diff --git a/go.mod b/go.mod index 14a6092d35..56d4f59cb5 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,7 @@ require ( github.com/google/go-cmp v0.6.0 github.com/google/uuid v1.5.0 github.com/klauspost/cpuid/v2 v2.2.5 - github.com/maxbrunsfeld/counterfeiter/v6 v6.8.1 // indirect + github.com/maxbrunsfeld/counterfeiter/v6 v6.11.2 // indirect github.com/mitchellh/mapstructure v1.5.0 github.com/nginxinc/nginx-prometheus-exporter v1.2.0 github.com/nxadm/tail v1.4.11 @@ -23,7 +23,7 @@ require ( github.com/spf13/cobra v1.8.0 github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.18.2 - github.com/stretchr/testify v1.9.0 + github.com/stretchr/testify v1.10.0 github.com/trivago/grok v1.0.0 github.com/vardius/message-bus v1.1.5 go.uber.org/atomic v1.11.0 @@ -42,7 +42,7 @@ require ( github.com/rs/cors v1.11.0 go.uber.org/goleak v1.3.0 go.uber.org/mock v0.4.0 - golang.org/x/sys v0.28.0 + golang.org/x/sys v0.29.0 golang.org/x/text v0.21.0 gopkg.in/yaml.v2 v2.4.0 ) @@ -59,7 +59,7 @@ require ( github.com/lufia/plan9stats v0.0.0-20231016141302-07b5767bb0ed // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/nginxinc/nginx-go-crossplane v0.4.48 // indirect + github.com/nginxinc/nginx-go-crossplane v0.4.70 // indirect github.com/pelletier/go-toml/v2 v2.1.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b // indirect @@ -80,9 +80,9 @@ require ( github.com/yusufpapurcu/wmi v1.2.3 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 // indirect - golang.org/x/mod v0.21.0 // indirect - golang.org/x/net v0.33.0 // indirect - golang.org/x/tools v0.25.0 // indirect + golang.org/x/mod v0.22.0 // indirect + golang.org/x/net v0.34.0 // indirect + golang.org/x/tools v0.29.0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240116215550-a9fa1716bcac // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect diff --git a/go.sum b/go.sum index af8131da9a..75837bdd33 100644 --- a/go.sum +++ b/go.sum @@ -73,22 +73,22 @@ github.com/lufia/plan9stats v0.0.0-20231016141302-07b5767bb0ed h1:036IscGBfJsFIg github.com/lufia/plan9stats v0.0.0-20231016141302-07b5767bb0ed/go.mod h1:ilwx/Dta8jXAgpFYFvSWEMwxmbWXyiUHkd5FwyKhb5k= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= -github.com/maxbrunsfeld/counterfeiter/v6 v6.8.1 h1:NicmruxkeqHjDv03SfSxqmaLuisddudfP3h5wdXFbhM= -github.com/maxbrunsfeld/counterfeiter/v6 v6.8.1/go.mod h1:eyp4DdUJAKkr9tvxR3jWhw2mDK7CWABMG5r9uyaKC7I= +github.com/maxbrunsfeld/counterfeiter/v6 v6.11.2 h1:yVCLo4+ACVroOEr4iFU1iH46Ldlzz2rTuu18Ra7M8sU= +github.com/maxbrunsfeld/counterfeiter/v6 v6.11.2/go.mod h1:VzB2VoMh1Y32/QqDfg9ZJYHj99oM4LiGtqPZydTiQSQ= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/nginxinc/nginx-go-crossplane v0.4.48 h1:Cf8sn8dTLJevtvNjGsla/wwa+rPTjm8eTfwSMqWisoI= -github.com/nginxinc/nginx-go-crossplane v0.4.48/go.mod h1:fgSibLM12jGRsh7QHpgL8wTKMEbfc594vSLK9ovwM6U= +github.com/nginxinc/nginx-go-crossplane v0.4.70 h1:zrmF8rk97TgB3uy5QtRZ4mY0tFAdhKG97H3XAM2LOBA= +github.com/nginxinc/nginx-go-crossplane v0.4.70/go.mod h1:o0dpGb2Nw1nYKHp8+b2dCxwrMWXGkjaVsZL1Jm3ouvQ= github.com/nginxinc/nginx-plus-go-client/v2 v2.0.1 h1:5VVK38bnELMDWnwfF6dSv57ResXh9AUzeDa72ENj94o= github.com/nginxinc/nginx-plus-go-client/v2 v2.0.1/go.mod h1:He+1izxYxVVO5/C9ZTukwOpvkAx5eS19nRQgKXDhX5I= github.com/nginxinc/nginx-prometheus-exporter v1.2.0 h1:jmu63tEm3hcupIpaIH72NEdwuNgGaQ/9q0IrnNqaPto= github.com/nginxinc/nginx-prometheus-exporter v1.2.0/go.mod h1:y8KANg4+7e/9HxT3vZDetjETLR5YhU0zv2WhZquo7C0= github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY= github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc= -github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8= -github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= +github.com/onsi/gomega v1.36.1 h1:bJDPBO7ibjxcbHMgSCoo4Yj18UWbKDlLwX1x9sybDcw= +github.com/onsi/gomega v1.36.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/orcaman/concurrent-map v1.0.0 h1:I/2A2XPCb4IuQWcQhBhSwGfiuybl/J0ev9HDbW65HOY= github.com/orcaman/concurrent-map v1.0.0/go.mod h1:Lu3tH6HLW3feq74c2GC+jIMS/K2CFcDWnWD9XkenwhI= @@ -157,8 +157,8 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= @@ -204,8 +204,8 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0= -golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= +golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= +golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -219,8 +219,8 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= -golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= +golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0= +golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -250,8 +250,8 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= -golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= +golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= @@ -279,8 +279,8 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.25.0 h1:oFU9pkj/iJgs+0DT+VMHrx+oBKs/LJMV+Uvg78sl+fE= -golang.org/x/tools v0.25.0/go.mod h1:/vtpO8WL1N9cQC3FN5zPqb//fRXskFHbLKk4OW1Q7rg= +golang.org/x/tools v0.29.0 h1:Xx0h3TtM9rzQpQuR4dKLrdglAmCEN5Oi+P74JdhdzXE= +golang.org/x/tools v0.29.0/go.mod h1:KMQVMRsVxU6nHCFXrBPhDB8XncLNLM0lIy/F14RP588= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/go.work.sum b/go.work.sum index 4b379894a0..c1feb68fae 100644 --- a/go.work.sum +++ b/go.work.sum @@ -1935,6 +1935,8 @@ github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTg github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/zapr v1.2.3/go.mod h1:eIauM6P8qSvTw5o2ez6UEAfGjQKrxQTl5EoK+Qa2oG4= github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= github.com/go-openapi/analysis v0.22.2/go.mod h1:pDF4UbZsQTo/oNuRfAWWd4dAh4yuYf//LYorPTjrpvo= @@ -1970,6 +1972,7 @@ github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LB github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-swagger/go-swagger v0.30.6-0.20240131062529-abb53530bfcf/go.mod h1:iZxZ4M49QHxbHLdZb1bXKt0t+5YO3lV6qBJ1vCb5REw= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ= @@ -2160,6 +2163,8 @@ github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20240117000934-35fc243c5815/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= +github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= +github.com/google/pprof v0.0.0-20240827171923-fa2c70bbbfe5/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= github.com/google/renameio v0.1.0 h1:GOZbcHa3HfsPKPlmyPyN2KEohoMXOhdMbHrvbpl2QaA= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/rpmpack v0.0.0-20191226140753-aa36bfddb3a0/go.mod h1:RaTPr0KUf2K7fnZYLNDrr8rxAamWs3iNywJLtQ2AzBg= @@ -2354,6 +2359,7 @@ github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1: github.com/ianlancetaylor/demangle v0.0.0-20210905161508-09a460cdf81d/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= github.com/ianlancetaylor/demangle v0.0.0-20230524184225-eabc099b10ab h1:BA4a7pe6ZTd9F8kXETBoijjFJ/ntaa//1wiH9BZu4zU= github.com/ianlancetaylor/demangle v0.0.0-20230524184225-eabc099b10ab/go.mod h1:gx7rwoVhcfuVKG5uya9Hs3Sxj7EIvldVofAWIUtGouw= +github.com/ianlancetaylor/demangle v0.0.0-20240312041847-bd984b5ce465/go.mod h1:gx7rwoVhcfuVKG5uya9Hs3Sxj7EIvldVofAWIUtGouw= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= @@ -2549,6 +2555,7 @@ github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88J github.com/maxbrunsfeld/counterfeiter/v6 v6.6.1/go.mod h1:qbKwBR+qQODzH2WD/s53mdgp/xVcXMlJb59GRFOp6Z4= github.com/maxbrunsfeld/counterfeiter/v6 v6.6.2/go.mod h1:otjOyjeqm3LALYcmX2AQIGH0VlojDoSd8aGOzsHAnBc= github.com/maxbrunsfeld/counterfeiter/v6 v6.7.0/go.mod h1:RVP6/F85JyxTrbJxWIdKU2vlSvK48iCMnMXRkSz7xtg= +github.com/maxbrunsfeld/counterfeiter/v6 v6.10.0/go.mod h1:TeVdzh+5QB5IpWDJAU/uviXA6kOg9yXzLrrjeLKJXqY= github.com/mgechev/dots v0.0.0-20210922191527-e955255bf517 h1:zpIH83+oKzcpryru8ceC6BxnoG8TBrhgAvRg8obzup0= github.com/mgechev/dots v0.0.0-20210922191527-e955255bf517/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg= github.com/mgechev/revive v1.3.1/go.mod h1:YlD6TTWl2B8A103R9KWJSPVI9DrEf+oqr15q21Ld+5I= @@ -2694,6 +2701,7 @@ github.com/onsi/ginkgo/v2 v2.5.0/go.mod h1:Luc4sArBICYCS8THh8v3i3i5CuSZO+RaQRaJo github.com/onsi/ginkgo/v2 v2.6.1/go.mod h1:yjiuMwPokqY1XauOgju45q3sJt6VzQ/Fict1LFVcsAo= github.com/onsi/ginkgo/v2 v2.9.4/go.mod h1:gCQYp2Q+kSoIj7ykSVb9nskRSsR6PUj4AiLywzIhbKM= github.com/onsi/ginkgo/v2 v2.9.7/go.mod h1:cxrmXWykAwTwhQsJOPfdIDiJ+l2RYq7U8hFU+M/1uw0= +github.com/onsi/ginkgo/v2 v2.20.1/go.mod h1:lG9ey2Z29hR41WMVthyJBGUBcBhGOtoPF2VFMvBXFCI= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= @@ -2712,6 +2720,8 @@ github.com/onsi/gomega v1.24.2/go.mod h1:gs3J10IS7Z7r7eXRoNJIrNqU4ToQukCJhFtKrWg github.com/onsi/gomega v1.27.6/go.mod h1:PIQNjfQwkP3aQAH7lf7j87O/5FiNr+ZR8+ipb+qQlhg= github.com/onsi/gomega v1.27.8/go.mod h1:2J8vzI/s+2shY9XHRApDkdgPo1TKT7P2u6fXeJKFnNQ= github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= +github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY= +github.com/onsi/gomega v1.36.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 h1:lDH9UUVJtmYCjyT0CI4q8xvlXPxeZ0gYCVvWbmPlp88= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/open-policy-agent/opa v0.42.2 h1:qocVAKyjrqMjCqsU02S/gHyLr4AQQ9xMtuV1kKnnyhM= @@ -3002,6 +3012,7 @@ github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1F github.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= @@ -3368,6 +3379,8 @@ golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98y golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g= golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= +golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc= +golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -3386,6 +3399,7 @@ golang.org/x/exp v0.0.0-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df h1:UA2aFVmmsIlefxMk29Dp2juaUSth8Pyn3Tq5Y5mJGME= golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= +golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= golang.org/x/exp/typeparams v0.0.0-20230224173230-c95f2b4c22f2/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= @@ -3509,6 +3523,9 @@ golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= +golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= +golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= +golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= golang.org/x/oauth2 v0.0.0-20180724155351-3d292e4d0cdc/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -3562,6 +3579,7 @@ golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -3683,6 +3701,8 @@ golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457 h1:zf5N6UOrA487eEFacMePxjXAJctxKmyjKUsjA11Uzuk= golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457/go.mod h1:pRgIJT+bRLFKnoM1ldnzKoxTIn14Yxz928LQRYYgIN0= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -3694,6 +3714,8 @@ golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo= golang.org/x/term v0.10.0 h1:3R7pNqamzBraeqj/Tj8qt1aQ2HpmlC+Cx/qL/7hn4/c= golang.org/x/term v0.24.0/go.mod h1:lOBK/LVxemqiMij05LGJ0tzNr8xlmwBRJ81PX6wVLH8= +golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg= +golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -3706,6 +3728,8 @@ golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -3807,6 +3831,8 @@ golang.org/x/tools v0.12.0/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ= +golang.org/x/tools v0.28.0/go.mod h1:dcIOrVd3mfQKTgrDVQHqCPMWy6lnhfhtX3hLXYVLfRw= golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= @@ -4195,6 +4221,9 @@ google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqw google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= +google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/airbrake/gobrake.v2 v2.0.9 h1:7z2uVWwn7oVeeugY1DtlPAy5H+KYgB1KeKTnqjNatLo= gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= gopkg.in/alessio/shellescape.v1 v1.0.0-20170105083845-52074bc9df61/go.mod h1:IfMagxm39Ys4ybJrDb7W3Ob8RwxftP0Yy+or/NVz1O8= diff --git a/sdk/config_helpers.go b/sdk/config_helpers.go index ed2595be87..9baa07e828 100644 --- a/sdk/config_helpers.go +++ b/sdk/config_helpers.go @@ -125,6 +125,7 @@ func GetNginxConfigWithIgnoreDirectives( }, ) if err != nil { + readLock.Unlock() return nil, fmt.Errorf("error reading config from %s, error: %s", confFile, err) } @@ -144,10 +145,11 @@ func GetNginxConfigWithIgnoreDirectives( err = updateNginxConfigFromPayload(confFile, payload, nginxConfig, allowedDirectories) if err != nil { + readLock.Unlock() return nil, fmt.Errorf("error assemble payload from %s, error: %s", confFile, err) } - readLock.Unlock() + readLock.Unlock() return nginxConfig, nil } diff --git a/sdk/config_helpers_test.go b/sdk/config_helpers_test.go index 9b4cb585ab..ac6c1ce745 100644 --- a/sdk/config_helpers_test.go +++ b/sdk/config_helpers_test.go @@ -799,6 +799,123 @@ var tests = []struct { "/tmp/testdata/nginx/ca/ca.crt": {}, }, }, + { + fileName: "/tmp/testdata/nginx/lua.conf", + config: `http { + server { + listen 443 ssl; + server_name lua.example.com; + + ssl_certificate /etc/nginx/ssl/server.cert; + ssl_certificate_key /etc/nginx/ssl/server.key; + + ssl_certificate_by_lua_block { + print("Test lua ssl certificate!") + } + } + + server { + } +}`, + plusApi: "", + expected: &proto.NginxConfig{ + Action: proto.NginxConfigAction_RETURN, + DirectoryMap: &proto.DirectoryMap{ + Directories: []*proto.Directory{ + { + Name: "/tmp/testdata/foo", + Permissions: "0755", + Files: []*proto.File{ + { + Name: "test.html", + Permissions: "0644", + }, + }, + }, + { + Name: "/tmp/testdata/nginx", + Permissions: "0755", + Files: []*proto.File{ + { + Name: "nginx2.conf", + Permissions: "0644", + Lines: int32(46), + }, + }, + }, + { + Name: "/tmp/testdata/nginx/ca", + Permissions: "0755", + Files: []*proto.File{ + { + Name: "ca.crt", + Permissions: "0644", + Lines: int32(31), + }, + }, + }, + }, + }, + AccessLogs: accessLogs, + ErrorLogs: errorLogs, + ConfigData: &proto.ConfigDescriptor{ + NginxId: nginxID, + SystemId: systemID, + Checksum: "", + }, + Ssl: &proto.SslCertificates{ + SslCerts: []*proto.SslCertificate{ + { + FileName: "/tmp/testdata/nginx/ca/ca.crt", + Validity: &proto.CertificateDates{ + NotBefore: 1632834204, + NotAfter: 1635426204, + }, + Issuer: &proto.CertificateName{ + CommonName: "ca.local", + Country: []string{"IE"}, + Locality: []string{"Cork"}, + Organization: []string{"NGINX"}, + OrganizationalUnit: nil, + }, + Subject: &proto.CertificateName{ + CommonName: "ca.local", + Country: []string{"IE"}, + Locality: []string{"Cork"}, + Organization: []string{"NGINX"}, + State: []string{"Cork"}, + OrganizationalUnit: nil, + }, + Mtime: &types.Timestamp{Seconds: 1633343804, Nanos: 15240107}, + SubjAltNames: nil, + PublicKeyAlgorithm: "RSA", + SignatureAlgorithm: "SHA512-RSA", + SerialNumber: "12554968962670027276", + SubjectKeyIdentifier: "75:50:E2:24:8F:6F:13:1D:81:20:E1:01:0B:57:2B:98:39:E5:2E:C3", + Fingerprint: "48:6D:05:D4:78:10:91:15:69:74:9C:6A:54:F7:F2:FC:C8:93:46:E8:28:42:24:41:68:41:51:1E:1E:43:E0:12", + AuthorityKeyIdentifier: "3A:79:E0:3E:61:CD:94:29:1D:BB:45:37:0B:E9:78:E9:2F:40:67:CA", + FingerprintAlgorithm: "SHA512-RSA", + Version: 3, + }, + }, + }, + // using RootDirectory for allowed in the tests, but the "root" directive is /tmp/testdata/foo, so + // should have an empty file list from the aux + Zaux: &proto.ZippedFile{ + Checksum: "51c05b653bc43deb5ec497988692fc5dec05ab8b6a0b78e908e4628b3d9e0d4c", + RootDirectory: "/tmp/testdata/foo", + }, + Zconfig: &proto.ZippedFile{ + Contents: []uint8{31, 139, 8, 0, 0, 0, 0, 0, 0, 255, 1, 0, 0, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0}, + Checksum: "cc6cee5366d87e85fbf1c05b9621df82996548e0e135f2b4a93e98f88c23d2b9", + RootDirectory: "/tmp/testdata/nginx", + }, + }, + expectedAuxFiles: map[string]struct{}{ + "/tmp/testdata/foo/test.html": {}, + "/tmp/testdata/nginx/ca/ca.crt": {}, + }, + }, } func TestGetNginxConfigFiles(t *testing.T) { diff --git a/sdk/go.mod b/sdk/go.mod index 60ce52408e..533c3f872b 100644 --- a/sdk/go.mod +++ b/sdk/go.mod @@ -10,9 +10,9 @@ require ( github.com/google/uuid v1.5.0 github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 github.com/mitchellh/mapstructure v1.5.0 - github.com/nginxinc/nginx-go-crossplane v0.4.48 + github.com/nginxinc/nginx-go-crossplane v0.4.70 github.com/sirupsen/logrus v1.9.3 - github.com/stretchr/testify v1.9.0 + github.com/stretchr/testify v1.10.0 google.golang.org/grpc v1.60.1 ) @@ -21,16 +21,16 @@ require ( github.com/golang/protobuf v1.5.4 // indirect github.com/jstemmer/go-junit-report v1.0.0 // indirect github.com/kr/text v0.2.0 // indirect - github.com/maxbrunsfeld/counterfeiter/v6 v6.8.1 // indirect + github.com/maxbrunsfeld/counterfeiter/v6 v6.11.2 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/rogpeppe/go-internal v1.12.0 // indirect github.com/stretchr/objx v0.5.2 // indirect - golang.org/x/mod v0.21.0 // indirect - golang.org/x/net v0.33.0 // indirect + golang.org/x/mod v0.22.0 // indirect + golang.org/x/net v0.34.0 // indirect golang.org/x/sync v0.10.0 // indirect - golang.org/x/sys v0.28.0 // indirect + golang.org/x/sys v0.29.0 // indirect golang.org/x/text v0.21.0 // indirect - golang.org/x/tools v0.25.0 // indirect + golang.org/x/tools v0.29.0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240116215550-a9fa1716bcac // indirect google.golang.org/protobuf v1.34.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/sdk/go.sum b/sdk/go.sum index 920d2d910c..c71c48ce4d 100644 --- a/sdk/go.sum +++ b/sdk/go.sum @@ -46,14 +46,14 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/maxbrunsfeld/counterfeiter/v6 v6.8.1 h1:NicmruxkeqHjDv03SfSxqmaLuisddudfP3h5wdXFbhM= -github.com/maxbrunsfeld/counterfeiter/v6 v6.8.1/go.mod h1:eyp4DdUJAKkr9tvxR3jWhw2mDK7CWABMG5r9uyaKC7I= +github.com/maxbrunsfeld/counterfeiter/v6 v6.11.2 h1:yVCLo4+ACVroOEr4iFU1iH46Ldlzz2rTuu18Ra7M8sU= +github.com/maxbrunsfeld/counterfeiter/v6 v6.11.2/go.mod h1:VzB2VoMh1Y32/QqDfg9ZJYHj99oM4LiGtqPZydTiQSQ= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/nginxinc/nginx-go-crossplane v0.4.48 h1:Cf8sn8dTLJevtvNjGsla/wwa+rPTjm8eTfwSMqWisoI= -github.com/nginxinc/nginx-go-crossplane v0.4.48/go.mod h1:fgSibLM12jGRsh7QHpgL8wTKMEbfc594vSLK9ovwM6U= -github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8= -github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= +github.com/nginxinc/nginx-go-crossplane v0.4.70 h1:zrmF8rk97TgB3uy5QtRZ4mY0tFAdhKG97H3XAM2LOBA= +github.com/nginxinc/nginx-go-crossplane v0.4.70/go.mod h1:o0dpGb2Nw1nYKHp8+b2dCxwrMWXGkjaVsZL1Jm3ouvQ= +github.com/onsi/gomega v1.36.1 h1:bJDPBO7ibjxcbHMgSCoo4Yj18UWbKDlLwX1x9sybDcw= +github.com/onsi/gomega v1.36.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -75,8 +75,8 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= @@ -93,8 +93,8 @@ golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0= -golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= +golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= +golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -103,8 +103,8 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= -golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= +golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0= +golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -120,8 +120,8 @@ golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= -golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= +golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= @@ -135,8 +135,8 @@ golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.25.0 h1:oFU9pkj/iJgs+0DT+VMHrx+oBKs/LJMV+Uvg78sl+fE= -golang.org/x/tools v0.25.0/go.mod h1:/vtpO8WL1N9cQC3FN5zPqb//fRXskFHbLKk4OW1Q7rg= +golang.org/x/tools v0.29.0 h1:Xx0h3TtM9rzQpQuR4dKLrdglAmCEN5Oi+P74JdhdzXE= +golang.org/x/tools v0.29.0/go.mod h1:KMQVMRsVxU6nHCFXrBPhDB8XncLNLM0lIy/F14RP588= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/sdk/vendor/github.com/jstemmer/go-junit-report/.gitignore b/sdk/vendor/github.com/jstemmer/go-junit-report/.gitignore deleted file mode 100644 index 7216c087e1..0000000000 --- a/sdk/vendor/github.com/jstemmer/go-junit-report/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -go-junit-report -build/ diff --git a/sdk/vendor/github.com/jstemmer/go-junit-report/.travis.yml b/sdk/vendor/github.com/jstemmer/go-junit-report/.travis.yml deleted file mode 100644 index d0dff3ef8e..0000000000 --- a/sdk/vendor/github.com/jstemmer/go-junit-report/.travis.yml +++ /dev/null @@ -1,16 +0,0 @@ -language: go - -go: - - tip - - "1.13.x" - - "1.12.x" - - "1.11.x" - - "1.10.x" - - "1.9.x" - - "1.8.x" - - "1.7.x" - - "1.6.x" - - "1.5.x" - - "1.4.x" - - "1.3.x" - - "1.2.x" diff --git a/sdk/vendor/github.com/jstemmer/go-junit-report/CONTRIBUTING.md b/sdk/vendor/github.com/jstemmer/go-junit-report/CONTRIBUTING.md deleted file mode 100644 index 125d350e11..0000000000 --- a/sdk/vendor/github.com/jstemmer/go-junit-report/CONTRIBUTING.md +++ /dev/null @@ -1,21 +0,0 @@ -# Contributing - -## Bug reports - -- Before reporting a bug, have a look at the [issue - list](https://github.com/jstemmer/go-junit-report/issues) to see if an issue - already exists for your problem. -- Include as much information as you can in the bug report, e.g.: the versions - of go-junit-report and the Go compiler, how go-junit-report was called, what - input was given to go-junit-report, what the actual output was, was the - expected output was. - -## Pull requests - -- Before sending a pull request for new features, open an issue to discuss it. -- Run `go fmt` to format your code. -- Add test coverage and run all tests. -- Prefer small PRs, avoid making unrelated changes in the same PR. -- Limit the first line of the commit message to 72 characters. -- Write commit messages in the imperative mood ("Fix bug", not "Fixed bug" or - "Fixes bug") . diff --git a/sdk/vendor/github.com/jstemmer/go-junit-report/Makefile b/sdk/vendor/github.com/jstemmer/go-junit-report/Makefile deleted file mode 100644 index 4c0aaf218f..0000000000 --- a/sdk/vendor/github.com/jstemmer/go-junit-report/Makefile +++ /dev/null @@ -1,26 +0,0 @@ -VERSION=$(shell git describe --match="v*") -REVISION=$(shell git rev-parse HEAD) -TIMESTAMP=$(shell date +%FT%T) - -test: - go test ./... - -build/go-junit-report build/go-junit-report.exe: clean - go build --ldflags "-s -X main.Version=$(VERSION) -X main.Revision=$(REVISION) -X main.BuildTime=$(TIMESTAMP)" -o $@ - -build/go-junit-report-$(VERSION)-$(GOOS)-$(GOARCH).tar.gz: build/go-junit-report - tar czf $@ -C build go-junit-report - -build/go-junit-report-$(VERSION)-windows-amd64.zip: build/go-junit-report.exe - zip -j $@ build/go-junit-report.exe - -release: test - $(MAKE) GOOS=linux GOARCH=amd64 build/go-junit-report-$(VERSION)-linux-amd64.tar.gz - $(MAKE) GOOS=windows GOARCH=amd64 build/go-junit-report-$(VERSION)-windows-amd64.zip - $(MAKE) GOOS=darwin GOARCH=amd64 build/go-junit-report-$(VERSION)-darwin-amd64.tar.gz - -clean: - rm -f build/go-junit-report - rm -f build/go-junit-report.exe - -.PHONY: build clean release test diff --git a/sdk/vendor/github.com/jstemmer/go-junit-report/README.md b/sdk/vendor/github.com/jstemmer/go-junit-report/README.md deleted file mode 100644 index a81ad10e46..0000000000 --- a/sdk/vendor/github.com/jstemmer/go-junit-report/README.md +++ /dev/null @@ -1,56 +0,0 @@ -# go-junit-report - -go-junit-report is a tool that converts [`go test`] output to an XML report, -suitable for applications that expect JUnit-style XML reports (e.g. -[Jenkins](http://jenkins-ci.org)). - -The test output [parser] and JUnit report [formatter] are also available as Go -packages. - -[![Build Status][travis-badge]][travis-link] - -## Install from package (recommended) - -Pre-built packages for Windows, macOS and Linux are found on the [Releases] -page. - -## Install from source - -Download and install the latest stable version from source by running: - -```bash -go install github.com/jstemmer/go-junit-report@latest -``` - -## Usage - -go-junit-report reads the full `go test` output from stdin and writes JUnit -compatible XML to stdout. In order to capture build errors as well as test -output, redirect both stdout and stderr to go-junit-report. - -```bash -go test -v 2>&1 | go-junit-report > report.xml -``` - -Parsing benchmark output is also supported, for example: - -```bash -go test -v -bench . -count 5 2>&1 | go-junit-report > report.xml -``` - -If you want go-junit-report to exit with a non-zero exit code when it encounters -build errors or test failures, set the `-set-exit-code` flag. - -Run `go-junit-report -help` for a list of all supported flags. - -## Contributing - -See [CONTRIBUTING.md]. - -[`go test`]: https://pkg.go.dev/cmd/go#hdr-Test_packages -[parser]: https://pkg.go.dev/github.com/jstemmer/go-junit-report/parser -[formatter]: https://pkg.go.dev/github.com/jstemmer/go-junit-report/formatter -[travis-badge]: https://travis-ci.org/jstemmer/go-junit-report.svg?branch=master -[travis-link]: https://travis-ci.org/jstemmer/go-junit-report -[Releases]: https://github.com/jstemmer/go-junit-report/releases -[CONTRIBUTING.md]: https://github.com/jstemmer/go-junit-report/blob/master/CONTRIBUTING.md diff --git a/sdk/vendor/github.com/jstemmer/go-junit-report/formatter/formatter.go b/sdk/vendor/github.com/jstemmer/go-junit-report/formatter/formatter.go deleted file mode 100644 index 6e1a0f31d6..0000000000 --- a/sdk/vendor/github.com/jstemmer/go-junit-report/formatter/formatter.go +++ /dev/null @@ -1,182 +0,0 @@ -package formatter - -import ( - "bufio" - "encoding/xml" - "fmt" - "io" - "runtime" - "strings" - "time" - - "github.com/jstemmer/go-junit-report/parser" -) - -// JUnitTestSuites is a collection of JUnit test suites. -type JUnitTestSuites struct { - XMLName xml.Name `xml:"testsuites"` - Suites []JUnitTestSuite `xml:"testsuite"` -} - -// JUnitTestSuite is a single JUnit test suite which may contain many -// testcases. -type JUnitTestSuite struct { - XMLName xml.Name `xml:"testsuite"` - Tests int `xml:"tests,attr"` - Failures int `xml:"failures,attr"` - Time string `xml:"time,attr"` - Name string `xml:"name,attr"` - Properties []JUnitProperty `xml:"properties>property,omitempty"` - TestCases []JUnitTestCase `xml:"testcase"` -} - -// JUnitTestCase is a single test case with its result. -type JUnitTestCase struct { - XMLName xml.Name `xml:"testcase"` - Classname string `xml:"classname,attr"` - Name string `xml:"name,attr"` - Time string `xml:"time,attr"` - SkipMessage *JUnitSkipMessage `xml:"skipped,omitempty"` - Failure *JUnitFailure `xml:"failure,omitempty"` -} - -// JUnitSkipMessage contains the reason why a testcase was skipped. -type JUnitSkipMessage struct { - Message string `xml:"message,attr"` -} - -// JUnitProperty represents a key/value pair used to define properties. -type JUnitProperty struct { - Name string `xml:"name,attr"` - Value string `xml:"value,attr"` -} - -// JUnitFailure contains data related to a failed test. -type JUnitFailure struct { - Message string `xml:"message,attr"` - Type string `xml:"type,attr"` - Contents string `xml:",chardata"` -} - -// JUnitReportXML writes a JUnit xml representation of the given report to w -// in the format described at http://windyroad.org/dl/Open%20Source/JUnit.xsd -func JUnitReportXML(report *parser.Report, noXMLHeader bool, goVersion string, w io.Writer) error { - suites := JUnitTestSuites{} - - // convert Report to JUnit test suites - for _, pkg := range report.Packages { - pkg.Benchmarks = mergeBenchmarks(pkg.Benchmarks) - ts := JUnitTestSuite{ - Tests: len(pkg.Tests) + len(pkg.Benchmarks), - Failures: 0, - Time: formatTime(pkg.Duration), - Name: pkg.Name, - Properties: []JUnitProperty{}, - TestCases: []JUnitTestCase{}, - } - - classname := pkg.Name - if idx := strings.LastIndex(classname, "/"); idx > -1 && idx < len(pkg.Name) { - classname = pkg.Name[idx+1:] - } - - // properties - if goVersion == "" { - // if goVersion was not specified as a flag, fall back to version reported by runtime - goVersion = runtime.Version() - } - ts.Properties = append(ts.Properties, JUnitProperty{"go.version", goVersion}) - if pkg.CoveragePct != "" { - ts.Properties = append(ts.Properties, JUnitProperty{"coverage.statements.pct", pkg.CoveragePct}) - } - - // individual test cases - for _, test := range pkg.Tests { - testCase := JUnitTestCase{ - Classname: classname, - Name: test.Name, - Time: formatTime(test.Duration), - Failure: nil, - } - - if test.Result == parser.FAIL { - ts.Failures++ - testCase.Failure = &JUnitFailure{ - Message: "Failed", - Type: "", - Contents: strings.Join(test.Output, "\n"), - } - } - - if test.Result == parser.SKIP { - testCase.SkipMessage = &JUnitSkipMessage{strings.Join(test.Output, "\n")} - } - - ts.TestCases = append(ts.TestCases, testCase) - } - - // individual benchmarks - for _, benchmark := range pkg.Benchmarks { - benchmarkCase := JUnitTestCase{ - Classname: classname, - Name: benchmark.Name, - Time: formatBenchmarkTime(benchmark.Duration), - } - - ts.TestCases = append(ts.TestCases, benchmarkCase) - } - - suites.Suites = append(suites.Suites, ts) - } - - // to xml - bytes, err := xml.MarshalIndent(suites, "", "\t") - if err != nil { - return err - } - - writer := bufio.NewWriter(w) - - if !noXMLHeader { - writer.WriteString(xml.Header) - } - - writer.Write(bytes) - writer.WriteByte('\n') - writer.Flush() - - return nil -} - -func mergeBenchmarks(benchmarks []*parser.Benchmark) []*parser.Benchmark { - var merged []*parser.Benchmark - benchmap := make(map[string][]*parser.Benchmark) - for _, bm := range benchmarks { - if _, ok := benchmap[bm.Name]; !ok { - merged = append(merged, &parser.Benchmark{Name: bm.Name}) - } - benchmap[bm.Name] = append(benchmap[bm.Name], bm) - } - - for _, bm := range merged { - for _, b := range benchmap[bm.Name] { - bm.Allocs += b.Allocs - bm.Bytes += b.Bytes - bm.Duration += b.Duration - } - n := len(benchmap[bm.Name]) - bm.Allocs /= n - bm.Bytes /= n - bm.Duration /= time.Duration(n) - } - - return merged -} - -func formatTime(d time.Duration) string { - return fmt.Sprintf("%.3f", d.Seconds()) -} - -func formatBenchmarkTime(d time.Duration) string { - return fmt.Sprintf("%.9f", d.Seconds()) -} diff --git a/sdk/vendor/github.com/jstemmer/go-junit-report/go-junit-report.go b/sdk/vendor/github.com/jstemmer/go-junit-report/go-junit-report.go deleted file mode 100644 index 24de3d9c4a..0000000000 --- a/sdk/vendor/github.com/jstemmer/go-junit-report/go-junit-report.go +++ /dev/null @@ -1,57 +0,0 @@ -package main - -import ( - "flag" - "fmt" - "os" - - "github.com/jstemmer/go-junit-report/formatter" - "github.com/jstemmer/go-junit-report/parser" -) - -var ( - Version = "v1.0.0-dev" - Revision = "HEAD" - BuildTime string -) - -var ( - noXMLHeader = flag.Bool("no-xml-header", false, "do not print xml header") - packageName = flag.String("package-name", "", "specify a package name (compiled test have no package name in output)") - goVersionFlag = flag.String("go-version", "", "specify the value to use for the go.version property in the generated XML") - setExitCode = flag.Bool("set-exit-code", false, "set exit code to 1 if tests failed") - version = flag.Bool("version", false, "print version") -) - -func main() { - flag.Parse() - - if *version { - fmt.Printf("go-junit-report %s %s (%s)\n", Version, BuildTime, Revision) - return - } - - if flag.NArg() != 0 { - fmt.Fprintf(os.Stderr, "%s does not accept positional arguments\n", os.Args[0]) - flag.Usage() - os.Exit(1) - } - - // Read input - report, err := parser.Parse(os.Stdin, *packageName) - if err != nil { - fmt.Printf("Error reading input: %s\n", err) - os.Exit(1) - } - - // Write xml - err = formatter.JUnitReportXML(report, *noXMLHeader, *goVersionFlag, os.Stdout) - if err != nil { - fmt.Printf("Error writing XML: %s\n", err) - os.Exit(1) - } - - if *setExitCode && report.Failures() > 0 { - os.Exit(1) - } -} diff --git a/sdk/vendor/github.com/maxbrunsfeld/counterfeiter/v6/.gitattributes b/sdk/vendor/github.com/maxbrunsfeld/counterfeiter/v6/.gitattributes deleted file mode 100644 index fcadb2cf97..0000000000 --- a/sdk/vendor/github.com/maxbrunsfeld/counterfeiter/v6/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -* text eol=lf diff --git a/sdk/vendor/github.com/maxbrunsfeld/counterfeiter/v6/.gitignore b/sdk/vendor/github.com/maxbrunsfeld/counterfeiter/v6/.gitignore deleted file mode 100644 index 1597f12b71..0000000000 --- a/sdk/vendor/github.com/maxbrunsfeld/counterfeiter/v6/.gitignore +++ /dev/null @@ -1,32 +0,0 @@ -# Compiled Object files, Static and Dynamic libs (Shared Objects) -*.o -*.a -*.so - -# Folders -_obj -_test - -# Architecture specific extensions/prefixes -*.[568vq] -[568vq].out - -*.cgo1.go -*.cgo2.c -_cgo_defun.c -_cgo_gotypes.go -_cgo_export.* - -_testmain.go - -*.exe -*.test -*.iml -.idea -.envrc - -/counterfeiter -integration/testdata/output -*.profile -*.bench -/.vscode diff --git a/sdk/vendor/github.com/maxbrunsfeld/counterfeiter/v6/.golangci.yaml b/sdk/vendor/github.com/maxbrunsfeld/counterfeiter/v6/.golangci.yaml deleted file mode 100644 index 1f2afa43bb..0000000000 --- a/sdk/vendor/github.com/maxbrunsfeld/counterfeiter/v6/.golangci.yaml +++ /dev/null @@ -1,3 +0,0 @@ -run: - skip-dirs: - - fixtures \ No newline at end of file diff --git a/sdk/vendor/github.com/maxbrunsfeld/counterfeiter/v6/README.md b/sdk/vendor/github.com/maxbrunsfeld/counterfeiter/v6/README.md deleted file mode 100644 index 5d471d6431..0000000000 --- a/sdk/vendor/github.com/maxbrunsfeld/counterfeiter/v6/README.md +++ /dev/null @@ -1,228 +0,0 @@ -# `counterfeiter` [![GitHub Actions](https://github.com/maxbrunsfeld/counterfeiter/actions/workflows/go.yml/badge.svg)](https://github.com/maxbrunsfeld/counterfeiter/actions/workflows/go.yml) [![Go Report Card](https://goreportcard.com/badge/github.com/maxbrunsfeld/counterfeiter/v6)](https://goreportcard.com/report/github.com/maxbrunsfeld/counterfeiter/v6) [![GoDoc](https://godoc.org/github.com/maxbrunsfeld/counterfeiter/v6?status.svg)](https://godoc.org/github.com/maxbrunsfeld/counterfeiter/v6) - -When writing unit-tests for an object, it is often useful to have fake implementations -of the object's collaborators. In go, such fake implementations cannot be generated -automatically at runtime, and writing them by hand can be quite arduous. - -`counterfeiter` allows you to simply generate test doubles for a given interface. - -### Supported Versions Of `go` - -`counterfeiter` follows the [support policy of `go` itself](https://golang.org/doc/devel/release.html#policy): - -> Each major Go release is supported until there are two newer major releases. For example, Go 1.5 was supported until the Go 1.7 release, and Go 1.6 was supported until the Go 1.8 release. We fix critical problems, including [critical security problems](https://golang.org/security), in supported releases as needed by issuing minor revisions (for example, Go 1.6.1, Go 1.6.2, and so on). - -If you are having problems with `counterfeiter` and are not using a supported version of go, please update to use a supported version of go before opening an issue. - -### Using `counterfeiter` - -⚠️ Please use [`go modules`](https://blog.golang.org/using-go-modules) when working with counterfeiter. - -Typically, `counterfeiter` is used in `go generate` directives. It can be frustrating when you change your interface declaration and suddenly all of your generated code is suddenly out-of-date. The best practice here is to use the [`go generate` command](https://blog.golang.org/generate) to make it easier to keep your test doubles up to date. - -#### Step 1 - Create `tools.go` - -You can take a dependency on tools by creating a `tools.go` file, as described in [How can I track tool dependencies for a module?](https://github.com/golang/go/wiki/Modules#how-can-i-track-tool-dependencies-for-a-module). This ensures that everyone working with your module is using the same version of each tool you use. - -```shell -$ cat tools/tools.go -``` - -```go -//go:build tools - -package tools - -import ( - _ "github.com/maxbrunsfeld/counterfeiter/v6" -) - -// This file imports packages that are used when running go generate, or used -// during the development process but not otherwise depended on by built code. -``` - -#### Step 2a - Add `go:generate` Directives - -You can add directives right next to your interface definitions (or not), in any `.go` file in your module. - -```shell -$ cat myinterface.go -``` - -```go -package foo - -//go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 . MySpecialInterface - -type MySpecialInterface interface { - DoThings(string, uint64) (int, error) -} -``` - -```shell -$ go generate ./... -Writing `FakeMySpecialInterface` to `foofakes/fake_my_special_interface.go`... Done -``` - -#### Step 2b - Add `counterfeiter:generate` Directives - -If you plan to have many directives in a single package, consider using this -option. You can add directives right next to your interface definitions -(or not), in any `.go` file in your module. - -```shell -$ cat myinterface.go -``` - -```go -package foo - -// You only need **one** of these per package! -//go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -generate - -// You will add lots of directives like these in the same package... -//counterfeiter:generate . MySpecialInterface -type MySpecialInterface interface { - DoThings(string, uint64) (int, error) -} - -// Like this... -//counterfeiter:generate . MyOtherInterface -type MyOtherInterface interface { - DoOtherThings(string, uint64) (int, error) -} -``` - -```shell -$ go generate ./... -Writing `FakeMySpecialInterface` to `foofakes/fake_my_special_interface.go`... Done -Writing `FakeMyOtherInterface` to `foofakes/fake_my_other_interface.go`... Done -``` - -#### Step 3 - Run `go generate` - -You can run `go generate` in the directory with your directive, or in the root of your module (to ensure you generate for all packages in your module): - -```shell -$ go generate ./... -``` - -#### Invoking `counterfeiter` from the shell - -You can use the following command to invoke `counterfeiter` from within a go module: - -```shell -$ go run github.com/maxbrunsfeld/counterfeiter/v6 - -USAGE - counterfeiter - [-generate>] [-o ] [-p] [--fake-name ] - [-header ] - [] [-] -``` - -#### Installing `counterfeiter` to `$GOPATH/bin` - -This is unnecessary if you're using the approach described above, but does allow you to invoke `counterfeiter` in your shell _outside_ of a module: - -```shell -$ go install github.com/maxbrunsfeld/counterfeiter/v6 -$ ~/go/bin/counterfeiter - -USAGE - counterfeiter - [-generate>] [-o ] [-p] [--fake-name ] - [-header ] - [] [-] -``` - -### Generating Test Doubles - -Given a path to a package and an interface name, you can generate a test double. - -```shell -$ cat path/to/foo/file.go -``` - -```go -package foo - -type MySpecialInterface interface { - DoThings(string, uint64) (int, error) -} -``` - -```shell -$ go run github.com/maxbrunsfeld/counterfeiter/v6 path/to/foo MySpecialInterface -Wrote `FakeMySpecialInterface` to `path/to/foo/foofakes/fake_my_special_interface.go` -``` - -### Using Test Doubles In Your Tests - -Instantiate fakes`: - -```go -import "my-repo/path/to/foo/foofakes" - -var fake = &foofakes.FakeMySpecialInterface{} -``` - -Fakes record the arguments they were called with: - -```go -fake.DoThings("stuff", 5) - -Expect(fake.DoThingsCallCount()).To(Equal(1)) - -str, num := fake.DoThingsArgsForCall(0) -Expect(str).To(Equal("stuff")) -Expect(num).To(Equal(uint64(5))) -``` - -You can stub their return values: - -```go -fake.DoThingsReturns(3, errors.New("the-error")) - -num, err := fake.DoThings("stuff", 5) -Expect(num).To(Equal(3)) -Expect(err).To(Equal(errors.New("the-error"))) -``` - -For more examples of using the `counterfeiter` API, look at [some of the provided examples](https://github.com/maxbrunsfeld/counterfeiter/blob/master/generated_fakes_test.go). - -### Generating Test Doubles For Third Party Interfaces - -For third party interfaces, you can specify the interface using the alternative syntax `.`, for example: - -```shell -$ go run github.com/maxbrunsfeld/counterfeiter/v6 github.com/go-redis/redis.Pipeliner -``` - -### Running The Tests For `counterfeiter` - -If you want to run the tests for `counterfeiter` (perhaps, because you want to contribute a PR), all you have to do is run `scripts/ci.sh`. - -### Contributions - -So you want to contribute to `counterfeiter`! That's great, here's exactly what you should do: - -- open a new github issue, describing your problem, or use case -- help us understand how you want to fix or extend `counterfeiter` -- write one or more unit tests for the behavior you want -- write the simplest code you can for the feature you're working on -- try to find any opportunities to refactor -- avoid writing code that isn't covered by unit tests - -`counterfeiter` has a few high level goals for contributors to keep in mind - -- keep unit-level test coverage as high as possible -- keep `main.go` as simple as possible -- avoid making the command line options any more complicated -- avoid making the internals of `counterfeiter` any more complicated - -If you have any questions about how to contribute, rest assured that @tjarratt and other maintainers will work with you to ensure we make `counterfeiter` better, together. This project has largely been maintained by the community, and we greatly appreciate any PR (whether big or small). - -### License - -`counterfeiter` is MIT-licensed. diff --git a/sdk/vendor/github.com/maxbrunsfeld/counterfeiter/v6/arguments/files.go b/sdk/vendor/github.com/maxbrunsfeld/counterfeiter/v6/arguments/files.go deleted file mode 100644 index a2485878db..0000000000 --- a/sdk/vendor/github.com/maxbrunsfeld/counterfeiter/v6/arguments/files.go +++ /dev/null @@ -1,6 +0,0 @@ -package arguments - -import "os" - -type Evaler func(string) (string, error) -type Stater func(string) (os.FileInfo, error) diff --git a/sdk/vendor/github.com/maxbrunsfeld/counterfeiter/v6/arguments/parser.go b/sdk/vendor/github.com/maxbrunsfeld/counterfeiter/v6/arguments/parser.go deleted file mode 100644 index 557d4959f1..0000000000 --- a/sdk/vendor/github.com/maxbrunsfeld/counterfeiter/v6/arguments/parser.go +++ /dev/null @@ -1,271 +0,0 @@ -package arguments - -import ( - "encoding/json" - "errors" - "flag" - "fmt" - "path" - "path/filepath" - "regexp" - "strings" - "unicode" -) - -func New(args []string, workingDir string, evaler Evaler, stater Stater) (*ParsedArguments, error) { - if len(args) == 0 { - return nil, errors.New("argument parsing requires at least one argument") - } - - fs := flag.NewFlagSet("counterfeiter", flag.ContinueOnError) - fakeNameFlag := fs.String( - "fake-name", - "", - "The name of the fake struct", - ) - - outputPathFlag := fs.String( - "o", - "", - "The file or directory to which the generated fake will be written", - ) - - packageFlag := fs.Bool( - "p", - false, - "Whether or not to generate a package shim", - ) - generateFlag := fs.Bool( - "generate", - false, - "Identify all //counterfeiter:generate directives in the current working directory and generate fakes for them", - ) - headerFlag := fs.String( - "header", - "", - "A path to a file that should be used as a header for the generated fake", - ) - quietFlag := fs.Bool( - "q", - false, - "Suppress status statements", - ) - helpFlag := fs.Bool( - "help", - false, - "Display this help", - ) - - err := fs.Parse(args[1:]) - if err != nil { - return nil, err - } - if *helpFlag { - return nil, errors.New(usage) - } - if len(fs.Args()) == 0 && !*generateFlag { - return nil, errors.New(usage) - } - - packageMode := *packageFlag - result := &ParsedArguments{ - PrintToStdOut: any(args, "-"), - GenerateInterfaceAndShimFromPackageDirectory: packageMode, - GenerateMode: *generateFlag, - HeaderFile: *headerFlag, - Quiet: *quietFlag, - } - if *generateFlag { - return result, nil - } - err = result.parseSourcePackageDir(packageMode, workingDir, evaler, stater, fs.Args()) - if err != nil { - return nil, err - } - result.parseInterfaceName(packageMode, fs.Args()) - result.parseFakeName(packageMode, *fakeNameFlag, fs.Args()) - result.parseOutputPath(packageMode, workingDir, *outputPathFlag, fs.Args()) - result.parseDestinationPackageName(packageMode, fs.Args()) - result.parsePackagePath(packageMode, fs.Args()) - return result, nil -} - -func (a *ParsedArguments) PrettyPrint() { - b, _ := json.Marshal(a) - fmt.Println(string(b)) -} - -func (a *ParsedArguments) parseInterfaceName(packageMode bool, args []string) { - if packageMode { - a.InterfaceName = "" - return - } - if len(args) == 1 { - fullyQualifiedInterface := strings.Split(args[0], ".") - a.InterfaceName = fullyQualifiedInterface[len(fullyQualifiedInterface)-1] - } else { - a.InterfaceName = args[1] - } -} - -func (a *ParsedArguments) parseSourcePackageDir(packageMode bool, workingDir string, evaler Evaler, stater Stater, args []string) error { - if packageMode { - a.SourcePackageDir = args[0] - return nil - } - if len(args) <= 1 { - return nil - } - s, err := getSourceDir(args[0], workingDir, evaler, stater) - if err != nil { - return err - } - a.SourcePackageDir = s - return nil -} - -func (a *ParsedArguments) parseFakeName(packageMode bool, fakeName string, args []string) { - if packageMode { - a.parsePackagePath(packageMode, args) - a.FakeImplName = strings.ToUpper(path.Base(a.PackagePath))[:1] + path.Base(a.PackagePath)[1:] - return - } - if fakeName == "" { - fakeName = "Fake" + fixupUnexportedNames(a.InterfaceName) - } - a.FakeImplName = fakeName -} - -func (a *ParsedArguments) parseOutputPath(packageMode bool, workingDir string, outputPath string, args []string) { - outputPathIsFilename := false - if strings.HasSuffix(outputPath, ".go") { - outputPathIsFilename = true - } - snakeCaseName := strings.ToLower(camelRegexp.ReplaceAllString(a.FakeImplName, "${1}_${2}")) - - if outputPath != "" { - if !filepath.IsAbs(outputPath) { - outputPath = filepath.Join(workingDir, outputPath) - } - a.OutputPath = outputPath - if !outputPathIsFilename { - a.OutputPath = filepath.Join(a.OutputPath, snakeCaseName+".go") - } - return - } - - if packageMode { - a.parseDestinationPackageName(packageMode, args) - a.OutputPath = path.Join(workingDir, a.DestinationPackageName, snakeCaseName+".go") - return - } - - d := workingDir - if len(args) > 1 { - d = a.SourcePackageDir - } - a.OutputPath = filepath.Join(d, packageNameForPath(d), snakeCaseName+".go") -} - -func (a *ParsedArguments) parseDestinationPackageName(packageMode bool, args []string) { - if packageMode { - a.parsePackagePath(packageMode, args) - a.DestinationPackageName = path.Base(a.PackagePath) + "shim" - return - } - - a.DestinationPackageName = restrictToValidPackageName(filepath.Base(filepath.Dir(a.OutputPath))) -} - -func (a *ParsedArguments) parsePackagePath(packageMode bool, args []string) { - if packageMode { - a.PackagePath = args[0] - return - } - if len(args) == 1 { - fullyQualifiedInterface := strings.Split(args[0], ".") - a.PackagePath = strings.Join(fullyQualifiedInterface[:len(fullyQualifiedInterface)-1], ".") - } else { - a.InterfaceName = args[1] - } - - if a.PackagePath == "" { - a.PackagePath = a.SourcePackageDir - } -} - -type ParsedArguments struct { - GenerateInterfaceAndShimFromPackageDirectory bool - - SourcePackageDir string // abs path to the dir containing the interface to fake - PackagePath string // package path to the package containing the interface to fake - OutputPath string // path to write the fake file to - - DestinationPackageName string // often the base-dir for OutputPath but must be a valid package name - - InterfaceName string // the interface to counterfeit - FakeImplName string // the name of the struct implementing the given interface - - PrintToStdOut bool - GenerateMode bool - Quiet bool - - HeaderFile string -} - -func fixupUnexportedNames(interfaceName string) string { - asRunes := []rune(interfaceName) - if len(asRunes) == 0 || !unicode.IsLower(asRunes[0]) { - return interfaceName - } - asRunes[0] = unicode.ToUpper(asRunes[0]) - return string(asRunes) -} - -var camelRegexp = regexp.MustCompile("([a-z])([A-Z])") - -func packageNameForPath(pathToPackage string) string { - _, packageName := filepath.Split(pathToPackage) - return packageName + "fakes" -} - -func getSourceDir(path string, workingDir string, evaler Evaler, stater Stater) (string, error) { - if !filepath.IsAbs(path) { - path = filepath.Join(workingDir, path) - } - - evaluatedPath, err := evaler(path) - if err != nil { - return "", fmt.Errorf("No such file/directory/package [%s]: %v", path, err) - } - - stat, err := stater(evaluatedPath) - if err != nil { - return "", fmt.Errorf("No such file/directory/package [%s]: %v", path, err) - } - - if !stat.IsDir() { - return filepath.Dir(path), nil - } - return path, nil -} - -func any(slice []string, needle string) bool { - for _, str := range slice { - if str == needle { - return true - } - } - - return false -} - -func restrictToValidPackageName(input string) string { - return strings.Map(func(r rune) rune { - if (r >= 'a' && r <= 'z') || (r >= 'A' && r <= 'Z') || (r >= '0' && r <= '9') || r == '_' { - return r - } else { - return -1 - } - }, input) -} diff --git a/sdk/vendor/github.com/maxbrunsfeld/counterfeiter/v6/arguments/usage.go b/sdk/vendor/github.com/maxbrunsfeld/counterfeiter/v6/arguments/usage.go deleted file mode 100644 index 0d707afaaa..0000000000 --- a/sdk/vendor/github.com/maxbrunsfeld/counterfeiter/v6/arguments/usage.go +++ /dev/null @@ -1,112 +0,0 @@ -package arguments - -const usage = ` -USAGE - counterfeiter - [-generate>] [-o ] [-p] [--fake-name ] - [-header ] - [] [-] - -ARGUMENTS - source-path - Path to the file or directory containing the interface to fake. - In package mode (-p), source-path should instead specify the path - of the input package; alternatively you can use the package name - (e.g. "os") and the path will be inferred from your GOROOT. - - interface - If source-path is specified: Name of the interface to fake. - If no source-path is specified: Fully qualified interface path of the interface to fake. - If -p is specified, this will be the name of the interface to generate. - - example: - # writes "FakeStdInterface" to ./packagefakes/fake_std_interface.go - counterfeiter package/subpackage.StdInterface - - '-' argument - Write code to standard out instead of to a file - -OPTIONS - -generate - Identify all //counterfeiter:generate directives in .go file in the - current working directory and generate fakes for them. You can pass - arguments as usual. - - NOTE: This is not the same as //go:generate directives - (used with the 'go generate' command), but it can be combined with - go generate by adding the following to a .go file: - - # runs counterfeiter in generate mode - //go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -generate - - example: - Add the following to a .go file: - - //counterfeiter:generate . MyInterface - //counterfeiter:generate . MyOtherInterface - //counterfeiter:generate . MyThirdInterface - - # run counterfeiter - counterfeiter -generate - # writes "FakeMyInterface" to ./mypackagefakes/fake_my_interface.go - # writes "FakeMyOtherInterface" to ./mypackagefakes/fake_my_other_interface.go - # writes "FakeMyThirdInterface" to ./mypackagefakes/fake_my_third_interface.go - - -o - Path to the file or directory for the generated fakes. - This also determines the package name that will be used. - By default, the generated fakes will be generated in - the package "xyzfakes" which is nested in package "xyz", - where "xyz" is the name of referenced package. - - example: - # writes "FakeMyInterface" to ./mySpecialFakesDir/specialFake.go - counterfeiter -o ./mySpecialFakesDir/specialFake.go ./mypackage MyInterface - - # writes "FakeMyInterface" to ./mySpecialFakesDir/fake_my_interface.go - counterfeiter -o ./mySpecialFakesDir ./mypackage MyInterface - - -p - Package mode: When invoked in package mode, counterfeiter - will generate an interface and shim implementation from a - package in your module. Counterfeiter finds the public methods - in the package and adds those method signatures - to the generated interface . - - example: - # generates os.go (interface) and osshim.go (shim) in ${PWD}/osshim - counterfeiter -p os - # now generate fake in ${PWD}/osshim/os_fake (fake_os.go) - go generate osshim/... - - -header - Path to the file which should be used as a header for all generated fakes. - By default, no special header is used. - This is useful to e.g. add a licence header to every fake. - - If the generate mode is used and both the "go:generate" and the - "counterfeiter:generate" specify a header file, the header file from the - "counterfeiter:generate" line takes precedence. - - example: - # having the following code in a package ... - //go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -header ./generic.go.txt -generate - //counterfeiter:generate -header ./specific.go.txt . MyInterface - //counterfeiter:generate . MyOtherInterface - //counterfeiter:generate . MyThirdInterface - - # ... generating the fakes ... - go generate . - - # writes "FakeMyInterface" with ./specific.go.txt as a header - # writes "FakeMyOtherInterface" & "FakeMyThirdInterface" with ./generic.go.txt as a header - - --fake-name - Name of the fake struct to generate. By default, 'Fake' will - be prepended to the name of the original interface. (ignored in - -p mode) - - example: - # writes "CoolThing" to ./mypackagefakes/cool_thing.go - counterfeiter --fake-name CoolThing ./mypackage MyInterface -` diff --git a/sdk/vendor/github.com/maxbrunsfeld/counterfeiter/v6/command/runner.go b/sdk/vendor/github.com/maxbrunsfeld/counterfeiter/v6/command/runner.go deleted file mode 100644 index 161fc4b2f4..0000000000 --- a/sdk/vendor/github.com/maxbrunsfeld/counterfeiter/v6/command/runner.go +++ /dev/null @@ -1,117 +0,0 @@ -package command - -import ( - "fmt" - "go/build" - "os" - "path/filepath" - "sort" - "strconv" - "strings" -) - -func Detect(cwd string, args []string, generateMode bool) ([]Invocation, error) { - if generateMode { - return generateModeInvocations(cwd) - } - - file := os.Getenv("GOFILE") - var lineno int - if goline, err := strconv.Atoi(os.Getenv("GOLINE")); err == nil { - lineno = goline - } - - i, err := NewInvocation(file, lineno, args) - if err != nil { - return nil, err - } - return []Invocation{i}, nil -} - -type Invocation struct { - Args []string - Line int - File string -} - -func NewInvocation(file string, line int, args []string) (Invocation, error) { - if len(args) < 1 { - return Invocation{}, fmt.Errorf("%s:%v an invocation of counterfeiter must have arguments", file, line) - } - i := Invocation{ - File: file, - Line: line, - Args: args, - } - return i, nil -} - -func generateModeInvocations(cwd string) ([]Invocation, error) { - var result []Invocation - // Find all the go files - pkg, err := build.ImportDir(cwd, build.IgnoreVendor) - if err != nil { - return nil, err - } - - gofiles := make([]string, 0, len(pkg.GoFiles)+len(pkg.CgoFiles)+len(pkg.TestGoFiles)+len(pkg.XTestGoFiles)) - gofiles = append(gofiles, pkg.GoFiles...) - gofiles = append(gofiles, pkg.CgoFiles...) - gofiles = append(gofiles, pkg.TestGoFiles...) - gofiles = append(gofiles, pkg.XTestGoFiles...) - sort.Strings(gofiles) - - for _, file := range gofiles { - invocations, err := invocationsInFile(cwd, file) - if err != nil { - return nil, err - } - result = append(result, invocations...) - } - - return result, nil -} - -func invocationsInFile(dir string, file string) ([]Invocation, error) { - str, err := os.ReadFile(filepath.Join(dir, file)) - if err != nil { - return nil, err - } - lines := strings.Split(string(str), "\n") - - var result []Invocation - line := 0 - for i := range lines { - line++ - args, ok := matchForString(lines[i]) - if !ok { - continue - } - inv, err := NewInvocation(file, line, args) - if err != nil { - return nil, err - } - - result = append(result, inv) - } - - return result, nil -} - -const generateDirectivePrefix = "//counterfeiter:generate " - -func matchForString(s string) ([]string, bool) { - if !strings.HasPrefix(s, generateDirectivePrefix) { - return nil, false - } - return stringToArgs(s[len(generateDirectivePrefix):]), true -} - -func stringToArgs(s string) []string { - a := strings.Fields(s) - result := []string{ - "counterfeiter", - } - result = append(result, a...) - return result -} diff --git a/sdk/vendor/github.com/maxbrunsfeld/counterfeiter/v6/generator/fake.go b/sdk/vendor/github.com/maxbrunsfeld/counterfeiter/v6/generator/fake.go index bf88f18d79..5c2a6fd1ac 100644 --- a/sdk/vendor/github.com/maxbrunsfeld/counterfeiter/v6/generator/fake.go +++ b/sdk/vendor/github.com/maxbrunsfeld/counterfeiter/v6/generator/fake.go @@ -25,19 +25,22 @@ const ( // Fake is used to generate a Fake implementation of an interface. type Fake struct { - Packages []*packages.Package - Package *packages.Package - Target *types.TypeName - Mode FakeMode - DestinationPackage string - Name string - TargetAlias string - TargetName string - TargetPackage string - Imports Imports - Methods []Method - Function Method - Header string + Packages []*packages.Package + Package *packages.Package + Target *types.TypeName + Mode FakeMode + DestinationPackage string + Name string + GenericTypeParametersAndConstraints string + GenericTypeParameters string + GenericTypeConstraints string + TargetAlias string + TargetName string + TargetPackage string + Imports Imports + Methods []Method + Function Method + Header string } // Method is a method of the interface. diff --git a/sdk/vendor/github.com/maxbrunsfeld/counterfeiter/v6/generator/interface_template.go b/sdk/vendor/github.com/maxbrunsfeld/counterfeiter/v6/generator/interface_template.go index 1a8fde9b46..3be9c1a5c3 100644 --- a/sdk/vendor/github.com/maxbrunsfeld/counterfeiter/v6/generator/interface_template.go +++ b/sdk/vendor/github.com/maxbrunsfeld/counterfeiter/v6/generator/interface_template.go @@ -27,7 +27,7 @@ import ( {{- end}} ) -type {{.Name}} struct { +type {{.Name}}{{.GenericTypeParametersAndConstraints}} struct { {{- range .Methods}} {{.Name}}Stub func({{.Params.AsArgs}}) {{.Returns.AsReturnSignature}} {{UnExport .Name}}Mutex sync.RWMutex @@ -54,7 +54,7 @@ type {{.Name}} struct { } {{range .Methods -}} -func (fake *{{$.Name}}) {{.Name}}({{.Params.AsNamedArgsWithTypes}}) {{.Returns.AsReturnSignature}} { +func (fake *{{$.Name}}{{$.GenericTypeParameters}}) {{.Name}}({{.Params.AsNamedArgsWithTypes}}) {{.Returns.AsReturnSignature}} { {{- range .Params.Slices}} var {{UnExport .Name}}Copy {{.Type}} if {{UnExport .Name}} != nil { @@ -90,20 +90,20 @@ func (fake *{{$.Name}}) {{.Name}}({{.Params.AsNamedArgsWithTypes}}) {{.Returns.A {{- end}} } -func (fake *{{$.Name}}) {{Title .Name}}CallCount() int { +func (fake *{{$.Name}}{{$.GenericTypeParameters}}) {{Title .Name}}CallCount() int { fake.{{UnExport .Name}}Mutex.RLock() defer fake.{{UnExport .Name}}Mutex.RUnlock() return len(fake.{{UnExport .Name}}ArgsForCall) } -func (fake *{{$.Name}}) {{Title .Name}}Calls(stub func({{.Params.AsArgs}}) {{.Returns.AsReturnSignature}}) { +func (fake *{{$.Name}}{{$.GenericTypeParameters}}) {{Title .Name}}Calls(stub func({{.Params.AsArgs}}) {{.Returns.AsReturnSignature}}) { fake.{{UnExport .Name}}Mutex.Lock() defer fake.{{UnExport .Name}}Mutex.Unlock() fake.{{.Name}}Stub = stub } {{if .Params.HasLength -}} -func (fake *{{$.Name}}) {{Title .Name}}ArgsForCall(i int) {{.Params.AsReturnSignature}} { +func (fake *{{$.Name}}{{$.GenericTypeParameters}}) {{Title .Name}}ArgsForCall(i int) {{.Params.AsReturnSignature}} { fake.{{UnExport .Name}}Mutex.RLock() defer fake.{{UnExport .Name}}Mutex.RUnlock() argsForCall := fake.{{UnExport .Name}}ArgsForCall[i] @@ -112,7 +112,7 @@ func (fake *{{$.Name}}) {{Title .Name}}ArgsForCall(i int) {{.Params.AsReturnSign {{- end}} {{if .Returns.HasLength -}} -func (fake *{{$.Name}}) {{Title .Name}}Returns({{.Returns.AsNamedArgsWithTypes}}) { +func (fake *{{$.Name}}{{$.GenericTypeParameters}}) {{Title .Name}}Returns({{.Returns.AsNamedArgsWithTypes}}) { fake.{{UnExport .Name}}Mutex.Lock() defer fake.{{UnExport .Name}}Mutex.Unlock() fake.{{.Name}}Stub = nil @@ -123,7 +123,7 @@ func (fake *{{$.Name}}) {{Title .Name}}Returns({{.Returns.AsNamedArgsWithTypes}} }{ {{- .Returns.AsNamedArgs -}} } } -func (fake *{{$.Name}}) {{Title .Name}}ReturnsOnCall(i int, {{.Returns.AsNamedArgsWithTypes}}) { +func (fake *{{$.Name}}{{$.GenericTypeParameters}}) {{Title .Name}}ReturnsOnCall(i int, {{.Returns.AsNamedArgsWithTypes}}) { fake.{{UnExport .Name}}Mutex.Lock() defer fake.{{UnExport .Name}}Mutex.Unlock() fake.{{.Name}}Stub = nil @@ -144,7 +144,7 @@ func (fake *{{$.Name}}) {{Title .Name}}ReturnsOnCall(i int, {{.Returns.AsNamedAr {{end -}} {{end}} -func (fake *{{.Name}}) Invocations() map[string][][]interface{} { +func (fake *{{.Name}}{{$.GenericTypeParameters}}) Invocations() map[string][][]interface{} { fake.invocationsMutex.RLock() defer fake.invocationsMutex.RUnlock() {{- range .Methods}} @@ -158,7 +158,7 @@ func (fake *{{.Name}}) Invocations() map[string][][]interface{} { return copiedInvocations } -func (fake *{{.Name}}) recordInvocation(key string, args []interface{}) { +func (fake *{{.Name}}{{$.GenericTypeParameters}}) recordInvocation(key string, args []interface{}) { fake.invocationsMutex.Lock() defer fake.invocationsMutex.Unlock() if fake.invocations == nil { @@ -171,6 +171,6 @@ func (fake *{{.Name}}) recordInvocation(key string, args []interface{}) { } {{if IsExported .TargetName -}} -var _ {{.TargetAlias}}.{{.TargetName}} = new({{.Name}}) +var _ {{.TargetAlias}}.{{.TargetName}}{{.GenericTypeConstraints}} = new({{.Name}}{{.GenericTypeConstraints}}) {{- end}} ` diff --git a/sdk/vendor/github.com/maxbrunsfeld/counterfeiter/v6/generator/loader.go b/sdk/vendor/github.com/maxbrunsfeld/counterfeiter/v6/generator/loader.go index 4a8695b1ed..106ddfbd58 100644 --- a/sdk/vendor/github.com/maxbrunsfeld/counterfeiter/v6/generator/loader.go +++ b/sdk/vendor/github.com/maxbrunsfeld/counterfeiter/v6/generator/loader.go @@ -57,9 +57,34 @@ func (f *Fake) loadPackages(c Cacher, workingDir string) error { return nil } +func (f *Fake) getGenericTypeData(typeName *types.TypeName) (paramNames []string, constraintNames []string, paramAndConstraintNames []string, found bool) { + if named, ok := typeName.Type().(*types.Named); ok { + if _, ok := named.Underlying().(*types.Interface); ok { + typeParams := named.TypeParams() + if typeParams.Len() > 0 { + for i := 0; i < typeParams.Len(); i++ { + param := typeParams.At(i) + paramName := param.Obj().Name() + constraint := param.Constraint() + constraintSections := strings.Split(constraint.String(), "/") + constraintName := constraintSections[len(constraintSections)-1] + paramNames = append(paramNames, paramName) + constraintNames = append(constraintNames, constraintName) + paramAndConstraintNames = append(paramAndConstraintNames, fmt.Sprintf("%s %s", paramName, constraintName)) + found = true + } + } + } + } + return +} + func (f *Fake) findPackage() error { var target *types.TypeName var pkg *packages.Package + genericTypeParametersAndConstraints := []string{} + genericTypeConstraints := []string{} + genericTypeParameters := []string{} for i := range f.Packages { if f.Packages[i].Types == nil || f.Packages[i].Types.Scope() == nil { continue @@ -72,6 +97,15 @@ func (f *Fake) findPackage() error { raw := pkg.Types.Scope().Lookup(f.TargetName) if raw != nil { if typeName, ok := raw.(*types.TypeName); ok { + if paramNames, constraintNames, paramAndConstraintNames, found := f.getGenericTypeData(typeName); found { + genericTypeParameters = append(genericTypeParameters, paramNames...) + genericTypeConstraints = append(genericTypeConstraints, constraintNames...) + genericTypeParametersAndConstraints = append( + genericTypeParametersAndConstraints, + paramAndConstraintNames..., + ) + } + target = typeName break } @@ -89,6 +123,11 @@ func (f *Fake) findPackage() error { f.Target = target f.Package = pkg f.TargetPackage = imports.VendorlessPath(pkg.PkgPath) + if len(genericTypeParameters) > 0 { + f.GenericTypeParametersAndConstraints = fmt.Sprintf("[%s]", strings.Join(genericTypeParametersAndConstraints, ", ")) + f.GenericTypeParameters = fmt.Sprintf("[%s]", strings.Join(genericTypeParameters, ", ")) + f.GenericTypeConstraints = fmt.Sprintf("[%s]", strings.Join(genericTypeConstraints, ", ")) + } t := f.Imports.Add(pkg.Name, f.TargetPackage) f.TargetAlias = t.Alias if f.Mode != Package { @@ -97,7 +136,7 @@ func (f *Fake) findPackage() error { if f.Mode == InterfaceOrFunction { if !f.IsInterface() && !f.IsFunction() { - return fmt.Errorf("cannot generate an fake for %s because it is not an interface or function", f.TargetName) + return fmt.Errorf("cannot generate a fake for %s because it is not an interface or function", f.TargetName) } } @@ -130,14 +169,10 @@ func (f *Fake) addImportsFor(typ types.Type) { f.addImportsFor(t.Elem()) case *types.Chan: f.addImportsFor(t.Elem()) + case *types.Alias: + f.addImportsForNamedType(t) case *types.Named: - if t.Obj() != nil && t.Obj().Pkg() != nil { - typeArgs := t.TypeArgs() - for i := 0; i < typeArgs.Len(); i++ { - f.addImportsFor(typeArgs.At(i)) - } - f.Imports.Add(t.Obj().Pkg().Name(), t.Obj().Pkg().Path()) - } + f.addImportsForNamedType(t) case *types.Slice: f.addImportsFor(t.Elem()) case *types.Array: @@ -154,3 +189,16 @@ func (f *Fake) addImportsFor(typ types.Type) { log.Printf("!!! WARNING: Missing case for type %s\n", reflect.TypeOf(typ).String()) } } + +func (f *Fake) addImportsForNamedType(t interface { + Obj() *types.TypeName + TypeArgs() *types.TypeList +}) { + if t.Obj() != nil && t.Obj().Pkg() != nil { + typeArgs := t.TypeArgs() + for i := 0; i < typeArgs.Len(); i++ { + f.addImportsFor(typeArgs.At(i)) + } + f.Imports.Add(t.Obj().Pkg().Name(), t.Obj().Pkg().Path()) + } +} diff --git a/sdk/vendor/github.com/maxbrunsfeld/counterfeiter/v6/main.go b/sdk/vendor/github.com/maxbrunsfeld/counterfeiter/v6/main.go deleted file mode 100644 index fcaf995a6f..0000000000 --- a/sdk/vendor/github.com/maxbrunsfeld/counterfeiter/v6/main.go +++ /dev/null @@ -1,207 +0,0 @@ -package main - -import ( - "errors" - "fmt" - "go/format" - "io" - "log" - "os" - "path/filepath" - "runtime/debug" - "runtime/pprof" - - "github.com/maxbrunsfeld/counterfeiter/v6/arguments" - "github.com/maxbrunsfeld/counterfeiter/v6/command" - "github.com/maxbrunsfeld/counterfeiter/v6/generator" -) - -func main() { - debug.SetGCPercent(-1) - - if err := run(); err != nil { - fail("%v", err) - } -} - -func run() error { - profile := os.Getenv("COUNTERFEITER_PROFILE") != "" - if profile { - p, err := filepath.Abs(filepath.Join(".", "counterfeiter.profile")) - if err != nil { - return err - } - f, err := os.Create(p) - if err != nil { - return err - } - if err := pprof.StartCPUProfile(f); err != nil { - return err - } - fmt.Printf("Profile: %s\n", p) - defer pprof.StopCPUProfile() - } - - log.SetFlags(log.Lshortfile) - if !isDebug() { - log.SetOutput(io.Discard) - } - - cwd, err := os.Getwd() - if err != nil { - return errors.New("Error - couldn't determine current working directory") - } - - var cache generator.Cacher - var headerReader generator.FileReader - if disableCache() { - cache = &generator.FakeCache{} - headerReader = &generator.SimpleFileReader{} - } else { - cache = &generator.Cache{} - headerReader = &generator.CachedFileReader{} - } - var invocations []command.Invocation - var args *arguments.ParsedArguments - args, _ = arguments.New(os.Args, cwd, filepath.EvalSymlinks, os.Stat) - generateMode := false - if args != nil { - generateMode = args.GenerateMode - } - if !generateMode && shouldPrintGenerateWarning() { - fmt.Printf("\nWARNING: Invoking counterfeiter multiple times from \"go generate\" is slow.\nConsider using counterfeiter:generate directives to speed things up.\nSee https://github.com/maxbrunsfeld/counterfeiter#step-2b---add-counterfeitergenerate-directives for more information.\nSet the \"COUNTERFEITER_NO_GENERATE_WARNING\" environment variable to suppress this message.\n\n") - } - invocations, err = command.Detect(cwd, os.Args, generateMode) - if err != nil { - return err - } - - for i := range invocations { - a, err := arguments.New(invocations[i].Args, cwd, filepath.EvalSymlinks, os.Stat) - if err != nil { - return err - } - - // If the '//counterfeiter:generate ...' line does not have a '-header' - // flag, we use the one from the "global" - // '//go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -generate -header /some/header.txt' - // line (which defaults to none). By doing so, we can configure the header - // once per package, which is probably the most common case for adding - // licence headers (i.e. all the fakes will have the same licence headers). - a.HeaderFile = or(a.HeaderFile, args.HeaderFile) - - err = generate(cwd, a, cache, headerReader) - if err != nil { - return err - } - } - return nil -} - -func or(opts ...string) string { - for _, s := range opts { - if s != "" { - return s - } - } - return "" -} - -func isDebug() bool { - return os.Getenv("COUNTERFEITER_DEBUG") != "" -} - -func disableCache() bool { - return os.Getenv("COUNTERFEITER_DISABLECACHE") != "" -} - -func shouldPrintGenerateWarning() bool { - return invokedByGoGenerate() && os.Getenv("COUNTERFEITER_NO_GENERATE_WARNING") == "" -} - -func invokedByGoGenerate() bool { - return os.Getenv("DOLLAR") == "$" -} - -func generate(workingDir string, args *arguments.ParsedArguments, cache generator.Cacher, headerReader generator.FileReader) error { - if !args.Quiet { - if err := reportStarting(workingDir, args.OutputPath, args.FakeImplName); err != nil { - return err - } - } - - b, err := doGenerate(workingDir, args, cache, headerReader) - if err != nil { - return err - } - - if err := printCode(b, args.OutputPath, args.PrintToStdOut); err != nil { - return err - } - - if !args.Quiet { - fmt.Fprint(os.Stderr, "Done\n") - } - - return nil -} - -func doGenerate(workingDir string, args *arguments.ParsedArguments, cache generator.Cacher, headerReader generator.FileReader) ([]byte, error) { - mode := generator.InterfaceOrFunction - if args.GenerateInterfaceAndShimFromPackageDirectory { - mode = generator.Package - } - - headerContent, err := headerReader.Get(workingDir, args.HeaderFile) - if err != nil { - return nil, err - } - - f, err := generator.NewFake(mode, args.InterfaceName, args.PackagePath, args.FakeImplName, args.DestinationPackageName, headerContent, workingDir, cache) - if err != nil { - return nil, err - } - return f.Generate(true) -} - -func printCode(code []byte, outputPath string, printToStdOut bool) error { - formattedCode, err := format.Source(code) - if err != nil { - return err - } - - if printToStdOut { - fmt.Println(string(formattedCode)) - return nil - } - _ = os.MkdirAll(filepath.Dir(outputPath), 0777) - file, err := os.Create(outputPath) - if err != nil { - return fmt.Errorf("Couldn't create fake file - %v", err) - } - - _, err = file.Write(formattedCode) - if err != nil { - return fmt.Errorf("Couldn't write to fake file - %v", err) - } - return nil -} - -func reportStarting(workingDir string, outputPath, fakeName string) error { - rel, err := filepath.Rel(workingDir, outputPath) - if err != nil { - return err - } - - msg := fmt.Sprintf("Writing `%s` to `%s`... ", fakeName, rel) - if isDebug() { - msg = msg + "\n" - } - fmt.Fprint(os.Stderr, msg) - return nil -} - -func fail(s string, args ...interface{}) { - fmt.Printf("\n"+s+"\n", args...) - os.Exit(1) -} diff --git a/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/.gitignore b/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/.gitignore index 82c668079f..e8838f9fa9 100644 --- a/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/.gitignore +++ b/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/.gitignore @@ -16,9 +16,6 @@ __pycache__/ *.out coverage.* -# Kubernetes Generated files - skip generated files, except for vendored files -!vendor/**/zz_generated.* - # editor and IDE paraphernalia .idea .vscode diff --git a/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/.golangci.yml b/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/.golangci.yml index 7888e9f1a6..593c5b9d06 100644 --- a/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/.golangci.yml +++ b/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/.golangci.yml @@ -40,9 +40,10 @@ linters: run: # 10 minute timeout for analysis timeout: 10m - modules-download-mode: vendor + modules-download-mode: mod skip-dirs-use-default: true + # Specific linter settings linters-settings: gocyclo: @@ -62,6 +63,9 @@ linters-settings: local-prefixes: gitswarm.f5net.com/indigo,gitlab.com/f5 errcheck: ignore: ^Close.*,os:^Setenv.*,fmt:.*,io/ioutil:^Read.*,github.com/spf13/viper:.*,github.com/pkg/errors:^Wrap.* + funclen: + skip-ifles: + - ".*\\.gen\\.go" lll: line-length: 140 diff --git a/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/Makefile b/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/Makefile index aada8bcacb..80ee2c08e4 100644 --- a/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/Makefile +++ b/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/Makefile @@ -1,6 +1,5 @@ PACKAGE = $(notdir $(patsubst %/,%,$(dir $(realpath $(lastword $(MAKEFILE_LIST)))))) OUT_DIR ?= build -VENDOR_DIR ?= vendor RESULTS_DIR ?= results DOCKER_REGISTRY ?= local DOCKER_TAG ?= latest @@ -25,7 +24,6 @@ deps: go mod download go mod tidy go mod verify - go mod vendor deps-upgrade: GOFLAGS="" go get -u ./... @@ -36,7 +34,7 @@ deps-upgrade: ####################################### fmt: $(info Running goimports...) - @goimports -w -e $$(find . -type f -name '*.go' -not -path "./vendor/*") + @goimports -w -e $$(find . -type f -name '*.go') test: $(info Running unit tests...) @@ -60,7 +58,7 @@ lint-docker: docker run --rm -v "${PWD}":/app -w /app golangci/golangci-lint:v1.51.2 golangci-lint run lint-shell: - shellcheck -x $$(find . -name "*.sh" -type f -not -path "./vendor/*") + shellcheck -x $$(find . -name "*.sh" -type f) gen: go generate -x ./... diff --git a/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/README.md b/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/README.md index 3f84bce266..e75f02cf44 100644 --- a/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/README.md +++ b/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/README.md @@ -74,7 +74,9 @@ func main() { ``` # Generate support for third-party modules -This is an example that takes the path of a third-party module source code to generate support for it. Assume the source code path of that module is `./src`. You can call `go run cmd/generate/main.go ./src`. The stdout will be like +This is a simple example that takes the path of a third-party module source code to generate support for it. For detailed usage of the tool, please run +`go run ./cmd/generate/ --help`. +Assuming the source code path of that module is `./src`, you can call `go run ./cmd/generate/ --src-path=./src -directive-map-name=directives -match-func-name=Match -match-func-comment=comment`. The output will be similar to: ```go /** @@ -107,8 +109,7 @@ var directives = map[string][]uint{ }, } -// Match is a matchFunc for parsing an NGINX config that contains the -// preceding directives. +// comment func Match(directive string) ([]uint, bool) { m, ok := directives[directive] return m, ok diff --git a/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze.go b/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze.go index d453b3d67e..e1127b2da7 100644 --- a/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze.go +++ b/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze.go @@ -7,6 +7,39 @@ package crossplane +// Upgrade for .gen.go files. If you don't have access to some private modules, +// please use -skip options to skip them. e.g. go generate -skip="nap". + +// Update for headersmore +//go:generate sh -c "sh ./scripts/generate/generate.sh --url https://github.com/openresty/headers-more-nginx-module.git --config-path ./scripts/generate/configs/headersmore_config.json > ./analyze_headersMore_directives.gen.go" + +// Update for njs +//go:generate sh -c "sh ./scripts/generate/generate.sh --url https://github.com/nginx/njs.git --config-path ./scripts/generate/configs/njs_config.json > ./analyze_njs_directives.gen.go" + +// Update for OSS, filter in config is the directives not in https://nginx.org/en/docs/dirindex.html but in source code. +// Override in config is for the "if" directive. We create a bitmask ngxConfExpr for it in crossplane, which is not in source code. +//go:generate sh -c "sh ./scripts/generate/generate.sh --url https://github.com/nginx/nginx.git --config-path ./scripts/generate/configs/oss_latest_config.json > ./analyze_oss_latest_directives.gen.go" +//go:generate sh -c "sh ./scripts/generate/generate.sh --url https://github.com/nginx/nginx.git --config-path ./scripts/generate/configs/oss_126_config.json --branch branches/stable-1.26 > ./analyze_oss_126_directives.gen.go" +//go:generate sh -c "sh ./scripts/generate/generate.sh --url https://github.com/nginx/nginx.git --config-path ./scripts/generate/configs/oss_124_config.json --branch branches/stable-1.24 > ./analyze_oss_124_directives.gen.go" + +// Update for lua, override is for the lua block directives, see https://github.com/nginxinc/nginx-go-crossplane/pull/86. +//go:generate sh -c "sh ./scripts/generate/generate.sh --url https://github.com/openresty/lua-nginx-module.git --config-path ./scripts/generate/configs/lua_config.json --path ./src > ./analyze_lua_directives.gen.go" + +// Update for otel. Filter is for some directives withou context. +// Otel provides its own config handler for some directives and they don't have context. Currently we don't support them. +//go:generate sh -c "sh ./scripts/generate/generate.sh --url https://github.com/nginxinc/nginx-otel.git --config-path ./scripts/generate/configs/otel_config.json --branch main > ./analyze_otel_directives.gen.go" + +// Update for NAP v4 and v5. +// NAP is a private module. Please ensure you have correct access and put the url. +// and branch of it in environment variable NAP_URL, NAP_V4_BRANCH, and NAP_V5_BRANCH. +// Override is for flag dirctives. NAP used ngxConfTake1 for flag directives, we change them to ngxConfFlag in crossplane. +// NAP v4 +//go:generate sh -c "sh ./scripts/generate/generate.sh --url $NAP_URL --config-path ./scripts/generate/configs/nap_v4_config.json --branch $NAP_V4_BRANCH --path ./src > analyze_appProtectWAFv4_directives.gen.go" +// NAP v5 +//go:generate sh -c "sh ./scripts/generate/generate.sh --url $NAP_URL --config-path ./scripts/generate/configs/nap_v5_config.json --branch $NAP_V5_BRANCH --path ./src > analyze_appProtectWAFv5_directives.gen.go" + +// Update for geoip2 +//go:generate sh -c "sh ./scripts/generate/generate.sh --url https://github.com/leev/ngx_http_geoip2_module.git --config-path ./scripts/generate/configs/geoip2_config.json > ./analyze_geoip2_directives.gen.go" import ( "fmt" ) @@ -219,7 +252,7 @@ func unionBitmaskMaps(maps ...map[string][]uint) map[string][]uint { // not provided. It is union of latest Nplus, Njs, and Otel. // //nolint:gochecknoglobals -var defaultDirectives = unionBitmaskMaps(ngxPlusLatestDirectives, moduleNjsDirectives, moduleOtelDirectives) +var defaultDirectives = unionBitmaskMaps(nginxPlusLatestDirectives, njsDirectives, otelDirectives) func DefaultDirectivesMatchFunc(directive string) ([]uint, bool) { masks, matched := defaultDirectives[directive] diff --git a/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_appProtectWAFv4_directives.gen.go b/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_appProtectWAFv4_directives.gen.go new file mode 100644 index 0000000000..c639b73fb4 --- /dev/null +++ b/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_appProtectWAFv4_directives.gen.go @@ -0,0 +1,88 @@ +/** + * Copyright (c) F5, Inc. + * + * This source code is licensed under the Apache License, Version 2.0 license found in the + * LICENSE file in the root directory of this source tree. + */ + +// Code generated by generator; DO NOT EDIT. +// All the definitions are extracted from the source code +// Each bit mask describes these behaviors: +// - how many arguments the directive can take +// - whether or not it is a block directive +// - whether this is a flag (takes one argument that's either "on" or "off") +// - which contexts it's allowed to be in + +package crossplane + +var appProtectWAFv4Directives = map[string][]uint{ + "app_protect_app_name": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "app_protect_compressed_requests_action": { + ngxHTTPMainConf | ngxConfTake1, + }, + "app_protect_config_set_timeout": { + ngxHTTPMainConf | ngxConfTake1, + }, + "app_protect_cookie_seed": { + ngxHTTPMainConf | ngxConfTake1, + }, + "app_protect_cpu_thresholds": { + ngxHTTPMainConf | ngxConfTake2, + }, + "app_protect_custom_log_attribute": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + }, + "app_protect_enable": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "app_protect_enforcer_address": { + ngxHTTPMainConf | ngxConfTake1, + }, + "app_protect_enforcer_memory_limit_mb": { + ngxHTTPMainConf | ngxConfTake1, + }, + "app_protect_failure_mode_action": { + ngxHTTPMainConf | ngxConfTake1, + }, + "app_protect_global_settings": { + ngxHTTPMainConf | ngxConfTake1, + }, + "app_protect_logging_str": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "app_protect_physical_memory_util_thresholds": { + ngxHTTPMainConf | ngxConfTake2, + }, + "app_protect_policy_file": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "app_protect_reconnect_period_seconds": { + ngxHTTPMainConf | ngxConfTake1, + }, + "app_protect_request_buffer_overflow_action": { + ngxHTTPMainConf | ngxConfTake1, + }, + "app_protect_response_enforcement_disable": { + ngxHTTPMainConf | ngxConfTake1, + }, + "app_protect_security_log": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + }, + "app_protect_security_log_enable": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "app_protect_streaming_buffer_watermarks": { + ngxHTTPMainConf | ngxConfTake2, + }, + "app_protect_user_defined_signatures": { + ngxHTTPMainConf | ngxConfTake1, + }, +} + +// MatchAppProtectWAFv4 is a MatchFunc for App Protect v4 module. +func MatchAppProtectWAFv4(directive string) ([]uint, bool) { + m, ok := appProtectWAFv4Directives[directive] + return m, ok +} diff --git a/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_appProtectWAFv4_directives.go b/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_appProtectWAFv4_directives.go deleted file mode 100644 index 4ef764f6f9..0000000000 --- a/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_appProtectWAFv4_directives.go +++ /dev/null @@ -1,51 +0,0 @@ -package crossplane - -// nginx app protect specific and global directives, inferred from -// [https://docs.nginx.com/nginx-app-protect/configuration-guide/configuration/#directives] - -//nolint:gochecknoglobals -var appProtectWAFv4Directives = map[string][]uint{ - "app_protect_compressed_requests_action": { - ngxHTTPMainConf | ngxConfTake1, - }, - "app_protect_cookie_seed": { - ngxHTTPMainConf | ngxConfTake1, - }, - "app_protect_cpu_thresholds": { - ngxHTTPMainConf | ngxConfTake2, - }, - "app_protect_enable": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "app_protect_failure_mode_action": { - ngxHTTPMainConf | ngxConfTake1, - }, - "app_protect_physical_memory_util_thresholds": { - ngxHTTPMainConf | ngxConfTake2, - }, - "app_protect_policy_file": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "app_protect_reconnect_period_seconds": { - ngxHTTPMainConf | ngxConfTake1, - }, - "app_protect_request_buffer_overflow_action": { - ngxHTTPMainConf | ngxConfTake1, - }, - "app_protect_security_log_enable": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "app_protect_security_log": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - }, - "app_protect_user_defined_signatures": { - ngxHTTPMainConf | ngxConfTake1, - }, -} - -// AppProtectWAFv4DirectivesMatchFn is a match function for parsing an NGINX config that contains the -// App Protect v4 module. -func AppProtectWAFv4DirectivesMatchFn(directive string) ([]uint, bool) { - masks, matched := appProtectWAFv4Directives[directive] - return masks, matched -} diff --git a/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_appProtectWAFv5_directives.gen.go b/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_appProtectWAFv5_directives.gen.go new file mode 100644 index 0000000000..4601a25a1e --- /dev/null +++ b/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_appProtectWAFv5_directives.gen.go @@ -0,0 +1,88 @@ +/** + * Copyright (c) F5, Inc. + * + * This source code is licensed under the Apache License, Version 2.0 license found in the + * LICENSE file in the root directory of this source tree. + */ + +// Code generated by generator; DO NOT EDIT. +// All the definitions are extracted from the source code +// Each bit mask describes these behaviors: +// - how many arguments the directive can take +// - whether or not it is a block directive +// - whether this is a flag (takes one argument that's either "on" or "off") +// - which contexts it's allowed to be in + +package crossplane + +var appProtectWAFv5Directives = map[string][]uint{ + "app_protect_app_name": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "app_protect_compressed_requests_action": { + ngxHTTPMainConf | ngxConfTake1, + }, + "app_protect_config_set_timeout": { + ngxHTTPMainConf | ngxConfTake1, + }, + "app_protect_cookie_seed": { + ngxHTTPMainConf | ngxConfTake1, + }, + "app_protect_cpu_thresholds": { + ngxHTTPMainConf | ngxConfTake2, + }, + "app_protect_custom_log_attribute": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + }, + "app_protect_enable": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "app_protect_enforcer_address": { + ngxHTTPMainConf | ngxConfTake1, + }, + "app_protect_enforcer_memory_limit_mb": { + ngxHTTPMainConf | ngxConfTake1, + }, + "app_protect_failure_mode_action": { + ngxHTTPMainConf | ngxConfTake1, + }, + "app_protect_global_settings": { + ngxHTTPMainConf | ngxConfTake1, + }, + "app_protect_logging_str": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "app_protect_physical_memory_util_thresholds": { + ngxHTTPMainConf | ngxConfTake2, + }, + "app_protect_policy_file": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "app_protect_reconnect_period_seconds": { + ngxHTTPMainConf | ngxConfTake1, + }, + "app_protect_request_buffer_overflow_action": { + ngxHTTPMainConf | ngxConfTake1, + }, + "app_protect_response_enforcement_disable": { + ngxHTTPMainConf | ngxConfTake1, + }, + "app_protect_security_log": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + }, + "app_protect_security_log_enable": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "app_protect_streaming_buffer_watermarks": { + ngxHTTPMainConf | ngxConfTake2, + }, + "app_protect_user_defined_signatures": { + ngxHTTPMainConf | ngxConfTake1, + }, +} + +// MatchAppProtectWAFv5 is a MatchFunc for App Protect v5 module. +func MatchAppProtectWAFv5(directive string) ([]uint, bool) { + m, ok := appProtectWAFv5Directives[directive] + return m, ok +} diff --git a/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_appProtectWAFv5_directives.go b/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_appProtectWAFv5_directives.go deleted file mode 100644 index bba7faa142..0000000000 --- a/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_appProtectWAFv5_directives.go +++ /dev/null @@ -1,51 +0,0 @@ -package crossplane - -// nginx app protect specific and global directives, inferred from -// [https://docs.nginx.com/nginx-app-protect/configuration-guide/configuration/#directives] - -//nolint:gochecknoglobals -var appProtectWAFv5Directives = map[string][]uint{ - "app_protect_physical_memory_util_thresholds": { - ngxHTTPMainConf | ngxConfTake2, - }, - "app_protect_cpu_thresholds": { - ngxHTTPMainConf | ngxConfTake2, - }, - "app_protect_failure_mode_action": { - ngxHTTPMainConf | ngxConfTake1, - }, - "app_protect_cookie_seed": { - ngxHTTPMainConf | ngxConfTake1, - }, - "app_protect_request_buffer_overflow_action": { - ngxHTTPMainConf | ngxConfTake1, - }, - "app_protect_reconnect_period_seconds": { - ngxHTTPMainConf | ngxConfTake1, - }, - "app_protect_enforcer_address": { - ngxHTTPMainConf | ngxConfTake1, - }, - "app_protect_enable": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "app_protect_policy_file": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "app_protect_security_log_enable": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "app_protect_security_log": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - }, - "app_protect_custom_log_attribute": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - }, -} - -// AppProtectWAFv5DirectivesMatchFn is a match function for parsing an NGINX config that contains the -// App Protect v5 module. -func AppProtectWAFv5DirectivesMatchFn(directive string) ([]uint, bool) { - masks, matched := appProtectWAFv5Directives[directive] - return masks, matched -} diff --git a/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_geoip2_directives.gen.go b/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_geoip2_directives.gen.go new file mode 100644 index 0000000000..998d61a948 --- /dev/null +++ b/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_geoip2_directives.gen.go @@ -0,0 +1,35 @@ +/** + * Copyright (c) F5, Inc. + * + * This source code is licensed under the Apache License, Version 2.0 license found in the + * LICENSE file in the root directory of this source tree. + */ + +// Code generated by generator; DO NOT EDIT. +// All the definitions are extracted from the source code +// Each bit mask describes these behaviors: +// - how many arguments the directive can take +// - whether or not it is a block directive +// - whether this is a flag (takes one argument that's either "on" or "off") +// - which contexts it's allowed to be in + +package crossplane + +var geoip2Directives = map[string][]uint{ + "geoip2": { + ngxHTTPMainConf | ngxConfBlock | ngxConfTake1, + ngxStreamMainConf | ngxConfBlock | ngxConfTake1, + }, + "geoip2_proxy": { + ngxHTTPMainConf | ngxConfTake1, + }, + "geoip2_proxy_recursive": { + ngxHTTPMainConf | ngxConfFlag, + }, +} + +// MatchGeoip2Latest is a MatchFunc for the latest version of geoip2. +func MatchGeoip2Latest(directive string) ([]uint, bool) { + m, ok := geoip2Directives[directive] + return m, ok +} diff --git a/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_headersMore_directives.gen.go b/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_headersMore_directives.gen.go new file mode 100644 index 0000000000..462a81bd82 --- /dev/null +++ b/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_headersMore_directives.gen.go @@ -0,0 +1,37 @@ +/** + * Copyright (c) F5, Inc. + * + * This source code is licensed under the Apache License, Version 2.0 license found in the + * LICENSE file in the root directory of this source tree. + */ + +// Code generated by generator; DO NOT EDIT. +// All the definitions are extracted from the source code +// Each bit mask describes these behaviors: +// - how many arguments the directive can take +// - whether or not it is a block directive +// - whether this is a flag (takes one argument that's either "on" or "off") +// - which contexts it's allowed to be in + +package crossplane + +var headersMoreDirectives = map[string][]uint{ + "more_clear_headers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf1More, + }, + "more_clear_input_headers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf1More, + }, + "more_set_headers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf1More, + }, + "more_set_input_headers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf1More, + }, +} + +// MatchHeadersMoreLatest is a MatchFunc for the latest version of headersmore. +func MatchHeadersMoreLatest(directive string) ([]uint, bool) { + m, ok := headersMoreDirectives[directive] + return m, ok +} diff --git a/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_headersMore_directives.go b/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_headersMore_directives.go deleted file mode 100644 index d32558dfb9..0000000000 --- a/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_headersMore_directives.go +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Copyright (c) F5, Inc. - * - * This source code is licensed under the Apache License, Version 2.0 license found in the - * LICENSE file in the root directory of this source tree. - */ - -// All the definitions are extracted from the source code -// Each bit mask describes these behaviors: -// - how many arguments the directive can take -// - whether or not it is a block directive -// - whether this is a flag (takes one argument that's either "on" or "off") -// - which contexts it's allowed to be in - -package crossplane - -//nolint:gochecknoglobals -var moduleHeadersMoreDirectives = map[string][]uint{ - "more_clear_headers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf1More, - }, - "more_clear_input_headers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf1More, - }, - "more_set_headers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf1More, - }, - "more_set_input_headers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf1More, - }, -} - -func HeadersMoreDirectivesMatchFn(directive string) ([]uint, bool) { - masks, matched := moduleHeadersMoreDirectives[directive] - return masks, matched -} diff --git a/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_lua_directives.gen.go b/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_lua_directives.gen.go new file mode 100644 index 0000000000..d30e0b29d1 --- /dev/null +++ b/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_lua_directives.gen.go @@ -0,0 +1,262 @@ +/** + * Copyright (c) F5, Inc. + * + * This source code is licensed under the Apache License, Version 2.0 license found in the + * LICENSE file in the root directory of this source tree. + */ + +// Code generated by generator; DO NOT EDIT. +// All the definitions are extracted from the source code +// Each bit mask describes these behaviors: +// - how many arguments the directive can take +// - whether or not it is a block directive +// - whether this is a flag (takes one argument that's either "on" or "off") +// - which contexts it's allowed to be in + +package crossplane + +var luaDirectives = map[string][]uint{ + "access_by_lua": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, + }, + "access_by_lua_block": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, + }, + "access_by_lua_file": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, + }, + "access_by_lua_no_postpone": { + ngxHTTPMainConf | ngxConfFlag, + }, + "balancer_by_lua_block": { + ngxHTTPUpsConf | ngxConfTake1, + }, + "balancer_by_lua_file": { + ngxHTTPUpsConf | ngxConfTake1, + }, + "balancer_keepalive": { + ngxHTTPUpsConf | ngxConfTake1, + }, + "body_filter_by_lua": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, + }, + "body_filter_by_lua_block": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, + }, + "body_filter_by_lua_file": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, + }, + "content_by_lua": { + ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, + }, + "content_by_lua_block": { + ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, + }, + "content_by_lua_file": { + ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, + }, + "exit_worker_by_lua_block": { + ngxHTTPMainConf | ngxConfTake1, + }, + "exit_worker_by_lua_file": { + ngxHTTPMainConf | ngxConfTake1, + }, + "header_filter_by_lua": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, + }, + "header_filter_by_lua_block": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, + }, + "header_filter_by_lua_file": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, + }, + "init_by_lua": { + ngxHTTPMainConf | ngxConfTake1, + }, + "init_by_lua_block": { + ngxHTTPMainConf | ngxConfTake1, + }, + "init_by_lua_file": { + ngxHTTPMainConf | ngxConfTake1, + }, + "init_worker_by_lua": { + ngxHTTPMainConf | ngxConfTake1, + }, + "init_worker_by_lua_block": { + ngxHTTPMainConf | ngxConfTake1, + }, + "init_worker_by_lua_file": { + ngxHTTPMainConf | ngxConfTake1, + }, + "log_by_lua": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, + }, + "log_by_lua_block": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, + }, + "log_by_lua_file": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, + }, + "lua_capture_error_log": { + ngxHTTPMainConf | ngxConfTake1, + }, + "lua_check_client_abort": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag, + }, + "lua_code_cache": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag, + }, + "lua_http10_buffering": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag, + }, + "lua_load_resty_core": { + ngxHTTPMainConf | ngxConfFlag, + }, + "lua_malloc_trim": { + ngxHTTPMainConf | ngxConfTake1, + }, + "lua_max_pending_timers": { + ngxHTTPMainConf | ngxConfTake1, + }, + "lua_max_running_timers": { + ngxHTTPMainConf | ngxConfTake1, + }, + "lua_need_request_body": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag, + }, + "lua_package_cpath": { + ngxHTTPMainConf | ngxConfTake1, + }, + "lua_package_path": { + ngxHTTPMainConf | ngxConfTake1, + }, + "lua_regex_cache_max_entries": { + ngxHTTPMainConf | ngxConfTake1, + }, + "lua_regex_match_limit": { + ngxHTTPMainConf | ngxConfTake1, + }, + "lua_sa_restart": { + ngxHTTPMainConf | ngxConfFlag, + }, + "lua_shared_dict": { + ngxHTTPMainConf | ngxConfTake2, + }, + "lua_socket_buffer_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, + }, + "lua_socket_connect_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, + }, + "lua_socket_keepalive_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, + }, + "lua_socket_log_errors": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag, + }, + "lua_socket_pool_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, + }, + "lua_socket_read_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, + }, + "lua_socket_send_lowat": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, + }, + "lua_socket_send_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, + }, + "lua_ssl_certificate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "lua_ssl_certificate_key": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "lua_ssl_ciphers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "lua_ssl_conf_command": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + }, + "lua_ssl_crl": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "lua_ssl_protocols": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "lua_ssl_trusted_certificate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "lua_ssl_verify_depth": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "lua_thread_cache_max_entries": { + ngxHTTPMainConf | ngxConfTake1, + }, + "lua_transform_underscores_in_response_headers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag, + }, + "lua_use_default_type": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag, + }, + "lua_worker_thread_vm_pool_size": { + ngxHTTPMainConf | ngxConfTake1, + }, + "rewrite_by_lua": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, + }, + "rewrite_by_lua_block": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, + }, + "rewrite_by_lua_file": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, + }, + "rewrite_by_lua_no_postpone": { + ngxHTTPMainConf | ngxConfFlag, + }, + "server_rewrite_by_lua_block": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "server_rewrite_by_lua_file": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "set_by_lua": { + ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf2More, + }, + "set_by_lua_block": { + ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake2, + }, + "set_by_lua_file": { + ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf2More, + }, + "ssl_certificate_by_lua_block": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "ssl_certificate_by_lua_file": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "ssl_client_hello_by_lua_block": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "ssl_client_hello_by_lua_file": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "ssl_session_fetch_by_lua_block": { + ngxHTTPMainConf | ngxConfTake1, + }, + "ssl_session_fetch_by_lua_file": { + ngxHTTPMainConf | ngxConfTake1, + }, + "ssl_session_store_by_lua_block": { + ngxHTTPMainConf | ngxConfTake1, + }, + "ssl_session_store_by_lua_file": { + ngxHTTPMainConf | ngxConfTake1, + }, +} + +// MatchLuaLatest is a MatchFunc for latest version of Lua. +func MatchLuaLatest(directive string) ([]uint, bool) { + m, ok := luaDirectives[directive] + return m, ok +} diff --git a/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_lua_directives.go b/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_lua_directives.go deleted file mode 100644 index 5008baaf4c..0000000000 --- a/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_lua_directives.go +++ /dev/null @@ -1,261 +0,0 @@ -/** - * Copyright (c) F5, Inc. - * - * This source code is licensed under the Apache License, Version 2.0 license found in the - * LICENSE file in the root directory of this source tree. - */ - -// All the definitions are extracted from the source code -// Each bit mask describes these behaviors: -// - how many arguments the directive can take -// - whether or not it is a block directive -// - whether this is a flag (takes one argument that's either "on" or "off") -// - which contexts it's allowed to be in - -package crossplane - -//nolint:gochecknoglobals -var moduleLuaDirectives = map[string][]uint{ - "access_by_lua": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, - }, - "access_by_lua_block": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, - }, - "access_by_lua_file": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, - }, - "access_by_lua_no_postpone": { - ngxHTTPMainConf | ngxConfFlag, - }, - "balancer_by_lua_block": { - ngxHTTPUpsConf | ngxConfTake1, - }, - "balancer_by_lua_file": { - ngxHTTPUpsConf | ngxConfTake1, - }, - "body_filter_by_lua": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, - }, - "body_filter_by_lua_block": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, - }, - "body_filter_by_lua_file": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, - }, - "content_by_lua": { - ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, - }, - "content_by_lua_block": { - ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, - }, - "content_by_lua_file": { - ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, - }, - "exit_worker_by_lua_block": { - ngxHTTPMainConf | ngxConfTake1, - }, - "exit_worker_by_lua_file": { - ngxHTTPMainConf | ngxConfTake1, - }, - "header_filter_by_lua": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, - }, - "header_filter_by_lua_block": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, - }, - "header_filter_by_lua_file": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, - }, - "init_by_lua": { - ngxHTTPMainConf | ngxConfTake1, - }, - "init_by_lua_block": { - ngxHTTPMainConf | ngxConfTake1, - }, - "init_by_lua_file": { - ngxHTTPMainConf | ngxConfTake1, - }, - "init_worker_by_lua": { - ngxHTTPMainConf | ngxConfTake1, - }, - "init_worker_by_lua_block": { - ngxHTTPMainConf | ngxConfTake1, - }, - "init_worker_by_lua_file": { - ngxHTTPMainConf | ngxConfTake1, - }, - "log_by_lua": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, - }, - "log_by_lua_block": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, - }, - "log_by_lua_file": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, - }, - "lua_capture_error_log": { - ngxHTTPMainConf | ngxConfTake1, - }, - "lua_check_client_abort": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag, - }, - "lua_code_cache": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag, - }, - "lua_fake_shm": { - ngxHTTPMainConf | ngxConfTake2, - }, - "lua_http10_buffering": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag, - }, - "lua_load_resty_core": { - ngxHTTPMainConf | ngxConfFlag, - }, - "lua_malloc_trim": { - ngxHTTPMainConf | ngxConfTake1, - }, - "lua_max_pending_timers": { - ngxHTTPMainConf | ngxConfTake1, - }, - "lua_max_running_timers": { - ngxHTTPMainConf | ngxConfTake1, - }, - "lua_need_request_body": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag, - }, - "lua_package_cpath": { - ngxHTTPMainConf | ngxConfTake1, - }, - "lua_package_path": { - ngxHTTPMainConf | ngxConfTake1, - }, - "lua_regex_cache_max_entries": { - ngxHTTPMainConf | ngxConfTake1, - }, - "lua_regex_match_limit": { - ngxHTTPMainConf | ngxConfTake1, - }, - "lua_sa_restart": { - ngxHTTPMainConf | ngxConfFlag, - }, - "lua_shared_dict": { - ngxHTTPMainConf | ngxConfTake2, - }, - "lua_socket_buffer_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, - }, - "lua_socket_connect_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, - }, - "lua_socket_keepalive_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, - }, - "lua_socket_log_errors": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag, - }, - "lua_socket_pool_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, - }, - "lua_socket_read_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, - }, - "lua_socket_send_lowat": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, - }, - "lua_socket_send_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, - }, - "lua_ssl_certificate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "lua_ssl_certificate_key": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "lua_ssl_ciphers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "lua_ssl_conf_command": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - }, - "lua_ssl_crl": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "lua_ssl_protocols": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "lua_ssl_trusted_certificate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "lua_ssl_verify_depth": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "lua_thread_cache_max_entries": { - ngxHTTPMainConf | ngxConfTake1, - }, - "lua_transform_underscores_in_response_headers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag, - }, - "lua_use_default_type": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag, - }, - "lua_worker_thread_vm_pool_size": { - ngxHTTPMainConf | ngxConfTake1, - }, - "rewrite_by_lua": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, - }, - "rewrite_by_lua_block": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, - }, - "rewrite_by_lua_file": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, - }, - "rewrite_by_lua_no_postpone": { - ngxHTTPMainConf | ngxConfFlag, - }, - "server_rewrite_by_lua_block": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "server_rewrite_by_lua_file": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "set_by_lua": { - ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf2More, - }, - "set_by_lua_block": { - ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake2, - }, - "set_by_lua_file": { - ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf2More, - }, - "ssl_certificate_by_lua_block": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "ssl_certificate_by_lua_file": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "ssl_client_hello_by_lua_block": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "ssl_client_hello_by_lua_file": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "ssl_session_fetch_by_lua_block": { - ngxHTTPMainConf | ngxConfTake1, - }, - "ssl_session_fetch_by_lua_file": { - ngxHTTPMainConf | ngxConfTake1, - }, - "ssl_session_store_by_lua_block": { - ngxHTTPMainConf | ngxConfTake1, - }, - "ssl_session_store_by_lua_file": { - ngxHTTPMainConf | ngxConfTake1, - }, -} - -func LuaDirectivesMatchFn(directive string) ([]uint, bool) { - masks, matched := moduleLuaDirectives[directive] - return masks, matched -} diff --git a/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_map.go b/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_map.go index 731f3640f2..e0570e4721 100644 --- a/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_map.go +++ b/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_map.go @@ -39,6 +39,7 @@ var mapBodies = map[string]mapParameterMasks{ defaultMasks: ngxConfTake1, }, "geoip2": { + specialParameterMasks: map[string]uint{"auto_reload": ngxConfTake1}, defaultMasks: ngxConf1More, }, "otel_exporter": { diff --git a/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_njs_directives.gen.go b/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_njs_directives.gen.go new file mode 100644 index 0000000000..3e0f9e047a --- /dev/null +++ b/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_njs_directives.gen.go @@ -0,0 +1,103 @@ +/** + * Copyright (c) F5, Inc. + * + * This source code is licensed under the Apache License, Version 2.0 license found in the + * LICENSE file in the root directory of this source tree. + */ + +// Code generated by generator; DO NOT EDIT. +// All the definitions are extracted from the source code +// Each bit mask describes these behaviors: +// - how many arguments the directive can take +// - whether or not it is a block directive +// - whether this is a flag (takes one argument that's either "on" or "off") +// - which contexts it's allowed to be in + +package crossplane + +var njsDirectives = map[string][]uint{ + "js_access": { + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "js_body_filter": { + ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConfTake12, + }, + "js_content": { + ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConfTake1, + }, + "js_fetch_buffer_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "js_fetch_ciphers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "js_fetch_max_response_buffer_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "js_fetch_protocols": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More, + }, + "js_fetch_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "js_fetch_trusted_certificate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "js_fetch_verify": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, + }, + "js_fetch_verify_depth": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "js_filter": { + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "js_header_filter": { + ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConfTake1, + }, + "js_import": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake13, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake13, + }, + "js_path": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "js_periodic": { + ngxHTTPLocConf | ngxConfAny, + ngxStreamSrvConf | ngxConfAny, + }, + "js_preload_object": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake13, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake13, + }, + "js_preread": { + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "js_set": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2, + }, + "js_shared_dict_zone": { + ngxHTTPMainConf | ngxConf1More, + ngxStreamMainConf | ngxConf1More, + }, + "js_var": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12, + }, +} + +// MatchNjsLatest is a MatchFunc for the latest version of njs. +func MatchNjsLatest(directive string) ([]uint, bool) { + m, ok := njsDirectives[directive] + return m, ok +} diff --git a/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_njs_directives.go b/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_njs_directives.go deleted file mode 100644 index 414aee1cb0..0000000000 --- a/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_njs_directives.go +++ /dev/null @@ -1,102 +0,0 @@ -/** - * Copyright (c) F5, Inc. - * - * This source code is licensed under the Apache License, Version 2.0 license found in the - * LICENSE file in the root directory of this source tree. - */ - -// All the definitions are extracted from the source code -// Each bit mask describes these behaviors: -// - how many arguments the directive can take -// - whether or not it is a block directive -// - whether this is a flag (takes one argument that's either "on" or "off") -// - which contexts it's allowed to be in - -package crossplane - -//nolint:gochecknoglobals -var moduleNjsDirectives = map[string][]uint{ - "js_access": { - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "js_body_filter": { - ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConfTake12, - }, - "js_content": { - ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConfTake1, - }, - "js_fetch_buffer_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "js_fetch_ciphers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "js_fetch_max_response_buffer_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "js_fetch_protocols": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More, - }, - "js_fetch_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "js_fetch_trusted_certificate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "js_fetch_verify": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, - }, - "js_fetch_verify_depth": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "js_filter": { - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "js_header_filter": { - ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConfTake1, - }, - "js_import": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake13, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake13, - }, - "js_path": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "js_periodic": { - ngxHTTPLocConf | ngxConfAny, - ngxStreamSrvConf | ngxConfAny, - }, - "js_preload_object": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake13, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake13, - }, - "js_preread": { - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "js_set": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2, - }, - "js_shared_dict_zone": { - ngxHTTPMainConf | ngxConf1More, - ngxStreamMainConf | ngxConf1More, - }, - "js_var": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12, - }, -} - -func NjsDirectivesMatchFn(directive string) ([]uint, bool) { - masks, matched := moduleNjsDirectives[directive] - return masks, matched -} diff --git a/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_nplus_R30_directives.go b/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_nplus_R30_directives.go index 8ed60cd4f3..e06a42a9e1 100644 --- a/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_nplus_R30_directives.go +++ b/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_nplus_R30_directives.go @@ -15,7 +15,7 @@ package crossplane //nolint:gochecknoglobals -var ngxPlusR30Directives = map[string][]uint{ +var nginxPlusR30Directives = map[string][]uint{ "absolute_redirect": { ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, }, @@ -2106,7 +2106,7 @@ var ngxPlusR30Directives = map[string][]uint{ }, } -func NgxPlusR30DirectivesMatchFn(directive string) ([]uint, bool) { - masks, matched := ngxPlusR30Directives[directive] +func MatchNginxPlusR30(directive string) ([]uint, bool) { + masks, matched := nginxPlusR30Directives[directive] return masks, matched } diff --git a/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_nplus_R31_directives.go b/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_nplus_R31_directives.go index 1fa3960e03..13d31ef47e 100644 --- a/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_nplus_R31_directives.go +++ b/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_nplus_R31_directives.go @@ -15,7 +15,7 @@ package crossplane //nolint:gochecknoglobals -var ngxPlusR31Directives = map[string][]uint{ +var nginxPlusR31Directives = map[string][]uint{ "absolute_redirect": { ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, }, @@ -2144,7 +2144,7 @@ var ngxPlusR31Directives = map[string][]uint{ }, } -func NgxPlusR31DirectivesMatchFn(directive string) ([]uint, bool) { - masks, matched := ngxPlusR31Directives[directive] +func MatchNginxPlusR31(directive string) ([]uint, bool) { + masks, matched := nginxPlusR31Directives[directive] return masks, matched } diff --git a/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_nplus_latest_directives.go b/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_nplus_latest_directives.go index 66cec3bc0b..7434823698 100644 --- a/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_nplus_latest_directives.go +++ b/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_nplus_latest_directives.go @@ -15,7 +15,7 @@ package crossplane //nolint:gochecknoglobals -var ngxPlusLatestDirectives = map[string][]uint{ +var nginxPlusLatestDirectives = map[string][]uint{ "absolute_redirect": { ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, }, @@ -2151,7 +2151,7 @@ var ngxPlusLatestDirectives = map[string][]uint{ }, } -func NgxPlusLatestDirectivesMatchFn(directive string) ([]uint, bool) { - masks, matched := ngxPlusLatestDirectives[directive] +func MatchNginxPlusLatest(directive string) ([]uint, bool) { + masks, matched := nginxPlusLatestDirectives[directive] return masks, matched } diff --git a/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_124_directives.gen.go b/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_124_directives.gen.go new file mode 100644 index 0000000000..2e2b8da4dd --- /dev/null +++ b/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_124_directives.gen.go @@ -0,0 +1,1874 @@ +/** + * Copyright (c) F5, Inc. + * + * This source code is licensed under the Apache License, Version 2.0 license found in the + * LICENSE file in the root directory of this source tree. + */ + +// Code generated by generator; DO NOT EDIT. +// All the definitions are extracted from the source code +// Each bit mask describes these behaviors: +// - how many arguments the directive can take +// - whether or not it is a block directive +// - whether this is a flag (takes one argument that's either "on" or "off") +// - which contexts it's allowed to be in + +package crossplane + +var oss124Directives = map[string][]uint{ + "absolute_redirect": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "accept_mutex": { + ngxEventConf | ngxConfFlag, + }, + "accept_mutex_delay": { + ngxEventConf | ngxConfTake1, + }, + "access_log": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConf1More, + ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More, + }, + "add_after_body": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "add_before_body": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "add_header": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23, + }, + "add_trailer": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23, + }, + "addition_types": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "aio": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "aio_write": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "alias": { + ngxHTTPLocConf | ngxConfTake1, + }, + "allow": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "ancient_browser": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "ancient_browser_value": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "auth_basic": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1, + }, + "auth_basic_user_file": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1, + }, + "auth_delay": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "auth_http": { + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + }, + "auth_http_header": { + ngxMailMainConf | ngxMailSrvConf | ngxConfTake2, + }, + "auth_http_pass_client_cert": { + ngxMailMainConf | ngxMailSrvConf | ngxConfFlag, + }, + "auth_http_timeout": { + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + }, + "auth_request": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "auth_request_set": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + }, + "autoindex": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "autoindex_exact_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "autoindex_format": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "autoindex_localtime": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "break": { + ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfNoArgs, + }, + "charset": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, + }, + "charset_map": { + ngxHTTPMainConf | ngxConfBlock | ngxConfTake2, + }, + "charset_types": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "chunked_transfer_encoding": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "client_body_buffer_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "client_body_in_file_only": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "client_body_in_single_buffer": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "client_body_temp_path": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234, + }, + "client_body_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "client_header_buffer_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "client_header_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "client_max_body_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "connection_pool_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "create_full_put_path": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "daemon": { + ngxMainConf | ngxDirectConf | ngxConfFlag, + }, + "dav_access": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123, + }, + "dav_methods": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "debug_connection": { + ngxEventConf | ngxConfTake1, + }, + "debug_points": { + ngxMainConf | ngxDirectConf | ngxConfTake1, + }, + "default_type": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "deny": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "directio": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "directio_alignment": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "disable_symlinks": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, + }, + "empty_gif": { + ngxHTTPLocConf | ngxConfNoArgs, + }, + "env": { + ngxMainConf | ngxDirectConf | ngxConfTake1, + }, + "error_log": { + ngxMainConf | ngxConf1More, + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + ngxMailMainConf | ngxMailSrvConf | ngxConf1More, + ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More, + }, + "error_page": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf2More, + }, + "etag": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "events": { + ngxMainConf | ngxConfBlock | ngxConfNoArgs, + }, + "expires": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake12, + }, + "fastcgi_bind": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, + }, + "fastcgi_buffer_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_buffering": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "fastcgi_buffers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + }, + "fastcgi_busy_buffers_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_cache": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_cache_background_update": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "fastcgi_cache_bypass": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "fastcgi_cache_key": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_cache_lock": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "fastcgi_cache_lock_age": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_cache_lock_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_cache_max_range_offset": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_cache_methods": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "fastcgi_cache_min_uses": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_cache_path": { + ngxHTTPMainConf | ngxConf2More, + }, + "fastcgi_cache_revalidate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "fastcgi_cache_use_stale": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "fastcgi_cache_valid": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "fastcgi_catch_stderr": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_connect_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_force_ranges": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "fastcgi_hide_header": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_ignore_client_abort": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "fastcgi_ignore_headers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "fastcgi_index": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_intercept_errors": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "fastcgi_keep_conn": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "fastcgi_limit_rate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_max_temp_file_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_next_upstream": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "fastcgi_next_upstream_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_next_upstream_tries": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_no_cache": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "fastcgi_param": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23, + }, + "fastcgi_pass": { + ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, + }, + "fastcgi_pass_header": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_pass_request_body": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "fastcgi_pass_request_headers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "fastcgi_read_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_request_buffering": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "fastcgi_send_lowat": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_send_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_socket_keepalive": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "fastcgi_split_path_info": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_store": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_store_access": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123, + }, + "fastcgi_temp_file_write_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_temp_path": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234, + }, + "flv": { + ngxHTTPLocConf | ngxConfNoArgs, + }, + "geo": { + ngxHTTPMainConf | ngxConfBlock | ngxConfTake12, + ngxStreamMainConf | ngxConfBlock | ngxConfTake12, + }, + "geoip_city": { + ngxHTTPMainConf | ngxConfTake12, + ngxStreamMainConf | ngxConfTake12, + }, + "geoip_country": { + ngxHTTPMainConf | ngxConfTake12, + ngxStreamMainConf | ngxConfTake12, + }, + "geoip_org": { + ngxHTTPMainConf | ngxConfTake12, + ngxStreamMainConf | ngxConfTake12, + }, + "geoip_proxy": { + ngxHTTPMainConf | ngxConfTake1, + }, + "geoip_proxy_recursive": { + ngxHTTPMainConf | ngxConfFlag, + }, + "google_perftools_profiles": { + ngxMainConf | ngxDirectConf | ngxConfTake1, + }, + "grpc_bind": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, + }, + "grpc_buffer_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "grpc_connect_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "grpc_hide_header": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "grpc_ignore_headers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "grpc_intercept_errors": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "grpc_next_upstream": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "grpc_next_upstream_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "grpc_next_upstream_tries": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "grpc_pass": { + ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, + }, + "grpc_pass_header": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "grpc_read_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "grpc_send_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "grpc_set_header": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + }, + "grpc_socket_keepalive": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "grpc_ssl_certificate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "grpc_ssl_certificate_key": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "grpc_ssl_ciphers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "grpc_ssl_conf_command": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + }, + "grpc_ssl_crl": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "grpc_ssl_name": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "grpc_ssl_password_file": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "grpc_ssl_protocols": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "grpc_ssl_server_name": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "grpc_ssl_session_reuse": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "grpc_ssl_trusted_certificate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "grpc_ssl_verify": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "grpc_ssl_verify_depth": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "gunzip": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "gunzip_buffers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + }, + "gzip": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag, + }, + "gzip_buffers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + }, + "gzip_comp_level": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "gzip_disable": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "gzip_http_version": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "gzip_min_length": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "gzip_proxied": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "gzip_static": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "gzip_types": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "gzip_vary": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "hash": { + ngxHTTPUpsConf | ngxConfTake12, + ngxStreamUpsConf | ngxConfTake12, + }, + "http": { + ngxMainConf | ngxConfBlock | ngxConfNoArgs, + }, + "http2_body_preread_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "http2_chunk_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "http2_idle_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "http2_max_concurrent_pushes": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "http2_max_concurrent_streams": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "http2_max_field_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "http2_max_header_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "http2_max_requests": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "http2_push": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "http2_push_preload": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "http2_recv_buffer_size": { + ngxHTTPMainConf | ngxConfTake1, + }, + "http2_recv_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "if": { + ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfExpr | ngxConf1More, + }, + "if_modified_since": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "ignore_invalid_headers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, + }, + "image_filter": { + ngxHTTPLocConf | ngxConfTake123, + }, + "image_filter_buffer": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "image_filter_interlace": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "image_filter_jpeg_quality": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "image_filter_sharpen": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "image_filter_transparency": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "image_filter_webp_quality": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "imap_auth": { + ngxMailMainConf | ngxMailSrvConf | ngxConf1More, + }, + "imap_capabilities": { + ngxMailMainConf | ngxMailSrvConf | ngxConf1More, + }, + "imap_client_buffer": { + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + }, + "include": { + ngxAnyConf | ngxConfTake1, + }, + "index": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "internal": { + ngxHTTPLocConf | ngxConfNoArgs, + }, + "ip_hash": { + ngxHTTPUpsConf | ngxConfNoArgs, + }, + "keepalive": { + ngxHTTPUpsConf | ngxConfTake1, + }, + "keepalive_disable": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, + }, + "keepalive_requests": { + ngxHTTPUpsConf | ngxConfTake1, + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "keepalive_time": { + ngxHTTPUpsConf | ngxConfTake1, + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "keepalive_timeout": { + ngxHTTPUpsConf | ngxConfTake1, + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, + }, + "large_client_header_buffers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake2, + }, + "least_conn": { + ngxHTTPUpsConf | ngxConfNoArgs, + ngxStreamUpsConf | ngxConfNoArgs, + }, + "limit_conn": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2, + }, + "limit_conn_dry_run": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, + }, + "limit_conn_log_level": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "limit_conn_status": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "limit_conn_zone": { + ngxHTTPMainConf | ngxConfTake2, + ngxStreamMainConf | ngxConfTake2, + }, + "limit_except": { + ngxHTTPLocConf | ngxConfBlock | ngxConf1More, + }, + "limit_rate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, + }, + "limit_rate_after": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, + }, + "limit_req": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123, + }, + "limit_req_dry_run": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "limit_req_log_level": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "limit_req_status": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "limit_req_zone": { + ngxHTTPMainConf | ngxConfTake3, + }, + "lingering_close": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "lingering_time": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "lingering_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "listen": { + ngxHTTPSrvConf | ngxConf1More, + ngxMailSrvConf | ngxConf1More, + ngxStreamSrvConf | ngxConf1More, + }, + "load_module": { + ngxMainConf | ngxDirectConf | ngxConfTake1, + }, + "location": { + ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfTake12, + }, + "lock_file": { + ngxMainConf | ngxDirectConf | ngxConfTake1, + }, + "log_format": { + ngxHTTPMainConf | ngxConf2More, + ngxStreamMainConf | ngxConf2More, + }, + "log_not_found": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "log_subrequest": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "mail": { + ngxMainConf | ngxConfBlock | ngxConfNoArgs, + }, + "map": { + ngxHTTPMainConf | ngxConfBlock | ngxConfTake2, + ngxStreamMainConf | ngxConfBlock | ngxConfTake2, + }, + "map_hash_bucket_size": { + ngxHTTPMainConf | ngxConfTake1, + ngxStreamMainConf | ngxConfTake1, + }, + "map_hash_max_size": { + ngxHTTPMainConf | ngxConfTake1, + ngxStreamMainConf | ngxConfTake1, + }, + "master_process": { + ngxMainConf | ngxDirectConf | ngxConfFlag, + }, + "max_errors": { + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + }, + "max_ranges": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "memcached_bind": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, + }, + "memcached_buffer_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "memcached_connect_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "memcached_gzip_flag": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "memcached_next_upstream": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "memcached_next_upstream_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "memcached_next_upstream_tries": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "memcached_pass": { + ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, + }, + "memcached_read_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "memcached_send_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "memcached_socket_keepalive": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "merge_slashes": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, + }, + "min_delete_depth": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "mirror": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "mirror_request_body": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "modern_browser": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, + }, + "modern_browser_value": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "mp4": { + ngxHTTPLocConf | ngxConfNoArgs, + }, + "mp4_buffer_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "mp4_max_buffer_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "mp4_start_key_frame": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "msie_padding": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "msie_refresh": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "multi_accept": { + ngxEventConf | ngxConfFlag, + }, + "open_file_cache": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, + }, + "open_file_cache_errors": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "open_file_cache_min_uses": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "open_file_cache_valid": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "open_log_file_cache": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1234, + }, + "output_buffers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + }, + "override_charset": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag, + }, + "pcre_jit": { + ngxMainConf | ngxDirectConf | ngxConfFlag, + }, + "perl": { + ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1, + }, + "perl_modules": { + ngxHTTPMainConf | ngxConfTake1, + }, + "perl_require": { + ngxHTTPMainConf | ngxConfTake1, + }, + "perl_set": { + ngxHTTPMainConf | ngxConfTake2, + }, + "pid": { + ngxMainConf | ngxDirectConf | ngxConfTake1, + }, + "pop3_auth": { + ngxMailMainConf | ngxMailSrvConf | ngxConf1More, + }, + "pop3_capabilities": { + ngxMailMainConf | ngxMailSrvConf | ngxConf1More, + }, + "port_in_redirect": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "postpone_output": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "preread_buffer_size": { + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "preread_timeout": { + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "protocol": { + ngxMailSrvConf | ngxConfTake1, + }, + "proxy_bind": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12, + }, + "proxy_buffer": { + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + }, + "proxy_buffer_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_buffering": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "proxy_buffers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + }, + "proxy_busy_buffers_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_cache": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_cache_background_update": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "proxy_cache_bypass": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "proxy_cache_convert_head": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "proxy_cache_key": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_cache_lock": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "proxy_cache_lock_age": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_cache_lock_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_cache_max_range_offset": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_cache_methods": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "proxy_cache_min_uses": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_cache_path": { + ngxHTTPMainConf | ngxConf2More, + }, + "proxy_cache_revalidate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "proxy_cache_use_stale": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "proxy_cache_valid": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "proxy_connect_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_cookie_domain": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, + }, + "proxy_cookie_flags": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234, + }, + "proxy_cookie_path": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, + }, + "proxy_download_rate": { + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_force_ranges": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "proxy_half_close": { + ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, + }, + "proxy_headers_hash_bucket_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_headers_hash_max_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_hide_header": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_http_version": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_ignore_client_abort": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "proxy_ignore_headers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "proxy_intercept_errors": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "proxy_limit_rate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_max_temp_file_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_method": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_next_upstream": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, + }, + "proxy_next_upstream_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_next_upstream_tries": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_no_cache": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "proxy_pass": { + ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConfTake1, + ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_pass_error_message": { + ngxMailMainConf | ngxMailSrvConf | ngxConfFlag, + }, + "proxy_pass_header": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_pass_request_body": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "proxy_pass_request_headers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "proxy_protocol": { + ngxMailMainConf | ngxMailSrvConf | ngxConfFlag, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, + }, + "proxy_protocol_timeout": { + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_read_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_redirect": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, + }, + "proxy_request_buffering": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "proxy_requests": { + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_responses": { + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_send_lowat": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_send_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_set_body": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_set_header": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + }, + "proxy_smtp_auth": { + ngxMailMainConf | ngxMailSrvConf | ngxConfFlag, + }, + "proxy_socket_keepalive": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, + }, + "proxy_ssl": { + ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, + }, + "proxy_ssl_certificate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_ssl_certificate_key": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_ssl_ciphers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_ssl_conf_command": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2, + }, + "proxy_ssl_crl": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_ssl_name": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_ssl_password_file": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_ssl_protocols": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More, + }, + "proxy_ssl_server_name": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, + }, + "proxy_ssl_session_reuse": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, + }, + "proxy_ssl_trusted_certificate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_ssl_verify": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, + }, + "proxy_ssl_verify_depth": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_store": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_store_access": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123, + }, + "proxy_temp_file_write_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_temp_path": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234, + }, + "proxy_timeout": { + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_upload_rate": { + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "random": { + ngxHTTPUpsConf | ngxConfNoArgs | ngxConfTake12, + ngxStreamUpsConf | ngxConfNoArgs | ngxConfTake12, + }, + "random_index": { + ngxHTTPLocConf | ngxConfFlag, + }, + "read_ahead": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "real_ip_header": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "real_ip_recursive": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "recursive_error_pages": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "referer_hash_bucket_size": { + ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "referer_hash_max_size": { + ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "request_pool_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "reset_timedout_connection": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "resolver": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + ngxMailMainConf | ngxMailSrvConf | ngxConf1More, + ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More, + }, + "resolver_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "return": { + ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake12, + ngxStreamSrvConf | ngxConfTake1, + }, + "rewrite": { + ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23, + }, + "rewrite_log": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag, + }, + "root": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, + }, + "satisfy": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_bind": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, + }, + "scgi_buffer_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_buffering": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "scgi_buffers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + }, + "scgi_busy_buffers_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_cache": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_cache_background_update": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "scgi_cache_bypass": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "scgi_cache_key": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_cache_lock": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "scgi_cache_lock_age": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_cache_lock_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_cache_max_range_offset": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_cache_methods": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "scgi_cache_min_uses": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_cache_path": { + ngxHTTPMainConf | ngxConf2More, + }, + "scgi_cache_revalidate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "scgi_cache_use_stale": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "scgi_cache_valid": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "scgi_connect_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_force_ranges": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "scgi_hide_header": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_ignore_client_abort": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "scgi_ignore_headers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "scgi_intercept_errors": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "scgi_limit_rate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_max_temp_file_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_next_upstream": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "scgi_next_upstream_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_next_upstream_tries": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_no_cache": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "scgi_param": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23, + }, + "scgi_pass": { + ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, + }, + "scgi_pass_header": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_pass_request_body": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "scgi_pass_request_headers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "scgi_read_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_request_buffering": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "scgi_send_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_socket_keepalive": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "scgi_store": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_store_access": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123, + }, + "scgi_temp_file_write_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_temp_path": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234, + }, + "secure_link": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "secure_link_md5": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "secure_link_secret": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "send_lowat": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "send_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "sendfile": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag, + }, + "sendfile_max_chunk": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "server": { + ngxHTTPMainConf | ngxConfBlock | ngxConfNoArgs, + ngxHTTPUpsConf | ngxConf1More, + ngxMailMainConf | ngxConfBlock | ngxConfNoArgs, + ngxStreamMainConf | ngxConfBlock | ngxConfNoArgs, + ngxStreamUpsConf | ngxConf1More, + }, + "server_name": { + ngxHTTPSrvConf | ngxConf1More, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + }, + "server_name_in_redirect": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "server_names_hash_bucket_size": { + ngxHTTPMainConf | ngxConfTake1, + }, + "server_names_hash_max_size": { + ngxHTTPMainConf | ngxConfTake1, + }, + "server_tokens": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "set": { + ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake2, + ngxStreamSrvConf | ngxConfTake2, + }, + "set_real_ip_from": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "slice": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "smtp_auth": { + ngxMailMainConf | ngxMailSrvConf | ngxConf1More, + }, + "smtp_capabilities": { + ngxMailMainConf | ngxMailSrvConf | ngxConf1More, + }, + "smtp_client_buffer": { + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + }, + "smtp_greeting_delay": { + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + }, + "source_charset": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, + }, + "split_clients": { + ngxHTTPMainConf | ngxConfBlock | ngxConfTake2, + ngxStreamMainConf | ngxConfBlock | ngxConfTake2, + }, + "ssi": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag, + }, + "ssi_last_modified": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "ssi_min_file_chunk": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "ssi_silent_errors": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "ssi_types": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "ssi_value_length": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "ssl": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, + ngxMailMainConf | ngxMailSrvConf | ngxConfFlag, + }, + "ssl_alpn": { + ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More, + }, + "ssl_buffer_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "ssl_certificate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "ssl_certificate_key": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "ssl_ciphers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "ssl_client_certificate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "ssl_conf_command": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake2, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake2, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2, + }, + "ssl_crl": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "ssl_dhparam": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "ssl_early_data": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, + }, + "ssl_ecdh_curve": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "ssl_engine": { + ngxMainConf | ngxDirectConf | ngxConfTake1, + }, + "ssl_handshake_timeout": { + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "ssl_ocsp": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, + }, + "ssl_ocsp_cache": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "ssl_ocsp_responder": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "ssl_password_file": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "ssl_prefer_server_ciphers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, + ngxMailMainConf | ngxMailSrvConf | ngxConfFlag, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, + }, + "ssl_preread": { + ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, + }, + "ssl_protocols": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConf1More, + ngxMailMainConf | ngxMailSrvConf | ngxConf1More, + ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More, + }, + "ssl_reject_handshake": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, + }, + "ssl_session_cache": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake12, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake12, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12, + }, + "ssl_session_ticket_key": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "ssl_session_tickets": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, + ngxMailMainConf | ngxMailSrvConf | ngxConfFlag, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, + }, + "ssl_session_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "ssl_stapling": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, + }, + "ssl_stapling_file": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "ssl_stapling_responder": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "ssl_stapling_verify": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, + }, + "ssl_trusted_certificate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "ssl_verify_client": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "ssl_verify_depth": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "starttls": { + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + }, + "stream": { + ngxMainConf | ngxConfBlock | ngxConfNoArgs, + }, + "stub_status": { + ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfNoArgs | ngxConfTake1, + }, + "sub_filter": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + }, + "sub_filter_last_modified": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "sub_filter_once": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "sub_filter_types": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "subrequest_output_buffer_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "tcp_nodelay": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, + }, + "tcp_nopush": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "thread_pool": { + ngxMainConf | ngxDirectConf | ngxConfTake23, + }, + "timeout": { + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + }, + "timer_resolution": { + ngxMainConf | ngxDirectConf | ngxConfTake1, + }, + "try_files": { + ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf2More, + }, + "types": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfNoArgs, + }, + "types_hash_bucket_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "types_hash_max_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "underscores_in_headers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, + }, + "uninitialized_variable_warn": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag, + }, + "upstream": { + ngxHTTPMainConf | ngxConfBlock | ngxConfTake1, + ngxStreamMainConf | ngxConfBlock | ngxConfTake1, + }, + "use": { + ngxEventConf | ngxConfTake1, + }, + "user": { + ngxMainConf | ngxDirectConf | ngxConfTake12, + }, + "userid": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "userid_domain": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "userid_expires": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "userid_flags": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123, + }, + "userid_mark": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "userid_name": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "userid_p3p": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "userid_path": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "userid_service": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_bind": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, + }, + "uwsgi_buffer_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_buffering": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "uwsgi_buffers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + }, + "uwsgi_busy_buffers_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_cache": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_cache_background_update": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_cache_bypass": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "uwsgi_cache_key": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_cache_lock": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "uwsgi_cache_lock_age": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_cache_lock_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_cache_max_range_offset": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_cache_methods": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "uwsgi_cache_min_uses": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_cache_path": { + ngxHTTPMainConf | ngxConf2More, + }, + "uwsgi_cache_revalidate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "uwsgi_cache_use_stale": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "uwsgi_cache_valid": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "uwsgi_connect_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_force_ranges": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "uwsgi_hide_header": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_ignore_client_abort": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "uwsgi_ignore_headers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "uwsgi_intercept_errors": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "uwsgi_limit_rate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_max_temp_file_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_modifier1": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_modifier2": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_next_upstream": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "uwsgi_next_upstream_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_next_upstream_tries": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_no_cache": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "uwsgi_param": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23, + }, + "uwsgi_pass": { + ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, + }, + "uwsgi_pass_header": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_pass_request_body": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "uwsgi_pass_request_headers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "uwsgi_read_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_request_buffering": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "uwsgi_send_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_socket_keepalive": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "uwsgi_ssl_certificate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_ssl_certificate_key": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_ssl_ciphers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_ssl_conf_command": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + }, + "uwsgi_ssl_crl": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_ssl_name": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_ssl_password_file": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_ssl_protocols": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "uwsgi_ssl_server_name": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "uwsgi_ssl_session_reuse": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "uwsgi_ssl_trusted_certificate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_ssl_verify": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "uwsgi_ssl_verify_depth": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_store": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_store_access": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123, + }, + "uwsgi_temp_file_write_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_temp_path": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234, + }, + "valid_referers": { + ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "variables_hash_bucket_size": { + ngxHTTPMainConf | ngxConfTake1, + ngxStreamMainConf | ngxConfTake1, + }, + "variables_hash_max_size": { + ngxHTTPMainConf | ngxConfTake1, + ngxStreamMainConf | ngxConfTake1, + }, + "worker_aio_requests": { + ngxEventConf | ngxConfTake1, + }, + "worker_connections": { + ngxEventConf | ngxConfTake1, + }, + "worker_cpu_affinity": { + ngxMainConf | ngxDirectConf | ngxConf1More, + }, + "worker_priority": { + ngxMainConf | ngxDirectConf | ngxConfTake1, + }, + "worker_processes": { + ngxMainConf | ngxDirectConf | ngxConfTake1, + }, + "worker_rlimit_core": { + ngxMainConf | ngxDirectConf | ngxConfTake1, + }, + "worker_rlimit_nofile": { + ngxMainConf | ngxDirectConf | ngxConfTake1, + }, + "worker_shutdown_timeout": { + ngxMainConf | ngxDirectConf | ngxConfTake1, + }, + "working_directory": { + ngxMainConf | ngxDirectConf | ngxConfTake1, + }, + "xclient": { + ngxMailMainConf | ngxMailSrvConf | ngxConfFlag, + }, + "xml_entities": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "xslt_last_modified": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "xslt_param": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + }, + "xslt_string_param": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + }, + "xslt_stylesheet": { + ngxHTTPLocConf | ngxConf1More, + }, + "xslt_types": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "zone": { + ngxHTTPUpsConf | ngxConfTake12, + ngxStreamUpsConf | ngxConfTake12, + }, +} + +// MatchOss124 contains directives in OSS 1.2.4 source code(including GEOIP, Perl, and XSLT) +func MatchOss124(directive string) ([]uint, bool) { + m, ok := oss124Directives[directive] + return m, ok +} diff --git a/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_124_directives.go b/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_124_directives.go deleted file mode 100644 index 10808c90b4..0000000000 --- a/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_124_directives.go +++ /dev/null @@ -1,1873 +0,0 @@ -/** - * Copyright (c) F5, Inc. - * - * This source code is licensed under the Apache License, Version 2.0 license found in the - * LICENSE file in the root directory of this source tree. - */ - -// All the definitions are extracted from the source code -// Each bit mask describes these behaviors: -// - how many arguments the directive can take -// - whether or not it is a block directive -// - whether this is a flag (takes one argument that's either "on" or "off") -// - which contexts it's allowed to be in - -package crossplane - -//nolint:gochecknoglobals -var ngxOss124Directives = map[string][]uint{ - "absolute_redirect": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "accept_mutex": { - ngxEventConf | ngxConfFlag, - }, - "accept_mutex_delay": { - ngxEventConf | ngxConfTake1, - }, - "access_log": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConf1More, - ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More, - }, - "add_after_body": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "add_before_body": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "add_header": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23, - }, - "add_trailer": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23, - }, - "addition_types": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "aio": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "aio_write": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "alias": { - ngxHTTPLocConf | ngxConfTake1, - }, - "allow": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "ancient_browser": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "ancient_browser_value": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "auth_basic": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1, - }, - "auth_basic_user_file": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1, - }, - "auth_delay": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "auth_http": { - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - }, - "auth_http_header": { - ngxMailMainConf | ngxMailSrvConf | ngxConfTake2, - }, - "auth_http_pass_client_cert": { - ngxMailMainConf | ngxMailSrvConf | ngxConfFlag, - }, - "auth_http_timeout": { - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - }, - "auth_request": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "auth_request_set": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - }, - "autoindex": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "autoindex_exact_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "autoindex_format": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "autoindex_localtime": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "break": { - ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfNoArgs, - }, - "charset": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, - }, - "charset_map": { - ngxHTTPMainConf | ngxConfBlock | ngxConfTake2, - }, - "charset_types": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "chunked_transfer_encoding": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "client_body_buffer_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "client_body_in_file_only": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "client_body_in_single_buffer": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "client_body_temp_path": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234, - }, - "client_body_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "client_header_buffer_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "client_header_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "client_max_body_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "connection_pool_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "create_full_put_path": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "daemon": { - ngxMainConf | ngxDirectConf | ngxConfFlag, - }, - "dav_access": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123, - }, - "dav_methods": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "debug_connection": { - ngxEventConf | ngxConfTake1, - }, - "debug_points": { - ngxMainConf | ngxDirectConf | ngxConfTake1, - }, - "default_type": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "deny": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "directio": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "directio_alignment": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "disable_symlinks": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, - }, - "empty_gif": { - ngxHTTPLocConf | ngxConfNoArgs, - }, - "env": { - ngxMainConf | ngxDirectConf | ngxConfTake1, - }, - "error_log": { - ngxMainConf | ngxConf1More, - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - ngxMailMainConf | ngxMailSrvConf | ngxConf1More, - ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More, - }, - "error_page": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf2More, - }, - "etag": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "events": { - ngxMainConf | ngxConfBlock | ngxConfNoArgs, - }, - "expires": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake12, - }, - "fastcgi_bind": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, - }, - "fastcgi_buffer_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_buffering": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "fastcgi_buffers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - }, - "fastcgi_busy_buffers_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_cache": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_cache_background_update": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "fastcgi_cache_bypass": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "fastcgi_cache_key": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_cache_lock": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "fastcgi_cache_lock_age": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_cache_lock_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_cache_max_range_offset": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_cache_methods": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "fastcgi_cache_min_uses": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_cache_path": { - ngxHTTPMainConf | ngxConf2More, - }, - "fastcgi_cache_revalidate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "fastcgi_cache_use_stale": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "fastcgi_cache_valid": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "fastcgi_catch_stderr": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_connect_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_force_ranges": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "fastcgi_hide_header": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_ignore_client_abort": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "fastcgi_ignore_headers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "fastcgi_index": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_intercept_errors": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "fastcgi_keep_conn": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "fastcgi_limit_rate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_max_temp_file_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_next_upstream": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "fastcgi_next_upstream_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_next_upstream_tries": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_no_cache": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "fastcgi_param": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23, - }, - "fastcgi_pass": { - ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, - }, - "fastcgi_pass_header": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_pass_request_body": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "fastcgi_pass_request_headers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "fastcgi_read_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_request_buffering": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "fastcgi_send_lowat": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_send_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_socket_keepalive": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "fastcgi_split_path_info": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_store": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_store_access": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123, - }, - "fastcgi_temp_file_write_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_temp_path": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234, - }, - "flv": { - ngxHTTPLocConf | ngxConfNoArgs, - }, - "geo": { - ngxHTTPMainConf | ngxConfBlock | ngxConfTake12, - ngxStreamMainConf | ngxConfBlock | ngxConfTake12, - }, - "geoip_city": { - ngxHTTPMainConf | ngxConfTake12, - ngxStreamMainConf | ngxConfTake12, - }, - "geoip_country": { - ngxHTTPMainConf | ngxConfTake12, - ngxStreamMainConf | ngxConfTake12, - }, - "geoip_org": { - ngxHTTPMainConf | ngxConfTake12, - ngxStreamMainConf | ngxConfTake12, - }, - "geoip_proxy": { - ngxHTTPMainConf | ngxConfTake1, - }, - "geoip_proxy_recursive": { - ngxHTTPMainConf | ngxConfFlag, - }, - "google_perftools_profiles": { - ngxMainConf | ngxDirectConf | ngxConfTake1, - }, - "grpc_bind": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, - }, - "grpc_buffer_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "grpc_connect_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "grpc_hide_header": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "grpc_ignore_headers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "grpc_intercept_errors": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "grpc_next_upstream": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "grpc_next_upstream_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "grpc_next_upstream_tries": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "grpc_pass": { - ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, - }, - "grpc_pass_header": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "grpc_read_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "grpc_send_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "grpc_set_header": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - }, - "grpc_socket_keepalive": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "grpc_ssl_certificate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "grpc_ssl_certificate_key": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "grpc_ssl_ciphers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "grpc_ssl_conf_command": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - }, - "grpc_ssl_crl": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "grpc_ssl_name": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "grpc_ssl_password_file": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "grpc_ssl_protocols": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "grpc_ssl_server_name": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "grpc_ssl_session_reuse": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "grpc_ssl_trusted_certificate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "grpc_ssl_verify": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "grpc_ssl_verify_depth": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "gunzip": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "gunzip_buffers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - }, - "gzip": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag, - }, - "gzip_buffers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - }, - "gzip_comp_level": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "gzip_disable": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "gzip_http_version": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "gzip_min_length": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "gzip_proxied": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "gzip_static": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "gzip_types": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "gzip_vary": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "hash": { - ngxHTTPUpsConf | ngxConfTake12, - ngxStreamUpsConf | ngxConfTake12, - }, - "http": { - ngxMainConf | ngxConfBlock | ngxConfNoArgs, - }, - "http2_body_preread_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "http2_chunk_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "http2_idle_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "http2_max_concurrent_pushes": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "http2_max_concurrent_streams": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "http2_max_field_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "http2_max_header_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "http2_max_requests": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "http2_push": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "http2_push_preload": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "http2_recv_buffer_size": { - ngxHTTPMainConf | ngxConfTake1, - }, - "http2_recv_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "if": { - ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfExpr | ngxConf1More, - }, - "if_modified_since": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "ignore_invalid_headers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, - }, - "image_filter": { - ngxHTTPLocConf | ngxConfTake123, - }, - "image_filter_buffer": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "image_filter_interlace": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "image_filter_jpeg_quality": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "image_filter_sharpen": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "image_filter_transparency": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "image_filter_webp_quality": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "imap_auth": { - ngxMailMainConf | ngxMailSrvConf | ngxConf1More, - }, - "imap_capabilities": { - ngxMailMainConf | ngxMailSrvConf | ngxConf1More, - }, - "imap_client_buffer": { - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - }, - "include": { - ngxAnyConf | ngxConfTake1, - }, - "index": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "internal": { - ngxHTTPLocConf | ngxConfNoArgs, - }, - "ip_hash": { - ngxHTTPUpsConf | ngxConfNoArgs, - }, - "keepalive": { - ngxHTTPUpsConf | ngxConfTake1, - }, - "keepalive_disable": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, - }, - "keepalive_requests": { - ngxHTTPUpsConf | ngxConfTake1, - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "keepalive_time": { - ngxHTTPUpsConf | ngxConfTake1, - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "keepalive_timeout": { - ngxHTTPUpsConf | ngxConfTake1, - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, - }, - "large_client_header_buffers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake2, - }, - "least_conn": { - ngxHTTPUpsConf | ngxConfNoArgs, - ngxStreamUpsConf | ngxConfNoArgs, - }, - "limit_conn": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2, - }, - "limit_conn_dry_run": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, - }, - "limit_conn_log_level": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "limit_conn_status": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "limit_conn_zone": { - ngxHTTPMainConf | ngxConfTake2, - ngxStreamMainConf | ngxConfTake2, - }, - "limit_except": { - ngxHTTPLocConf | ngxConfBlock | ngxConf1More, - }, - "limit_rate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, - }, - "limit_rate_after": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, - }, - "limit_req": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123, - }, - "limit_req_dry_run": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "limit_req_log_level": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "limit_req_status": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "limit_req_zone": { - ngxHTTPMainConf | ngxConfTake3, - }, - "lingering_close": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "lingering_time": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "lingering_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "listen": { - ngxHTTPSrvConf | ngxConf1More, - ngxMailSrvConf | ngxConf1More, - ngxStreamSrvConf | ngxConf1More, - }, - "load_module": { - ngxMainConf | ngxDirectConf | ngxConfTake1, - }, - "location": { - ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfTake12, - }, - "lock_file": { - ngxMainConf | ngxDirectConf | ngxConfTake1, - }, - "log_format": { - ngxHTTPMainConf | ngxConf2More, - ngxStreamMainConf | ngxConf2More, - }, - "log_not_found": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "log_subrequest": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "mail": { - ngxMainConf | ngxConfBlock | ngxConfNoArgs, - }, - "map": { - ngxHTTPMainConf | ngxConfBlock | ngxConfTake2, - ngxStreamMainConf | ngxConfBlock | ngxConfTake2, - }, - "map_hash_bucket_size": { - ngxHTTPMainConf | ngxConfTake1, - ngxStreamMainConf | ngxConfTake1, - }, - "map_hash_max_size": { - ngxHTTPMainConf | ngxConfTake1, - ngxStreamMainConf | ngxConfTake1, - }, - "master_process": { - ngxMainConf | ngxDirectConf | ngxConfFlag, - }, - "max_errors": { - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - }, - "max_ranges": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "memcached_bind": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, - }, - "memcached_buffer_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "memcached_connect_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "memcached_gzip_flag": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "memcached_next_upstream": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "memcached_next_upstream_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "memcached_next_upstream_tries": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "memcached_pass": { - ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, - }, - "memcached_read_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "memcached_send_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "memcached_socket_keepalive": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "merge_slashes": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, - }, - "min_delete_depth": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "mirror": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "mirror_request_body": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "modern_browser": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, - }, - "modern_browser_value": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "mp4": { - ngxHTTPLocConf | ngxConfNoArgs, - }, - "mp4_buffer_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "mp4_max_buffer_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "mp4_start_key_frame": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "msie_padding": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "msie_refresh": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "multi_accept": { - ngxEventConf | ngxConfFlag, - }, - "open_file_cache": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, - }, - "open_file_cache_errors": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "open_file_cache_min_uses": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "open_file_cache_valid": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "open_log_file_cache": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1234, - }, - "output_buffers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - }, - "override_charset": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag, - }, - "pcre_jit": { - ngxMainConf | ngxDirectConf | ngxConfFlag, - }, - "perl": { - ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1, - }, - "perl_modules": { - ngxHTTPMainConf | ngxConfTake1, - }, - "perl_require": { - ngxHTTPMainConf | ngxConfTake1, - }, - "perl_set": { - ngxHTTPMainConf | ngxConfTake2, - }, - "pid": { - ngxMainConf | ngxDirectConf | ngxConfTake1, - }, - "pop3_auth": { - ngxMailMainConf | ngxMailSrvConf | ngxConf1More, - }, - "pop3_capabilities": { - ngxMailMainConf | ngxMailSrvConf | ngxConf1More, - }, - "port_in_redirect": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "postpone_output": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "preread_buffer_size": { - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "preread_timeout": { - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "protocol": { - ngxMailSrvConf | ngxConfTake1, - }, - "proxy_bind": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12, - }, - "proxy_buffer": { - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - }, - "proxy_buffer_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "proxy_buffering": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "proxy_buffers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - }, - "proxy_busy_buffers_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_cache": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_cache_background_update": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "proxy_cache_bypass": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "proxy_cache_convert_head": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "proxy_cache_key": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_cache_lock": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "proxy_cache_lock_age": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_cache_lock_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_cache_max_range_offset": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_cache_methods": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "proxy_cache_min_uses": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_cache_path": { - ngxHTTPMainConf | ngxConf2More, - }, - "proxy_cache_revalidate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "proxy_cache_use_stale": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "proxy_cache_valid": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "proxy_connect_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "proxy_cookie_domain": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, - }, - "proxy_cookie_flags": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234, - }, - "proxy_cookie_path": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, - }, - "proxy_download_rate": { - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "proxy_force_ranges": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "proxy_half_close": { - ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, - }, - "proxy_headers_hash_bucket_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_headers_hash_max_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_hide_header": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_http_version": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_ignore_client_abort": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "proxy_ignore_headers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "proxy_intercept_errors": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "proxy_limit_rate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_max_temp_file_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_method": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_next_upstream": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, - }, - "proxy_next_upstream_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "proxy_next_upstream_tries": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "proxy_no_cache": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "proxy_pass": { - ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConfTake1, - ngxStreamSrvConf | ngxConfTake1, - }, - "proxy_pass_error_message": { - ngxMailMainConf | ngxMailSrvConf | ngxConfFlag, - }, - "proxy_pass_header": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_pass_request_body": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "proxy_pass_request_headers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "proxy_protocol": { - ngxMailMainConf | ngxMailSrvConf | ngxConfFlag, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, - }, - "proxy_protocol_timeout": { - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "proxy_read_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_redirect": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, - }, - "proxy_request_buffering": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "proxy_requests": { - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "proxy_responses": { - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "proxy_send_lowat": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_send_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_set_body": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_set_header": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - }, - "proxy_smtp_auth": { - ngxMailMainConf | ngxMailSrvConf | ngxConfFlag, - }, - "proxy_socket_keepalive": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, - }, - "proxy_ssl": { - ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, - }, - "proxy_ssl_certificate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "proxy_ssl_certificate_key": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "proxy_ssl_ciphers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "proxy_ssl_conf_command": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2, - }, - "proxy_ssl_crl": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "proxy_ssl_name": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "proxy_ssl_password_file": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "proxy_ssl_protocols": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More, - }, - "proxy_ssl_server_name": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, - }, - "proxy_ssl_session_reuse": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, - }, - "proxy_ssl_trusted_certificate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "proxy_ssl_verify": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, - }, - "proxy_ssl_verify_depth": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "proxy_store": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_store_access": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123, - }, - "proxy_temp_file_write_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_temp_path": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234, - }, - "proxy_timeout": { - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "proxy_upload_rate": { - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "random": { - ngxHTTPUpsConf | ngxConfNoArgs | ngxConfTake12, - ngxStreamUpsConf | ngxConfNoArgs | ngxConfTake12, - }, - "random_index": { - ngxHTTPLocConf | ngxConfFlag, - }, - "read_ahead": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "real_ip_header": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "real_ip_recursive": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "recursive_error_pages": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "referer_hash_bucket_size": { - ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "referer_hash_max_size": { - ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "request_pool_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "reset_timedout_connection": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "resolver": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - ngxMailMainConf | ngxMailSrvConf | ngxConf1More, - ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More, - }, - "resolver_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "return": { - ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake12, - ngxStreamSrvConf | ngxConfTake1, - }, - "rewrite": { - ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23, - }, - "rewrite_log": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag, - }, - "root": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, - }, - "satisfy": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_bind": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, - }, - "scgi_buffer_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_buffering": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "scgi_buffers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - }, - "scgi_busy_buffers_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_cache": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_cache_background_update": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "scgi_cache_bypass": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "scgi_cache_key": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_cache_lock": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "scgi_cache_lock_age": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_cache_lock_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_cache_max_range_offset": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_cache_methods": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "scgi_cache_min_uses": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_cache_path": { - ngxHTTPMainConf | ngxConf2More, - }, - "scgi_cache_revalidate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "scgi_cache_use_stale": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "scgi_cache_valid": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "scgi_connect_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_force_ranges": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "scgi_hide_header": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_ignore_client_abort": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "scgi_ignore_headers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "scgi_intercept_errors": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "scgi_limit_rate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_max_temp_file_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_next_upstream": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "scgi_next_upstream_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_next_upstream_tries": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_no_cache": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "scgi_param": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23, - }, - "scgi_pass": { - ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, - }, - "scgi_pass_header": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_pass_request_body": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "scgi_pass_request_headers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "scgi_read_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_request_buffering": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "scgi_send_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_socket_keepalive": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "scgi_store": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_store_access": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123, - }, - "scgi_temp_file_write_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_temp_path": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234, - }, - "secure_link": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "secure_link_md5": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "secure_link_secret": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "send_lowat": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "send_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "sendfile": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag, - }, - "sendfile_max_chunk": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "server": { - ngxHTTPMainConf | ngxConfBlock | ngxConfNoArgs, - ngxHTTPUpsConf | ngxConf1More, - ngxMailMainConf | ngxConfBlock | ngxConfNoArgs, - ngxStreamMainConf | ngxConfBlock | ngxConfNoArgs, - ngxStreamUpsConf | ngxConf1More, - }, - "server_name": { - ngxHTTPSrvConf | ngxConf1More, - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - }, - "server_name_in_redirect": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "server_names_hash_bucket_size": { - ngxHTTPMainConf | ngxConfTake1, - }, - "server_names_hash_max_size": { - ngxHTTPMainConf | ngxConfTake1, - }, - "server_tokens": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "set": { - ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake2, - ngxStreamSrvConf | ngxConfTake2, - }, - "set_real_ip_from": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "slice": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "smtp_auth": { - ngxMailMainConf | ngxMailSrvConf | ngxConf1More, - }, - "smtp_capabilities": { - ngxMailMainConf | ngxMailSrvConf | ngxConf1More, - }, - "smtp_client_buffer": { - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - }, - "smtp_greeting_delay": { - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - }, - "source_charset": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, - }, - "split_clients": { - ngxHTTPMainConf | ngxConfBlock | ngxConfTake2, - ngxStreamMainConf | ngxConfBlock | ngxConfTake2, - }, - "ssi": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag, - }, - "ssi_last_modified": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "ssi_min_file_chunk": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "ssi_silent_errors": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "ssi_types": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "ssi_value_length": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "ssl": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, - ngxMailMainConf | ngxMailSrvConf | ngxConfFlag, - }, - "ssl_alpn": { - ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More, - }, - "ssl_buffer_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "ssl_certificate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "ssl_certificate_key": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "ssl_ciphers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "ssl_client_certificate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "ssl_conf_command": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake2, - ngxMailMainConf | ngxMailSrvConf | ngxConfTake2, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2, - }, - "ssl_crl": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "ssl_dhparam": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "ssl_early_data": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, - }, - "ssl_ecdh_curve": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "ssl_engine": { - ngxMainConf | ngxDirectConf | ngxConfTake1, - }, - "ssl_handshake_timeout": { - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "ssl_ocsp": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, - }, - "ssl_ocsp_cache": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "ssl_ocsp_responder": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "ssl_password_file": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "ssl_prefer_server_ciphers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, - ngxMailMainConf | ngxMailSrvConf | ngxConfFlag, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, - }, - "ssl_preread": { - ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, - }, - "ssl_protocols": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConf1More, - ngxMailMainConf | ngxMailSrvConf | ngxConf1More, - ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More, - }, - "ssl_reject_handshake": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, - }, - "ssl_session_cache": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake12, - ngxMailMainConf | ngxMailSrvConf | ngxConfTake12, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12, - }, - "ssl_session_ticket_key": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "ssl_session_tickets": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, - ngxMailMainConf | ngxMailSrvConf | ngxConfFlag, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, - }, - "ssl_session_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "ssl_stapling": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, - }, - "ssl_stapling_file": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "ssl_stapling_responder": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "ssl_stapling_verify": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, - }, - "ssl_trusted_certificate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "ssl_verify_client": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "ssl_verify_depth": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "starttls": { - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - }, - "stream": { - ngxMainConf | ngxConfBlock | ngxConfNoArgs, - }, - "stub_status": { - ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfNoArgs | ngxConfTake1, - }, - "sub_filter": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - }, - "sub_filter_last_modified": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "sub_filter_once": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "sub_filter_types": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "subrequest_output_buffer_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "tcp_nodelay": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, - }, - "tcp_nopush": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "thread_pool": { - ngxMainConf | ngxDirectConf | ngxConfTake23, - }, - "timeout": { - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - }, - "timer_resolution": { - ngxMainConf | ngxDirectConf | ngxConfTake1, - }, - "try_files": { - ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf2More, - }, - "types": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfNoArgs, - }, - "types_hash_bucket_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "types_hash_max_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "underscores_in_headers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, - }, - "uninitialized_variable_warn": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag, - }, - "upstream": { - ngxHTTPMainConf | ngxConfBlock | ngxConfTake1, - ngxStreamMainConf | ngxConfBlock | ngxConfTake1, - }, - "use": { - ngxEventConf | ngxConfTake1, - }, - "user": { - ngxMainConf | ngxDirectConf | ngxConfTake12, - }, - "userid": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "userid_domain": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "userid_expires": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "userid_flags": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123, - }, - "userid_mark": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "userid_name": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "userid_p3p": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "userid_path": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "userid_service": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_bind": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, - }, - "uwsgi_buffer_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_buffering": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "uwsgi_buffers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - }, - "uwsgi_busy_buffers_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_cache": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_cache_background_update": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_cache_bypass": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "uwsgi_cache_key": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_cache_lock": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "uwsgi_cache_lock_age": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_cache_lock_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_cache_max_range_offset": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_cache_methods": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "uwsgi_cache_min_uses": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_cache_path": { - ngxHTTPMainConf | ngxConf2More, - }, - "uwsgi_cache_revalidate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "uwsgi_cache_use_stale": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "uwsgi_cache_valid": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "uwsgi_connect_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_force_ranges": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "uwsgi_hide_header": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_ignore_client_abort": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "uwsgi_ignore_headers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "uwsgi_intercept_errors": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "uwsgi_limit_rate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_max_temp_file_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_modifier1": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_modifier2": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_next_upstream": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "uwsgi_next_upstream_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_next_upstream_tries": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_no_cache": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "uwsgi_param": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23, - }, - "uwsgi_pass": { - ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, - }, - "uwsgi_pass_header": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_pass_request_body": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "uwsgi_pass_request_headers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "uwsgi_read_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_request_buffering": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "uwsgi_send_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_socket_keepalive": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "uwsgi_ssl_certificate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_ssl_certificate_key": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_ssl_ciphers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_ssl_conf_command": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - }, - "uwsgi_ssl_crl": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_ssl_name": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_ssl_password_file": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_ssl_protocols": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "uwsgi_ssl_server_name": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "uwsgi_ssl_session_reuse": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "uwsgi_ssl_trusted_certificate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_ssl_verify": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "uwsgi_ssl_verify_depth": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_store": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_store_access": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123, - }, - "uwsgi_temp_file_write_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_temp_path": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234, - }, - "valid_referers": { - ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "variables_hash_bucket_size": { - ngxHTTPMainConf | ngxConfTake1, - ngxStreamMainConf | ngxConfTake1, - }, - "variables_hash_max_size": { - ngxHTTPMainConf | ngxConfTake1, - ngxStreamMainConf | ngxConfTake1, - }, - "worker_aio_requests": { - ngxEventConf | ngxConfTake1, - }, - "worker_connections": { - ngxEventConf | ngxConfTake1, - }, - "worker_cpu_affinity": { - ngxMainConf | ngxDirectConf | ngxConf1More, - }, - "worker_priority": { - ngxMainConf | ngxDirectConf | ngxConfTake1, - }, - "worker_processes": { - ngxMainConf | ngxDirectConf | ngxConfTake1, - }, - "worker_rlimit_core": { - ngxMainConf | ngxDirectConf | ngxConfTake1, - }, - "worker_rlimit_nofile": { - ngxMainConf | ngxDirectConf | ngxConfTake1, - }, - "worker_shutdown_timeout": { - ngxMainConf | ngxDirectConf | ngxConfTake1, - }, - "working_directory": { - ngxMainConf | ngxDirectConf | ngxConfTake1, - }, - "xclient": { - ngxMailMainConf | ngxMailSrvConf | ngxConfFlag, - }, - "xml_entities": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "xslt_last_modified": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "xslt_param": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - }, - "xslt_string_param": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - }, - "xslt_stylesheet": { - ngxHTTPLocConf | ngxConf1More, - }, - "xslt_types": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "zone": { - ngxHTTPUpsConf | ngxConfTake12, - ngxStreamUpsConf | ngxConfTake12, - }, -} - -func Oss124DirectivesMatchFn(directive string) ([]uint, bool) { - masks, matched := ngxOss124Directives[directive] - return masks, matched -} diff --git a/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_126_directives.gen.go b/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_126_directives.gen.go new file mode 100644 index 0000000000..1fb0ee8cf1 --- /dev/null +++ b/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_126_directives.gen.go @@ -0,0 +1,1907 @@ +/** + * Copyright (c) F5, Inc. + * + * This source code is licensed under the Apache License, Version 2.0 license found in the + * LICENSE file in the root directory of this source tree. + */ + +// Code generated by generator; DO NOT EDIT. +// All the definitions are extracted from the source code +// Each bit mask describes these behaviors: +// - how many arguments the directive can take +// - whether or not it is a block directive +// - whether this is a flag (takes one argument that's either "on" or "off") +// - which contexts it's allowed to be in + +package crossplane + +var oss126Directives = map[string][]uint{ + "absolute_redirect": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "accept_mutex": { + ngxEventConf | ngxConfFlag, + }, + "accept_mutex_delay": { + ngxEventConf | ngxConfTake1, + }, + "access_log": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConf1More, + ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More, + }, + "add_after_body": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "add_before_body": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "add_header": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23, + }, + "add_trailer": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23, + }, + "addition_types": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "aio": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "aio_write": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "alias": { + ngxHTTPLocConf | ngxConfTake1, + }, + "allow": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "ancient_browser": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "ancient_browser_value": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "auth_basic": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1, + }, + "auth_basic_user_file": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1, + }, + "auth_delay": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "auth_http": { + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + }, + "auth_http_header": { + ngxMailMainConf | ngxMailSrvConf | ngxConfTake2, + }, + "auth_http_pass_client_cert": { + ngxMailMainConf | ngxMailSrvConf | ngxConfFlag, + }, + "auth_http_timeout": { + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + }, + "auth_request": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "auth_request_set": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + }, + "autoindex": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "autoindex_exact_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "autoindex_format": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "autoindex_localtime": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "break": { + ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfNoArgs, + }, + "charset": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, + }, + "charset_map": { + ngxHTTPMainConf | ngxConfBlock | ngxConfTake2, + }, + "charset_types": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "chunked_transfer_encoding": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "client_body_buffer_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "client_body_in_file_only": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "client_body_in_single_buffer": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "client_body_temp_path": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234, + }, + "client_body_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "client_header_buffer_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "client_header_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "client_max_body_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "connection_pool_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "create_full_put_path": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "daemon": { + ngxMainConf | ngxDirectConf | ngxConfFlag, + }, + "dav_access": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123, + }, + "dav_methods": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "debug_connection": { + ngxEventConf | ngxConfTake1, + }, + "debug_points": { + ngxMainConf | ngxDirectConf | ngxConfTake1, + }, + "default_type": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "deny": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "directio": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "directio_alignment": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "disable_symlinks": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, + }, + "empty_gif": { + ngxHTTPLocConf | ngxConfNoArgs, + }, + "env": { + ngxMainConf | ngxDirectConf | ngxConfTake1, + }, + "error_log": { + ngxMainConf | ngxConf1More, + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + ngxMailMainConf | ngxMailSrvConf | ngxConf1More, + ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More, + }, + "error_page": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf2More, + }, + "etag": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "events": { + ngxMainConf | ngxConfBlock | ngxConfNoArgs, + }, + "expires": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake12, + }, + "fastcgi_bind": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, + }, + "fastcgi_buffer_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_buffering": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "fastcgi_buffers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + }, + "fastcgi_busy_buffers_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_cache": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_cache_background_update": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "fastcgi_cache_bypass": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "fastcgi_cache_key": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_cache_lock": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "fastcgi_cache_lock_age": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_cache_lock_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_cache_max_range_offset": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_cache_methods": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "fastcgi_cache_min_uses": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_cache_path": { + ngxHTTPMainConf | ngxConf2More, + }, + "fastcgi_cache_revalidate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "fastcgi_cache_use_stale": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "fastcgi_cache_valid": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "fastcgi_catch_stderr": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_connect_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_force_ranges": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "fastcgi_hide_header": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_ignore_client_abort": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "fastcgi_ignore_headers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "fastcgi_index": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_intercept_errors": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "fastcgi_keep_conn": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "fastcgi_limit_rate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_max_temp_file_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_next_upstream": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "fastcgi_next_upstream_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_next_upstream_tries": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_no_cache": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "fastcgi_param": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23, + }, + "fastcgi_pass": { + ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, + }, + "fastcgi_pass_header": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_pass_request_body": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "fastcgi_pass_request_headers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "fastcgi_read_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_request_buffering": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "fastcgi_send_lowat": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_send_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_socket_keepalive": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "fastcgi_split_path_info": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_store": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_store_access": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123, + }, + "fastcgi_temp_file_write_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_temp_path": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234, + }, + "flv": { + ngxHTTPLocConf | ngxConfNoArgs, + }, + "geo": { + ngxHTTPMainConf | ngxConfBlock | ngxConfTake12, + ngxStreamMainConf | ngxConfBlock | ngxConfTake12, + }, + "geoip_city": { + ngxHTTPMainConf | ngxConfTake12, + ngxStreamMainConf | ngxConfTake12, + }, + "geoip_country": { + ngxHTTPMainConf | ngxConfTake12, + ngxStreamMainConf | ngxConfTake12, + }, + "geoip_org": { + ngxHTTPMainConf | ngxConfTake12, + ngxStreamMainConf | ngxConfTake12, + }, + "geoip_proxy": { + ngxHTTPMainConf | ngxConfTake1, + }, + "geoip_proxy_recursive": { + ngxHTTPMainConf | ngxConfFlag, + }, + "google_perftools_profiles": { + ngxMainConf | ngxDirectConf | ngxConfTake1, + }, + "grpc_bind": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, + }, + "grpc_buffer_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "grpc_connect_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "grpc_hide_header": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "grpc_ignore_headers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "grpc_intercept_errors": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "grpc_next_upstream": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "grpc_next_upstream_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "grpc_next_upstream_tries": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "grpc_pass": { + ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, + }, + "grpc_pass_header": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "grpc_read_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "grpc_send_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "grpc_set_header": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + }, + "grpc_socket_keepalive": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "grpc_ssl_certificate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "grpc_ssl_certificate_key": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "grpc_ssl_ciphers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "grpc_ssl_conf_command": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + }, + "grpc_ssl_crl": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "grpc_ssl_name": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "grpc_ssl_password_file": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "grpc_ssl_protocols": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "grpc_ssl_server_name": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "grpc_ssl_session_reuse": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "grpc_ssl_trusted_certificate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "grpc_ssl_verify": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "grpc_ssl_verify_depth": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "gunzip": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "gunzip_buffers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + }, + "gzip": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag, + }, + "gzip_buffers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + }, + "gzip_comp_level": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "gzip_disable": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "gzip_http_version": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "gzip_min_length": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "gzip_proxied": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "gzip_static": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "gzip_types": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "gzip_vary": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "hash": { + ngxHTTPUpsConf | ngxConfTake12, + ngxStreamUpsConf | ngxConfTake12, + }, + "http": { + ngxMainConf | ngxConfBlock | ngxConfNoArgs, + }, + "http2": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, + }, + "http2_body_preread_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "http2_chunk_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "http2_idle_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "http2_max_concurrent_pushes": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "http2_max_concurrent_streams": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "http2_max_field_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "http2_max_header_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "http2_max_requests": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "http2_push": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "http2_push_preload": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "http2_recv_buffer_size": { + ngxHTTPMainConf | ngxConfTake1, + }, + "http2_recv_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "http3": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, + }, + "http3_hq": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, + }, + "http3_max_concurrent_streams": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "http3_stream_buffer_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "if": { + ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfExpr | ngxConf1More, + }, + "if_modified_since": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "ignore_invalid_headers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, + }, + "image_filter": { + ngxHTTPLocConf | ngxConfTake123, + }, + "image_filter_buffer": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "image_filter_interlace": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "image_filter_jpeg_quality": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "image_filter_sharpen": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "image_filter_transparency": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "image_filter_webp_quality": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "imap_auth": { + ngxMailMainConf | ngxMailSrvConf | ngxConf1More, + }, + "imap_capabilities": { + ngxMailMainConf | ngxMailSrvConf | ngxConf1More, + }, + "imap_client_buffer": { + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + }, + "include": { + ngxAnyConf | ngxConfTake1, + }, + "index": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "internal": { + ngxHTTPLocConf | ngxConfNoArgs, + }, + "ip_hash": { + ngxHTTPUpsConf | ngxConfNoArgs, + }, + "keepalive": { + ngxHTTPUpsConf | ngxConfTake1, + }, + "keepalive_disable": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, + }, + "keepalive_requests": { + ngxHTTPUpsConf | ngxConfTake1, + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "keepalive_time": { + ngxHTTPUpsConf | ngxConfTake1, + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "keepalive_timeout": { + ngxHTTPUpsConf | ngxConfTake1, + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, + }, + "large_client_header_buffers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake2, + }, + "least_conn": { + ngxHTTPUpsConf | ngxConfNoArgs, + ngxStreamUpsConf | ngxConfNoArgs, + }, + "limit_conn": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2, + }, + "limit_conn_dry_run": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, + }, + "limit_conn_log_level": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "limit_conn_status": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "limit_conn_zone": { + ngxHTTPMainConf | ngxConfTake2, + ngxStreamMainConf | ngxConfTake2, + }, + "limit_except": { + ngxHTTPLocConf | ngxConfBlock | ngxConf1More, + }, + "limit_rate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, + }, + "limit_rate_after": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, + }, + "limit_req": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123, + }, + "limit_req_dry_run": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "limit_req_log_level": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "limit_req_status": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "limit_req_zone": { + ngxHTTPMainConf | ngxConfTake3, + }, + "lingering_close": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "lingering_time": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "lingering_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "listen": { + ngxHTTPSrvConf | ngxConf1More, + ngxMailSrvConf | ngxConf1More, + ngxStreamSrvConf | ngxConf1More, + }, + "load_module": { + ngxMainConf | ngxDirectConf | ngxConfTake1, + }, + "location": { + ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfTake12, + }, + "lock_file": { + ngxMainConf | ngxDirectConf | ngxConfTake1, + }, + "log_format": { + ngxHTTPMainConf | ngxConf2More, + ngxStreamMainConf | ngxConf2More, + }, + "log_not_found": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "log_subrequest": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "mail": { + ngxMainConf | ngxConfBlock | ngxConfNoArgs, + }, + "map": { + ngxHTTPMainConf | ngxConfBlock | ngxConfTake2, + ngxStreamMainConf | ngxConfBlock | ngxConfTake2, + }, + "map_hash_bucket_size": { + ngxHTTPMainConf | ngxConfTake1, + ngxStreamMainConf | ngxConfTake1, + }, + "map_hash_max_size": { + ngxHTTPMainConf | ngxConfTake1, + ngxStreamMainConf | ngxConfTake1, + }, + "master_process": { + ngxMainConf | ngxDirectConf | ngxConfFlag, + }, + "max_errors": { + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + }, + "max_ranges": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "memcached_bind": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, + }, + "memcached_buffer_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "memcached_connect_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "memcached_gzip_flag": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "memcached_next_upstream": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "memcached_next_upstream_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "memcached_next_upstream_tries": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "memcached_pass": { + ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, + }, + "memcached_read_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "memcached_send_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "memcached_socket_keepalive": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "merge_slashes": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, + }, + "min_delete_depth": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "mirror": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "mirror_request_body": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "modern_browser": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, + }, + "modern_browser_value": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "mp4": { + ngxHTTPLocConf | ngxConfNoArgs, + }, + "mp4_buffer_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "mp4_max_buffer_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "mp4_start_key_frame": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "msie_padding": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "msie_refresh": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "multi_accept": { + ngxEventConf | ngxConfFlag, + }, + "open_file_cache": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, + }, + "open_file_cache_errors": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "open_file_cache_min_uses": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "open_file_cache_valid": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "open_log_file_cache": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1234, + }, + "output_buffers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + }, + "override_charset": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag, + }, + "pass": { + ngxStreamSrvConf | ngxConfTake1, + }, + "pcre_jit": { + ngxMainConf | ngxDirectConf | ngxConfFlag, + }, + "perl": { + ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1, + }, + "perl_modules": { + ngxHTTPMainConf | ngxConfTake1, + }, + "perl_require": { + ngxHTTPMainConf | ngxConfTake1, + }, + "perl_set": { + ngxHTTPMainConf | ngxConfTake2, + }, + "pid": { + ngxMainConf | ngxDirectConf | ngxConfTake1, + }, + "pop3_auth": { + ngxMailMainConf | ngxMailSrvConf | ngxConf1More, + }, + "pop3_capabilities": { + ngxMailMainConf | ngxMailSrvConf | ngxConf1More, + }, + "port_in_redirect": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "postpone_output": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "preread_buffer_size": { + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "preread_timeout": { + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "protocol": { + ngxMailSrvConf | ngxConfTake1, + }, + "proxy_bind": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12, + }, + "proxy_buffer": { + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + }, + "proxy_buffer_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_buffering": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "proxy_buffers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + }, + "proxy_busy_buffers_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_cache": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_cache_background_update": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "proxy_cache_bypass": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "proxy_cache_convert_head": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "proxy_cache_key": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_cache_lock": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "proxy_cache_lock_age": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_cache_lock_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_cache_max_range_offset": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_cache_methods": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "proxy_cache_min_uses": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_cache_path": { + ngxHTTPMainConf | ngxConf2More, + }, + "proxy_cache_revalidate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "proxy_cache_use_stale": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "proxy_cache_valid": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "proxy_connect_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_cookie_domain": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, + }, + "proxy_cookie_flags": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234, + }, + "proxy_cookie_path": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, + }, + "proxy_download_rate": { + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_force_ranges": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "proxy_half_close": { + ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, + }, + "proxy_headers_hash_bucket_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_headers_hash_max_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_hide_header": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_http_version": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_ignore_client_abort": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "proxy_ignore_headers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "proxy_intercept_errors": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "proxy_limit_rate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_max_temp_file_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_method": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_next_upstream": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, + }, + "proxy_next_upstream_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_next_upstream_tries": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_no_cache": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "proxy_pass": { + ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConfTake1, + ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_pass_error_message": { + ngxMailMainConf | ngxMailSrvConf | ngxConfFlag, + }, + "proxy_pass_header": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_pass_request_body": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "proxy_pass_request_headers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "proxy_protocol": { + ngxMailMainConf | ngxMailSrvConf | ngxConfFlag, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, + }, + "proxy_protocol_timeout": { + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_read_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_redirect": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, + }, + "proxy_request_buffering": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "proxy_requests": { + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_responses": { + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_send_lowat": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_send_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_set_body": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_set_header": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + }, + "proxy_smtp_auth": { + ngxMailMainConf | ngxMailSrvConf | ngxConfFlag, + }, + "proxy_socket_keepalive": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, + }, + "proxy_ssl": { + ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, + }, + "proxy_ssl_certificate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_ssl_certificate_key": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_ssl_ciphers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_ssl_conf_command": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2, + }, + "proxy_ssl_crl": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_ssl_name": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_ssl_password_file": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_ssl_protocols": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More, + }, + "proxy_ssl_server_name": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, + }, + "proxy_ssl_session_reuse": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, + }, + "proxy_ssl_trusted_certificate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_ssl_verify": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, + }, + "proxy_ssl_verify_depth": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_store": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_store_access": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123, + }, + "proxy_temp_file_write_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_temp_path": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234, + }, + "proxy_timeout": { + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_upload_rate": { + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "quic_active_connection_id_limit": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "quic_bpf": { + ngxMainConf | ngxDirectConf | ngxConfFlag, + }, + "quic_gso": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, + }, + "quic_host_key": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "quic_retry": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, + }, + "random": { + ngxHTTPUpsConf | ngxConfNoArgs | ngxConfTake12, + ngxStreamUpsConf | ngxConfNoArgs | ngxConfTake12, + }, + "random_index": { + ngxHTTPLocConf | ngxConfFlag, + }, + "read_ahead": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "real_ip_header": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "real_ip_recursive": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "recursive_error_pages": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "referer_hash_bucket_size": { + ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "referer_hash_max_size": { + ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "request_pool_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "reset_timedout_connection": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "resolver": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + ngxMailMainConf | ngxMailSrvConf | ngxConf1More, + ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More, + }, + "resolver_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "return": { + ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake12, + ngxStreamSrvConf | ngxConfTake1, + }, + "rewrite": { + ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23, + }, + "rewrite_log": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag, + }, + "root": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, + }, + "satisfy": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_bind": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, + }, + "scgi_buffer_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_buffering": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "scgi_buffers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + }, + "scgi_busy_buffers_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_cache": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_cache_background_update": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "scgi_cache_bypass": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "scgi_cache_key": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_cache_lock": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "scgi_cache_lock_age": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_cache_lock_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_cache_max_range_offset": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_cache_methods": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "scgi_cache_min_uses": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_cache_path": { + ngxHTTPMainConf | ngxConf2More, + }, + "scgi_cache_revalidate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "scgi_cache_use_stale": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "scgi_cache_valid": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "scgi_connect_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_force_ranges": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "scgi_hide_header": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_ignore_client_abort": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "scgi_ignore_headers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "scgi_intercept_errors": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "scgi_limit_rate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_max_temp_file_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_next_upstream": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "scgi_next_upstream_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_next_upstream_tries": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_no_cache": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "scgi_param": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23, + }, + "scgi_pass": { + ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, + }, + "scgi_pass_header": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_pass_request_body": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "scgi_pass_request_headers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "scgi_read_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_request_buffering": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "scgi_send_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_socket_keepalive": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "scgi_store": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_store_access": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123, + }, + "scgi_temp_file_write_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_temp_path": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234, + }, + "secure_link": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "secure_link_md5": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "secure_link_secret": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "send_lowat": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "send_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "sendfile": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag, + }, + "sendfile_max_chunk": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "server": { + ngxHTTPMainConf | ngxConfBlock | ngxConfNoArgs, + ngxHTTPUpsConf | ngxConf1More, + ngxMailMainConf | ngxConfBlock | ngxConfNoArgs, + ngxStreamMainConf | ngxConfBlock | ngxConfNoArgs, + ngxStreamUpsConf | ngxConf1More, + }, + "server_name": { + ngxHTTPSrvConf | ngxConf1More, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamSrvConf | ngxConf1More, + }, + "server_name_in_redirect": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "server_names_hash_bucket_size": { + ngxHTTPMainConf | ngxConfTake1, + ngxStreamMainConf | ngxConfTake1, + }, + "server_names_hash_max_size": { + ngxHTTPMainConf | ngxConfTake1, + ngxStreamMainConf | ngxConfTake1, + }, + "server_tokens": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "set": { + ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake2, + ngxStreamSrvConf | ngxConfTake2, + }, + "set_real_ip_from": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "slice": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "smtp_auth": { + ngxMailMainConf | ngxMailSrvConf | ngxConf1More, + }, + "smtp_capabilities": { + ngxMailMainConf | ngxMailSrvConf | ngxConf1More, + }, + "smtp_client_buffer": { + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + }, + "smtp_greeting_delay": { + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + }, + "source_charset": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, + }, + "split_clients": { + ngxHTTPMainConf | ngxConfBlock | ngxConfTake2, + ngxStreamMainConf | ngxConfBlock | ngxConfTake2, + }, + "ssi": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag, + }, + "ssi_last_modified": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "ssi_min_file_chunk": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "ssi_silent_errors": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "ssi_types": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "ssi_value_length": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "ssl_alpn": { + ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More, + }, + "ssl_buffer_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "ssl_certificate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "ssl_certificate_key": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "ssl_ciphers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "ssl_client_certificate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "ssl_conf_command": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake2, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake2, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2, + }, + "ssl_crl": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "ssl_dhparam": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "ssl_early_data": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, + }, + "ssl_ecdh_curve": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "ssl_engine": { + ngxMainConf | ngxDirectConf | ngxConfTake1, + }, + "ssl_handshake_timeout": { + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "ssl_ocsp": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, + }, + "ssl_ocsp_cache": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "ssl_ocsp_responder": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "ssl_password_file": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "ssl_prefer_server_ciphers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, + ngxMailMainConf | ngxMailSrvConf | ngxConfFlag, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, + }, + "ssl_preread": { + ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, + }, + "ssl_protocols": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConf1More, + ngxMailMainConf | ngxMailSrvConf | ngxConf1More, + ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More, + }, + "ssl_reject_handshake": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, + }, + "ssl_session_cache": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake12, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake12, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12, + }, + "ssl_session_ticket_key": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "ssl_session_tickets": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, + ngxMailMainConf | ngxMailSrvConf | ngxConfFlag, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, + }, + "ssl_session_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "ssl_stapling": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, + }, + "ssl_stapling_file": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "ssl_stapling_responder": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "ssl_stapling_verify": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, + }, + "ssl_trusted_certificate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "ssl_verify_client": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "ssl_verify_depth": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "starttls": { + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + }, + "stream": { + ngxMainConf | ngxConfBlock | ngxConfNoArgs, + }, + "stub_status": { + ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfNoArgs | ngxConfTake1, + }, + "sub_filter": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + }, + "sub_filter_last_modified": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "sub_filter_once": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "sub_filter_types": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "subrequest_output_buffer_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "tcp_nodelay": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, + }, + "tcp_nopush": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "thread_pool": { + ngxMainConf | ngxDirectConf | ngxConfTake23, + }, + "timeout": { + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + }, + "timer_resolution": { + ngxMainConf | ngxDirectConf | ngxConfTake1, + }, + "try_files": { + ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf2More, + }, + "types": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfNoArgs, + }, + "types_hash_bucket_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "types_hash_max_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "underscores_in_headers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, + }, + "uninitialized_variable_warn": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag, + }, + "upstream": { + ngxHTTPMainConf | ngxConfBlock | ngxConfTake1, + ngxStreamMainConf | ngxConfBlock | ngxConfTake1, + }, + "use": { + ngxEventConf | ngxConfTake1, + }, + "user": { + ngxMainConf | ngxDirectConf | ngxConfTake12, + }, + "userid": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "userid_domain": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "userid_expires": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "userid_flags": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123, + }, + "userid_mark": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "userid_name": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "userid_p3p": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "userid_path": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "userid_service": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_bind": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, + }, + "uwsgi_buffer_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_buffering": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "uwsgi_buffers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + }, + "uwsgi_busy_buffers_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_cache": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_cache_background_update": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_cache_bypass": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "uwsgi_cache_key": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_cache_lock": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "uwsgi_cache_lock_age": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_cache_lock_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_cache_max_range_offset": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_cache_methods": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "uwsgi_cache_min_uses": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_cache_path": { + ngxHTTPMainConf | ngxConf2More, + }, + "uwsgi_cache_revalidate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "uwsgi_cache_use_stale": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "uwsgi_cache_valid": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "uwsgi_connect_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_force_ranges": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "uwsgi_hide_header": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_ignore_client_abort": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "uwsgi_ignore_headers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "uwsgi_intercept_errors": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "uwsgi_limit_rate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_max_temp_file_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_modifier1": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_modifier2": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_next_upstream": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "uwsgi_next_upstream_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_next_upstream_tries": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_no_cache": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "uwsgi_param": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23, + }, + "uwsgi_pass": { + ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, + }, + "uwsgi_pass_header": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_pass_request_body": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "uwsgi_pass_request_headers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "uwsgi_read_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_request_buffering": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "uwsgi_send_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_socket_keepalive": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "uwsgi_ssl_certificate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_ssl_certificate_key": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_ssl_ciphers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_ssl_conf_command": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + }, + "uwsgi_ssl_crl": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_ssl_name": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_ssl_password_file": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_ssl_protocols": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "uwsgi_ssl_server_name": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "uwsgi_ssl_session_reuse": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "uwsgi_ssl_trusted_certificate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_ssl_verify": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "uwsgi_ssl_verify_depth": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_store": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_store_access": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123, + }, + "uwsgi_temp_file_write_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_temp_path": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234, + }, + "valid_referers": { + ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "variables_hash_bucket_size": { + ngxHTTPMainConf | ngxConfTake1, + ngxStreamMainConf | ngxConfTake1, + }, + "variables_hash_max_size": { + ngxHTTPMainConf | ngxConfTake1, + ngxStreamMainConf | ngxConfTake1, + }, + "worker_aio_requests": { + ngxEventConf | ngxConfTake1, + }, + "worker_connections": { + ngxEventConf | ngxConfTake1, + }, + "worker_cpu_affinity": { + ngxMainConf | ngxDirectConf | ngxConf1More, + }, + "worker_priority": { + ngxMainConf | ngxDirectConf | ngxConfTake1, + }, + "worker_processes": { + ngxMainConf | ngxDirectConf | ngxConfTake1, + }, + "worker_rlimit_core": { + ngxMainConf | ngxDirectConf | ngxConfTake1, + }, + "worker_rlimit_nofile": { + ngxMainConf | ngxDirectConf | ngxConfTake1, + }, + "worker_shutdown_timeout": { + ngxMainConf | ngxDirectConf | ngxConfTake1, + }, + "working_directory": { + ngxMainConf | ngxDirectConf | ngxConfTake1, + }, + "xclient": { + ngxMailMainConf | ngxMailSrvConf | ngxConfFlag, + }, + "xml_entities": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "xslt_last_modified": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "xslt_param": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + }, + "xslt_string_param": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + }, + "xslt_stylesheet": { + ngxHTTPLocConf | ngxConf1More, + }, + "xslt_types": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "zone": { + ngxHTTPUpsConf | ngxConfTake12, + ngxStreamUpsConf | ngxConfTake12, + }, +} + +// MatchOss126 contains directives in OSS 1.2.6 source code(including GEOIP, Perl, and XSLT) +func MatchOss126(directive string) ([]uint, bool) { + m, ok := oss126Directives[directive] + return m, ok +} diff --git a/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_126_directives.go b/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_126_directives.go deleted file mode 100644 index 6a35295eed..0000000000 --- a/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_126_directives.go +++ /dev/null @@ -1,1906 +0,0 @@ -/** - * Copyright (c) F5, Inc. - * - * This source code is licensed under the Apache License, Version 2.0 license found in the - * LICENSE file in the root directory of this source tree. - */ - -// All the definitions are extracted from the source code -// Each bit mask describes these behaviors: -// - how many arguments the directive can take -// - whether or not it is a block directive -// - whether this is a flag (takes one argument that's either "on" or "off") -// - which contexts it's allowed to be in - -package crossplane - -//nolint:gochecknoglobals -var ngxOss126Directives = map[string][]uint{ - "absolute_redirect": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "accept_mutex": { - ngxEventConf | ngxConfFlag, - }, - "accept_mutex_delay": { - ngxEventConf | ngxConfTake1, - }, - "access_log": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConf1More, - ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More, - }, - "add_after_body": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "add_before_body": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "add_header": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23, - }, - "add_trailer": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23, - }, - "addition_types": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "aio": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "aio_write": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "alias": { - ngxHTTPLocConf | ngxConfTake1, - }, - "allow": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "ancient_browser": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "ancient_browser_value": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "auth_basic": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1, - }, - "auth_basic_user_file": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1, - }, - "auth_delay": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "auth_http": { - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - }, - "auth_http_header": { - ngxMailMainConf | ngxMailSrvConf | ngxConfTake2, - }, - "auth_http_pass_client_cert": { - ngxMailMainConf | ngxMailSrvConf | ngxConfFlag, - }, - "auth_http_timeout": { - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - }, - "auth_request": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "auth_request_set": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - }, - "autoindex": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "autoindex_exact_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "autoindex_format": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "autoindex_localtime": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "break": { - ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfNoArgs, - }, - "charset": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, - }, - "charset_map": { - ngxHTTPMainConf | ngxConfBlock | ngxConfTake2, - }, - "charset_types": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "chunked_transfer_encoding": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "client_body_buffer_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "client_body_in_file_only": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "client_body_in_single_buffer": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "client_body_temp_path": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234, - }, - "client_body_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "client_header_buffer_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "client_header_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "client_max_body_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "connection_pool_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "create_full_put_path": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "daemon": { - ngxMainConf | ngxDirectConf | ngxConfFlag, - }, - "dav_access": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123, - }, - "dav_methods": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "debug_connection": { - ngxEventConf | ngxConfTake1, - }, - "debug_points": { - ngxMainConf | ngxDirectConf | ngxConfTake1, - }, - "default_type": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "deny": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "directio": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "directio_alignment": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "disable_symlinks": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, - }, - "empty_gif": { - ngxHTTPLocConf | ngxConfNoArgs, - }, - "env": { - ngxMainConf | ngxDirectConf | ngxConfTake1, - }, - "error_log": { - ngxMainConf | ngxConf1More, - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - ngxMailMainConf | ngxMailSrvConf | ngxConf1More, - ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More, - }, - "error_page": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf2More, - }, - "etag": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "events": { - ngxMainConf | ngxConfBlock | ngxConfNoArgs, - }, - "expires": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake12, - }, - "fastcgi_bind": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, - }, - "fastcgi_buffer_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_buffering": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "fastcgi_buffers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - }, - "fastcgi_busy_buffers_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_cache": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_cache_background_update": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "fastcgi_cache_bypass": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "fastcgi_cache_key": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_cache_lock": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "fastcgi_cache_lock_age": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_cache_lock_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_cache_max_range_offset": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_cache_methods": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "fastcgi_cache_min_uses": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_cache_path": { - ngxHTTPMainConf | ngxConf2More, - }, - "fastcgi_cache_revalidate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "fastcgi_cache_use_stale": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "fastcgi_cache_valid": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "fastcgi_catch_stderr": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_connect_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_force_ranges": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "fastcgi_hide_header": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_ignore_client_abort": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "fastcgi_ignore_headers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "fastcgi_index": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_intercept_errors": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "fastcgi_keep_conn": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "fastcgi_limit_rate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_max_temp_file_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_next_upstream": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "fastcgi_next_upstream_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_next_upstream_tries": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_no_cache": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "fastcgi_param": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23, - }, - "fastcgi_pass": { - ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, - }, - "fastcgi_pass_header": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_pass_request_body": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "fastcgi_pass_request_headers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "fastcgi_read_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_request_buffering": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "fastcgi_send_lowat": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_send_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_socket_keepalive": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "fastcgi_split_path_info": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_store": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_store_access": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123, - }, - "fastcgi_temp_file_write_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_temp_path": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234, - }, - "flv": { - ngxHTTPLocConf | ngxConfNoArgs, - }, - "geo": { - ngxHTTPMainConf | ngxConfBlock | ngxConfTake12, - ngxStreamMainConf | ngxConfBlock | ngxConfTake12, - }, - "geoip_city": { - ngxHTTPMainConf | ngxConfTake12, - ngxStreamMainConf | ngxConfTake12, - }, - "geoip_country": { - ngxHTTPMainConf | ngxConfTake12, - ngxStreamMainConf | ngxConfTake12, - }, - "geoip_org": { - ngxHTTPMainConf | ngxConfTake12, - ngxStreamMainConf | ngxConfTake12, - }, - "geoip_proxy": { - ngxHTTPMainConf | ngxConfTake1, - }, - "geoip_proxy_recursive": { - ngxHTTPMainConf | ngxConfFlag, - }, - "google_perftools_profiles": { - ngxMainConf | ngxDirectConf | ngxConfTake1, - }, - "grpc_bind": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, - }, - "grpc_buffer_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "grpc_connect_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "grpc_hide_header": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "grpc_ignore_headers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "grpc_intercept_errors": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "grpc_next_upstream": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "grpc_next_upstream_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "grpc_next_upstream_tries": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "grpc_pass": { - ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, - }, - "grpc_pass_header": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "grpc_read_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "grpc_send_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "grpc_set_header": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - }, - "grpc_socket_keepalive": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "grpc_ssl_certificate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "grpc_ssl_certificate_key": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "grpc_ssl_ciphers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "grpc_ssl_conf_command": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - }, - "grpc_ssl_crl": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "grpc_ssl_name": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "grpc_ssl_password_file": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "grpc_ssl_protocols": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "grpc_ssl_server_name": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "grpc_ssl_session_reuse": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "grpc_ssl_trusted_certificate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "grpc_ssl_verify": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "grpc_ssl_verify_depth": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "gunzip": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "gunzip_buffers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - }, - "gzip": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag, - }, - "gzip_buffers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - }, - "gzip_comp_level": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "gzip_disable": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "gzip_http_version": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "gzip_min_length": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "gzip_proxied": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "gzip_static": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "gzip_types": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "gzip_vary": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "hash": { - ngxHTTPUpsConf | ngxConfTake12, - ngxStreamUpsConf | ngxConfTake12, - }, - "http": { - ngxMainConf | ngxConfBlock | ngxConfNoArgs, - }, - "http2": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, - }, - "http2_body_preread_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "http2_chunk_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "http2_idle_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "http2_max_concurrent_pushes": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "http2_max_concurrent_streams": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "http2_max_field_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "http2_max_header_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "http2_max_requests": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "http2_push": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "http2_push_preload": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "http2_recv_buffer_size": { - ngxHTTPMainConf | ngxConfTake1, - }, - "http2_recv_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "http3": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, - }, - "http3_hq": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, - }, - "http3_max_concurrent_streams": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "http3_stream_buffer_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "if": { - ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfExpr | ngxConf1More, - }, - "if_modified_since": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "ignore_invalid_headers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, - }, - "image_filter": { - ngxHTTPLocConf | ngxConfTake123, - }, - "image_filter_buffer": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "image_filter_interlace": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "image_filter_jpeg_quality": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "image_filter_sharpen": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "image_filter_transparency": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "image_filter_webp_quality": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "imap_auth": { - ngxMailMainConf | ngxMailSrvConf | ngxConf1More, - }, - "imap_capabilities": { - ngxMailMainConf | ngxMailSrvConf | ngxConf1More, - }, - "imap_client_buffer": { - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - }, - "include": { - ngxAnyConf | ngxConfTake1, - }, - "index": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "internal": { - ngxHTTPLocConf | ngxConfNoArgs, - }, - "ip_hash": { - ngxHTTPUpsConf | ngxConfNoArgs, - }, - "keepalive": { - ngxHTTPUpsConf | ngxConfTake1, - }, - "keepalive_disable": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, - }, - "keepalive_requests": { - ngxHTTPUpsConf | ngxConfTake1, - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "keepalive_time": { - ngxHTTPUpsConf | ngxConfTake1, - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "keepalive_timeout": { - ngxHTTPUpsConf | ngxConfTake1, - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, - }, - "large_client_header_buffers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake2, - }, - "least_conn": { - ngxHTTPUpsConf | ngxConfNoArgs, - ngxStreamUpsConf | ngxConfNoArgs, - }, - "limit_conn": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2, - }, - "limit_conn_dry_run": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, - }, - "limit_conn_log_level": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "limit_conn_status": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "limit_conn_zone": { - ngxHTTPMainConf | ngxConfTake2, - ngxStreamMainConf | ngxConfTake2, - }, - "limit_except": { - ngxHTTPLocConf | ngxConfBlock | ngxConf1More, - }, - "limit_rate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, - }, - "limit_rate_after": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, - }, - "limit_req": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123, - }, - "limit_req_dry_run": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "limit_req_log_level": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "limit_req_status": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "limit_req_zone": { - ngxHTTPMainConf | ngxConfTake3, - }, - "lingering_close": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "lingering_time": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "lingering_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "listen": { - ngxHTTPSrvConf | ngxConf1More, - ngxMailSrvConf | ngxConf1More, - ngxStreamSrvConf | ngxConf1More, - }, - "load_module": { - ngxMainConf | ngxDirectConf | ngxConfTake1, - }, - "location": { - ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfTake12, - }, - "lock_file": { - ngxMainConf | ngxDirectConf | ngxConfTake1, - }, - "log_format": { - ngxHTTPMainConf | ngxConf2More, - ngxStreamMainConf | ngxConf2More, - }, - "log_not_found": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "log_subrequest": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "mail": { - ngxMainConf | ngxConfBlock | ngxConfNoArgs, - }, - "map": { - ngxHTTPMainConf | ngxConfBlock | ngxConfTake2, - ngxStreamMainConf | ngxConfBlock | ngxConfTake2, - }, - "map_hash_bucket_size": { - ngxHTTPMainConf | ngxConfTake1, - ngxStreamMainConf | ngxConfTake1, - }, - "map_hash_max_size": { - ngxHTTPMainConf | ngxConfTake1, - ngxStreamMainConf | ngxConfTake1, - }, - "master_process": { - ngxMainConf | ngxDirectConf | ngxConfFlag, - }, - "max_errors": { - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - }, - "max_ranges": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "memcached_bind": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, - }, - "memcached_buffer_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "memcached_connect_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "memcached_gzip_flag": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "memcached_next_upstream": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "memcached_next_upstream_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "memcached_next_upstream_tries": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "memcached_pass": { - ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, - }, - "memcached_read_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "memcached_send_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "memcached_socket_keepalive": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "merge_slashes": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, - }, - "min_delete_depth": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "mirror": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "mirror_request_body": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "modern_browser": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, - }, - "modern_browser_value": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "mp4": { - ngxHTTPLocConf | ngxConfNoArgs, - }, - "mp4_buffer_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "mp4_max_buffer_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "mp4_start_key_frame": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "msie_padding": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "msie_refresh": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "multi_accept": { - ngxEventConf | ngxConfFlag, - }, - "open_file_cache": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, - }, - "open_file_cache_errors": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "open_file_cache_min_uses": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "open_file_cache_valid": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "open_log_file_cache": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1234, - }, - "output_buffers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - }, - "override_charset": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag, - }, - "pass": { - ngxStreamSrvConf | ngxConfTake1, - }, - "pcre_jit": { - ngxMainConf | ngxDirectConf | ngxConfFlag, - }, - "perl": { - ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1, - }, - "perl_modules": { - ngxHTTPMainConf | ngxConfTake1, - }, - "perl_require": { - ngxHTTPMainConf | ngxConfTake1, - }, - "perl_set": { - ngxHTTPMainConf | ngxConfTake2, - }, - "pid": { - ngxMainConf | ngxDirectConf | ngxConfTake1, - }, - "pop3_auth": { - ngxMailMainConf | ngxMailSrvConf | ngxConf1More, - }, - "pop3_capabilities": { - ngxMailMainConf | ngxMailSrvConf | ngxConf1More, - }, - "port_in_redirect": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "postpone_output": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "preread_buffer_size": { - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "preread_timeout": { - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "protocol": { - ngxMailSrvConf | ngxConfTake1, - }, - "proxy_bind": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12, - }, - "proxy_buffer": { - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - }, - "proxy_buffer_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "proxy_buffering": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "proxy_buffers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - }, - "proxy_busy_buffers_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_cache": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_cache_background_update": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "proxy_cache_bypass": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "proxy_cache_convert_head": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "proxy_cache_key": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_cache_lock": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "proxy_cache_lock_age": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_cache_lock_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_cache_max_range_offset": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_cache_methods": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "proxy_cache_min_uses": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_cache_path": { - ngxHTTPMainConf | ngxConf2More, - }, - "proxy_cache_revalidate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "proxy_cache_use_stale": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "proxy_cache_valid": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "proxy_connect_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "proxy_cookie_domain": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, - }, - "proxy_cookie_flags": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234, - }, - "proxy_cookie_path": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, - }, - "proxy_download_rate": { - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "proxy_force_ranges": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "proxy_half_close": { - ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, - }, - "proxy_headers_hash_bucket_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_headers_hash_max_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_hide_header": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_http_version": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_ignore_client_abort": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "proxy_ignore_headers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "proxy_intercept_errors": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "proxy_limit_rate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_max_temp_file_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_method": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_next_upstream": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, - }, - "proxy_next_upstream_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "proxy_next_upstream_tries": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "proxy_no_cache": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "proxy_pass": { - ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConfTake1, - ngxStreamSrvConf | ngxConfTake1, - }, - "proxy_pass_error_message": { - ngxMailMainConf | ngxMailSrvConf | ngxConfFlag, - }, - "proxy_pass_header": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_pass_request_body": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "proxy_pass_request_headers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "proxy_protocol": { - ngxMailMainConf | ngxMailSrvConf | ngxConfFlag, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, - }, - "proxy_protocol_timeout": { - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "proxy_read_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_redirect": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, - }, - "proxy_request_buffering": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "proxy_requests": { - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "proxy_responses": { - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "proxy_send_lowat": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_send_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_set_body": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_set_header": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - }, - "proxy_smtp_auth": { - ngxMailMainConf | ngxMailSrvConf | ngxConfFlag, - }, - "proxy_socket_keepalive": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, - }, - "proxy_ssl": { - ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, - }, - "proxy_ssl_certificate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "proxy_ssl_certificate_key": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "proxy_ssl_ciphers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "proxy_ssl_conf_command": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2, - }, - "proxy_ssl_crl": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "proxy_ssl_name": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "proxy_ssl_password_file": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "proxy_ssl_protocols": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More, - }, - "proxy_ssl_server_name": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, - }, - "proxy_ssl_session_reuse": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, - }, - "proxy_ssl_trusted_certificate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "proxy_ssl_verify": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, - }, - "proxy_ssl_verify_depth": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "proxy_store": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_store_access": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123, - }, - "proxy_temp_file_write_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_temp_path": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234, - }, - "proxy_timeout": { - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "proxy_upload_rate": { - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "quic_active_connection_id_limit": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "quic_bpf": { - ngxMainConf | ngxDirectConf | ngxConfFlag, - }, - "quic_gso": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, - }, - "quic_host_key": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "quic_retry": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, - }, - "random": { - ngxHTTPUpsConf | ngxConfNoArgs | ngxConfTake12, - ngxStreamUpsConf | ngxConfNoArgs | ngxConfTake12, - }, - "random_index": { - ngxHTTPLocConf | ngxConfFlag, - }, - "read_ahead": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "real_ip_header": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "real_ip_recursive": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "recursive_error_pages": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "referer_hash_bucket_size": { - ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "referer_hash_max_size": { - ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "request_pool_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "reset_timedout_connection": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "resolver": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - ngxMailMainConf | ngxMailSrvConf | ngxConf1More, - ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More, - }, - "resolver_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "return": { - ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake12, - ngxStreamSrvConf | ngxConfTake1, - }, - "rewrite": { - ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23, - }, - "rewrite_log": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag, - }, - "root": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, - }, - "satisfy": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_bind": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, - }, - "scgi_buffer_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_buffering": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "scgi_buffers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - }, - "scgi_busy_buffers_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_cache": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_cache_background_update": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "scgi_cache_bypass": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "scgi_cache_key": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_cache_lock": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "scgi_cache_lock_age": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_cache_lock_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_cache_max_range_offset": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_cache_methods": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "scgi_cache_min_uses": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_cache_path": { - ngxHTTPMainConf | ngxConf2More, - }, - "scgi_cache_revalidate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "scgi_cache_use_stale": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "scgi_cache_valid": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "scgi_connect_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_force_ranges": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "scgi_hide_header": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_ignore_client_abort": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "scgi_ignore_headers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "scgi_intercept_errors": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "scgi_limit_rate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_max_temp_file_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_next_upstream": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "scgi_next_upstream_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_next_upstream_tries": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_no_cache": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "scgi_param": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23, - }, - "scgi_pass": { - ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, - }, - "scgi_pass_header": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_pass_request_body": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "scgi_pass_request_headers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "scgi_read_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_request_buffering": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "scgi_send_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_socket_keepalive": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "scgi_store": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_store_access": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123, - }, - "scgi_temp_file_write_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_temp_path": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234, - }, - "secure_link": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "secure_link_md5": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "secure_link_secret": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "send_lowat": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "send_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "sendfile": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag, - }, - "sendfile_max_chunk": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "server": { - ngxHTTPMainConf | ngxConfBlock | ngxConfNoArgs, - ngxHTTPUpsConf | ngxConf1More, - ngxMailMainConf | ngxConfBlock | ngxConfNoArgs, - ngxStreamMainConf | ngxConfBlock | ngxConfNoArgs, - ngxStreamUpsConf | ngxConf1More, - }, - "server_name": { - ngxHTTPSrvConf | ngxConf1More, - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - ngxStreamSrvConf | ngxConf1More, - }, - "server_name_in_redirect": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "server_names_hash_bucket_size": { - ngxHTTPMainConf | ngxConfTake1, - ngxStreamMainConf | ngxConfTake1, - }, - "server_names_hash_max_size": { - ngxHTTPMainConf | ngxConfTake1, - ngxStreamMainConf | ngxConfTake1, - }, - "server_tokens": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "set": { - ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake2, - ngxStreamSrvConf | ngxConfTake2, - }, - "set_real_ip_from": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "slice": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "smtp_auth": { - ngxMailMainConf | ngxMailSrvConf | ngxConf1More, - }, - "smtp_capabilities": { - ngxMailMainConf | ngxMailSrvConf | ngxConf1More, - }, - "smtp_client_buffer": { - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - }, - "smtp_greeting_delay": { - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - }, - "source_charset": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, - }, - "split_clients": { - ngxHTTPMainConf | ngxConfBlock | ngxConfTake2, - ngxStreamMainConf | ngxConfBlock | ngxConfTake2, - }, - "ssi": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag, - }, - "ssi_last_modified": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "ssi_min_file_chunk": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "ssi_silent_errors": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "ssi_types": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "ssi_value_length": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "ssl_alpn": { - ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More, - }, - "ssl_buffer_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "ssl_certificate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "ssl_certificate_key": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "ssl_ciphers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "ssl_client_certificate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "ssl_conf_command": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake2, - ngxMailMainConf | ngxMailSrvConf | ngxConfTake2, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2, - }, - "ssl_crl": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "ssl_dhparam": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "ssl_early_data": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, - }, - "ssl_ecdh_curve": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "ssl_engine": { - ngxMainConf | ngxDirectConf | ngxConfTake1, - }, - "ssl_handshake_timeout": { - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "ssl_ocsp": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, - }, - "ssl_ocsp_cache": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "ssl_ocsp_responder": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "ssl_password_file": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "ssl_prefer_server_ciphers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, - ngxMailMainConf | ngxMailSrvConf | ngxConfFlag, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, - }, - "ssl_preread": { - ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, - }, - "ssl_protocols": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConf1More, - ngxMailMainConf | ngxMailSrvConf | ngxConf1More, - ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More, - }, - "ssl_reject_handshake": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, - }, - "ssl_session_cache": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake12, - ngxMailMainConf | ngxMailSrvConf | ngxConfTake12, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12, - }, - "ssl_session_ticket_key": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "ssl_session_tickets": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, - ngxMailMainConf | ngxMailSrvConf | ngxConfFlag, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, - }, - "ssl_session_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "ssl_stapling": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, - }, - "ssl_stapling_file": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "ssl_stapling_responder": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "ssl_stapling_verify": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, - }, - "ssl_trusted_certificate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "ssl_verify_client": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "ssl_verify_depth": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "starttls": { - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - }, - "stream": { - ngxMainConf | ngxConfBlock | ngxConfNoArgs, - }, - "stub_status": { - ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfNoArgs | ngxConfTake1, - }, - "sub_filter": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - }, - "sub_filter_last_modified": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "sub_filter_once": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "sub_filter_types": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "subrequest_output_buffer_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "tcp_nodelay": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, - }, - "tcp_nopush": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "thread_pool": { - ngxMainConf | ngxDirectConf | ngxConfTake23, - }, - "timeout": { - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - }, - "timer_resolution": { - ngxMainConf | ngxDirectConf | ngxConfTake1, - }, - "try_files": { - ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf2More, - }, - "types": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfNoArgs, - }, - "types_hash_bucket_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "types_hash_max_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "underscores_in_headers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, - }, - "uninitialized_variable_warn": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag, - }, - "upstream": { - ngxHTTPMainConf | ngxConfBlock | ngxConfTake1, - ngxStreamMainConf | ngxConfBlock | ngxConfTake1, - }, - "use": { - ngxEventConf | ngxConfTake1, - }, - "user": { - ngxMainConf | ngxDirectConf | ngxConfTake12, - }, - "userid": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "userid_domain": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "userid_expires": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "userid_flags": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123, - }, - "userid_mark": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "userid_name": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "userid_p3p": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "userid_path": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "userid_service": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_bind": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, - }, - "uwsgi_buffer_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_buffering": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "uwsgi_buffers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - }, - "uwsgi_busy_buffers_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_cache": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_cache_background_update": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_cache_bypass": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "uwsgi_cache_key": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_cache_lock": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "uwsgi_cache_lock_age": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_cache_lock_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_cache_max_range_offset": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_cache_methods": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "uwsgi_cache_min_uses": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_cache_path": { - ngxHTTPMainConf | ngxConf2More, - }, - "uwsgi_cache_revalidate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "uwsgi_cache_use_stale": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "uwsgi_cache_valid": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "uwsgi_connect_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_force_ranges": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "uwsgi_hide_header": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_ignore_client_abort": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "uwsgi_ignore_headers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "uwsgi_intercept_errors": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "uwsgi_limit_rate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_max_temp_file_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_modifier1": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_modifier2": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_next_upstream": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "uwsgi_next_upstream_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_next_upstream_tries": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_no_cache": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "uwsgi_param": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23, - }, - "uwsgi_pass": { - ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, - }, - "uwsgi_pass_header": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_pass_request_body": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "uwsgi_pass_request_headers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "uwsgi_read_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_request_buffering": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "uwsgi_send_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_socket_keepalive": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "uwsgi_ssl_certificate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_ssl_certificate_key": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_ssl_ciphers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_ssl_conf_command": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - }, - "uwsgi_ssl_crl": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_ssl_name": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_ssl_password_file": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_ssl_protocols": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "uwsgi_ssl_server_name": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "uwsgi_ssl_session_reuse": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "uwsgi_ssl_trusted_certificate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_ssl_verify": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "uwsgi_ssl_verify_depth": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_store": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_store_access": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123, - }, - "uwsgi_temp_file_write_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_temp_path": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234, - }, - "valid_referers": { - ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "variables_hash_bucket_size": { - ngxHTTPMainConf | ngxConfTake1, - ngxStreamMainConf | ngxConfTake1, - }, - "variables_hash_max_size": { - ngxHTTPMainConf | ngxConfTake1, - ngxStreamMainConf | ngxConfTake1, - }, - "worker_aio_requests": { - ngxEventConf | ngxConfTake1, - }, - "worker_connections": { - ngxEventConf | ngxConfTake1, - }, - "worker_cpu_affinity": { - ngxMainConf | ngxDirectConf | ngxConf1More, - }, - "worker_priority": { - ngxMainConf | ngxDirectConf | ngxConfTake1, - }, - "worker_processes": { - ngxMainConf | ngxDirectConf | ngxConfTake1, - }, - "worker_rlimit_core": { - ngxMainConf | ngxDirectConf | ngxConfTake1, - }, - "worker_rlimit_nofile": { - ngxMainConf | ngxDirectConf | ngxConfTake1, - }, - "worker_shutdown_timeout": { - ngxMainConf | ngxDirectConf | ngxConfTake1, - }, - "working_directory": { - ngxMainConf | ngxDirectConf | ngxConfTake1, - }, - "xclient": { - ngxMailMainConf | ngxMailSrvConf | ngxConfFlag, - }, - "xml_entities": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "xslt_last_modified": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "xslt_param": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - }, - "xslt_string_param": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - }, - "xslt_stylesheet": { - ngxHTTPLocConf | ngxConf1More, - }, - "xslt_types": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "zone": { - ngxHTTPUpsConf | ngxConfTake12, - ngxStreamUpsConf | ngxConfTake12, - }, -} - -func Oss126DirectivesMatchFn(directive string) ([]uint, bool) { - masks, matched := ngxOss126Directives[directive] - return masks, matched -} diff --git a/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_latest_directives.gen.go b/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_latest_directives.gen.go new file mode 100644 index 0000000000..5ef3eac02a --- /dev/null +++ b/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_latest_directives.gen.go @@ -0,0 +1,1907 @@ +/** + * Copyright (c) F5, Inc. + * + * This source code is licensed under the Apache License, Version 2.0 license found in the + * LICENSE file in the root directory of this source tree. + */ + +// Code generated by generator; DO NOT EDIT. +// All the definitions are extracted from the source code +// Each bit mask describes these behaviors: +// - how many arguments the directive can take +// - whether or not it is a block directive +// - whether this is a flag (takes one argument that's either "on" or "off") +// - which contexts it's allowed to be in + +package crossplane + +var ossLatestDirectives = map[string][]uint{ + "absolute_redirect": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "accept_mutex": { + ngxEventConf | ngxConfFlag, + }, + "accept_mutex_delay": { + ngxEventConf | ngxConfTake1, + }, + "access_log": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConf1More, + ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More, + }, + "add_after_body": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "add_before_body": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "add_header": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23, + }, + "add_trailer": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23, + }, + "addition_types": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "aio": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "aio_write": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "alias": { + ngxHTTPLocConf | ngxConfTake1, + }, + "allow": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "ancient_browser": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "ancient_browser_value": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "auth_basic": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1, + }, + "auth_basic_user_file": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1, + }, + "auth_delay": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "auth_http": { + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + }, + "auth_http_header": { + ngxMailMainConf | ngxMailSrvConf | ngxConfTake2, + }, + "auth_http_pass_client_cert": { + ngxMailMainConf | ngxMailSrvConf | ngxConfFlag, + }, + "auth_http_timeout": { + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + }, + "auth_request": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "auth_request_set": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + }, + "autoindex": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "autoindex_exact_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "autoindex_format": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "autoindex_localtime": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "break": { + ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfNoArgs, + }, + "charset": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, + }, + "charset_map": { + ngxHTTPMainConf | ngxConfBlock | ngxConfTake2, + }, + "charset_types": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "chunked_transfer_encoding": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "client_body_buffer_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "client_body_in_file_only": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "client_body_in_single_buffer": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "client_body_temp_path": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234, + }, + "client_body_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "client_header_buffer_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "client_header_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "client_max_body_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "connection_pool_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "create_full_put_path": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "daemon": { + ngxMainConf | ngxDirectConf | ngxConfFlag, + }, + "dav_access": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123, + }, + "dav_methods": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "debug_connection": { + ngxEventConf | ngxConfTake1, + }, + "debug_points": { + ngxMainConf | ngxDirectConf | ngxConfTake1, + }, + "default_type": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "deny": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "directio": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "directio_alignment": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "disable_symlinks": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, + }, + "empty_gif": { + ngxHTTPLocConf | ngxConfNoArgs, + }, + "env": { + ngxMainConf | ngxDirectConf | ngxConfTake1, + }, + "error_log": { + ngxMainConf | ngxConf1More, + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + ngxMailMainConf | ngxMailSrvConf | ngxConf1More, + ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More, + }, + "error_page": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf2More, + }, + "etag": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "events": { + ngxMainConf | ngxConfBlock | ngxConfNoArgs, + }, + "expires": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake12, + }, + "fastcgi_bind": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, + }, + "fastcgi_buffer_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_buffering": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "fastcgi_buffers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + }, + "fastcgi_busy_buffers_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_cache": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_cache_background_update": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "fastcgi_cache_bypass": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "fastcgi_cache_key": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_cache_lock": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "fastcgi_cache_lock_age": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_cache_lock_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_cache_max_range_offset": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_cache_methods": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "fastcgi_cache_min_uses": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_cache_path": { + ngxHTTPMainConf | ngxConf2More, + }, + "fastcgi_cache_revalidate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "fastcgi_cache_use_stale": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "fastcgi_cache_valid": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "fastcgi_catch_stderr": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_connect_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_force_ranges": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "fastcgi_hide_header": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_ignore_client_abort": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "fastcgi_ignore_headers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "fastcgi_index": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_intercept_errors": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "fastcgi_keep_conn": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "fastcgi_limit_rate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_max_temp_file_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_next_upstream": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "fastcgi_next_upstream_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_next_upstream_tries": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_no_cache": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "fastcgi_param": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23, + }, + "fastcgi_pass": { + ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, + }, + "fastcgi_pass_header": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_pass_request_body": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "fastcgi_pass_request_headers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "fastcgi_read_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_request_buffering": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "fastcgi_send_lowat": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_send_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_socket_keepalive": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "fastcgi_split_path_info": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_store": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_store_access": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123, + }, + "fastcgi_temp_file_write_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "fastcgi_temp_path": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234, + }, + "flv": { + ngxHTTPLocConf | ngxConfNoArgs, + }, + "geo": { + ngxHTTPMainConf | ngxConfBlock | ngxConfTake12, + ngxStreamMainConf | ngxConfBlock | ngxConfTake12, + }, + "geoip_city": { + ngxHTTPMainConf | ngxConfTake12, + ngxStreamMainConf | ngxConfTake12, + }, + "geoip_country": { + ngxHTTPMainConf | ngxConfTake12, + ngxStreamMainConf | ngxConfTake12, + }, + "geoip_org": { + ngxHTTPMainConf | ngxConfTake12, + ngxStreamMainConf | ngxConfTake12, + }, + "geoip_proxy": { + ngxHTTPMainConf | ngxConfTake1, + }, + "geoip_proxy_recursive": { + ngxHTTPMainConf | ngxConfFlag, + }, + "google_perftools_profiles": { + ngxMainConf | ngxDirectConf | ngxConfTake1, + }, + "grpc_bind": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, + }, + "grpc_buffer_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "grpc_connect_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "grpc_hide_header": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "grpc_ignore_headers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "grpc_intercept_errors": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "grpc_next_upstream": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "grpc_next_upstream_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "grpc_next_upstream_tries": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "grpc_pass": { + ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, + }, + "grpc_pass_header": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "grpc_read_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "grpc_send_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "grpc_set_header": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + }, + "grpc_socket_keepalive": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "grpc_ssl_certificate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "grpc_ssl_certificate_key": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "grpc_ssl_ciphers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "grpc_ssl_conf_command": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + }, + "grpc_ssl_crl": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "grpc_ssl_name": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "grpc_ssl_password_file": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "grpc_ssl_protocols": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "grpc_ssl_server_name": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "grpc_ssl_session_reuse": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "grpc_ssl_trusted_certificate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "grpc_ssl_verify": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "grpc_ssl_verify_depth": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "gunzip": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "gunzip_buffers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + }, + "gzip": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag, + }, + "gzip_buffers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + }, + "gzip_comp_level": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "gzip_disable": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "gzip_http_version": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "gzip_min_length": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "gzip_proxied": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "gzip_static": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "gzip_types": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "gzip_vary": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "hash": { + ngxHTTPUpsConf | ngxConfTake12, + ngxStreamUpsConf | ngxConfTake12, + }, + "http": { + ngxMainConf | ngxConfBlock | ngxConfNoArgs, + }, + "http2": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, + }, + "http2_body_preread_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "http2_chunk_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "http2_idle_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "http2_max_concurrent_pushes": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "http2_max_concurrent_streams": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "http2_max_field_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "http2_max_header_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "http2_max_requests": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "http2_push": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "http2_push_preload": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "http2_recv_buffer_size": { + ngxHTTPMainConf | ngxConfTake1, + }, + "http2_recv_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "http3": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, + }, + "http3_hq": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, + }, + "http3_max_concurrent_streams": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "http3_stream_buffer_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "if": { + ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfExpr | ngxConf1More, + }, + "if_modified_since": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "ignore_invalid_headers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, + }, + "image_filter": { + ngxHTTPLocConf | ngxConfTake123, + }, + "image_filter_buffer": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "image_filter_interlace": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "image_filter_jpeg_quality": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "image_filter_sharpen": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "image_filter_transparency": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "image_filter_webp_quality": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "imap_auth": { + ngxMailMainConf | ngxMailSrvConf | ngxConf1More, + }, + "imap_capabilities": { + ngxMailMainConf | ngxMailSrvConf | ngxConf1More, + }, + "imap_client_buffer": { + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + }, + "include": { + ngxAnyConf | ngxConfTake1, + }, + "index": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "internal": { + ngxHTTPLocConf | ngxConfNoArgs, + }, + "ip_hash": { + ngxHTTPUpsConf | ngxConfNoArgs, + }, + "keepalive": { + ngxHTTPUpsConf | ngxConfTake1, + }, + "keepalive_disable": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, + }, + "keepalive_requests": { + ngxHTTPUpsConf | ngxConfTake1, + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "keepalive_time": { + ngxHTTPUpsConf | ngxConfTake1, + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "keepalive_timeout": { + ngxHTTPUpsConf | ngxConfTake1, + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, + }, + "large_client_header_buffers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake2, + }, + "least_conn": { + ngxHTTPUpsConf | ngxConfNoArgs, + ngxStreamUpsConf | ngxConfNoArgs, + }, + "limit_conn": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2, + }, + "limit_conn_dry_run": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, + }, + "limit_conn_log_level": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "limit_conn_status": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "limit_conn_zone": { + ngxHTTPMainConf | ngxConfTake2, + ngxStreamMainConf | ngxConfTake2, + }, + "limit_except": { + ngxHTTPLocConf | ngxConfBlock | ngxConf1More, + }, + "limit_rate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, + }, + "limit_rate_after": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, + }, + "limit_req": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123, + }, + "limit_req_dry_run": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "limit_req_log_level": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "limit_req_status": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "limit_req_zone": { + ngxHTTPMainConf | ngxConfTake3, + }, + "lingering_close": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "lingering_time": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "lingering_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "listen": { + ngxHTTPSrvConf | ngxConf1More, + ngxMailSrvConf | ngxConf1More, + ngxStreamSrvConf | ngxConf1More, + }, + "load_module": { + ngxMainConf | ngxDirectConf | ngxConfTake1, + }, + "location": { + ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfTake12, + }, + "lock_file": { + ngxMainConf | ngxDirectConf | ngxConfTake1, + }, + "log_format": { + ngxHTTPMainConf | ngxConf2More, + ngxStreamMainConf | ngxConf2More, + }, + "log_not_found": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "log_subrequest": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "mail": { + ngxMainConf | ngxConfBlock | ngxConfNoArgs, + }, + "map": { + ngxHTTPMainConf | ngxConfBlock | ngxConfTake2, + ngxStreamMainConf | ngxConfBlock | ngxConfTake2, + }, + "map_hash_bucket_size": { + ngxHTTPMainConf | ngxConfTake1, + ngxStreamMainConf | ngxConfTake1, + }, + "map_hash_max_size": { + ngxHTTPMainConf | ngxConfTake1, + ngxStreamMainConf | ngxConfTake1, + }, + "master_process": { + ngxMainConf | ngxDirectConf | ngxConfFlag, + }, + "max_errors": { + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + }, + "max_ranges": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "memcached_bind": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, + }, + "memcached_buffer_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "memcached_connect_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "memcached_gzip_flag": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "memcached_next_upstream": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "memcached_next_upstream_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "memcached_next_upstream_tries": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "memcached_pass": { + ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, + }, + "memcached_read_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "memcached_send_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "memcached_socket_keepalive": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "merge_slashes": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, + }, + "min_delete_depth": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "mirror": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "mirror_request_body": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "modern_browser": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, + }, + "modern_browser_value": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "mp4": { + ngxHTTPLocConf | ngxConfNoArgs, + }, + "mp4_buffer_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "mp4_max_buffer_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "mp4_start_key_frame": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "msie_padding": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "msie_refresh": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "multi_accept": { + ngxEventConf | ngxConfFlag, + }, + "open_file_cache": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, + }, + "open_file_cache_errors": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "open_file_cache_min_uses": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "open_file_cache_valid": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "open_log_file_cache": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1234, + }, + "output_buffers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + }, + "override_charset": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag, + }, + "pass": { + ngxStreamSrvConf | ngxConfTake1, + }, + "pcre_jit": { + ngxMainConf | ngxDirectConf | ngxConfFlag, + }, + "perl": { + ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1, + }, + "perl_modules": { + ngxHTTPMainConf | ngxConfTake1, + }, + "perl_require": { + ngxHTTPMainConf | ngxConfTake1, + }, + "perl_set": { + ngxHTTPMainConf | ngxConfTake2, + }, + "pid": { + ngxMainConf | ngxDirectConf | ngxConfTake1, + }, + "pop3_auth": { + ngxMailMainConf | ngxMailSrvConf | ngxConf1More, + }, + "pop3_capabilities": { + ngxMailMainConf | ngxMailSrvConf | ngxConf1More, + }, + "port_in_redirect": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "postpone_output": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "preread_buffer_size": { + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "preread_timeout": { + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "protocol": { + ngxMailSrvConf | ngxConfTake1, + }, + "proxy_bind": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12, + }, + "proxy_buffer": { + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + }, + "proxy_buffer_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_buffering": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "proxy_buffers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + }, + "proxy_busy_buffers_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_cache": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_cache_background_update": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "proxy_cache_bypass": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "proxy_cache_convert_head": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "proxy_cache_key": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_cache_lock": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "proxy_cache_lock_age": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_cache_lock_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_cache_max_range_offset": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_cache_methods": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "proxy_cache_min_uses": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_cache_path": { + ngxHTTPMainConf | ngxConf2More, + }, + "proxy_cache_revalidate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "proxy_cache_use_stale": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "proxy_cache_valid": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "proxy_connect_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_cookie_domain": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, + }, + "proxy_cookie_flags": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234, + }, + "proxy_cookie_path": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, + }, + "proxy_download_rate": { + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_force_ranges": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "proxy_half_close": { + ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, + }, + "proxy_headers_hash_bucket_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_headers_hash_max_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_hide_header": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_http_version": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_ignore_client_abort": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "proxy_ignore_headers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "proxy_intercept_errors": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "proxy_limit_rate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_max_temp_file_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_method": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_next_upstream": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, + }, + "proxy_next_upstream_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_next_upstream_tries": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_no_cache": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "proxy_pass": { + ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConfTake1, + ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_pass_error_message": { + ngxMailMainConf | ngxMailSrvConf | ngxConfFlag, + }, + "proxy_pass_header": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_pass_request_body": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "proxy_pass_request_headers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "proxy_protocol": { + ngxMailMainConf | ngxMailSrvConf | ngxConfFlag, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, + }, + "proxy_protocol_timeout": { + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_read_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_redirect": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, + }, + "proxy_request_buffering": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "proxy_requests": { + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_responses": { + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_send_lowat": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_send_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_set_body": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_set_header": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + }, + "proxy_smtp_auth": { + ngxMailMainConf | ngxMailSrvConf | ngxConfFlag, + }, + "proxy_socket_keepalive": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, + }, + "proxy_ssl": { + ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, + }, + "proxy_ssl_certificate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_ssl_certificate_key": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_ssl_ciphers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_ssl_conf_command": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2, + }, + "proxy_ssl_crl": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_ssl_name": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_ssl_password_file": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_ssl_protocols": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More, + }, + "proxy_ssl_server_name": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, + }, + "proxy_ssl_session_reuse": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, + }, + "proxy_ssl_trusted_certificate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_ssl_verify": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, + }, + "proxy_ssl_verify_depth": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_store": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_store_access": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123, + }, + "proxy_temp_file_write_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "proxy_temp_path": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234, + }, + "proxy_timeout": { + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "proxy_upload_rate": { + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "quic_active_connection_id_limit": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "quic_bpf": { + ngxMainConf | ngxDirectConf | ngxConfFlag, + }, + "quic_gso": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, + }, + "quic_host_key": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "quic_retry": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, + }, + "random": { + ngxHTTPUpsConf | ngxConfNoArgs | ngxConfTake12, + ngxStreamUpsConf | ngxConfNoArgs | ngxConfTake12, + }, + "random_index": { + ngxHTTPLocConf | ngxConfFlag, + }, + "read_ahead": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "real_ip_header": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "real_ip_recursive": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "recursive_error_pages": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "referer_hash_bucket_size": { + ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "referer_hash_max_size": { + ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "request_pool_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "reset_timedout_connection": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "resolver": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + ngxMailMainConf | ngxMailSrvConf | ngxConf1More, + ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More, + }, + "resolver_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "return": { + ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake12, + ngxStreamSrvConf | ngxConfTake1, + }, + "rewrite": { + ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23, + }, + "rewrite_log": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag, + }, + "root": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, + }, + "satisfy": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_bind": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, + }, + "scgi_buffer_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_buffering": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "scgi_buffers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + }, + "scgi_busy_buffers_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_cache": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_cache_background_update": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "scgi_cache_bypass": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "scgi_cache_key": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_cache_lock": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "scgi_cache_lock_age": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_cache_lock_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_cache_max_range_offset": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_cache_methods": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "scgi_cache_min_uses": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_cache_path": { + ngxHTTPMainConf | ngxConf2More, + }, + "scgi_cache_revalidate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "scgi_cache_use_stale": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "scgi_cache_valid": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "scgi_connect_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_force_ranges": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "scgi_hide_header": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_ignore_client_abort": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "scgi_ignore_headers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "scgi_intercept_errors": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "scgi_limit_rate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_max_temp_file_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_next_upstream": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "scgi_next_upstream_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_next_upstream_tries": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_no_cache": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "scgi_param": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23, + }, + "scgi_pass": { + ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, + }, + "scgi_pass_header": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_pass_request_body": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "scgi_pass_request_headers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "scgi_read_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_request_buffering": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "scgi_send_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_socket_keepalive": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "scgi_store": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_store_access": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123, + }, + "scgi_temp_file_write_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "scgi_temp_path": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234, + }, + "secure_link": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "secure_link_md5": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "secure_link_secret": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "send_lowat": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "send_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "sendfile": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag, + }, + "sendfile_max_chunk": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "server": { + ngxHTTPMainConf | ngxConfBlock | ngxConfNoArgs, + ngxHTTPUpsConf | ngxConf1More, + ngxMailMainConf | ngxConfBlock | ngxConfNoArgs, + ngxStreamMainConf | ngxConfBlock | ngxConfNoArgs, + ngxStreamUpsConf | ngxConf1More, + }, + "server_name": { + ngxHTTPSrvConf | ngxConf1More, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamSrvConf | ngxConf1More, + }, + "server_name_in_redirect": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "server_names_hash_bucket_size": { + ngxHTTPMainConf | ngxConfTake1, + ngxStreamMainConf | ngxConfTake1, + }, + "server_names_hash_max_size": { + ngxHTTPMainConf | ngxConfTake1, + ngxStreamMainConf | ngxConfTake1, + }, + "server_tokens": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "set": { + ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake2, + ngxStreamSrvConf | ngxConfTake2, + }, + "set_real_ip_from": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "slice": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "smtp_auth": { + ngxMailMainConf | ngxMailSrvConf | ngxConf1More, + }, + "smtp_capabilities": { + ngxMailMainConf | ngxMailSrvConf | ngxConf1More, + }, + "smtp_client_buffer": { + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + }, + "smtp_greeting_delay": { + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + }, + "source_charset": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, + }, + "split_clients": { + ngxHTTPMainConf | ngxConfBlock | ngxConfTake2, + ngxStreamMainConf | ngxConfBlock | ngxConfTake2, + }, + "ssi": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag, + }, + "ssi_last_modified": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "ssi_min_file_chunk": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "ssi_silent_errors": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "ssi_types": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "ssi_value_length": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "ssl_alpn": { + ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More, + }, + "ssl_buffer_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "ssl_certificate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "ssl_certificate_key": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "ssl_ciphers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "ssl_client_certificate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "ssl_conf_command": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake2, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake2, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2, + }, + "ssl_crl": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "ssl_dhparam": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "ssl_early_data": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, + }, + "ssl_ecdh_curve": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "ssl_engine": { + ngxMainConf | ngxDirectConf | ngxConfTake1, + }, + "ssl_handshake_timeout": { + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "ssl_ocsp": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, + }, + "ssl_ocsp_cache": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "ssl_ocsp_responder": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "ssl_password_file": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "ssl_prefer_server_ciphers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, + ngxMailMainConf | ngxMailSrvConf | ngxConfFlag, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, + }, + "ssl_preread": { + ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, + }, + "ssl_protocols": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConf1More, + ngxMailMainConf | ngxMailSrvConf | ngxConf1More, + ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More, + }, + "ssl_reject_handshake": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, + }, + "ssl_session_cache": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake12, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake12, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12, + }, + "ssl_session_ticket_key": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "ssl_session_tickets": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, + ngxMailMainConf | ngxMailSrvConf | ngxConfFlag, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, + }, + "ssl_session_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "ssl_stapling": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, + }, + "ssl_stapling_file": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "ssl_stapling_responder": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + }, + "ssl_stapling_verify": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, + }, + "ssl_trusted_certificate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "ssl_verify_client": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "ssl_verify_depth": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, + }, + "starttls": { + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + }, + "stream": { + ngxMainConf | ngxConfBlock | ngxConfNoArgs, + }, + "stub_status": { + ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfNoArgs | ngxConfTake1, + }, + "sub_filter": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + }, + "sub_filter_last_modified": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "sub_filter_once": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "sub_filter_types": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "subrequest_output_buffer_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "tcp_nodelay": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, + }, + "tcp_nopush": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "thread_pool": { + ngxMainConf | ngxDirectConf | ngxConfTake23, + }, + "timeout": { + ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, + }, + "timer_resolution": { + ngxMainConf | ngxDirectConf | ngxConfTake1, + }, + "try_files": { + ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf2More, + }, + "types": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfNoArgs, + }, + "types_hash_bucket_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "types_hash_max_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "underscores_in_headers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, + }, + "uninitialized_variable_warn": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag, + }, + "upstream": { + ngxHTTPMainConf | ngxConfBlock | ngxConfTake1, + ngxStreamMainConf | ngxConfBlock | ngxConfTake1, + }, + "use": { + ngxEventConf | ngxConfTake1, + }, + "user": { + ngxMainConf | ngxDirectConf | ngxConfTake12, + }, + "userid": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "userid_domain": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "userid_expires": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "userid_flags": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123, + }, + "userid_mark": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "userid_name": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "userid_p3p": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "userid_path": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "userid_service": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_bind": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, + }, + "uwsgi_buffer_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_buffering": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "uwsgi_buffers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + }, + "uwsgi_busy_buffers_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_cache": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_cache_background_update": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_cache_bypass": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "uwsgi_cache_key": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_cache_lock": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "uwsgi_cache_lock_age": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_cache_lock_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_cache_max_range_offset": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_cache_methods": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "uwsgi_cache_min_uses": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_cache_path": { + ngxHTTPMainConf | ngxConf2More, + }, + "uwsgi_cache_revalidate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "uwsgi_cache_use_stale": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "uwsgi_cache_valid": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "uwsgi_connect_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_force_ranges": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "uwsgi_hide_header": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_ignore_client_abort": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "uwsgi_ignore_headers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "uwsgi_intercept_errors": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "uwsgi_limit_rate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_max_temp_file_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_modifier1": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_modifier2": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_next_upstream": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "uwsgi_next_upstream_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_next_upstream_tries": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_no_cache": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "uwsgi_param": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23, + }, + "uwsgi_pass": { + ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, + }, + "uwsgi_pass_header": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_pass_request_body": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "uwsgi_pass_request_headers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "uwsgi_read_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_request_buffering": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "uwsgi_send_timeout": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_socket_keepalive": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "uwsgi_ssl_certificate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_ssl_certificate_key": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_ssl_ciphers": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_ssl_conf_command": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + }, + "uwsgi_ssl_crl": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_ssl_name": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_ssl_password_file": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_ssl_protocols": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "uwsgi_ssl_server_name": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "uwsgi_ssl_session_reuse": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "uwsgi_ssl_trusted_certificate": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_ssl_verify": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "uwsgi_ssl_verify_depth": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_store": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_store_access": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123, + }, + "uwsgi_temp_file_write_size": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "uwsgi_temp_path": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234, + }, + "valid_referers": { + ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "variables_hash_bucket_size": { + ngxHTTPMainConf | ngxConfTake1, + ngxStreamMainConf | ngxConfTake1, + }, + "variables_hash_max_size": { + ngxHTTPMainConf | ngxConfTake1, + ngxStreamMainConf | ngxConfTake1, + }, + "worker_aio_requests": { + ngxEventConf | ngxConfTake1, + }, + "worker_connections": { + ngxEventConf | ngxConfTake1, + }, + "worker_cpu_affinity": { + ngxMainConf | ngxDirectConf | ngxConf1More, + }, + "worker_priority": { + ngxMainConf | ngxDirectConf | ngxConfTake1, + }, + "worker_processes": { + ngxMainConf | ngxDirectConf | ngxConfTake1, + }, + "worker_rlimit_core": { + ngxMainConf | ngxDirectConf | ngxConfTake1, + }, + "worker_rlimit_nofile": { + ngxMainConf | ngxDirectConf | ngxConfTake1, + }, + "worker_shutdown_timeout": { + ngxMainConf | ngxDirectConf | ngxConfTake1, + }, + "working_directory": { + ngxMainConf | ngxDirectConf | ngxConfTake1, + }, + "xclient": { + ngxMailMainConf | ngxMailSrvConf | ngxConfFlag, + }, + "xml_entities": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "xslt_last_modified": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, + }, + "xslt_param": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + }, + "xslt_string_param": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + }, + "xslt_stylesheet": { + ngxHTTPLocConf | ngxConf1More, + }, + "xslt_types": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, + }, + "zone": { + ngxHTTPUpsConf | ngxConfTake12, + ngxStreamUpsConf | ngxConfTake12, + }, +} + +// MatchOssLatest contains directives in latest version of OSS source code(including GEOIP, Perl, and XSLT) +func MatchOssLatest(directive string) ([]uint, bool) { + m, ok := ossLatestDirectives[directive] + return m, ok +} diff --git a/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_latest_directives.go b/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_latest_directives.go deleted file mode 100644 index c74abb00c4..0000000000 --- a/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_latest_directives.go +++ /dev/null @@ -1,1906 +0,0 @@ -/** - * Copyright (c) F5, Inc. - * - * This source code is licensed under the Apache License, Version 2.0 license found in the - * LICENSE file in the root directory of this source tree. - */ - -// All the definitions are extracted from the source code -// Each bit mask describes these behaviors: -// - how many arguments the directive can take -// - whether or not it is a block directive -// - whether this is a flag (takes one argument that's either "on" or "off") -// - which contexts it's allowed to be in - -package crossplane - -//nolint:gochecknoglobals -var ngxOssLatestDirectives = map[string][]uint{ - "absolute_redirect": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "accept_mutex": { - ngxEventConf | ngxConfFlag, - }, - "accept_mutex_delay": { - ngxEventConf | ngxConfTake1, - }, - "access_log": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConf1More, - ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More, - }, - "add_after_body": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "add_before_body": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "add_header": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23, - }, - "add_trailer": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23, - }, - "addition_types": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "aio": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "aio_write": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "alias": { - ngxHTTPLocConf | ngxConfTake1, - }, - "allow": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "ancient_browser": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "ancient_browser_value": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "auth_basic": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1, - }, - "auth_basic_user_file": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1, - }, - "auth_delay": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "auth_http": { - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - }, - "auth_http_header": { - ngxMailMainConf | ngxMailSrvConf | ngxConfTake2, - }, - "auth_http_pass_client_cert": { - ngxMailMainConf | ngxMailSrvConf | ngxConfFlag, - }, - "auth_http_timeout": { - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - }, - "auth_request": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "auth_request_set": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - }, - "autoindex": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "autoindex_exact_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "autoindex_format": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "autoindex_localtime": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "break": { - ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfNoArgs, - }, - "charset": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, - }, - "charset_map": { - ngxHTTPMainConf | ngxConfBlock | ngxConfTake2, - }, - "charset_types": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "chunked_transfer_encoding": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "client_body_buffer_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "client_body_in_file_only": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "client_body_in_single_buffer": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "client_body_temp_path": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234, - }, - "client_body_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "client_header_buffer_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "client_header_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "client_max_body_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "connection_pool_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "create_full_put_path": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "daemon": { - ngxMainConf | ngxDirectConf | ngxConfFlag, - }, - "dav_access": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123, - }, - "dav_methods": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "debug_connection": { - ngxEventConf | ngxConfTake1, - }, - "debug_points": { - ngxMainConf | ngxDirectConf | ngxConfTake1, - }, - "default_type": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "deny": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "directio": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "directio_alignment": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "disable_symlinks": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, - }, - "empty_gif": { - ngxHTTPLocConf | ngxConfNoArgs, - }, - "env": { - ngxMainConf | ngxDirectConf | ngxConfTake1, - }, - "error_log": { - ngxMainConf | ngxConf1More, - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - ngxMailMainConf | ngxMailSrvConf | ngxConf1More, - ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More, - }, - "error_page": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf2More, - }, - "etag": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "events": { - ngxMainConf | ngxConfBlock | ngxConfNoArgs, - }, - "expires": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake12, - }, - "fastcgi_bind": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, - }, - "fastcgi_buffer_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_buffering": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "fastcgi_buffers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - }, - "fastcgi_busy_buffers_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_cache": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_cache_background_update": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "fastcgi_cache_bypass": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "fastcgi_cache_key": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_cache_lock": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "fastcgi_cache_lock_age": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_cache_lock_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_cache_max_range_offset": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_cache_methods": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "fastcgi_cache_min_uses": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_cache_path": { - ngxHTTPMainConf | ngxConf2More, - }, - "fastcgi_cache_revalidate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "fastcgi_cache_use_stale": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "fastcgi_cache_valid": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "fastcgi_catch_stderr": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_connect_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_force_ranges": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "fastcgi_hide_header": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_ignore_client_abort": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "fastcgi_ignore_headers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "fastcgi_index": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_intercept_errors": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "fastcgi_keep_conn": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "fastcgi_limit_rate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_max_temp_file_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_next_upstream": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "fastcgi_next_upstream_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_next_upstream_tries": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_no_cache": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "fastcgi_param": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23, - }, - "fastcgi_pass": { - ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, - }, - "fastcgi_pass_header": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_pass_request_body": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "fastcgi_pass_request_headers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "fastcgi_read_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_request_buffering": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "fastcgi_send_lowat": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_send_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_socket_keepalive": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "fastcgi_split_path_info": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_store": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_store_access": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123, - }, - "fastcgi_temp_file_write_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "fastcgi_temp_path": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234, - }, - "flv": { - ngxHTTPLocConf | ngxConfNoArgs, - }, - "geo": { - ngxHTTPMainConf | ngxConfBlock | ngxConfTake12, - ngxStreamMainConf | ngxConfBlock | ngxConfTake12, - }, - "geoip_city": { - ngxHTTPMainConf | ngxConfTake12, - ngxStreamMainConf | ngxConfTake12, - }, - "geoip_country": { - ngxHTTPMainConf | ngxConfTake12, - ngxStreamMainConf | ngxConfTake12, - }, - "geoip_org": { - ngxHTTPMainConf | ngxConfTake12, - ngxStreamMainConf | ngxConfTake12, - }, - "geoip_proxy": { - ngxHTTPMainConf | ngxConfTake1, - }, - "geoip_proxy_recursive": { - ngxHTTPMainConf | ngxConfFlag, - }, - "google_perftools_profiles": { - ngxMainConf | ngxDirectConf | ngxConfTake1, - }, - "grpc_bind": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, - }, - "grpc_buffer_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "grpc_connect_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "grpc_hide_header": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "grpc_ignore_headers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "grpc_intercept_errors": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "grpc_next_upstream": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "grpc_next_upstream_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "grpc_next_upstream_tries": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "grpc_pass": { - ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, - }, - "grpc_pass_header": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "grpc_read_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "grpc_send_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "grpc_set_header": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - }, - "grpc_socket_keepalive": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "grpc_ssl_certificate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "grpc_ssl_certificate_key": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "grpc_ssl_ciphers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "grpc_ssl_conf_command": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - }, - "grpc_ssl_crl": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "grpc_ssl_name": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "grpc_ssl_password_file": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "grpc_ssl_protocols": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "grpc_ssl_server_name": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "grpc_ssl_session_reuse": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "grpc_ssl_trusted_certificate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "grpc_ssl_verify": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "grpc_ssl_verify_depth": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "gunzip": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "gunzip_buffers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - }, - "gzip": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag, - }, - "gzip_buffers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - }, - "gzip_comp_level": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "gzip_disable": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "gzip_http_version": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "gzip_min_length": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "gzip_proxied": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "gzip_static": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "gzip_types": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "gzip_vary": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "hash": { - ngxHTTPUpsConf | ngxConfTake12, - ngxStreamUpsConf | ngxConfTake12, - }, - "http": { - ngxMainConf | ngxConfBlock | ngxConfNoArgs, - }, - "http2": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, - }, - "http2_body_preread_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "http2_chunk_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "http2_idle_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "http2_max_concurrent_pushes": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "http2_max_concurrent_streams": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "http2_max_field_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "http2_max_header_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "http2_max_requests": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "http2_push": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "http2_push_preload": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "http2_recv_buffer_size": { - ngxHTTPMainConf | ngxConfTake1, - }, - "http2_recv_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "http3": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, - }, - "http3_hq": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, - }, - "http3_max_concurrent_streams": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "http3_stream_buffer_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "if": { - ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfExpr | ngxConf1More, - }, - "if_modified_since": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "ignore_invalid_headers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, - }, - "image_filter": { - ngxHTTPLocConf | ngxConfTake123, - }, - "image_filter_buffer": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "image_filter_interlace": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "image_filter_jpeg_quality": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "image_filter_sharpen": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "image_filter_transparency": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "image_filter_webp_quality": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "imap_auth": { - ngxMailMainConf | ngxMailSrvConf | ngxConf1More, - }, - "imap_capabilities": { - ngxMailMainConf | ngxMailSrvConf | ngxConf1More, - }, - "imap_client_buffer": { - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - }, - "include": { - ngxAnyConf | ngxConfTake1, - }, - "index": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "internal": { - ngxHTTPLocConf | ngxConfNoArgs, - }, - "ip_hash": { - ngxHTTPUpsConf | ngxConfNoArgs, - }, - "keepalive": { - ngxHTTPUpsConf | ngxConfTake1, - }, - "keepalive_disable": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, - }, - "keepalive_requests": { - ngxHTTPUpsConf | ngxConfTake1, - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "keepalive_time": { - ngxHTTPUpsConf | ngxConfTake1, - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "keepalive_timeout": { - ngxHTTPUpsConf | ngxConfTake1, - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, - }, - "large_client_header_buffers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake2, - }, - "least_conn": { - ngxHTTPUpsConf | ngxConfNoArgs, - ngxStreamUpsConf | ngxConfNoArgs, - }, - "limit_conn": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2, - }, - "limit_conn_dry_run": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, - }, - "limit_conn_log_level": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "limit_conn_status": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "limit_conn_zone": { - ngxHTTPMainConf | ngxConfTake2, - ngxStreamMainConf | ngxConfTake2, - }, - "limit_except": { - ngxHTTPLocConf | ngxConfBlock | ngxConf1More, - }, - "limit_rate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, - }, - "limit_rate_after": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, - }, - "limit_req": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123, - }, - "limit_req_dry_run": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "limit_req_log_level": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "limit_req_status": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "limit_req_zone": { - ngxHTTPMainConf | ngxConfTake3, - }, - "lingering_close": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "lingering_time": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "lingering_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "listen": { - ngxHTTPSrvConf | ngxConf1More, - ngxMailSrvConf | ngxConf1More, - ngxStreamSrvConf | ngxConf1More, - }, - "load_module": { - ngxMainConf | ngxDirectConf | ngxConfTake1, - }, - "location": { - ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfTake12, - }, - "lock_file": { - ngxMainConf | ngxDirectConf | ngxConfTake1, - }, - "log_format": { - ngxHTTPMainConf | ngxConf2More, - ngxStreamMainConf | ngxConf2More, - }, - "log_not_found": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "log_subrequest": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "mail": { - ngxMainConf | ngxConfBlock | ngxConfNoArgs, - }, - "map": { - ngxHTTPMainConf | ngxConfBlock | ngxConfTake2, - ngxStreamMainConf | ngxConfBlock | ngxConfTake2, - }, - "map_hash_bucket_size": { - ngxHTTPMainConf | ngxConfTake1, - ngxStreamMainConf | ngxConfTake1, - }, - "map_hash_max_size": { - ngxHTTPMainConf | ngxConfTake1, - ngxStreamMainConf | ngxConfTake1, - }, - "master_process": { - ngxMainConf | ngxDirectConf | ngxConfFlag, - }, - "max_errors": { - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - }, - "max_ranges": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "memcached_bind": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, - }, - "memcached_buffer_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "memcached_connect_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "memcached_gzip_flag": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "memcached_next_upstream": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "memcached_next_upstream_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "memcached_next_upstream_tries": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "memcached_pass": { - ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, - }, - "memcached_read_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "memcached_send_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "memcached_socket_keepalive": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "merge_slashes": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, - }, - "min_delete_depth": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "mirror": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "mirror_request_body": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "modern_browser": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, - }, - "modern_browser_value": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "mp4": { - ngxHTTPLocConf | ngxConfNoArgs, - }, - "mp4_buffer_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "mp4_max_buffer_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "mp4_start_key_frame": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "msie_padding": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "msie_refresh": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "multi_accept": { - ngxEventConf | ngxConfFlag, - }, - "open_file_cache": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, - }, - "open_file_cache_errors": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "open_file_cache_min_uses": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "open_file_cache_valid": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "open_log_file_cache": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1234, - }, - "output_buffers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - }, - "override_charset": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag, - }, - "pass": { - ngxStreamSrvConf | ngxConfTake1, - }, - "pcre_jit": { - ngxMainConf | ngxDirectConf | ngxConfFlag, - }, - "perl": { - ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1, - }, - "perl_modules": { - ngxHTTPMainConf | ngxConfTake1, - }, - "perl_require": { - ngxHTTPMainConf | ngxConfTake1, - }, - "perl_set": { - ngxHTTPMainConf | ngxConfTake2, - }, - "pid": { - ngxMainConf | ngxDirectConf | ngxConfTake1, - }, - "pop3_auth": { - ngxMailMainConf | ngxMailSrvConf | ngxConf1More, - }, - "pop3_capabilities": { - ngxMailMainConf | ngxMailSrvConf | ngxConf1More, - }, - "port_in_redirect": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "postpone_output": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "preread_buffer_size": { - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "preread_timeout": { - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "protocol": { - ngxMailSrvConf | ngxConfTake1, - }, - "proxy_bind": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12, - }, - "proxy_buffer": { - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - }, - "proxy_buffer_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "proxy_buffering": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "proxy_buffers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - }, - "proxy_busy_buffers_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_cache": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_cache_background_update": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "proxy_cache_bypass": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "proxy_cache_convert_head": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "proxy_cache_key": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_cache_lock": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "proxy_cache_lock_age": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_cache_lock_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_cache_max_range_offset": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_cache_methods": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "proxy_cache_min_uses": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_cache_path": { - ngxHTTPMainConf | ngxConf2More, - }, - "proxy_cache_revalidate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "proxy_cache_use_stale": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "proxy_cache_valid": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "proxy_connect_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "proxy_cookie_domain": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, - }, - "proxy_cookie_flags": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234, - }, - "proxy_cookie_path": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, - }, - "proxy_download_rate": { - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "proxy_force_ranges": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "proxy_half_close": { - ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, - }, - "proxy_headers_hash_bucket_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_headers_hash_max_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_hide_header": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_http_version": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_ignore_client_abort": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "proxy_ignore_headers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "proxy_intercept_errors": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "proxy_limit_rate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_max_temp_file_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_method": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_next_upstream": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, - }, - "proxy_next_upstream_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "proxy_next_upstream_tries": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "proxy_no_cache": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "proxy_pass": { - ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConfTake1, - ngxStreamSrvConf | ngxConfTake1, - }, - "proxy_pass_error_message": { - ngxMailMainConf | ngxMailSrvConf | ngxConfFlag, - }, - "proxy_pass_header": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_pass_request_body": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "proxy_pass_request_headers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "proxy_protocol": { - ngxMailMainConf | ngxMailSrvConf | ngxConfFlag, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, - }, - "proxy_protocol_timeout": { - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "proxy_read_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_redirect": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, - }, - "proxy_request_buffering": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "proxy_requests": { - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "proxy_responses": { - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "proxy_send_lowat": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_send_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_set_body": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_set_header": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - }, - "proxy_smtp_auth": { - ngxMailMainConf | ngxMailSrvConf | ngxConfFlag, - }, - "proxy_socket_keepalive": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, - }, - "proxy_ssl": { - ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, - }, - "proxy_ssl_certificate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "proxy_ssl_certificate_key": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "proxy_ssl_ciphers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "proxy_ssl_conf_command": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2, - }, - "proxy_ssl_crl": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "proxy_ssl_name": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "proxy_ssl_password_file": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "proxy_ssl_protocols": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More, - }, - "proxy_ssl_server_name": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, - }, - "proxy_ssl_session_reuse": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, - }, - "proxy_ssl_trusted_certificate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "proxy_ssl_verify": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, - }, - "proxy_ssl_verify_depth": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "proxy_store": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_store_access": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123, - }, - "proxy_temp_file_write_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "proxy_temp_path": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234, - }, - "proxy_timeout": { - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "proxy_upload_rate": { - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "quic_active_connection_id_limit": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "quic_bpf": { - ngxMainConf | ngxDirectConf | ngxConfFlag, - }, - "quic_gso": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, - }, - "quic_host_key": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "quic_retry": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, - }, - "random": { - ngxHTTPUpsConf | ngxConfNoArgs | ngxConfTake12, - ngxStreamUpsConf | ngxConfNoArgs | ngxConfTake12, - }, - "random_index": { - ngxHTTPLocConf | ngxConfFlag, - }, - "read_ahead": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "real_ip_header": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "real_ip_recursive": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "recursive_error_pages": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "referer_hash_bucket_size": { - ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "referer_hash_max_size": { - ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "request_pool_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "reset_timedout_connection": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "resolver": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - ngxMailMainConf | ngxMailSrvConf | ngxConf1More, - ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More, - }, - "resolver_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "return": { - ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake12, - ngxStreamSrvConf | ngxConfTake1, - }, - "rewrite": { - ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23, - }, - "rewrite_log": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag, - }, - "root": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, - }, - "satisfy": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_bind": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, - }, - "scgi_buffer_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_buffering": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "scgi_buffers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - }, - "scgi_busy_buffers_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_cache": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_cache_background_update": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "scgi_cache_bypass": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "scgi_cache_key": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_cache_lock": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "scgi_cache_lock_age": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_cache_lock_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_cache_max_range_offset": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_cache_methods": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "scgi_cache_min_uses": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_cache_path": { - ngxHTTPMainConf | ngxConf2More, - }, - "scgi_cache_revalidate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "scgi_cache_use_stale": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "scgi_cache_valid": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "scgi_connect_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_force_ranges": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "scgi_hide_header": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_ignore_client_abort": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "scgi_ignore_headers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "scgi_intercept_errors": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "scgi_limit_rate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_max_temp_file_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_next_upstream": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "scgi_next_upstream_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_next_upstream_tries": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_no_cache": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "scgi_param": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23, - }, - "scgi_pass": { - ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, - }, - "scgi_pass_header": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_pass_request_body": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "scgi_pass_request_headers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "scgi_read_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_request_buffering": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "scgi_send_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_socket_keepalive": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "scgi_store": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_store_access": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123, - }, - "scgi_temp_file_write_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "scgi_temp_path": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234, - }, - "secure_link": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "secure_link_md5": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "secure_link_secret": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "send_lowat": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "send_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "sendfile": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag, - }, - "sendfile_max_chunk": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "server": { - ngxHTTPMainConf | ngxConfBlock | ngxConfNoArgs, - ngxHTTPUpsConf | ngxConf1More, - ngxMailMainConf | ngxConfBlock | ngxConfNoArgs, - ngxStreamMainConf | ngxConfBlock | ngxConfNoArgs, - ngxStreamUpsConf | ngxConf1More, - }, - "server_name": { - ngxHTTPSrvConf | ngxConf1More, - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - ngxStreamSrvConf | ngxConf1More, - }, - "server_name_in_redirect": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "server_names_hash_bucket_size": { - ngxHTTPMainConf | ngxConfTake1, - ngxStreamMainConf | ngxConfTake1, - }, - "server_names_hash_max_size": { - ngxHTTPMainConf | ngxConfTake1, - ngxStreamMainConf | ngxConfTake1, - }, - "server_tokens": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "set": { - ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake2, - ngxStreamSrvConf | ngxConfTake2, - }, - "set_real_ip_from": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "slice": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "smtp_auth": { - ngxMailMainConf | ngxMailSrvConf | ngxConf1More, - }, - "smtp_capabilities": { - ngxMailMainConf | ngxMailSrvConf | ngxConf1More, - }, - "smtp_client_buffer": { - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - }, - "smtp_greeting_delay": { - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - }, - "source_charset": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, - }, - "split_clients": { - ngxHTTPMainConf | ngxConfBlock | ngxConfTake2, - ngxStreamMainConf | ngxConfBlock | ngxConfTake2, - }, - "ssi": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag, - }, - "ssi_last_modified": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "ssi_min_file_chunk": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "ssi_silent_errors": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "ssi_types": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "ssi_value_length": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "ssl_alpn": { - ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More, - }, - "ssl_buffer_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "ssl_certificate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "ssl_certificate_key": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "ssl_ciphers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "ssl_client_certificate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "ssl_conf_command": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake2, - ngxMailMainConf | ngxMailSrvConf | ngxConfTake2, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2, - }, - "ssl_crl": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "ssl_dhparam": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "ssl_early_data": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, - }, - "ssl_ecdh_curve": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "ssl_engine": { - ngxMainConf | ngxDirectConf | ngxConfTake1, - }, - "ssl_handshake_timeout": { - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "ssl_ocsp": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, - }, - "ssl_ocsp_cache": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "ssl_ocsp_responder": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "ssl_password_file": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "ssl_prefer_server_ciphers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, - ngxMailMainConf | ngxMailSrvConf | ngxConfFlag, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, - }, - "ssl_preread": { - ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, - }, - "ssl_protocols": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConf1More, - ngxMailMainConf | ngxMailSrvConf | ngxConf1More, - ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More, - }, - "ssl_reject_handshake": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, - }, - "ssl_session_cache": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake12, - ngxMailMainConf | ngxMailSrvConf | ngxConfTake12, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12, - }, - "ssl_session_ticket_key": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "ssl_session_tickets": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, - ngxMailMainConf | ngxMailSrvConf | ngxConfFlag, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, - }, - "ssl_session_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "ssl_stapling": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, - }, - "ssl_stapling_file": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "ssl_stapling_responder": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - }, - "ssl_stapling_verify": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, - }, - "ssl_trusted_certificate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "ssl_verify_client": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "ssl_verify_depth": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1, - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1, - }, - "starttls": { - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - }, - "stream": { - ngxMainConf | ngxConfBlock | ngxConfNoArgs, - }, - "stub_status": { - ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfNoArgs | ngxConfTake1, - }, - "sub_filter": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - }, - "sub_filter_last_modified": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "sub_filter_once": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "sub_filter_types": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "subrequest_output_buffer_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "tcp_nodelay": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag, - }, - "tcp_nopush": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "thread_pool": { - ngxMainConf | ngxDirectConf | ngxConfTake23, - }, - "timeout": { - ngxMailMainConf | ngxMailSrvConf | ngxConfTake1, - }, - "timer_resolution": { - ngxMainConf | ngxDirectConf | ngxConfTake1, - }, - "try_files": { - ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf2More, - }, - "types": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfNoArgs, - }, - "types_hash_bucket_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "types_hash_max_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "underscores_in_headers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag, - }, - "uninitialized_variable_warn": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag, - }, - "upstream": { - ngxHTTPMainConf | ngxConfBlock | ngxConfTake1, - ngxStreamMainConf | ngxConfBlock | ngxConfTake1, - }, - "use": { - ngxEventConf | ngxConfTake1, - }, - "user": { - ngxMainConf | ngxDirectConf | ngxConfTake12, - }, - "userid": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "userid_domain": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "userid_expires": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "userid_flags": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123, - }, - "userid_mark": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "userid_name": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "userid_p3p": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "userid_path": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "userid_service": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_bind": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12, - }, - "uwsgi_buffer_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_buffering": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "uwsgi_buffers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - }, - "uwsgi_busy_buffers_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_cache": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_cache_background_update": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_cache_bypass": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "uwsgi_cache_key": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_cache_lock": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "uwsgi_cache_lock_age": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_cache_lock_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_cache_max_range_offset": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_cache_methods": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "uwsgi_cache_min_uses": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_cache_path": { - ngxHTTPMainConf | ngxConf2More, - }, - "uwsgi_cache_revalidate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "uwsgi_cache_use_stale": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "uwsgi_cache_valid": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "uwsgi_connect_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_force_ranges": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "uwsgi_hide_header": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_ignore_client_abort": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "uwsgi_ignore_headers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "uwsgi_intercept_errors": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "uwsgi_limit_rate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_max_temp_file_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_modifier1": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_modifier2": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_next_upstream": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "uwsgi_next_upstream_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_next_upstream_tries": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_no_cache": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "uwsgi_param": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23, - }, - "uwsgi_pass": { - ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1, - }, - "uwsgi_pass_header": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_pass_request_body": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "uwsgi_pass_request_headers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "uwsgi_read_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_request_buffering": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "uwsgi_send_timeout": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_socket_keepalive": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "uwsgi_ssl_certificate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_ssl_certificate_key": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_ssl_ciphers": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_ssl_conf_command": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - }, - "uwsgi_ssl_crl": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_ssl_name": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_ssl_password_file": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_ssl_protocols": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "uwsgi_ssl_server_name": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "uwsgi_ssl_session_reuse": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "uwsgi_ssl_trusted_certificate": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_ssl_verify": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "uwsgi_ssl_verify_depth": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_store": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_store_access": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123, - }, - "uwsgi_temp_file_write_size": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "uwsgi_temp_path": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234, - }, - "valid_referers": { - ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "variables_hash_bucket_size": { - ngxHTTPMainConf | ngxConfTake1, - ngxStreamMainConf | ngxConfTake1, - }, - "variables_hash_max_size": { - ngxHTTPMainConf | ngxConfTake1, - ngxStreamMainConf | ngxConfTake1, - }, - "worker_aio_requests": { - ngxEventConf | ngxConfTake1, - }, - "worker_connections": { - ngxEventConf | ngxConfTake1, - }, - "worker_cpu_affinity": { - ngxMainConf | ngxDirectConf | ngxConf1More, - }, - "worker_priority": { - ngxMainConf | ngxDirectConf | ngxConfTake1, - }, - "worker_processes": { - ngxMainConf | ngxDirectConf | ngxConfTake1, - }, - "worker_rlimit_core": { - ngxMainConf | ngxDirectConf | ngxConfTake1, - }, - "worker_rlimit_nofile": { - ngxMainConf | ngxDirectConf | ngxConfTake1, - }, - "worker_shutdown_timeout": { - ngxMainConf | ngxDirectConf | ngxConfTake1, - }, - "working_directory": { - ngxMainConf | ngxDirectConf | ngxConfTake1, - }, - "xclient": { - ngxMailMainConf | ngxMailSrvConf | ngxConfFlag, - }, - "xml_entities": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "xslt_last_modified": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag, - }, - "xslt_param": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - }, - "xslt_string_param": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - }, - "xslt_stylesheet": { - ngxHTTPLocConf | ngxConf1More, - }, - "xslt_types": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More, - }, - "zone": { - ngxHTTPUpsConf | ngxConfTake12, - ngxStreamUpsConf | ngxConfTake12, - }, -} - -func OssLatestDirectivesMatchFn(directive string) ([]uint, bool) { - masks, matched := ngxOssLatestDirectives[directive] - return masks, matched -} diff --git a/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_otel_directives.gen.go b/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_otel_directives.gen.go new file mode 100644 index 0000000000..5047bf39f2 --- /dev/null +++ b/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_otel_directives.gen.go @@ -0,0 +1,43 @@ +/** + * Copyright (c) F5, Inc. + * + * This source code is licensed under the Apache License, Version 2.0 license found in the + * LICENSE file in the root directory of this source tree. + */ + +// Code generated by generator; DO NOT EDIT. +// All the definitions are extracted from the source code +// Each bit mask describes these behaviors: +// - how many arguments the directive can take +// - whether or not it is a block directive +// - whether this is a flag (takes one argument that's either "on" or "off") +// - which contexts it's allowed to be in + +package crossplane + +var otelDirectives = map[string][]uint{ + "otel_exporter": { + ngxHTTPMainConf | ngxConfBlock | ngxConfNoArgs, + }, + "otel_service_name": { + ngxHTTPMainConf | ngxConfTake1, + }, + "otel_span_attr": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, + }, + "otel_span_name": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "otel_trace": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, + "otel_trace_context": { + ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, + }, +} + +// MatchOtelLatest is a MatchFunc for latest version of otel. +func MatchOtelLatest(directive string) ([]uint, bool) { + m, ok := otelDirectives[directive] + return m, ok +} diff --git a/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_otel_directives.go b/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_otel_directives.go deleted file mode 100644 index b597179ff2..0000000000 --- a/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_otel_directives.go +++ /dev/null @@ -1,54 +0,0 @@ -/** - * Copyright (c) F5, Inc. - * - * This source code is licensed under the Apache License, Version 2.0 license found in the - * LICENSE file in the root directory of this source tree. - */ - -// All the definitions are extracted from the source code -// Each bit mask describes these behaviors: -// - how many arguments the directive can take -// - whether or not it is a block directive -// - whether this is a flag (takes one argument that's either "on" or "off") -// - which contexts it's allowed to be in - -package crossplane - -//nolint:gochecknoglobals -var moduleOtelDirectives = map[string][]uint{ - "batch_count": { - ngxConfTake1, - }, - "batch_size": { - ngxConfTake1, - }, - "endpoint": { - ngxConfTake1, - }, - "interval": { - ngxConfTake1, - }, - "otel_exporter": { - ngxHTTPMainConf | ngxConfBlock | ngxConfNoArgs, - }, - "otel_service_name": { - ngxHTTPMainConf | ngxConfTake1, - }, - "otel_span_attr": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2, - }, - "otel_span_name": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "otel_trace": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, - "otel_trace_context": { - ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1, - }, -} - -func OtelDirectivesMatchFn(directive string) ([]uint, bool) { - masks, matched := moduleOtelDirectives[directive] - return masks, matched -} diff --git a/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/buffer.go b/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/buffer.go index f43186fcaa..0da6dcac32 100644 --- a/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/buffer.go +++ b/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/buffer.go @@ -14,7 +14,7 @@ import ( // Creator abstracts file creation (to write configs to something other than files). type Creator interface { - Create(string) (io.WriteCloser, error) + Create(path string) (io.WriteCloser, error) Reset() } diff --git a/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/parse.go b/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/parse.go index 4d44904709..2f3126f7d5 100644 --- a/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/parse.go +++ b/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/parse.go @@ -385,7 +385,6 @@ func (p *parser) parse(parsing *Config, tokens <-chan NgxToken, ctx blockCtx, co // if the file pattern was explicit, nginx will check // that the included file can be opened and read if f, err := p.openFile(pattern); err != nil { - defer f.Close() perr := &ParseError{ What: err.Error(), File: &parsing.File, @@ -399,6 +398,7 @@ func (p *parser) parse(parsing *Config, tokens <-chan NgxToken, ctx blockCtx, co return nil, perr } } else { + defer f.Close() fnames = []string{pattern} } } diff --git a/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/tools.go b/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/tools.go index 2114566b8f..ece0bb62e4 100644 --- a/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/tools.go +++ b/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/tools.go @@ -4,10 +4,10 @@ // This file just exists to ensure we download the tools we need for building // See https://github.com/golang/go/wiki/Modules#how-can-i-track-tool-dependencies-for-a-module -package tools +package crossplane import ( - _ "github.com/jstemmer/go-junit-report" - _ "github.com/maxbrunsfeld/counterfeiter/v6" - _ "golang.org/x/tools/cmd/goimports" + _ "github.com/jstemmer/go-junit-report/parser" + _ "github.com/maxbrunsfeld/counterfeiter/v6/generator" + _ "golang.org/x/tools/imports" ) diff --git a/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/util.go b/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/util.go index d2e84adeb9..b7af673bf8 100644 --- a/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/util.go +++ b/sdk/vendor/github.com/nginxinc/nginx-go-crossplane/util.go @@ -64,7 +64,7 @@ func validExpr(d *Directive) bool { strings.HasSuffix(d.Args[e], ")") && ((l == 1 && len(d.Args[b]) > 2) || // empty expression single arg '()' (l == 2 && (len(d.Args[b]) > 1 || len(d.Args[e]) > 1)) || // empty expression two args '(', ')' - (l > 2)) + (l > 2)) //nolint: mnd } // prepareIfArgs removes parentheses from an `if` directive's arguments. diff --git a/sdk/vendor/github.com/stretchr/testify/assert/assertion_compare.go b/sdk/vendor/github.com/stretchr/testify/assert/assertion_compare.go index 4d4b4aad6f..7e19eba090 100644 --- a/sdk/vendor/github.com/stretchr/testify/assert/assertion_compare.go +++ b/sdk/vendor/github.com/stretchr/testify/assert/assertion_compare.go @@ -7,10 +7,13 @@ import ( "time" ) -type CompareType int +// Deprecated: CompareType has only ever been for internal use and has accidentally been published since v1.6.0. Do not use it. +type CompareType = compareResult + +type compareResult int const ( - compareLess CompareType = iota - 1 + compareLess compareResult = iota - 1 compareEqual compareGreater ) @@ -39,7 +42,7 @@ var ( bytesType = reflect.TypeOf([]byte{}) ) -func compare(obj1, obj2 interface{}, kind reflect.Kind) (CompareType, bool) { +func compare(obj1, obj2 interface{}, kind reflect.Kind) (compareResult, bool) { obj1Value := reflect.ValueOf(obj1) obj2Value := reflect.ValueOf(obj2) @@ -325,7 +328,13 @@ func compare(obj1, obj2 interface{}, kind reflect.Kind) (CompareType, bool) { timeObj2 = obj2Value.Convert(timeType).Interface().(time.Time) } - return compare(timeObj1.UnixNano(), timeObj2.UnixNano(), reflect.Int64) + if timeObj1.Before(timeObj2) { + return compareLess, true + } + if timeObj1.Equal(timeObj2) { + return compareEqual, true + } + return compareGreater, true } case reflect.Slice: { @@ -345,7 +354,7 @@ func compare(obj1, obj2 interface{}, kind reflect.Kind) (CompareType, bool) { bytesObj2 = obj2Value.Convert(bytesType).Interface().([]byte) } - return CompareType(bytes.Compare(bytesObj1, bytesObj2)), true + return compareResult(bytes.Compare(bytesObj1, bytesObj2)), true } case reflect.Uintptr: { @@ -381,7 +390,7 @@ func Greater(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface if h, ok := t.(tHelper); ok { h.Helper() } - return compareTwoValues(t, e1, e2, []CompareType{compareGreater}, "\"%v\" is not greater than \"%v\"", msgAndArgs...) + return compareTwoValues(t, e1, e2, []compareResult{compareGreater}, "\"%v\" is not greater than \"%v\"", msgAndArgs...) } // GreaterOrEqual asserts that the first element is greater than or equal to the second @@ -394,7 +403,7 @@ func GreaterOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...in if h, ok := t.(tHelper); ok { h.Helper() } - return compareTwoValues(t, e1, e2, []CompareType{compareGreater, compareEqual}, "\"%v\" is not greater than or equal to \"%v\"", msgAndArgs...) + return compareTwoValues(t, e1, e2, []compareResult{compareGreater, compareEqual}, "\"%v\" is not greater than or equal to \"%v\"", msgAndArgs...) } // Less asserts that the first element is less than the second @@ -406,7 +415,7 @@ func Less(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) if h, ok := t.(tHelper); ok { h.Helper() } - return compareTwoValues(t, e1, e2, []CompareType{compareLess}, "\"%v\" is not less than \"%v\"", msgAndArgs...) + return compareTwoValues(t, e1, e2, []compareResult{compareLess}, "\"%v\" is not less than \"%v\"", msgAndArgs...) } // LessOrEqual asserts that the first element is less than or equal to the second @@ -419,7 +428,7 @@ func LessOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...inter if h, ok := t.(tHelper); ok { h.Helper() } - return compareTwoValues(t, e1, e2, []CompareType{compareLess, compareEqual}, "\"%v\" is not less than or equal to \"%v\"", msgAndArgs...) + return compareTwoValues(t, e1, e2, []compareResult{compareLess, compareEqual}, "\"%v\" is not less than or equal to \"%v\"", msgAndArgs...) } // Positive asserts that the specified element is positive @@ -431,7 +440,7 @@ func Positive(t TestingT, e interface{}, msgAndArgs ...interface{}) bool { h.Helper() } zero := reflect.Zero(reflect.TypeOf(e)) - return compareTwoValues(t, e, zero.Interface(), []CompareType{compareGreater}, "\"%v\" is not positive", msgAndArgs...) + return compareTwoValues(t, e, zero.Interface(), []compareResult{compareGreater}, "\"%v\" is not positive", msgAndArgs...) } // Negative asserts that the specified element is negative @@ -443,10 +452,10 @@ func Negative(t TestingT, e interface{}, msgAndArgs ...interface{}) bool { h.Helper() } zero := reflect.Zero(reflect.TypeOf(e)) - return compareTwoValues(t, e, zero.Interface(), []CompareType{compareLess}, "\"%v\" is not negative", msgAndArgs...) + return compareTwoValues(t, e, zero.Interface(), []compareResult{compareLess}, "\"%v\" is not negative", msgAndArgs...) } -func compareTwoValues(t TestingT, e1 interface{}, e2 interface{}, allowedComparesResults []CompareType, failMessage string, msgAndArgs ...interface{}) bool { +func compareTwoValues(t TestingT, e1 interface{}, e2 interface{}, allowedComparesResults []compareResult, failMessage string, msgAndArgs ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() } @@ -469,7 +478,7 @@ func compareTwoValues(t TestingT, e1 interface{}, e2 interface{}, allowedCompare return true } -func containsValue(values []CompareType, value CompareType) bool { +func containsValue(values []compareResult, value compareResult) bool { for _, v := range values { if v == value { return true diff --git a/sdk/vendor/github.com/stretchr/testify/assert/assertion_format.go b/sdk/vendor/github.com/stretchr/testify/assert/assertion_format.go index 3ddab109ad..1906341657 100644 --- a/sdk/vendor/github.com/stretchr/testify/assert/assertion_format.go +++ b/sdk/vendor/github.com/stretchr/testify/assert/assertion_format.go @@ -104,8 +104,8 @@ func EqualExportedValuesf(t TestingT, expected interface{}, actual interface{}, return EqualExportedValues(t, expected, actual, append([]interface{}{msg}, args...)...) } -// EqualValuesf asserts that two objects are equal or convertible to the same types -// and equal. +// EqualValuesf asserts that two objects are equal or convertible to the larger +// type and equal. // // assert.EqualValuesf(t, uint32(123), int32(123), "error message %s", "formatted") func EqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { @@ -186,7 +186,7 @@ func Eventuallyf(t TestingT, condition func() bool, waitFor time.Duration, tick // assert.EventuallyWithTf(t, func(c *assert.CollectT, "error message %s", "formatted") { // // add assertions as needed; any assertion failure will fail the current tick // assert.True(c, externalValue, "expected 'externalValue' to be true") -// }, 1*time.Second, 10*time.Second, "external state has not changed to 'true'; still false") +// }, 10*time.Second, 1*time.Second, "external state has not changed to 'true'; still false") func EventuallyWithTf(t TestingT, condition func(collect *CollectT), waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -568,6 +568,23 @@ func NotContainsf(t TestingT, s interface{}, contains interface{}, msg string, a return NotContains(t, s, contains, append([]interface{}{msg}, args...)...) } +// NotElementsMatchf asserts that the specified listA(array, slice...) is NOT equal to specified +// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements, +// the number of appearances of each of them in both lists should not match. +// This is an inverse of ElementsMatch. +// +// assert.NotElementsMatchf(t, [1, 1, 2, 3], [1, 1, 2, 3], "error message %s", "formatted") -> false +// +// assert.NotElementsMatchf(t, [1, 1, 2, 3], [1, 2, 3], "error message %s", "formatted") -> true +// +// assert.NotElementsMatchf(t, [1, 2, 3], [1, 2, 4], "error message %s", "formatted") -> true +func NotElementsMatchf(t TestingT, listA interface{}, listB interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return NotElementsMatch(t, listA, listB, append([]interface{}{msg}, args...)...) +} + // NotEmptyf asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either // a slice or a channel with len == 0. // @@ -604,7 +621,16 @@ func NotEqualValuesf(t TestingT, expected interface{}, actual interface{}, msg s return NotEqualValues(t, expected, actual, append([]interface{}{msg}, args...)...) } -// NotErrorIsf asserts that at none of the errors in err's chain matches target. +// NotErrorAsf asserts that none of the errors in err's chain matches target, +// but if so, sets target to that error value. +func NotErrorAsf(t TestingT, err error, target interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return NotErrorAs(t, err, target, append([]interface{}{msg}, args...)...) +} + +// NotErrorIsf asserts that none of the errors in err's chain matches target. // This is a wrapper for errors.Is. func NotErrorIsf(t TestingT, err error, target error, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { diff --git a/sdk/vendor/github.com/stretchr/testify/assert/assertion_forward.go b/sdk/vendor/github.com/stretchr/testify/assert/assertion_forward.go index a84e09bd40..21629087ba 100644 --- a/sdk/vendor/github.com/stretchr/testify/assert/assertion_forward.go +++ b/sdk/vendor/github.com/stretchr/testify/assert/assertion_forward.go @@ -186,8 +186,8 @@ func (a *Assertions) EqualExportedValuesf(expected interface{}, actual interface return EqualExportedValuesf(a.t, expected, actual, msg, args...) } -// EqualValues asserts that two objects are equal or convertible to the same types -// and equal. +// EqualValues asserts that two objects are equal or convertible to the larger +// type and equal. // // a.EqualValues(uint32(123), int32(123)) func (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool { @@ -197,8 +197,8 @@ func (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAn return EqualValues(a.t, expected, actual, msgAndArgs...) } -// EqualValuesf asserts that two objects are equal or convertible to the same types -// and equal. +// EqualValuesf asserts that two objects are equal or convertible to the larger +// type and equal. // // a.EqualValuesf(uint32(123), int32(123), "error message %s", "formatted") func (a *Assertions) EqualValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { @@ -336,7 +336,7 @@ func (a *Assertions) Eventually(condition func() bool, waitFor time.Duration, ti // a.EventuallyWithT(func(c *assert.CollectT) { // // add assertions as needed; any assertion failure will fail the current tick // assert.True(c, externalValue, "expected 'externalValue' to be true") -// }, 1*time.Second, 10*time.Second, "external state has not changed to 'true'; still false") +// }, 10*time.Second, 1*time.Second, "external state has not changed to 'true'; still false") func (a *Assertions) EventuallyWithT(condition func(collect *CollectT), waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -361,7 +361,7 @@ func (a *Assertions) EventuallyWithT(condition func(collect *CollectT), waitFor // a.EventuallyWithTf(func(c *assert.CollectT, "error message %s", "formatted") { // // add assertions as needed; any assertion failure will fail the current tick // assert.True(c, externalValue, "expected 'externalValue' to be true") -// }, 1*time.Second, 10*time.Second, "external state has not changed to 'true'; still false") +// }, 10*time.Second, 1*time.Second, "external state has not changed to 'true'; still false") func (a *Assertions) EventuallyWithTf(condition func(collect *CollectT), waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1128,6 +1128,40 @@ func (a *Assertions) NotContainsf(s interface{}, contains interface{}, msg strin return NotContainsf(a.t, s, contains, msg, args...) } +// NotElementsMatch asserts that the specified listA(array, slice...) is NOT equal to specified +// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements, +// the number of appearances of each of them in both lists should not match. +// This is an inverse of ElementsMatch. +// +// a.NotElementsMatch([1, 1, 2, 3], [1, 1, 2, 3]) -> false +// +// a.NotElementsMatch([1, 1, 2, 3], [1, 2, 3]) -> true +// +// a.NotElementsMatch([1, 2, 3], [1, 2, 4]) -> true +func (a *Assertions) NotElementsMatch(listA interface{}, listB interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NotElementsMatch(a.t, listA, listB, msgAndArgs...) +} + +// NotElementsMatchf asserts that the specified listA(array, slice...) is NOT equal to specified +// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements, +// the number of appearances of each of them in both lists should not match. +// This is an inverse of ElementsMatch. +// +// a.NotElementsMatchf([1, 1, 2, 3], [1, 1, 2, 3], "error message %s", "formatted") -> false +// +// a.NotElementsMatchf([1, 1, 2, 3], [1, 2, 3], "error message %s", "formatted") -> true +// +// a.NotElementsMatchf([1, 2, 3], [1, 2, 4], "error message %s", "formatted") -> true +func (a *Assertions) NotElementsMatchf(listA interface{}, listB interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NotElementsMatchf(a.t, listA, listB, msg, args...) +} + // NotEmpty asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either // a slice or a channel with len == 0. // @@ -1200,7 +1234,25 @@ func (a *Assertions) NotEqualf(expected interface{}, actual interface{}, msg str return NotEqualf(a.t, expected, actual, msg, args...) } -// NotErrorIs asserts that at none of the errors in err's chain matches target. +// NotErrorAs asserts that none of the errors in err's chain matches target, +// but if so, sets target to that error value. +func (a *Assertions) NotErrorAs(err error, target interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NotErrorAs(a.t, err, target, msgAndArgs...) +} + +// NotErrorAsf asserts that none of the errors in err's chain matches target, +// but if so, sets target to that error value. +func (a *Assertions) NotErrorAsf(err error, target interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NotErrorAsf(a.t, err, target, msg, args...) +} + +// NotErrorIs asserts that none of the errors in err's chain matches target. // This is a wrapper for errors.Is. func (a *Assertions) NotErrorIs(err error, target error, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { @@ -1209,7 +1261,7 @@ func (a *Assertions) NotErrorIs(err error, target error, msgAndArgs ...interface return NotErrorIs(a.t, err, target, msgAndArgs...) } -// NotErrorIsf asserts that at none of the errors in err's chain matches target. +// NotErrorIsf asserts that none of the errors in err's chain matches target. // This is a wrapper for errors.Is. func (a *Assertions) NotErrorIsf(err error, target error, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { diff --git a/sdk/vendor/github.com/stretchr/testify/assert/assertion_order.go b/sdk/vendor/github.com/stretchr/testify/assert/assertion_order.go index 00df62a059..1d2f71824a 100644 --- a/sdk/vendor/github.com/stretchr/testify/assert/assertion_order.go +++ b/sdk/vendor/github.com/stretchr/testify/assert/assertion_order.go @@ -6,7 +6,7 @@ import ( ) // isOrdered checks that collection contains orderable elements. -func isOrdered(t TestingT, object interface{}, allowedComparesResults []CompareType, failMessage string, msgAndArgs ...interface{}) bool { +func isOrdered(t TestingT, object interface{}, allowedComparesResults []compareResult, failMessage string, msgAndArgs ...interface{}) bool { objKind := reflect.TypeOf(object).Kind() if objKind != reflect.Slice && objKind != reflect.Array { return false @@ -50,7 +50,7 @@ func isOrdered(t TestingT, object interface{}, allowedComparesResults []CompareT // assert.IsIncreasing(t, []float{1, 2}) // assert.IsIncreasing(t, []string{"a", "b"}) func IsIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { - return isOrdered(t, object, []CompareType{compareLess}, "\"%v\" is not less than \"%v\"", msgAndArgs...) + return isOrdered(t, object, []compareResult{compareLess}, "\"%v\" is not less than \"%v\"", msgAndArgs...) } // IsNonIncreasing asserts that the collection is not increasing @@ -59,7 +59,7 @@ func IsIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) boo // assert.IsNonIncreasing(t, []float{2, 1}) // assert.IsNonIncreasing(t, []string{"b", "a"}) func IsNonIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { - return isOrdered(t, object, []CompareType{compareEqual, compareGreater}, "\"%v\" is not greater than or equal to \"%v\"", msgAndArgs...) + return isOrdered(t, object, []compareResult{compareEqual, compareGreater}, "\"%v\" is not greater than or equal to \"%v\"", msgAndArgs...) } // IsDecreasing asserts that the collection is decreasing @@ -68,7 +68,7 @@ func IsNonIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) // assert.IsDecreasing(t, []float{2, 1}) // assert.IsDecreasing(t, []string{"b", "a"}) func IsDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { - return isOrdered(t, object, []CompareType{compareGreater}, "\"%v\" is not greater than \"%v\"", msgAndArgs...) + return isOrdered(t, object, []compareResult{compareGreater}, "\"%v\" is not greater than \"%v\"", msgAndArgs...) } // IsNonDecreasing asserts that the collection is not decreasing @@ -77,5 +77,5 @@ func IsDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) boo // assert.IsNonDecreasing(t, []float{1, 2}) // assert.IsNonDecreasing(t, []string{"a", "b"}) func IsNonDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { - return isOrdered(t, object, []CompareType{compareLess, compareEqual}, "\"%v\" is not less than or equal to \"%v\"", msgAndArgs...) + return isOrdered(t, object, []compareResult{compareLess, compareEqual}, "\"%v\" is not less than or equal to \"%v\"", msgAndArgs...) } diff --git a/sdk/vendor/github.com/stretchr/testify/assert/assertions.go b/sdk/vendor/github.com/stretchr/testify/assert/assertions.go index 0b7570f21c..4e91332bb5 100644 --- a/sdk/vendor/github.com/stretchr/testify/assert/assertions.go +++ b/sdk/vendor/github.com/stretchr/testify/assert/assertions.go @@ -19,7 +19,9 @@ import ( "github.com/davecgh/go-spew/spew" "github.com/pmezard/go-difflib/difflib" - "gopkg.in/yaml.v3" + + // Wrapper around gopkg.in/yaml.v3 + "github.com/stretchr/testify/assert/yaml" ) //go:generate sh -c "cd ../_codegen && go build && cd - && ../_codegen/_codegen -output-package=assert -template=assertion_format.go.tmpl" @@ -45,6 +47,10 @@ type BoolAssertionFunc func(TestingT, bool, ...interface{}) bool // for table driven tests. type ErrorAssertionFunc func(TestingT, error, ...interface{}) bool +// PanicAssertionFunc is a common function prototype when validating a panic value. Can be useful +// for table driven tests. +type PanicAssertionFunc = func(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool + // Comparison is a custom function that returns true on success and false on failure type Comparison func() (success bool) @@ -496,7 +502,13 @@ func Same(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) b h.Helper() } - if !samePointers(expected, actual) { + same, ok := samePointers(expected, actual) + if !ok { + return Fail(t, "Both arguments must be pointers", msgAndArgs...) + } + + if !same { + // both are pointers but not the same type & pointing to the same address return Fail(t, fmt.Sprintf("Not same: \n"+ "expected: %p %#v\n"+ "actual : %p %#v", expected, expected, actual, actual), msgAndArgs...) @@ -516,7 +528,13 @@ func NotSame(t TestingT, expected, actual interface{}, msgAndArgs ...interface{} h.Helper() } - if samePointers(expected, actual) { + same, ok := samePointers(expected, actual) + if !ok { + //fails when the arguments are not pointers + return !(Fail(t, "Both arguments must be pointers", msgAndArgs...)) + } + + if same { return Fail(t, fmt.Sprintf( "Expected and actual point to the same object: %p %#v", expected, expected), msgAndArgs...) @@ -524,21 +542,23 @@ func NotSame(t TestingT, expected, actual interface{}, msgAndArgs ...interface{} return true } -// samePointers compares two generic interface objects and returns whether -// they point to the same object -func samePointers(first, second interface{}) bool { +// samePointers checks if two generic interface objects are pointers of the same +// type pointing to the same object. It returns two values: same indicating if +// they are the same type and point to the same object, and ok indicating that +// both inputs are pointers. +func samePointers(first, second interface{}) (same bool, ok bool) { firstPtr, secondPtr := reflect.ValueOf(first), reflect.ValueOf(second) if firstPtr.Kind() != reflect.Ptr || secondPtr.Kind() != reflect.Ptr { - return false + return false, false //not both are pointers } firstType, secondType := reflect.TypeOf(first), reflect.TypeOf(second) if firstType != secondType { - return false + return false, true // both are pointers, but of different types } // compare pointer addresses - return first == second + return first == second, true } // formatUnequalValues takes two values of arbitrary types and returns string @@ -572,8 +592,8 @@ func truncatingFormat(data interface{}) string { return value } -// EqualValues asserts that two objects are equal or convertible to the same types -// and equal. +// EqualValues asserts that two objects are equal or convertible to the larger +// type and equal. // // assert.EqualValues(t, uint32(123), int32(123)) func EqualValues(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool { @@ -615,21 +635,6 @@ func EqualExportedValues(t TestingT, expected, actual interface{}, msgAndArgs .. return Fail(t, fmt.Sprintf("Types expected to match exactly\n\t%v != %v", aType, bType), msgAndArgs...) } - if aType.Kind() == reflect.Ptr { - aType = aType.Elem() - } - if bType.Kind() == reflect.Ptr { - bType = bType.Elem() - } - - if aType.Kind() != reflect.Struct { - return Fail(t, fmt.Sprintf("Types expected to both be struct or pointer to struct \n\t%v != %v", aType.Kind(), reflect.Struct), msgAndArgs...) - } - - if bType.Kind() != reflect.Struct { - return Fail(t, fmt.Sprintf("Types expected to both be struct or pointer to struct \n\t%v != %v", bType.Kind(), reflect.Struct), msgAndArgs...) - } - expected = copyExportedFields(expected) actual = copyExportedFields(actual) @@ -1170,6 +1175,39 @@ func formatListDiff(listA, listB interface{}, extraA, extraB []interface{}) stri return msg.String() } +// NotElementsMatch asserts that the specified listA(array, slice...) is NOT equal to specified +// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements, +// the number of appearances of each of them in both lists should not match. +// This is an inverse of ElementsMatch. +// +// assert.NotElementsMatch(t, [1, 1, 2, 3], [1, 1, 2, 3]) -> false +// +// assert.NotElementsMatch(t, [1, 1, 2, 3], [1, 2, 3]) -> true +// +// assert.NotElementsMatch(t, [1, 2, 3], [1, 2, 4]) -> true +func NotElementsMatch(t TestingT, listA, listB interface{}, msgAndArgs ...interface{}) (ok bool) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if isEmpty(listA) && isEmpty(listB) { + return Fail(t, "listA and listB contain the same elements", msgAndArgs) + } + + if !isList(t, listA, msgAndArgs...) { + return Fail(t, "listA is not a list type", msgAndArgs...) + } + if !isList(t, listB, msgAndArgs...) { + return Fail(t, "listB is not a list type", msgAndArgs...) + } + + extraA, extraB := diffLists(listA, listB) + if len(extraA) == 0 && len(extraB) == 0 { + return Fail(t, "listA and listB contain the same elements", msgAndArgs) + } + + return true +} + // Condition uses a Comparison to assert a complex condition. func Condition(t TestingT, comp Comparison, msgAndArgs ...interface{}) bool { if h, ok := t.(tHelper); ok { @@ -1488,6 +1526,9 @@ func InEpsilon(t TestingT, expected, actual interface{}, epsilon float64, msgAnd if err != nil { return Fail(t, err.Error(), msgAndArgs...) } + if math.IsNaN(actualEpsilon) { + return Fail(t, "relative error is NaN", msgAndArgs...) + } if actualEpsilon > epsilon { return Fail(t, fmt.Sprintf("Relative error is too high: %#v (expected)\n"+ " < %#v (actual)", epsilon, actualEpsilon), msgAndArgs...) @@ -1611,7 +1652,6 @@ func ErrorContains(t TestingT, theError error, contains string, msgAndArgs ...in // matchRegexp return true if a specified regexp matches a string. func matchRegexp(rx interface{}, str interface{}) bool { - var r *regexp.Regexp if rr, ok := rx.(*regexp.Regexp); ok { r = rr @@ -1619,7 +1659,14 @@ func matchRegexp(rx interface{}, str interface{}) bool { r = regexp.MustCompile(fmt.Sprint(rx)) } - return (r.FindStringIndex(fmt.Sprint(str)) != nil) + switch v := str.(type) { + case []byte: + return r.Match(v) + case string: + return r.MatchString(v) + default: + return r.MatchString(fmt.Sprint(v)) + } } @@ -1872,7 +1919,7 @@ var spewConfigStringerEnabled = spew.ConfigState{ MaxDepth: 10, } -type tHelper interface { +type tHelper = interface { Helper() } @@ -1911,6 +1958,9 @@ func Eventually(t TestingT, condition func() bool, waitFor time.Duration, tick t // CollectT implements the TestingT interface and collects all errors. type CollectT struct { + // A slice of errors. Non-nil slice denotes a failure. + // If it's non-nil but len(c.errors) == 0, this is also a failure + // obtained by direct c.FailNow() call. errors []error } @@ -1919,9 +1969,10 @@ func (c *CollectT) Errorf(format string, args ...interface{}) { c.errors = append(c.errors, fmt.Errorf(format, args...)) } -// FailNow panics. -func (*CollectT) FailNow() { - panic("Assertion failed") +// FailNow stops execution by calling runtime.Goexit. +func (c *CollectT) FailNow() { + c.fail() + runtime.Goexit() } // Deprecated: That was a method for internal usage that should not have been published. Now just panics. @@ -1934,6 +1985,16 @@ func (*CollectT) Copy(TestingT) { panic("Copy() is deprecated") } +func (c *CollectT) fail() { + if !c.failed() { + c.errors = []error{} // Make it non-nil to mark a failure. + } +} + +func (c *CollectT) failed() bool { + return c.errors != nil +} + // EventuallyWithT asserts that given condition will be met in waitFor time, // periodically checking target function each tick. In contrast to Eventually, // it supplies a CollectT to the condition function, so that the condition @@ -1951,14 +2012,14 @@ func (*CollectT) Copy(TestingT) { // assert.EventuallyWithT(t, func(c *assert.CollectT) { // // add assertions as needed; any assertion failure will fail the current tick // assert.True(c, externalValue, "expected 'externalValue' to be true") -// }, 1*time.Second, 10*time.Second, "external state has not changed to 'true'; still false") +// }, 10*time.Second, 1*time.Second, "external state has not changed to 'true'; still false") func EventuallyWithT(t TestingT, condition func(collect *CollectT), waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() } var lastFinishedTickErrs []error - ch := make(chan []error, 1) + ch := make(chan *CollectT, 1) timer := time.NewTimer(waitFor) defer timer.Stop() @@ -1978,16 +2039,16 @@ func EventuallyWithT(t TestingT, condition func(collect *CollectT), waitFor time go func() { collect := new(CollectT) defer func() { - ch <- collect.errors + ch <- collect }() condition(collect) }() - case errs := <-ch: - if len(errs) == 0 { + case collect := <-ch: + if !collect.failed() { return true } // Keep the errors from the last ended condition, so that they can be copied to t if timeout is reached. - lastFinishedTickErrs = errs + lastFinishedTickErrs = collect.errors tick = ticker.C } } @@ -2049,7 +2110,7 @@ func ErrorIs(t TestingT, err, target error, msgAndArgs ...interface{}) bool { ), msgAndArgs...) } -// NotErrorIs asserts that at none of the errors in err's chain matches target. +// NotErrorIs asserts that none of the errors in err's chain matches target. // This is a wrapper for errors.Is. func NotErrorIs(t TestingT, err, target error, msgAndArgs ...interface{}) bool { if h, ok := t.(tHelper); ok { @@ -2090,6 +2151,24 @@ func ErrorAs(t TestingT, err error, target interface{}, msgAndArgs ...interface{ ), msgAndArgs...) } +// NotErrorAs asserts that none of the errors in err's chain matches target, +// but if so, sets target to that error value. +func NotErrorAs(t TestingT, err error, target interface{}, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if !errors.As(err, target) { + return true + } + + chain := buildErrorChainString(err) + + return Fail(t, fmt.Sprintf("Target error should not be in err chain:\n"+ + "found: %q\n"+ + "in chain: %s", target, chain, + ), msgAndArgs...) +} + func buildErrorChainString(err error) string { if err == nil { return "" diff --git a/sdk/vendor/github.com/stretchr/testify/assert/yaml/yaml_custom.go b/sdk/vendor/github.com/stretchr/testify/assert/yaml/yaml_custom.go new file mode 100644 index 0000000000..baa0cc7d7f --- /dev/null +++ b/sdk/vendor/github.com/stretchr/testify/assert/yaml/yaml_custom.go @@ -0,0 +1,25 @@ +//go:build testify_yaml_custom && !testify_yaml_fail && !testify_yaml_default +// +build testify_yaml_custom,!testify_yaml_fail,!testify_yaml_default + +// Package yaml is an implementation of YAML functions that calls a pluggable implementation. +// +// This implementation is selected with the testify_yaml_custom build tag. +// +// go test -tags testify_yaml_custom +// +// This implementation can be used at build time to replace the default implementation +// to avoid linking with [gopkg.in/yaml.v3]. +// +// In your test package: +// +// import assertYaml "github.com/stretchr/testify/assert/yaml" +// +// func init() { +// assertYaml.Unmarshal = func (in []byte, out interface{}) error { +// // ... +// return nil +// } +// } +package yaml + +var Unmarshal func(in []byte, out interface{}) error diff --git a/sdk/vendor/github.com/stretchr/testify/assert/yaml/yaml_default.go b/sdk/vendor/github.com/stretchr/testify/assert/yaml/yaml_default.go new file mode 100644 index 0000000000..b83c6cf64c --- /dev/null +++ b/sdk/vendor/github.com/stretchr/testify/assert/yaml/yaml_default.go @@ -0,0 +1,37 @@ +//go:build !testify_yaml_fail && !testify_yaml_custom +// +build !testify_yaml_fail,!testify_yaml_custom + +// Package yaml is just an indirection to handle YAML deserialization. +// +// This package is just an indirection that allows the builder to override the +// indirection with an alternative implementation of this package that uses +// another implementation of YAML deserialization. This allows to not either not +// use YAML deserialization at all, or to use another implementation than +// [gopkg.in/yaml.v3] (for example for license compatibility reasons, see [PR #1120]). +// +// Alternative implementations are selected using build tags: +// +// - testify_yaml_fail: [Unmarshal] always fails with an error +// - testify_yaml_custom: [Unmarshal] is a variable. Caller must initialize it +// before calling any of [github.com/stretchr/testify/assert.YAMLEq] or +// [github.com/stretchr/testify/assert.YAMLEqf]. +// +// Usage: +// +// go test -tags testify_yaml_fail +// +// You can check with "go list" which implementation is linked: +// +// go list -f '{{.Imports}}' github.com/stretchr/testify/assert/yaml +// go list -tags testify_yaml_fail -f '{{.Imports}}' github.com/stretchr/testify/assert/yaml +// go list -tags testify_yaml_custom -f '{{.Imports}}' github.com/stretchr/testify/assert/yaml +// +// [PR #1120]: https://github.com/stretchr/testify/pull/1120 +package yaml + +import goyaml "gopkg.in/yaml.v3" + +// Unmarshal is just a wrapper of [gopkg.in/yaml.v3.Unmarshal]. +func Unmarshal(in []byte, out interface{}) error { + return goyaml.Unmarshal(in, out) +} diff --git a/sdk/vendor/github.com/stretchr/testify/assert/yaml/yaml_fail.go b/sdk/vendor/github.com/stretchr/testify/assert/yaml/yaml_fail.go new file mode 100644 index 0000000000..e78f7dfe69 --- /dev/null +++ b/sdk/vendor/github.com/stretchr/testify/assert/yaml/yaml_fail.go @@ -0,0 +1,18 @@ +//go:build testify_yaml_fail && !testify_yaml_custom && !testify_yaml_default +// +build testify_yaml_fail,!testify_yaml_custom,!testify_yaml_default + +// Package yaml is an implementation of YAML functions that always fail. +// +// This implementation can be used at build time to replace the default implementation +// to avoid linking with [gopkg.in/yaml.v3]: +// +// go test -tags testify_yaml_fail +package yaml + +import "errors" + +var errNotImplemented = errors.New("YAML functions are not available (see https://pkg.go.dev/github.com/stretchr/testify/assert/yaml)") + +func Unmarshal([]byte, interface{}) error { + return errNotImplemented +} diff --git a/sdk/vendor/github.com/stretchr/testify/mock/mock.go b/sdk/vendor/github.com/stretchr/testify/mock/mock.go index 213bde2ea6..eb5682df97 100644 --- a/sdk/vendor/github.com/stretchr/testify/mock/mock.go +++ b/sdk/vendor/github.com/stretchr/testify/mock/mock.go @@ -80,12 +80,12 @@ type Call struct { requires []*Call } -func newCall(parent *Mock, methodName string, callerInfo []string, methodArguments ...interface{}) *Call { +func newCall(parent *Mock, methodName string, callerInfo []string, methodArguments Arguments, returnArguments Arguments) *Call { return &Call{ Parent: parent, Method: methodName, Arguments: methodArguments, - ReturnArguments: make([]interface{}, 0), + ReturnArguments: returnArguments, callerInfo: callerInfo, Repeatability: 0, WaitFor: nil, @@ -256,7 +256,7 @@ func (c *Call) Unset() *Call { // calls have been called as expected. The referenced calls may be from the // same mock instance and/or other mock instances. // -// Mock.On("Do").Return(nil).Notbefore( +// Mock.On("Do").Return(nil).NotBefore( // Mock.On("Init").Return(nil) // ) func (c *Call) NotBefore(calls ...*Call) *Call { @@ -273,6 +273,20 @@ func (c *Call) NotBefore(calls ...*Call) *Call { return c } +// InOrder defines the order in which the calls should be made +// +// For example: +// +// InOrder( +// Mock.On("init").Return(nil), +// Mock.On("Do").Return(nil), +// ) +func InOrder(calls ...*Call) { + for i := 1; i < len(calls); i++ { + calls[i].NotBefore(calls[i-1]) + } +} + // Mock is the workhorse used to track activity on another object. // For an example of its usage, refer to the "Example Usage" section at the top // of this document. @@ -351,7 +365,8 @@ func (m *Mock) On(methodName string, arguments ...interface{}) *Call { m.mutex.Lock() defer m.mutex.Unlock() - c := newCall(m, methodName, assert.CallerInfo(), arguments...) + + c := newCall(m, methodName, assert.CallerInfo(), arguments, make([]interface{}, 0)) m.ExpectedCalls = append(m.ExpectedCalls, c) return c } @@ -491,11 +506,12 @@ func (m *Mock) MethodCalled(methodName string, arguments ...interface{}) Argumen m.mutex.Unlock() if closestCall != nil { - m.fail("\n\nmock: Unexpected Method Call\n-----------------------------\n\n%s\n\nThe closest call I have is: \n\n%s\n\n%s\nDiff: %s", + m.fail("\n\nmock: Unexpected Method Call\n-----------------------------\n\n%s\n\nThe closest call I have is: \n\n%s\n\n%s\nDiff: %s\nat: %s\n", callString(methodName, arguments, true), callString(methodName, closestCall.Arguments, true), diffArguments(closestCall.Arguments, arguments), strings.TrimSpace(mismatch), + assert.CallerInfo(), ) } else { m.fail("\nassert: mock: I don't know what to return because the method call was unexpected.\n\tEither do Mock.On(\"%s\").Return(...) first, or remove the %s() call.\n\tThis method was unexpected:\n\t\t%s\n\tat: %s", methodName, methodName, callString(methodName, arguments, true), assert.CallerInfo()) @@ -529,7 +545,7 @@ func (m *Mock) MethodCalled(methodName string, arguments ...interface{}) Argumen call.totalCalls++ // add the call - m.Calls = append(m.Calls, *newCall(m, methodName, assert.CallerInfo(), arguments...)) + m.Calls = append(m.Calls, *newCall(m, methodName, assert.CallerInfo(), arguments, call.ReturnArguments)) m.mutex.Unlock() // block if specified @@ -764,9 +780,17 @@ const ( ) // AnythingOfTypeArgument contains the type of an argument -// for use when type checking. Used in Diff and Assert. +// for use when type checking. Used in [Arguments.Diff] and [Arguments.Assert]. // -// Deprecated: this is an implementation detail that must not be used. Use [AnythingOfType] instead. +// Deprecated: this is an implementation detail that must not be used. Use the [AnythingOfType] constructor instead, example: +// +// m.On("Do", mock.AnythingOfType("string")) +// +// All explicit type declarations can be replaced with interface{} as is expected by [Mock.On], example: +// +// func anyString interface{} { +// return mock.AnythingOfType("string") +// } type AnythingOfTypeArgument = anythingOfTypeArgument // anythingOfTypeArgument is a string that contains the type of an argument @@ -780,53 +804,54 @@ type anythingOfTypeArgument string // // For example: // -// Assert(t, AnythingOfType("string"), AnythingOfType("int")) +// args.Assert(t, AnythingOfType("string"), AnythingOfType("int")) func AnythingOfType(t string) AnythingOfTypeArgument { return anythingOfTypeArgument(t) } // IsTypeArgument is a struct that contains the type of an argument -// for use when type checking. This is an alternative to AnythingOfType. -// Used in Diff and Assert. +// for use when type checking. This is an alternative to [AnythingOfType]. +// Used in [Arguments.Diff] and [Arguments.Assert]. type IsTypeArgument struct { t reflect.Type } // IsType returns an IsTypeArgument object containing the type to check for. // You can provide a zero-value of the type to check. This is an -// alternative to AnythingOfType. Used in Diff and Assert. +// alternative to [AnythingOfType]. Used in [Arguments.Diff] and [Arguments.Assert]. // // For example: -// Assert(t, IsType(""), IsType(0)) +// +// args.Assert(t, IsType(""), IsType(0)) func IsType(t interface{}) *IsTypeArgument { return &IsTypeArgument{t: reflect.TypeOf(t)} } -// FunctionalOptionsArgument is a struct that contains the type and value of an functional option argument -// for use when type checking. +// FunctionalOptionsArgument contains a list of functional options arguments +// expected for use when matching a list of arguments. type FunctionalOptionsArgument struct { - value interface{} + values []interface{} } // String returns the string representation of FunctionalOptionsArgument func (f *FunctionalOptionsArgument) String() string { var name string - tValue := reflect.ValueOf(f.value) - if tValue.Len() > 0 { - name = "[]" + reflect.TypeOf(tValue.Index(0).Interface()).String() + if len(f.values) > 0 { + name = "[]" + reflect.TypeOf(f.values[0]).String() } - return strings.Replace(fmt.Sprintf("%#v", f.value), "[]interface {}", name, 1) + return strings.Replace(fmt.Sprintf("%#v", f.values), "[]interface {}", name, 1) } -// FunctionalOptions returns an FunctionalOptionsArgument object containing the functional option type -// and the values to check of +// FunctionalOptions returns an [FunctionalOptionsArgument] object containing +// the expected functional-options to check for. // // For example: -// Assert(t, FunctionalOptions("[]foo.FunctionalOption", foo.Opt1(), foo.Opt2())) -func FunctionalOptions(value ...interface{}) *FunctionalOptionsArgument { +// +// args.Assert(t, FunctionalOptions(foo.Opt1("strValue"), foo.Opt2(613))) +func FunctionalOptions(values ...interface{}) *FunctionalOptionsArgument { return &FunctionalOptionsArgument{ - value: value, + values: values, } } @@ -873,10 +898,11 @@ func (f argumentMatcher) String() string { // and false otherwise. // // Example: -// m.On("Do", MatchedBy(func(req *http.Request) bool { return req.Host == "example.com" })) // -// |fn|, must be a function accepting a single argument (of the expected type) -// which returns a bool. If |fn| doesn't match the required signature, +// m.On("Do", MatchedBy(func(req *http.Request) bool { return req.Host == "example.com" })) +// +// fn must be a function accepting a single argument (of the expected type) +// which returns a bool. If fn doesn't match the required signature, // MatchedBy() panics. func MatchedBy(fn interface{}) argumentMatcher { fnType := reflect.TypeOf(fn) @@ -979,20 +1005,17 @@ func (args Arguments) Diff(objects []interface{}) (string, int) { output = fmt.Sprintf("%s\t%d: FAIL: type %s != type %s - %s\n", output, i, expected.t.Name(), actualT.Name(), actualFmt) } case *FunctionalOptionsArgument: - t := expected.value - var name string - tValue := reflect.ValueOf(t) - if tValue.Len() > 0 { - name = "[]" + reflect.TypeOf(tValue.Index(0).Interface()).String() + if len(expected.values) > 0 { + name = "[]" + reflect.TypeOf(expected.values[0]).String() } - tName := reflect.TypeOf(t).Name() - if name != reflect.TypeOf(actual).String() && tValue.Len() != 0 { + const tName = "[]interface{}" + if name != reflect.TypeOf(actual).String() && len(expected.values) != 0 { differences++ output = fmt.Sprintf("%s\t%d: FAIL: type %s != type %s - %s\n", output, i, tName, reflect.TypeOf(actual).Name(), actualFmt) } else { - if ef, af := assertOpts(t, actual); ef == "" && af == "" { + if ef, af := assertOpts(expected.values, actual); ef == "" && af == "" { // match output = fmt.Sprintf("%s\t%d: PASS: %s == %s\n", output, i, tName, tName) } else { @@ -1092,7 +1115,7 @@ func (args Arguments) Error(index int) error { return nil } if s, ok = obj.(error); !ok { - panic(fmt.Sprintf("assert: arguments: Error(%d) failed because object wasn't correct type: %v", index, args.Get(index))) + panic(fmt.Sprintf("assert: arguments: Error(%d) failed because object wasn't correct type: %v", index, obj)) } return s } @@ -1181,32 +1204,38 @@ type tHelper interface { func assertOpts(expected, actual interface{}) (expectedFmt, actualFmt string) { expectedOpts := reflect.ValueOf(expected) actualOpts := reflect.ValueOf(actual) + + var expectedFuncs []*runtime.Func var expectedNames []string for i := 0; i < expectedOpts.Len(); i++ { - expectedNames = append(expectedNames, funcName(expectedOpts.Index(i).Interface())) + f := runtimeFunc(expectedOpts.Index(i).Interface()) + expectedFuncs = append(expectedFuncs, f) + expectedNames = append(expectedNames, funcName(f)) } + var actualFuncs []*runtime.Func var actualNames []string for i := 0; i < actualOpts.Len(); i++ { - actualNames = append(actualNames, funcName(actualOpts.Index(i).Interface())) + f := runtimeFunc(actualOpts.Index(i).Interface()) + actualFuncs = append(actualFuncs, f) + actualNames = append(actualNames, funcName(f)) } - if !assert.ObjectsAreEqual(expectedNames, actualNames) { + + if expectedOpts.Len() != actualOpts.Len() { expectedFmt = fmt.Sprintf("%v", expectedNames) actualFmt = fmt.Sprintf("%v", actualNames) return } for i := 0; i < expectedOpts.Len(); i++ { - expectedOpt := expectedOpts.Index(i).Interface() - actualOpt := actualOpts.Index(i).Interface() - - expectedFunc := expectedNames[i] - actualFunc := actualNames[i] - if expectedFunc != actualFunc { - expectedFmt = expectedFunc - actualFmt = actualFunc + if !isFuncSame(expectedFuncs[i], actualFuncs[i]) { + expectedFmt = expectedNames[i] + actualFmt = actualNames[i] return } + expectedOpt := expectedOpts.Index(i).Interface() + actualOpt := actualOpts.Index(i).Interface() + ot := reflect.TypeOf(expectedOpt) var expectedValues []reflect.Value var actualValues []reflect.Value @@ -1224,9 +1253,9 @@ func assertOpts(expected, actual interface{}) (expectedFmt, actualFmt string) { reflect.ValueOf(actualOpt).Call(actualValues) for i := 0; i < ot.NumIn(); i++ { - if !assert.ObjectsAreEqual(expectedValues[i].Interface(), actualValues[i].Interface()) { - expectedFmt = fmt.Sprintf("%s %+v", expectedNames[i], expectedValues[i].Interface()) - actualFmt = fmt.Sprintf("%s %+v", expectedNames[i], actualValues[i].Interface()) + if expectedArg, actualArg := expectedValues[i].Interface(), actualValues[i].Interface(); !assert.ObjectsAreEqual(expectedArg, actualArg) { + expectedFmt = fmt.Sprintf("%s(%T) -> %#v", expectedNames[i], expectedArg, expectedArg) + actualFmt = fmt.Sprintf("%s(%T) -> %#v", expectedNames[i], actualArg, actualArg) return } } @@ -1235,7 +1264,25 @@ func assertOpts(expected, actual interface{}) (expectedFmt, actualFmt string) { return "", "" } -func funcName(opt interface{}) string { - n := runtime.FuncForPC(reflect.ValueOf(opt).Pointer()).Name() - return strings.TrimSuffix(path.Base(n), path.Ext(n)) +func runtimeFunc(opt interface{}) *runtime.Func { + return runtime.FuncForPC(reflect.ValueOf(opt).Pointer()) +} + +func funcName(f *runtime.Func) string { + name := f.Name() + trimmed := strings.TrimSuffix(path.Base(name), path.Ext(name)) + splitted := strings.Split(trimmed, ".") + + if len(splitted) == 0 { + return trimmed + } + + return splitted[len(splitted)-1] +} + +func isFuncSame(f1, f2 *runtime.Func) bool { + f1File, f1Loc := f1.FileLine(f1.Entry()) + f2File, f2Loc := f2.FileLine(f2.Entry()) + + return f1File == f2File && f1Loc == f2Loc } diff --git a/sdk/vendor/github.com/stretchr/testify/require/require.go b/sdk/vendor/github.com/stretchr/testify/require/require.go index 506a82f807..d8921950d7 100644 --- a/sdk/vendor/github.com/stretchr/testify/require/require.go +++ b/sdk/vendor/github.com/stretchr/testify/require/require.go @@ -34,9 +34,9 @@ func Conditionf(t TestingT, comp assert.Comparison, msg string, args ...interfac // Contains asserts that the specified string, list(array, slice...) or map contains the // specified substring or element. // -// assert.Contains(t, "Hello World", "World") -// assert.Contains(t, ["Hello", "World"], "World") -// assert.Contains(t, {"Hello": "World"}, "Hello") +// require.Contains(t, "Hello World", "World") +// require.Contains(t, ["Hello", "World"], "World") +// require.Contains(t, {"Hello": "World"}, "Hello") func Contains(t TestingT, s interface{}, contains interface{}, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -50,9 +50,9 @@ func Contains(t TestingT, s interface{}, contains interface{}, msgAndArgs ...int // Containsf asserts that the specified string, list(array, slice...) or map contains the // specified substring or element. // -// assert.Containsf(t, "Hello World", "World", "error message %s", "formatted") -// assert.Containsf(t, ["Hello", "World"], "World", "error message %s", "formatted") -// assert.Containsf(t, {"Hello": "World"}, "Hello", "error message %s", "formatted") +// require.Containsf(t, "Hello World", "World", "error message %s", "formatted") +// require.Containsf(t, ["Hello", "World"], "World", "error message %s", "formatted") +// require.Containsf(t, {"Hello": "World"}, "Hello", "error message %s", "formatted") func Containsf(t TestingT, s interface{}, contains interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -91,7 +91,7 @@ func DirExistsf(t TestingT, path string, msg string, args ...interface{}) { // listB(array, slice...) ignoring the order of the elements. If there are duplicate elements, // the number of appearances of each of them in both lists should match. // -// assert.ElementsMatch(t, [1, 3, 2, 3], [1, 3, 3, 2]) +// require.ElementsMatch(t, [1, 3, 2, 3], [1, 3, 3, 2]) func ElementsMatch(t TestingT, listA interface{}, listB interface{}, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -106,7 +106,7 @@ func ElementsMatch(t TestingT, listA interface{}, listB interface{}, msgAndArgs // listB(array, slice...) ignoring the order of the elements. If there are duplicate elements, // the number of appearances of each of them in both lists should match. // -// assert.ElementsMatchf(t, [1, 3, 2, 3], [1, 3, 3, 2], "error message %s", "formatted") +// require.ElementsMatchf(t, [1, 3, 2, 3], [1, 3, 3, 2], "error message %s", "formatted") func ElementsMatchf(t TestingT, listA interface{}, listB interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -120,7 +120,7 @@ func ElementsMatchf(t TestingT, listA interface{}, listB interface{}, msg string // Empty asserts that the specified object is empty. I.e. nil, "", false, 0 or either // a slice or a channel with len == 0. // -// assert.Empty(t, obj) +// require.Empty(t, obj) func Empty(t TestingT, object interface{}, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -134,7 +134,7 @@ func Empty(t TestingT, object interface{}, msgAndArgs ...interface{}) { // Emptyf asserts that the specified object is empty. I.e. nil, "", false, 0 or either // a slice or a channel with len == 0. // -// assert.Emptyf(t, obj, "error message %s", "formatted") +// require.Emptyf(t, obj, "error message %s", "formatted") func Emptyf(t TestingT, object interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -147,7 +147,7 @@ func Emptyf(t TestingT, object interface{}, msg string, args ...interface{}) { // Equal asserts that two objects are equal. // -// assert.Equal(t, 123, 123) +// require.Equal(t, 123, 123) // // Pointer variable equality is determined based on the equality of the // referenced values (as opposed to the memory addresses). Function equality @@ -166,7 +166,7 @@ func Equal(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...i // and that it is equal to the provided error. // // actualObj, err := SomeFunction() -// assert.EqualError(t, err, expectedErrorString) +// require.EqualError(t, err, expectedErrorString) func EqualError(t TestingT, theError error, errString string, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -181,7 +181,7 @@ func EqualError(t TestingT, theError error, errString string, msgAndArgs ...inte // and that it is equal to the provided error. // // actualObj, err := SomeFunction() -// assert.EqualErrorf(t, err, expectedErrorString, "error message %s", "formatted") +// require.EqualErrorf(t, err, expectedErrorString, "error message %s", "formatted") func EqualErrorf(t TestingT, theError error, errString string, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -200,8 +200,8 @@ func EqualErrorf(t TestingT, theError error, errString string, msg string, args // Exported int // notExported int // } -// assert.EqualExportedValues(t, S{1, 2}, S{1, 3}) => true -// assert.EqualExportedValues(t, S{1, 2}, S{2, 3}) => false +// require.EqualExportedValues(t, S{1, 2}, S{1, 3}) => true +// require.EqualExportedValues(t, S{1, 2}, S{2, 3}) => false func EqualExportedValues(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -220,8 +220,8 @@ func EqualExportedValues(t TestingT, expected interface{}, actual interface{}, m // Exported int // notExported int // } -// assert.EqualExportedValuesf(t, S{1, 2}, S{1, 3}, "error message %s", "formatted") => true -// assert.EqualExportedValuesf(t, S{1, 2}, S{2, 3}, "error message %s", "formatted") => false +// require.EqualExportedValuesf(t, S{1, 2}, S{1, 3}, "error message %s", "formatted") => true +// require.EqualExportedValuesf(t, S{1, 2}, S{2, 3}, "error message %s", "formatted") => false func EqualExportedValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -232,10 +232,10 @@ func EqualExportedValuesf(t TestingT, expected interface{}, actual interface{}, t.FailNow() } -// EqualValues asserts that two objects are equal or convertible to the same types -// and equal. +// EqualValues asserts that two objects are equal or convertible to the larger +// type and equal. // -// assert.EqualValues(t, uint32(123), int32(123)) +// require.EqualValues(t, uint32(123), int32(123)) func EqualValues(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -246,10 +246,10 @@ func EqualValues(t TestingT, expected interface{}, actual interface{}, msgAndArg t.FailNow() } -// EqualValuesf asserts that two objects are equal or convertible to the same types -// and equal. +// EqualValuesf asserts that two objects are equal or convertible to the larger +// type and equal. // -// assert.EqualValuesf(t, uint32(123), int32(123), "error message %s", "formatted") +// require.EqualValuesf(t, uint32(123), int32(123), "error message %s", "formatted") func EqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -262,7 +262,7 @@ func EqualValuesf(t TestingT, expected interface{}, actual interface{}, msg stri // Equalf asserts that two objects are equal. // -// assert.Equalf(t, 123, 123, "error message %s", "formatted") +// require.Equalf(t, 123, 123, "error message %s", "formatted") // // Pointer variable equality is determined based on the equality of the // referenced values (as opposed to the memory addresses). Function equality @@ -280,8 +280,8 @@ func Equalf(t TestingT, expected interface{}, actual interface{}, msg string, ar // Error asserts that a function returned an error (i.e. not `nil`). // // actualObj, err := SomeFunction() -// if assert.Error(t, err) { -// assert.Equal(t, expectedError, err) +// if require.Error(t, err) { +// require.Equal(t, expectedError, err) // } func Error(t TestingT, err error, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { @@ -321,7 +321,7 @@ func ErrorAsf(t TestingT, err error, target interface{}, msg string, args ...int // and that the error contains the specified substring. // // actualObj, err := SomeFunction() -// assert.ErrorContains(t, err, expectedErrorSubString) +// require.ErrorContains(t, err, expectedErrorSubString) func ErrorContains(t TestingT, theError error, contains string, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -336,7 +336,7 @@ func ErrorContains(t TestingT, theError error, contains string, msgAndArgs ...in // and that the error contains the specified substring. // // actualObj, err := SomeFunction() -// assert.ErrorContainsf(t, err, expectedErrorSubString, "error message %s", "formatted") +// require.ErrorContainsf(t, err, expectedErrorSubString, "error message %s", "formatted") func ErrorContainsf(t TestingT, theError error, contains string, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -374,8 +374,8 @@ func ErrorIsf(t TestingT, err error, target error, msg string, args ...interface // Errorf asserts that a function returned an error (i.e. not `nil`). // // actualObj, err := SomeFunction() -// if assert.Errorf(t, err, "error message %s", "formatted") { -// assert.Equal(t, expectedErrorf, err) +// if require.Errorf(t, err, "error message %s", "formatted") { +// require.Equal(t, expectedErrorf, err) // } func Errorf(t TestingT, err error, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { @@ -390,7 +390,7 @@ func Errorf(t TestingT, err error, msg string, args ...interface{}) { // Eventually asserts that given condition will be met in waitFor time, // periodically checking target function each tick. // -// assert.Eventually(t, func() bool { return true; }, time.Second, 10*time.Millisecond) +// require.Eventually(t, func() bool { return true; }, time.Second, 10*time.Millisecond) func Eventually(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -415,10 +415,10 @@ func Eventually(t TestingT, condition func() bool, waitFor time.Duration, tick t // time.Sleep(8*time.Second) // externalValue = true // }() -// assert.EventuallyWithT(t, func(c *assert.CollectT) { +// require.EventuallyWithT(t, func(c *require.CollectT) { // // add assertions as needed; any assertion failure will fail the current tick -// assert.True(c, externalValue, "expected 'externalValue' to be true") -// }, 1*time.Second, 10*time.Second, "external state has not changed to 'true'; still false") +// require.True(c, externalValue, "expected 'externalValue' to be true") +// }, 10*time.Second, 1*time.Second, "external state has not changed to 'true'; still false") func EventuallyWithT(t TestingT, condition func(collect *assert.CollectT), waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -443,10 +443,10 @@ func EventuallyWithT(t TestingT, condition func(collect *assert.CollectT), waitF // time.Sleep(8*time.Second) // externalValue = true // }() -// assert.EventuallyWithTf(t, func(c *assert.CollectT, "error message %s", "formatted") { +// require.EventuallyWithTf(t, func(c *require.CollectT, "error message %s", "formatted") { // // add assertions as needed; any assertion failure will fail the current tick -// assert.True(c, externalValue, "expected 'externalValue' to be true") -// }, 1*time.Second, 10*time.Second, "external state has not changed to 'true'; still false") +// require.True(c, externalValue, "expected 'externalValue' to be true") +// }, 10*time.Second, 1*time.Second, "external state has not changed to 'true'; still false") func EventuallyWithTf(t TestingT, condition func(collect *assert.CollectT), waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -460,7 +460,7 @@ func EventuallyWithTf(t TestingT, condition func(collect *assert.CollectT), wait // Eventuallyf asserts that given condition will be met in waitFor time, // periodically checking target function each tick. // -// assert.Eventuallyf(t, func() bool { return true; }, time.Second, 10*time.Millisecond, "error message %s", "formatted") +// require.Eventuallyf(t, func() bool { return true; }, time.Second, 10*time.Millisecond, "error message %s", "formatted") func Eventuallyf(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -473,7 +473,7 @@ func Eventuallyf(t TestingT, condition func() bool, waitFor time.Duration, tick // Exactly asserts that two objects are equal in value and type. // -// assert.Exactly(t, int32(123), int64(123)) +// require.Exactly(t, int32(123), int64(123)) func Exactly(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -486,7 +486,7 @@ func Exactly(t TestingT, expected interface{}, actual interface{}, msgAndArgs .. // Exactlyf asserts that two objects are equal in value and type. // -// assert.Exactlyf(t, int32(123), int64(123), "error message %s", "formatted") +// require.Exactlyf(t, int32(123), int64(123), "error message %s", "formatted") func Exactlyf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -543,7 +543,7 @@ func Failf(t TestingT, failureMessage string, msg string, args ...interface{}) { // False asserts that the specified value is false. // -// assert.False(t, myBool) +// require.False(t, myBool) func False(t TestingT, value bool, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -556,7 +556,7 @@ func False(t TestingT, value bool, msgAndArgs ...interface{}) { // Falsef asserts that the specified value is false. // -// assert.Falsef(t, myBool, "error message %s", "formatted") +// require.Falsef(t, myBool, "error message %s", "formatted") func Falsef(t TestingT, value bool, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -593,9 +593,9 @@ func FileExistsf(t TestingT, path string, msg string, args ...interface{}) { // Greater asserts that the first element is greater than the second // -// assert.Greater(t, 2, 1) -// assert.Greater(t, float64(2), float64(1)) -// assert.Greater(t, "b", "a") +// require.Greater(t, 2, 1) +// require.Greater(t, float64(2), float64(1)) +// require.Greater(t, "b", "a") func Greater(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -608,10 +608,10 @@ func Greater(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface // GreaterOrEqual asserts that the first element is greater than or equal to the second // -// assert.GreaterOrEqual(t, 2, 1) -// assert.GreaterOrEqual(t, 2, 2) -// assert.GreaterOrEqual(t, "b", "a") -// assert.GreaterOrEqual(t, "b", "b") +// require.GreaterOrEqual(t, 2, 1) +// require.GreaterOrEqual(t, 2, 2) +// require.GreaterOrEqual(t, "b", "a") +// require.GreaterOrEqual(t, "b", "b") func GreaterOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -624,10 +624,10 @@ func GreaterOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...in // GreaterOrEqualf asserts that the first element is greater than or equal to the second // -// assert.GreaterOrEqualf(t, 2, 1, "error message %s", "formatted") -// assert.GreaterOrEqualf(t, 2, 2, "error message %s", "formatted") -// assert.GreaterOrEqualf(t, "b", "a", "error message %s", "formatted") -// assert.GreaterOrEqualf(t, "b", "b", "error message %s", "formatted") +// require.GreaterOrEqualf(t, 2, 1, "error message %s", "formatted") +// require.GreaterOrEqualf(t, 2, 2, "error message %s", "formatted") +// require.GreaterOrEqualf(t, "b", "a", "error message %s", "formatted") +// require.GreaterOrEqualf(t, "b", "b", "error message %s", "formatted") func GreaterOrEqualf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -640,9 +640,9 @@ func GreaterOrEqualf(t TestingT, e1 interface{}, e2 interface{}, msg string, arg // Greaterf asserts that the first element is greater than the second // -// assert.Greaterf(t, 2, 1, "error message %s", "formatted") -// assert.Greaterf(t, float64(2), float64(1), "error message %s", "formatted") -// assert.Greaterf(t, "b", "a", "error message %s", "formatted") +// require.Greaterf(t, 2, 1, "error message %s", "formatted") +// require.Greaterf(t, float64(2), float64(1), "error message %s", "formatted") +// require.Greaterf(t, "b", "a", "error message %s", "formatted") func Greaterf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -656,7 +656,7 @@ func Greaterf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...in // HTTPBodyContains asserts that a specified handler returns a // body that contains a string. // -// assert.HTTPBodyContains(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky") +// require.HTTPBodyContains(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky") // // Returns whether the assertion was successful (true) or not (false). func HTTPBodyContains(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) { @@ -672,7 +672,7 @@ func HTTPBodyContains(t TestingT, handler http.HandlerFunc, method string, url s // HTTPBodyContainsf asserts that a specified handler returns a // body that contains a string. // -// assert.HTTPBodyContainsf(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") +// require.HTTPBodyContainsf(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") // // Returns whether the assertion was successful (true) or not (false). func HTTPBodyContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) { @@ -688,7 +688,7 @@ func HTTPBodyContainsf(t TestingT, handler http.HandlerFunc, method string, url // HTTPBodyNotContains asserts that a specified handler returns a // body that does not contain a string. // -// assert.HTTPBodyNotContains(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky") +// require.HTTPBodyNotContains(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky") // // Returns whether the assertion was successful (true) or not (false). func HTTPBodyNotContains(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) { @@ -704,7 +704,7 @@ func HTTPBodyNotContains(t TestingT, handler http.HandlerFunc, method string, ur // HTTPBodyNotContainsf asserts that a specified handler returns a // body that does not contain a string. // -// assert.HTTPBodyNotContainsf(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") +// require.HTTPBodyNotContainsf(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") // // Returns whether the assertion was successful (true) or not (false). func HTTPBodyNotContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) { @@ -719,7 +719,7 @@ func HTTPBodyNotContainsf(t TestingT, handler http.HandlerFunc, method string, u // HTTPError asserts that a specified handler returns an error status code. // -// assert.HTTPError(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// require.HTTPError(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} // // Returns whether the assertion was successful (true) or not (false). func HTTPError(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) { @@ -734,7 +734,7 @@ func HTTPError(t TestingT, handler http.HandlerFunc, method string, url string, // HTTPErrorf asserts that a specified handler returns an error status code. // -// assert.HTTPErrorf(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// require.HTTPErrorf(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} // // Returns whether the assertion was successful (true) or not (false). func HTTPErrorf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) { @@ -749,7 +749,7 @@ func HTTPErrorf(t TestingT, handler http.HandlerFunc, method string, url string, // HTTPRedirect asserts that a specified handler returns a redirect status code. // -// assert.HTTPRedirect(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// require.HTTPRedirect(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} // // Returns whether the assertion was successful (true) or not (false). func HTTPRedirect(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) { @@ -764,7 +764,7 @@ func HTTPRedirect(t TestingT, handler http.HandlerFunc, method string, url strin // HTTPRedirectf asserts that a specified handler returns a redirect status code. // -// assert.HTTPRedirectf(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// require.HTTPRedirectf(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} // // Returns whether the assertion was successful (true) or not (false). func HTTPRedirectf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) { @@ -779,7 +779,7 @@ func HTTPRedirectf(t TestingT, handler http.HandlerFunc, method string, url stri // HTTPStatusCode asserts that a specified handler returns a specified status code. // -// assert.HTTPStatusCode(t, myHandler, "GET", "/notImplemented", nil, 501) +// require.HTTPStatusCode(t, myHandler, "GET", "/notImplemented", nil, 501) // // Returns whether the assertion was successful (true) or not (false). func HTTPStatusCode(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, statuscode int, msgAndArgs ...interface{}) { @@ -794,7 +794,7 @@ func HTTPStatusCode(t TestingT, handler http.HandlerFunc, method string, url str // HTTPStatusCodef asserts that a specified handler returns a specified status code. // -// assert.HTTPStatusCodef(t, myHandler, "GET", "/notImplemented", nil, 501, "error message %s", "formatted") +// require.HTTPStatusCodef(t, myHandler, "GET", "/notImplemented", nil, 501, "error message %s", "formatted") // // Returns whether the assertion was successful (true) or not (false). func HTTPStatusCodef(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, statuscode int, msg string, args ...interface{}) { @@ -809,7 +809,7 @@ func HTTPStatusCodef(t TestingT, handler http.HandlerFunc, method string, url st // HTTPSuccess asserts that a specified handler returns a success status code. // -// assert.HTTPSuccess(t, myHandler, "POST", "http://www.google.com", nil) +// require.HTTPSuccess(t, myHandler, "POST", "http://www.google.com", nil) // // Returns whether the assertion was successful (true) or not (false). func HTTPSuccess(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) { @@ -824,7 +824,7 @@ func HTTPSuccess(t TestingT, handler http.HandlerFunc, method string, url string // HTTPSuccessf asserts that a specified handler returns a success status code. // -// assert.HTTPSuccessf(t, myHandler, "POST", "http://www.google.com", nil, "error message %s", "formatted") +// require.HTTPSuccessf(t, myHandler, "POST", "http://www.google.com", nil, "error message %s", "formatted") // // Returns whether the assertion was successful (true) or not (false). func HTTPSuccessf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) { @@ -839,7 +839,7 @@ func HTTPSuccessf(t TestingT, handler http.HandlerFunc, method string, url strin // Implements asserts that an object is implemented by the specified interface. // -// assert.Implements(t, (*MyInterface)(nil), new(MyObject)) +// require.Implements(t, (*MyInterface)(nil), new(MyObject)) func Implements(t TestingT, interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -852,7 +852,7 @@ func Implements(t TestingT, interfaceObject interface{}, object interface{}, msg // Implementsf asserts that an object is implemented by the specified interface. // -// assert.Implementsf(t, (*MyInterface)(nil), new(MyObject), "error message %s", "formatted") +// require.Implementsf(t, (*MyInterface)(nil), new(MyObject), "error message %s", "formatted") func Implementsf(t TestingT, interfaceObject interface{}, object interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -865,7 +865,7 @@ func Implementsf(t TestingT, interfaceObject interface{}, object interface{}, ms // InDelta asserts that the two numerals are within delta of each other. // -// assert.InDelta(t, math.Pi, 22/7.0, 0.01) +// require.InDelta(t, math.Pi, 22/7.0, 0.01) func InDelta(t TestingT, expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -922,7 +922,7 @@ func InDeltaSlicef(t TestingT, expected interface{}, actual interface{}, delta f // InDeltaf asserts that the two numerals are within delta of each other. // -// assert.InDeltaf(t, math.Pi, 22/7.0, 0.01, "error message %s", "formatted") +// require.InDeltaf(t, math.Pi, 22/7.0, 0.01, "error message %s", "formatted") func InDeltaf(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -979,9 +979,9 @@ func InEpsilonf(t TestingT, expected interface{}, actual interface{}, epsilon fl // IsDecreasing asserts that the collection is decreasing // -// assert.IsDecreasing(t, []int{2, 1, 0}) -// assert.IsDecreasing(t, []float{2, 1}) -// assert.IsDecreasing(t, []string{"b", "a"}) +// require.IsDecreasing(t, []int{2, 1, 0}) +// require.IsDecreasing(t, []float{2, 1}) +// require.IsDecreasing(t, []string{"b", "a"}) func IsDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -994,9 +994,9 @@ func IsDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) { // IsDecreasingf asserts that the collection is decreasing // -// assert.IsDecreasingf(t, []int{2, 1, 0}, "error message %s", "formatted") -// assert.IsDecreasingf(t, []float{2, 1}, "error message %s", "formatted") -// assert.IsDecreasingf(t, []string{"b", "a"}, "error message %s", "formatted") +// require.IsDecreasingf(t, []int{2, 1, 0}, "error message %s", "formatted") +// require.IsDecreasingf(t, []float{2, 1}, "error message %s", "formatted") +// require.IsDecreasingf(t, []string{"b", "a"}, "error message %s", "formatted") func IsDecreasingf(t TestingT, object interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1009,9 +1009,9 @@ func IsDecreasingf(t TestingT, object interface{}, msg string, args ...interface // IsIncreasing asserts that the collection is increasing // -// assert.IsIncreasing(t, []int{1, 2, 3}) -// assert.IsIncreasing(t, []float{1, 2}) -// assert.IsIncreasing(t, []string{"a", "b"}) +// require.IsIncreasing(t, []int{1, 2, 3}) +// require.IsIncreasing(t, []float{1, 2}) +// require.IsIncreasing(t, []string{"a", "b"}) func IsIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1024,9 +1024,9 @@ func IsIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) { // IsIncreasingf asserts that the collection is increasing // -// assert.IsIncreasingf(t, []int{1, 2, 3}, "error message %s", "formatted") -// assert.IsIncreasingf(t, []float{1, 2}, "error message %s", "formatted") -// assert.IsIncreasingf(t, []string{"a", "b"}, "error message %s", "formatted") +// require.IsIncreasingf(t, []int{1, 2, 3}, "error message %s", "formatted") +// require.IsIncreasingf(t, []float{1, 2}, "error message %s", "formatted") +// require.IsIncreasingf(t, []string{"a", "b"}, "error message %s", "formatted") func IsIncreasingf(t TestingT, object interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1039,9 +1039,9 @@ func IsIncreasingf(t TestingT, object interface{}, msg string, args ...interface // IsNonDecreasing asserts that the collection is not decreasing // -// assert.IsNonDecreasing(t, []int{1, 1, 2}) -// assert.IsNonDecreasing(t, []float{1, 2}) -// assert.IsNonDecreasing(t, []string{"a", "b"}) +// require.IsNonDecreasing(t, []int{1, 1, 2}) +// require.IsNonDecreasing(t, []float{1, 2}) +// require.IsNonDecreasing(t, []string{"a", "b"}) func IsNonDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1054,9 +1054,9 @@ func IsNonDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) // IsNonDecreasingf asserts that the collection is not decreasing // -// assert.IsNonDecreasingf(t, []int{1, 1, 2}, "error message %s", "formatted") -// assert.IsNonDecreasingf(t, []float{1, 2}, "error message %s", "formatted") -// assert.IsNonDecreasingf(t, []string{"a", "b"}, "error message %s", "formatted") +// require.IsNonDecreasingf(t, []int{1, 1, 2}, "error message %s", "formatted") +// require.IsNonDecreasingf(t, []float{1, 2}, "error message %s", "formatted") +// require.IsNonDecreasingf(t, []string{"a", "b"}, "error message %s", "formatted") func IsNonDecreasingf(t TestingT, object interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1069,9 +1069,9 @@ func IsNonDecreasingf(t TestingT, object interface{}, msg string, args ...interf // IsNonIncreasing asserts that the collection is not increasing // -// assert.IsNonIncreasing(t, []int{2, 1, 1}) -// assert.IsNonIncreasing(t, []float{2, 1}) -// assert.IsNonIncreasing(t, []string{"b", "a"}) +// require.IsNonIncreasing(t, []int{2, 1, 1}) +// require.IsNonIncreasing(t, []float{2, 1}) +// require.IsNonIncreasing(t, []string{"b", "a"}) func IsNonIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1084,9 +1084,9 @@ func IsNonIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) // IsNonIncreasingf asserts that the collection is not increasing // -// assert.IsNonIncreasingf(t, []int{2, 1, 1}, "error message %s", "formatted") -// assert.IsNonIncreasingf(t, []float{2, 1}, "error message %s", "formatted") -// assert.IsNonIncreasingf(t, []string{"b", "a"}, "error message %s", "formatted") +// require.IsNonIncreasingf(t, []int{2, 1, 1}, "error message %s", "formatted") +// require.IsNonIncreasingf(t, []float{2, 1}, "error message %s", "formatted") +// require.IsNonIncreasingf(t, []string{"b", "a"}, "error message %s", "formatted") func IsNonIncreasingf(t TestingT, object interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1121,7 +1121,7 @@ func IsTypef(t TestingT, expectedType interface{}, object interface{}, msg strin // JSONEq asserts that two JSON strings are equivalent. // -// assert.JSONEq(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`) +// require.JSONEq(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`) func JSONEq(t TestingT, expected string, actual string, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1134,7 +1134,7 @@ func JSONEq(t TestingT, expected string, actual string, msgAndArgs ...interface{ // JSONEqf asserts that two JSON strings are equivalent. // -// assert.JSONEqf(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`, "error message %s", "formatted") +// require.JSONEqf(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`, "error message %s", "formatted") func JSONEqf(t TestingT, expected string, actual string, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1148,7 +1148,7 @@ func JSONEqf(t TestingT, expected string, actual string, msg string, args ...int // Len asserts that the specified object has specific length. // Len also fails if the object has a type that len() not accept. // -// assert.Len(t, mySlice, 3) +// require.Len(t, mySlice, 3) func Len(t TestingT, object interface{}, length int, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1162,7 +1162,7 @@ func Len(t TestingT, object interface{}, length int, msgAndArgs ...interface{}) // Lenf asserts that the specified object has specific length. // Lenf also fails if the object has a type that len() not accept. // -// assert.Lenf(t, mySlice, 3, "error message %s", "formatted") +// require.Lenf(t, mySlice, 3, "error message %s", "formatted") func Lenf(t TestingT, object interface{}, length int, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1175,9 +1175,9 @@ func Lenf(t TestingT, object interface{}, length int, msg string, args ...interf // Less asserts that the first element is less than the second // -// assert.Less(t, 1, 2) -// assert.Less(t, float64(1), float64(2)) -// assert.Less(t, "a", "b") +// require.Less(t, 1, 2) +// require.Less(t, float64(1), float64(2)) +// require.Less(t, "a", "b") func Less(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1190,10 +1190,10 @@ func Less(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) // LessOrEqual asserts that the first element is less than or equal to the second // -// assert.LessOrEqual(t, 1, 2) -// assert.LessOrEqual(t, 2, 2) -// assert.LessOrEqual(t, "a", "b") -// assert.LessOrEqual(t, "b", "b") +// require.LessOrEqual(t, 1, 2) +// require.LessOrEqual(t, 2, 2) +// require.LessOrEqual(t, "a", "b") +// require.LessOrEqual(t, "b", "b") func LessOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1206,10 +1206,10 @@ func LessOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...inter // LessOrEqualf asserts that the first element is less than or equal to the second // -// assert.LessOrEqualf(t, 1, 2, "error message %s", "formatted") -// assert.LessOrEqualf(t, 2, 2, "error message %s", "formatted") -// assert.LessOrEqualf(t, "a", "b", "error message %s", "formatted") -// assert.LessOrEqualf(t, "b", "b", "error message %s", "formatted") +// require.LessOrEqualf(t, 1, 2, "error message %s", "formatted") +// require.LessOrEqualf(t, 2, 2, "error message %s", "formatted") +// require.LessOrEqualf(t, "a", "b", "error message %s", "formatted") +// require.LessOrEqualf(t, "b", "b", "error message %s", "formatted") func LessOrEqualf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1222,9 +1222,9 @@ func LessOrEqualf(t TestingT, e1 interface{}, e2 interface{}, msg string, args . // Lessf asserts that the first element is less than the second // -// assert.Lessf(t, 1, 2, "error message %s", "formatted") -// assert.Lessf(t, float64(1), float64(2), "error message %s", "formatted") -// assert.Lessf(t, "a", "b", "error message %s", "formatted") +// require.Lessf(t, 1, 2, "error message %s", "formatted") +// require.Lessf(t, float64(1), float64(2), "error message %s", "formatted") +// require.Lessf(t, "a", "b", "error message %s", "formatted") func Lessf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1237,8 +1237,8 @@ func Lessf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...inter // Negative asserts that the specified element is negative // -// assert.Negative(t, -1) -// assert.Negative(t, -1.23) +// require.Negative(t, -1) +// require.Negative(t, -1.23) func Negative(t TestingT, e interface{}, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1251,8 +1251,8 @@ func Negative(t TestingT, e interface{}, msgAndArgs ...interface{}) { // Negativef asserts that the specified element is negative // -// assert.Negativef(t, -1, "error message %s", "formatted") -// assert.Negativef(t, -1.23, "error message %s", "formatted") +// require.Negativef(t, -1, "error message %s", "formatted") +// require.Negativef(t, -1.23, "error message %s", "formatted") func Negativef(t TestingT, e interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1266,7 +1266,7 @@ func Negativef(t TestingT, e interface{}, msg string, args ...interface{}) { // Never asserts that the given condition doesn't satisfy in waitFor time, // periodically checking the target function each tick. // -// assert.Never(t, func() bool { return false; }, time.Second, 10*time.Millisecond) +// require.Never(t, func() bool { return false; }, time.Second, 10*time.Millisecond) func Never(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1280,7 +1280,7 @@ func Never(t TestingT, condition func() bool, waitFor time.Duration, tick time.D // Neverf asserts that the given condition doesn't satisfy in waitFor time, // periodically checking the target function each tick. // -// assert.Neverf(t, func() bool { return false; }, time.Second, 10*time.Millisecond, "error message %s", "formatted") +// require.Neverf(t, func() bool { return false; }, time.Second, 10*time.Millisecond, "error message %s", "formatted") func Neverf(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1293,7 +1293,7 @@ func Neverf(t TestingT, condition func() bool, waitFor time.Duration, tick time. // Nil asserts that the specified object is nil. // -// assert.Nil(t, err) +// require.Nil(t, err) func Nil(t TestingT, object interface{}, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1306,7 +1306,7 @@ func Nil(t TestingT, object interface{}, msgAndArgs ...interface{}) { // Nilf asserts that the specified object is nil. // -// assert.Nilf(t, err, "error message %s", "formatted") +// require.Nilf(t, err, "error message %s", "formatted") func Nilf(t TestingT, object interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1344,8 +1344,8 @@ func NoDirExistsf(t TestingT, path string, msg string, args ...interface{}) { // NoError asserts that a function returned no error (i.e. `nil`). // // actualObj, err := SomeFunction() -// if assert.NoError(t, err) { -// assert.Equal(t, expectedObj, actualObj) +// if require.NoError(t, err) { +// require.Equal(t, expectedObj, actualObj) // } func NoError(t TestingT, err error, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { @@ -1360,8 +1360,8 @@ func NoError(t TestingT, err error, msgAndArgs ...interface{}) { // NoErrorf asserts that a function returned no error (i.e. `nil`). // // actualObj, err := SomeFunction() -// if assert.NoErrorf(t, err, "error message %s", "formatted") { -// assert.Equal(t, expectedObj, actualObj) +// if require.NoErrorf(t, err, "error message %s", "formatted") { +// require.Equal(t, expectedObj, actualObj) // } func NoErrorf(t TestingT, err error, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { @@ -1400,9 +1400,9 @@ func NoFileExistsf(t TestingT, path string, msg string, args ...interface{}) { // NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the // specified substring or element. // -// assert.NotContains(t, "Hello World", "Earth") -// assert.NotContains(t, ["Hello", "World"], "Earth") -// assert.NotContains(t, {"Hello": "World"}, "Earth") +// require.NotContains(t, "Hello World", "Earth") +// require.NotContains(t, ["Hello", "World"], "Earth") +// require.NotContains(t, {"Hello": "World"}, "Earth") func NotContains(t TestingT, s interface{}, contains interface{}, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1416,9 +1416,9 @@ func NotContains(t TestingT, s interface{}, contains interface{}, msgAndArgs ... // NotContainsf asserts that the specified string, list(array, slice...) or map does NOT contain the // specified substring or element. // -// assert.NotContainsf(t, "Hello World", "Earth", "error message %s", "formatted") -// assert.NotContainsf(t, ["Hello", "World"], "Earth", "error message %s", "formatted") -// assert.NotContainsf(t, {"Hello": "World"}, "Earth", "error message %s", "formatted") +// require.NotContainsf(t, "Hello World", "Earth", "error message %s", "formatted") +// require.NotContainsf(t, ["Hello", "World"], "Earth", "error message %s", "formatted") +// require.NotContainsf(t, {"Hello": "World"}, "Earth", "error message %s", "formatted") func NotContainsf(t TestingT, s interface{}, contains interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1429,11 +1429,51 @@ func NotContainsf(t TestingT, s interface{}, contains interface{}, msg string, a t.FailNow() } +// NotElementsMatch asserts that the specified listA(array, slice...) is NOT equal to specified +// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements, +// the number of appearances of each of them in both lists should not match. +// This is an inverse of ElementsMatch. +// +// require.NotElementsMatch(t, [1, 1, 2, 3], [1, 1, 2, 3]) -> false +// +// require.NotElementsMatch(t, [1, 1, 2, 3], [1, 2, 3]) -> true +// +// require.NotElementsMatch(t, [1, 2, 3], [1, 2, 4]) -> true +func NotElementsMatch(t TestingT, listA interface{}, listB interface{}, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.NotElementsMatch(t, listA, listB, msgAndArgs...) { + return + } + t.FailNow() +} + +// NotElementsMatchf asserts that the specified listA(array, slice...) is NOT equal to specified +// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements, +// the number of appearances of each of them in both lists should not match. +// This is an inverse of ElementsMatch. +// +// require.NotElementsMatchf(t, [1, 1, 2, 3], [1, 1, 2, 3], "error message %s", "formatted") -> false +// +// require.NotElementsMatchf(t, [1, 1, 2, 3], [1, 2, 3], "error message %s", "formatted") -> true +// +// require.NotElementsMatchf(t, [1, 2, 3], [1, 2, 4], "error message %s", "formatted") -> true +func NotElementsMatchf(t TestingT, listA interface{}, listB interface{}, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.NotElementsMatchf(t, listA, listB, msg, args...) { + return + } + t.FailNow() +} + // NotEmpty asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either // a slice or a channel with len == 0. // -// if assert.NotEmpty(t, obj) { -// assert.Equal(t, "two", obj[1]) +// if require.NotEmpty(t, obj) { +// require.Equal(t, "two", obj[1]) // } func NotEmpty(t TestingT, object interface{}, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { @@ -1448,8 +1488,8 @@ func NotEmpty(t TestingT, object interface{}, msgAndArgs ...interface{}) { // NotEmptyf asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either // a slice or a channel with len == 0. // -// if assert.NotEmptyf(t, obj, "error message %s", "formatted") { -// assert.Equal(t, "two", obj[1]) +// if require.NotEmptyf(t, obj, "error message %s", "formatted") { +// require.Equal(t, "two", obj[1]) // } func NotEmptyf(t TestingT, object interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { @@ -1463,7 +1503,7 @@ func NotEmptyf(t TestingT, object interface{}, msg string, args ...interface{}) // NotEqual asserts that the specified values are NOT equal. // -// assert.NotEqual(t, obj1, obj2) +// require.NotEqual(t, obj1, obj2) // // Pointer variable equality is determined based on the equality of the // referenced values (as opposed to the memory addresses). @@ -1479,7 +1519,7 @@ func NotEqual(t TestingT, expected interface{}, actual interface{}, msgAndArgs . // NotEqualValues asserts that two objects are not equal even when converted to the same type // -// assert.NotEqualValues(t, obj1, obj2) +// require.NotEqualValues(t, obj1, obj2) func NotEqualValues(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1492,7 +1532,7 @@ func NotEqualValues(t TestingT, expected interface{}, actual interface{}, msgAnd // NotEqualValuesf asserts that two objects are not equal even when converted to the same type // -// assert.NotEqualValuesf(t, obj1, obj2, "error message %s", "formatted") +// require.NotEqualValuesf(t, obj1, obj2, "error message %s", "formatted") func NotEqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1505,7 +1545,7 @@ func NotEqualValuesf(t TestingT, expected interface{}, actual interface{}, msg s // NotEqualf asserts that the specified values are NOT equal. // -// assert.NotEqualf(t, obj1, obj2, "error message %s", "formatted") +// require.NotEqualf(t, obj1, obj2, "error message %s", "formatted") // // Pointer variable equality is determined based on the equality of the // referenced values (as opposed to the memory addresses). @@ -1519,7 +1559,31 @@ func NotEqualf(t TestingT, expected interface{}, actual interface{}, msg string, t.FailNow() } -// NotErrorIs asserts that at none of the errors in err's chain matches target. +// NotErrorAs asserts that none of the errors in err's chain matches target, +// but if so, sets target to that error value. +func NotErrorAs(t TestingT, err error, target interface{}, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.NotErrorAs(t, err, target, msgAndArgs...) { + return + } + t.FailNow() +} + +// NotErrorAsf asserts that none of the errors in err's chain matches target, +// but if so, sets target to that error value. +func NotErrorAsf(t TestingT, err error, target interface{}, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.NotErrorAsf(t, err, target, msg, args...) { + return + } + t.FailNow() +} + +// NotErrorIs asserts that none of the errors in err's chain matches target. // This is a wrapper for errors.Is. func NotErrorIs(t TestingT, err error, target error, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { @@ -1531,7 +1595,7 @@ func NotErrorIs(t TestingT, err error, target error, msgAndArgs ...interface{}) t.FailNow() } -// NotErrorIsf asserts that at none of the errors in err's chain matches target. +// NotErrorIsf asserts that none of the errors in err's chain matches target. // This is a wrapper for errors.Is. func NotErrorIsf(t TestingT, err error, target error, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { @@ -1545,7 +1609,7 @@ func NotErrorIsf(t TestingT, err error, target error, msg string, args ...interf // NotImplements asserts that an object does not implement the specified interface. // -// assert.NotImplements(t, (*MyInterface)(nil), new(MyObject)) +// require.NotImplements(t, (*MyInterface)(nil), new(MyObject)) func NotImplements(t TestingT, interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1558,7 +1622,7 @@ func NotImplements(t TestingT, interfaceObject interface{}, object interface{}, // NotImplementsf asserts that an object does not implement the specified interface. // -// assert.NotImplementsf(t, (*MyInterface)(nil), new(MyObject), "error message %s", "formatted") +// require.NotImplementsf(t, (*MyInterface)(nil), new(MyObject), "error message %s", "formatted") func NotImplementsf(t TestingT, interfaceObject interface{}, object interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1571,7 +1635,7 @@ func NotImplementsf(t TestingT, interfaceObject interface{}, object interface{}, // NotNil asserts that the specified object is not nil. // -// assert.NotNil(t, err) +// require.NotNil(t, err) func NotNil(t TestingT, object interface{}, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1584,7 +1648,7 @@ func NotNil(t TestingT, object interface{}, msgAndArgs ...interface{}) { // NotNilf asserts that the specified object is not nil. // -// assert.NotNilf(t, err, "error message %s", "formatted") +// require.NotNilf(t, err, "error message %s", "formatted") func NotNilf(t TestingT, object interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1597,7 +1661,7 @@ func NotNilf(t TestingT, object interface{}, msg string, args ...interface{}) { // NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic. // -// assert.NotPanics(t, func(){ RemainCalm() }) +// require.NotPanics(t, func(){ RemainCalm() }) func NotPanics(t TestingT, f assert.PanicTestFunc, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1610,7 +1674,7 @@ func NotPanics(t TestingT, f assert.PanicTestFunc, msgAndArgs ...interface{}) { // NotPanicsf asserts that the code inside the specified PanicTestFunc does NOT panic. // -// assert.NotPanicsf(t, func(){ RemainCalm() }, "error message %s", "formatted") +// require.NotPanicsf(t, func(){ RemainCalm() }, "error message %s", "formatted") func NotPanicsf(t TestingT, f assert.PanicTestFunc, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1623,8 +1687,8 @@ func NotPanicsf(t TestingT, f assert.PanicTestFunc, msg string, args ...interfac // NotRegexp asserts that a specified regexp does not match a string. // -// assert.NotRegexp(t, regexp.MustCompile("starts"), "it's starting") -// assert.NotRegexp(t, "^start", "it's not starting") +// require.NotRegexp(t, regexp.MustCompile("starts"), "it's starting") +// require.NotRegexp(t, "^start", "it's not starting") func NotRegexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1637,8 +1701,8 @@ func NotRegexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interf // NotRegexpf asserts that a specified regexp does not match a string. // -// assert.NotRegexpf(t, regexp.MustCompile("starts"), "it's starting", "error message %s", "formatted") -// assert.NotRegexpf(t, "^start", "it's not starting", "error message %s", "formatted") +// require.NotRegexpf(t, regexp.MustCompile("starts"), "it's starting", "error message %s", "formatted") +// require.NotRegexpf(t, "^start", "it's not starting", "error message %s", "formatted") func NotRegexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1651,7 +1715,7 @@ func NotRegexpf(t TestingT, rx interface{}, str interface{}, msg string, args .. // NotSame asserts that two pointers do not reference the same object. // -// assert.NotSame(t, ptr1, ptr2) +// require.NotSame(t, ptr1, ptr2) // // Both arguments must be pointer variables. Pointer variable sameness is // determined based on the equality of both type and value. @@ -1667,7 +1731,7 @@ func NotSame(t TestingT, expected interface{}, actual interface{}, msgAndArgs .. // NotSamef asserts that two pointers do not reference the same object. // -// assert.NotSamef(t, ptr1, ptr2, "error message %s", "formatted") +// require.NotSamef(t, ptr1, ptr2, "error message %s", "formatted") // // Both arguments must be pointer variables. Pointer variable sameness is // determined based on the equality of both type and value. @@ -1685,8 +1749,8 @@ func NotSamef(t TestingT, expected interface{}, actual interface{}, msg string, // contain all elements given in the specified subset list(array, slice...) or // map. // -// assert.NotSubset(t, [1, 3, 4], [1, 2]) -// assert.NotSubset(t, {"x": 1, "y": 2}, {"z": 3}) +// require.NotSubset(t, [1, 3, 4], [1, 2]) +// require.NotSubset(t, {"x": 1, "y": 2}, {"z": 3}) func NotSubset(t TestingT, list interface{}, subset interface{}, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1701,8 +1765,8 @@ func NotSubset(t TestingT, list interface{}, subset interface{}, msgAndArgs ...i // contain all elements given in the specified subset list(array, slice...) or // map. // -// assert.NotSubsetf(t, [1, 3, 4], [1, 2], "error message %s", "formatted") -// assert.NotSubsetf(t, {"x": 1, "y": 2}, {"z": 3}, "error message %s", "formatted") +// require.NotSubsetf(t, [1, 3, 4], [1, 2], "error message %s", "formatted") +// require.NotSubsetf(t, {"x": 1, "y": 2}, {"z": 3}, "error message %s", "formatted") func NotSubsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1737,7 +1801,7 @@ func NotZerof(t TestingT, i interface{}, msg string, args ...interface{}) { // Panics asserts that the code inside the specified PanicTestFunc panics. // -// assert.Panics(t, func(){ GoCrazy() }) +// require.Panics(t, func(){ GoCrazy() }) func Panics(t TestingT, f assert.PanicTestFunc, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1752,7 +1816,7 @@ func Panics(t TestingT, f assert.PanicTestFunc, msgAndArgs ...interface{}) { // panics, and that the recovered panic value is an error that satisfies the // EqualError comparison. // -// assert.PanicsWithError(t, "crazy error", func(){ GoCrazy() }) +// require.PanicsWithError(t, "crazy error", func(){ GoCrazy() }) func PanicsWithError(t TestingT, errString string, f assert.PanicTestFunc, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1767,7 +1831,7 @@ func PanicsWithError(t TestingT, errString string, f assert.PanicTestFunc, msgAn // panics, and that the recovered panic value is an error that satisfies the // EqualError comparison. // -// assert.PanicsWithErrorf(t, "crazy error", func(){ GoCrazy() }, "error message %s", "formatted") +// require.PanicsWithErrorf(t, "crazy error", func(){ GoCrazy() }, "error message %s", "formatted") func PanicsWithErrorf(t TestingT, errString string, f assert.PanicTestFunc, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1781,7 +1845,7 @@ func PanicsWithErrorf(t TestingT, errString string, f assert.PanicTestFunc, msg // PanicsWithValue asserts that the code inside the specified PanicTestFunc panics, and that // the recovered panic value equals the expected panic value. // -// assert.PanicsWithValue(t, "crazy error", func(){ GoCrazy() }) +// require.PanicsWithValue(t, "crazy error", func(){ GoCrazy() }) func PanicsWithValue(t TestingT, expected interface{}, f assert.PanicTestFunc, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1795,7 +1859,7 @@ func PanicsWithValue(t TestingT, expected interface{}, f assert.PanicTestFunc, m // PanicsWithValuef asserts that the code inside the specified PanicTestFunc panics, and that // the recovered panic value equals the expected panic value. // -// assert.PanicsWithValuef(t, "crazy error", func(){ GoCrazy() }, "error message %s", "formatted") +// require.PanicsWithValuef(t, "crazy error", func(){ GoCrazy() }, "error message %s", "formatted") func PanicsWithValuef(t TestingT, expected interface{}, f assert.PanicTestFunc, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1808,7 +1872,7 @@ func PanicsWithValuef(t TestingT, expected interface{}, f assert.PanicTestFunc, // Panicsf asserts that the code inside the specified PanicTestFunc panics. // -// assert.Panicsf(t, func(){ GoCrazy() }, "error message %s", "formatted") +// require.Panicsf(t, func(){ GoCrazy() }, "error message %s", "formatted") func Panicsf(t TestingT, f assert.PanicTestFunc, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1821,8 +1885,8 @@ func Panicsf(t TestingT, f assert.PanicTestFunc, msg string, args ...interface{} // Positive asserts that the specified element is positive // -// assert.Positive(t, 1) -// assert.Positive(t, 1.23) +// require.Positive(t, 1) +// require.Positive(t, 1.23) func Positive(t TestingT, e interface{}, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1835,8 +1899,8 @@ func Positive(t TestingT, e interface{}, msgAndArgs ...interface{}) { // Positivef asserts that the specified element is positive // -// assert.Positivef(t, 1, "error message %s", "formatted") -// assert.Positivef(t, 1.23, "error message %s", "formatted") +// require.Positivef(t, 1, "error message %s", "formatted") +// require.Positivef(t, 1.23, "error message %s", "formatted") func Positivef(t TestingT, e interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1849,8 +1913,8 @@ func Positivef(t TestingT, e interface{}, msg string, args ...interface{}) { // Regexp asserts that a specified regexp matches a string. // -// assert.Regexp(t, regexp.MustCompile("start"), "it's starting") -// assert.Regexp(t, "start...$", "it's not starting") +// require.Regexp(t, regexp.MustCompile("start"), "it's starting") +// require.Regexp(t, "start...$", "it's not starting") func Regexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1863,8 +1927,8 @@ func Regexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface // Regexpf asserts that a specified regexp matches a string. // -// assert.Regexpf(t, regexp.MustCompile("start"), "it's starting", "error message %s", "formatted") -// assert.Regexpf(t, "start...$", "it's not starting", "error message %s", "formatted") +// require.Regexpf(t, regexp.MustCompile("start"), "it's starting", "error message %s", "formatted") +// require.Regexpf(t, "start...$", "it's not starting", "error message %s", "formatted") func Regexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1877,7 +1941,7 @@ func Regexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...in // Same asserts that two pointers reference the same object. // -// assert.Same(t, ptr1, ptr2) +// require.Same(t, ptr1, ptr2) // // Both arguments must be pointer variables. Pointer variable sameness is // determined based on the equality of both type and value. @@ -1893,7 +1957,7 @@ func Same(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...in // Samef asserts that two pointers reference the same object. // -// assert.Samef(t, ptr1, ptr2, "error message %s", "formatted") +// require.Samef(t, ptr1, ptr2, "error message %s", "formatted") // // Both arguments must be pointer variables. Pointer variable sameness is // determined based on the equality of both type and value. @@ -1910,8 +1974,8 @@ func Samef(t TestingT, expected interface{}, actual interface{}, msg string, arg // Subset asserts that the specified list(array, slice...) or map contains all // elements given in the specified subset list(array, slice...) or map. // -// assert.Subset(t, [1, 2, 3], [1, 2]) -// assert.Subset(t, {"x": 1, "y": 2}, {"x": 1}) +// require.Subset(t, [1, 2, 3], [1, 2]) +// require.Subset(t, {"x": 1, "y": 2}, {"x": 1}) func Subset(t TestingT, list interface{}, subset interface{}, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1925,8 +1989,8 @@ func Subset(t TestingT, list interface{}, subset interface{}, msgAndArgs ...inte // Subsetf asserts that the specified list(array, slice...) or map contains all // elements given in the specified subset list(array, slice...) or map. // -// assert.Subsetf(t, [1, 2, 3], [1, 2], "error message %s", "formatted") -// assert.Subsetf(t, {"x": 1, "y": 2}, {"x": 1}, "error message %s", "formatted") +// require.Subsetf(t, [1, 2, 3], [1, 2], "error message %s", "formatted") +// require.Subsetf(t, {"x": 1, "y": 2}, {"x": 1}, "error message %s", "formatted") func Subsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1939,7 +2003,7 @@ func Subsetf(t TestingT, list interface{}, subset interface{}, msg string, args // True asserts that the specified value is true. // -// assert.True(t, myBool) +// require.True(t, myBool) func True(t TestingT, value bool, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1952,7 +2016,7 @@ func True(t TestingT, value bool, msgAndArgs ...interface{}) { // Truef asserts that the specified value is true. // -// assert.Truef(t, myBool, "error message %s", "formatted") +// require.Truef(t, myBool, "error message %s", "formatted") func Truef(t TestingT, value bool, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1965,7 +2029,7 @@ func Truef(t TestingT, value bool, msg string, args ...interface{}) { // WithinDuration asserts that the two times are within duration delta of each other. // -// assert.WithinDuration(t, time.Now(), time.Now(), 10*time.Second) +// require.WithinDuration(t, time.Now(), time.Now(), 10*time.Second) func WithinDuration(t TestingT, expected time.Time, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1978,7 +2042,7 @@ func WithinDuration(t TestingT, expected time.Time, actual time.Time, delta time // WithinDurationf asserts that the two times are within duration delta of each other. // -// assert.WithinDurationf(t, time.Now(), time.Now(), 10*time.Second, "error message %s", "formatted") +// require.WithinDurationf(t, time.Now(), time.Now(), 10*time.Second, "error message %s", "formatted") func WithinDurationf(t TestingT, expected time.Time, actual time.Time, delta time.Duration, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1991,7 +2055,7 @@ func WithinDurationf(t TestingT, expected time.Time, actual time.Time, delta tim // WithinRange asserts that a time is within a time range (inclusive). // -// assert.WithinRange(t, time.Now(), time.Now().Add(-time.Second), time.Now().Add(time.Second)) +// require.WithinRange(t, time.Now(), time.Now().Add(-time.Second), time.Now().Add(time.Second)) func WithinRange(t TestingT, actual time.Time, start time.Time, end time.Time, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -2004,7 +2068,7 @@ func WithinRange(t TestingT, actual time.Time, start time.Time, end time.Time, m // WithinRangef asserts that a time is within a time range (inclusive). // -// assert.WithinRangef(t, time.Now(), time.Now().Add(-time.Second), time.Now().Add(time.Second), "error message %s", "formatted") +// require.WithinRangef(t, time.Now(), time.Now().Add(-time.Second), time.Now().Add(time.Second), "error message %s", "formatted") func WithinRangef(t TestingT, actual time.Time, start time.Time, end time.Time, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() diff --git a/sdk/vendor/github.com/stretchr/testify/require/require.go.tmpl b/sdk/vendor/github.com/stretchr/testify/require/require.go.tmpl index 55e42ddebd..8b32836850 100644 --- a/sdk/vendor/github.com/stretchr/testify/require/require.go.tmpl +++ b/sdk/vendor/github.com/stretchr/testify/require/require.go.tmpl @@ -1,4 +1,4 @@ -{{.Comment}} +{{ replace .Comment "assert." "require."}} func {{.DocInfo.Name}}(t TestingT, {{.Params}}) { if h, ok := t.(tHelper); ok { h.Helper() } if assert.{{.DocInfo.Name}}(t, {{.ForwardedParams}}) { return } diff --git a/sdk/vendor/github.com/stretchr/testify/require/require_forward.go b/sdk/vendor/github.com/stretchr/testify/require/require_forward.go index eee8310a5f..1bd87304f4 100644 --- a/sdk/vendor/github.com/stretchr/testify/require/require_forward.go +++ b/sdk/vendor/github.com/stretchr/testify/require/require_forward.go @@ -187,8 +187,8 @@ func (a *Assertions) EqualExportedValuesf(expected interface{}, actual interface EqualExportedValuesf(a.t, expected, actual, msg, args...) } -// EqualValues asserts that two objects are equal or convertible to the same types -// and equal. +// EqualValues asserts that two objects are equal or convertible to the larger +// type and equal. // // a.EqualValues(uint32(123), int32(123)) func (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) { @@ -198,8 +198,8 @@ func (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAn EqualValues(a.t, expected, actual, msgAndArgs...) } -// EqualValuesf asserts that two objects are equal or convertible to the same types -// and equal. +// EqualValuesf asserts that two objects are equal or convertible to the larger +// type and equal. // // a.EqualValuesf(uint32(123), int32(123), "error message %s", "formatted") func (a *Assertions) EqualValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) { @@ -337,7 +337,7 @@ func (a *Assertions) Eventually(condition func() bool, waitFor time.Duration, ti // a.EventuallyWithT(func(c *assert.CollectT) { // // add assertions as needed; any assertion failure will fail the current tick // assert.True(c, externalValue, "expected 'externalValue' to be true") -// }, 1*time.Second, 10*time.Second, "external state has not changed to 'true'; still false") +// }, 10*time.Second, 1*time.Second, "external state has not changed to 'true'; still false") func (a *Assertions) EventuallyWithT(condition func(collect *assert.CollectT), waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -362,7 +362,7 @@ func (a *Assertions) EventuallyWithT(condition func(collect *assert.CollectT), w // a.EventuallyWithTf(func(c *assert.CollectT, "error message %s", "formatted") { // // add assertions as needed; any assertion failure will fail the current tick // assert.True(c, externalValue, "expected 'externalValue' to be true") -// }, 1*time.Second, 10*time.Second, "external state has not changed to 'true'; still false") +// }, 10*time.Second, 1*time.Second, "external state has not changed to 'true'; still false") func (a *Assertions) EventuallyWithTf(condition func(collect *assert.CollectT), waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1129,6 +1129,40 @@ func (a *Assertions) NotContainsf(s interface{}, contains interface{}, msg strin NotContainsf(a.t, s, contains, msg, args...) } +// NotElementsMatch asserts that the specified listA(array, slice...) is NOT equal to specified +// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements, +// the number of appearances of each of them in both lists should not match. +// This is an inverse of ElementsMatch. +// +// a.NotElementsMatch([1, 1, 2, 3], [1, 1, 2, 3]) -> false +// +// a.NotElementsMatch([1, 1, 2, 3], [1, 2, 3]) -> true +// +// a.NotElementsMatch([1, 2, 3], [1, 2, 4]) -> true +func (a *Assertions) NotElementsMatch(listA interface{}, listB interface{}, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + NotElementsMatch(a.t, listA, listB, msgAndArgs...) +} + +// NotElementsMatchf asserts that the specified listA(array, slice...) is NOT equal to specified +// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements, +// the number of appearances of each of them in both lists should not match. +// This is an inverse of ElementsMatch. +// +// a.NotElementsMatchf([1, 1, 2, 3], [1, 1, 2, 3], "error message %s", "formatted") -> false +// +// a.NotElementsMatchf([1, 1, 2, 3], [1, 2, 3], "error message %s", "formatted") -> true +// +// a.NotElementsMatchf([1, 2, 3], [1, 2, 4], "error message %s", "formatted") -> true +func (a *Assertions) NotElementsMatchf(listA interface{}, listB interface{}, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + NotElementsMatchf(a.t, listA, listB, msg, args...) +} + // NotEmpty asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either // a slice or a channel with len == 0. // @@ -1201,7 +1235,25 @@ func (a *Assertions) NotEqualf(expected interface{}, actual interface{}, msg str NotEqualf(a.t, expected, actual, msg, args...) } -// NotErrorIs asserts that at none of the errors in err's chain matches target. +// NotErrorAs asserts that none of the errors in err's chain matches target, +// but if so, sets target to that error value. +func (a *Assertions) NotErrorAs(err error, target interface{}, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + NotErrorAs(a.t, err, target, msgAndArgs...) +} + +// NotErrorAsf asserts that none of the errors in err's chain matches target, +// but if so, sets target to that error value. +func (a *Assertions) NotErrorAsf(err error, target interface{}, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + NotErrorAsf(a.t, err, target, msg, args...) +} + +// NotErrorIs asserts that none of the errors in err's chain matches target. // This is a wrapper for errors.Is. func (a *Assertions) NotErrorIs(err error, target error, msgAndArgs ...interface{}) { if h, ok := a.t.(tHelper); ok { @@ -1210,7 +1262,7 @@ func (a *Assertions) NotErrorIs(err error, target error, msgAndArgs ...interface NotErrorIs(a.t, err, target, msgAndArgs...) } -// NotErrorIsf asserts that at none of the errors in err's chain matches target. +// NotErrorIsf asserts that none of the errors in err's chain matches target. // This is a wrapper for errors.Is. func (a *Assertions) NotErrorIsf(err error, target error, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { diff --git a/sdk/vendor/github.com/stretchr/testify/require/requirements.go b/sdk/vendor/github.com/stretchr/testify/require/requirements.go index 91772dfeb9..6b7ce929eb 100644 --- a/sdk/vendor/github.com/stretchr/testify/require/requirements.go +++ b/sdk/vendor/github.com/stretchr/testify/require/requirements.go @@ -6,7 +6,7 @@ type TestingT interface { FailNow() } -type tHelper interface { +type tHelper = interface { Helper() } diff --git a/sdk/vendor/golang.org/x/net/http2/config.go b/sdk/vendor/golang.org/x/net/http2/config.go index de58dfb8dc..ca645d9a1a 100644 --- a/sdk/vendor/golang.org/x/net/http2/config.go +++ b/sdk/vendor/golang.org/x/net/http2/config.go @@ -60,7 +60,7 @@ func configFromServer(h1 *http.Server, h2 *Server) http2Config { return conf } -// configFromServer merges configuration settings from h2 and h2.t1.HTTP2 +// configFromTransport merges configuration settings from h2 and h2.t1.HTTP2 // (the net/http Transport). func configFromTransport(h2 *Transport) http2Config { conf := http2Config{ diff --git a/sdk/vendor/golang.org/x/net/http2/config_go124.go b/sdk/vendor/golang.org/x/net/http2/config_go124.go index e3784123c8..5b516c55ff 100644 --- a/sdk/vendor/golang.org/x/net/http2/config_go124.go +++ b/sdk/vendor/golang.org/x/net/http2/config_go124.go @@ -13,7 +13,7 @@ func fillNetHTTPServerConfig(conf *http2Config, srv *http.Server) { fillNetHTTPConfig(conf, srv.HTTP2) } -// fillNetHTTPServerConfig sets fields in conf from tr.HTTP2. +// fillNetHTTPTransportConfig sets fields in conf from tr.HTTP2. func fillNetHTTPTransportConfig(conf *http2Config, tr *http.Transport) { fillNetHTTPConfig(conf, tr.HTTP2) } diff --git a/sdk/vendor/golang.org/x/net/http2/transport.go b/sdk/vendor/golang.org/x/net/http2/transport.go index 090d0e1bdb..b2e2ed3373 100644 --- a/sdk/vendor/golang.org/x/net/http2/transport.go +++ b/sdk/vendor/golang.org/x/net/http2/transport.go @@ -375,6 +375,7 @@ type ClientConn struct { doNotReuse bool // whether conn is marked to not be reused for any future requests closing bool closed bool + closedOnIdle bool // true if conn was closed for idleness seenSettings bool // true if we've seen a settings frame, false otherwise seenSettingsChan chan struct{} // closed when seenSettings is true or frame reading fails wantSettingsAck bool // we sent a SETTINGS frame and haven't heard back @@ -1089,10 +1090,12 @@ func (cc *ClientConn) idleStateLocked() (st clientConnIdleState) { // If this connection has never been used for a request and is closed, // then let it take a request (which will fail). + // If the conn was closed for idleness, we're racing the idle timer; + // don't try to use the conn. (Issue #70515.) // // This avoids a situation where an error early in a connection's lifetime // goes unreported. - if cc.nextStreamID == 1 && cc.streamsReserved == 0 && cc.closed { + if cc.nextStreamID == 1 && cc.streamsReserved == 0 && cc.closed && !cc.closedOnIdle { st.canTakeNewRequest = true } @@ -1155,6 +1158,7 @@ func (cc *ClientConn) closeIfIdle() { return } cc.closed = true + cc.closedOnIdle = true nextID := cc.nextStreamID // TODO: do clients send GOAWAY too? maybe? Just Close: cc.mu.Unlock() @@ -2434,9 +2438,12 @@ func (rl *clientConnReadLoop) cleanup() { // This avoids a situation where new connections are constantly created, // added to the pool, fail, and are removed from the pool, without any error // being surfaced to the user. - const unusedWaitTime = 5 * time.Second + unusedWaitTime := 5 * time.Second + if cc.idleTimeout > 0 && unusedWaitTime > cc.idleTimeout { + unusedWaitTime = cc.idleTimeout + } idleTime := cc.t.now().Sub(cc.lastActive) - if atomic.LoadUint32(&cc.atomicReused) == 0 && idleTime < unusedWaitTime { + if atomic.LoadUint32(&cc.atomicReused) == 0 && idleTime < unusedWaitTime && !cc.closedOnIdle { cc.idleTimer = cc.t.afterFunc(unusedWaitTime-idleTime, func() { cc.t.connPool().MarkDead(cc) }) diff --git a/sdk/vendor/golang.org/x/sys/unix/syscall_dragonfly.go b/sdk/vendor/golang.org/x/sys/unix/syscall_dragonfly.go index 97cb916f2c..be8c002070 100644 --- a/sdk/vendor/golang.org/x/sys/unix/syscall_dragonfly.go +++ b/sdk/vendor/golang.org/x/sys/unix/syscall_dragonfly.go @@ -246,6 +246,18 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e return sendfile(outfd, infd, offset, count) } +func Dup3(oldfd, newfd, flags int) error { + if oldfd == newfd || flags&^O_CLOEXEC != 0 { + return EINVAL + } + how := F_DUP2FD + if flags&O_CLOEXEC != 0 { + how = F_DUP2FD_CLOEXEC + } + _, err := fcntl(oldfd, how, newfd) + return err +} + /* * Exposed directly */ diff --git a/sdk/vendor/golang.org/x/sys/windows/dll_windows.go b/sdk/vendor/golang.org/x/sys/windows/dll_windows.go index 4e613cf633..3ca814f54d 100644 --- a/sdk/vendor/golang.org/x/sys/windows/dll_windows.go +++ b/sdk/vendor/golang.org/x/sys/windows/dll_windows.go @@ -43,8 +43,8 @@ type DLL struct { // LoadDLL loads DLL file into memory. // // Warning: using LoadDLL without an absolute path name is subject to -// DLL preloading attacks. To safely load a system DLL, use LazyDLL -// with System set to true, or use LoadLibraryEx directly. +// DLL preloading attacks. To safely load a system DLL, use [NewLazySystemDLL], +// or use [LoadLibraryEx] directly. func LoadDLL(name string) (dll *DLL, err error) { namep, err := UTF16PtrFromString(name) if err != nil { @@ -271,6 +271,9 @@ func (d *LazyDLL) NewProc(name string) *LazyProc { } // NewLazyDLL creates new LazyDLL associated with DLL file. +// +// Warning: using NewLazyDLL without an absolute path name is subject to +// DLL preloading attacks. To safely load a system DLL, use [NewLazySystemDLL]. func NewLazyDLL(name string) *LazyDLL { return &LazyDLL{Name: name} } @@ -410,7 +413,3 @@ func loadLibraryEx(name string, system bool) (*DLL, error) { } return &DLL{Name: name, Handle: h}, nil } - -type errString string - -func (s errString) Error() string { return string(s) } diff --git a/sdk/vendor/golang.org/x/tools/cmd/goimports/doc.go b/sdk/vendor/golang.org/x/tools/cmd/goimports/doc.go deleted file mode 100644 index 18a3ad448e..0000000000 --- a/sdk/vendor/golang.org/x/tools/cmd/goimports/doc.go +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright 2013 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. - -/* -Command goimports updates your Go import lines, -adding missing ones and removing unreferenced ones. - - $ go install golang.org/x/tools/cmd/goimports@latest - -In addition to fixing imports, goimports also formats -your code in the same style as gofmt so it can be used -as a replacement for your editor's gofmt-on-save hook. - -For emacs, make sure you have the latest go-mode.el: - - https://github.com/dominikh/go-mode.el - -Then in your .emacs file: - - (setq gofmt-command "goimports") - (add-hook 'before-save-hook 'gofmt-before-save) - -For vim, set "gofmt_command" to "goimports": - - https://golang.org/change/39c724dd7f252 - https://golang.org/wiki/IDEsAndTextEditorPlugins - etc - -For GoSublime, follow the steps described here: - - http://michaelwhatcott.com/gosublime-goimports/ - -For other editors, you probably know what to do. - -To exclude directories in your $GOPATH from being scanned for Go -files, goimports respects a configuration file at -$GOPATH/src/.goimportsignore which may contain blank lines, comment -lines (beginning with '#'), or lines naming a directory relative to -the configuration file to ignore when scanning. No globbing or regex -patterns are allowed. Use the "-v" verbose flag to verify it's -working and see what goimports is doing. - -File bugs or feature requests at: - - https://golang.org/issues/new?title=x/tools/cmd/goimports:+ - -Happy hacking! -*/ -package main // import "golang.org/x/tools/cmd/goimports" diff --git a/sdk/vendor/golang.org/x/tools/cmd/goimports/goimports.go b/sdk/vendor/golang.org/x/tools/cmd/goimports/goimports.go deleted file mode 100644 index dcb5023a2e..0000000000 --- a/sdk/vendor/golang.org/x/tools/cmd/goimports/goimports.go +++ /dev/null @@ -1,379 +0,0 @@ -// Copyright 2013 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 ( - "bufio" - "bytes" - "errors" - "flag" - "fmt" - "go/scanner" - "io" - "log" - "os" - "os/exec" - "path/filepath" - "runtime" - "runtime/pprof" - "strings" - - "golang.org/x/tools/internal/gocommand" - "golang.org/x/tools/internal/imports" -) - -var ( - // main operation modes - list = flag.Bool("l", false, "list files whose formatting differs from goimport's") - write = flag.Bool("w", false, "write result to (source) file instead of stdout") - doDiff = flag.Bool("d", false, "display diffs instead of rewriting files") - srcdir = flag.String("srcdir", "", "choose imports as if source code is from `dir`. When operating on a single file, dir may instead be the complete file name.") - - verbose bool // verbose logging - - cpuProfile = flag.String("cpuprofile", "", "CPU profile output") - memProfile = flag.String("memprofile", "", "memory profile output") - memProfileRate = flag.Int("memrate", 0, "if > 0, sets runtime.MemProfileRate") - - options = &imports.Options{ - TabWidth: 8, - TabIndent: true, - Comments: true, - Fragment: true, - Env: &imports.ProcessEnv{ - GocmdRunner: &gocommand.Runner{}, - }, - } - exitCode = 0 -) - -func init() { - flag.BoolVar(&options.AllErrors, "e", false, "report all errors (not just the first 10 on different lines)") - flag.StringVar(&options.LocalPrefix, "local", "", "put imports beginning with this string after 3rd-party packages; comma-separated list") - flag.BoolVar(&options.FormatOnly, "format-only", false, "if true, don't fix imports and only format. In this mode, goimports is effectively gofmt, with the addition that imports are grouped into sections.") -} - -func report(err error) { - scanner.PrintError(os.Stderr, err) - exitCode = 2 -} - -func usage() { - fmt.Fprintf(os.Stderr, "usage: goimports [flags] [path ...]\n") - flag.PrintDefaults() - os.Exit(2) -} - -func isGoFile(f os.FileInfo) bool { - // ignore non-Go files - name := f.Name() - return !f.IsDir() && !strings.HasPrefix(name, ".") && strings.HasSuffix(name, ".go") -} - -// argumentType is which mode goimports was invoked as. -type argumentType int - -const ( - // fromStdin means the user is piping their source into goimports. - fromStdin argumentType = iota - - // singleArg is the common case from editors, when goimports is run on - // a single file. - singleArg - - // multipleArg is when the user ran "goimports file1.go file2.go" - // or ran goimports on a directory tree. - multipleArg -) - -func processFile(filename string, in io.Reader, out io.Writer, argType argumentType) error { - opt := options - if argType == fromStdin { - nopt := *options - nopt.Fragment = true - opt = &nopt - } - - if in == nil { - f, err := os.Open(filename) - if err != nil { - return err - } - defer f.Close() - in = f - } - - src, err := io.ReadAll(in) - if err != nil { - return err - } - - target := filename - if *srcdir != "" { - // Determine whether the provided -srcdirc is a directory or file - // and then use it to override the target. - // - // See https://github.com/dominikh/go-mode.el/issues/146 - if isFile(*srcdir) { - if argType == multipleArg { - return errors.New("-srcdir value can't be a file when passing multiple arguments or when walking directories") - } - target = *srcdir - } else if argType == singleArg && strings.HasSuffix(*srcdir, ".go") && !isDir(*srcdir) { - // For a file which doesn't exist on disk yet, but might shortly. - // e.g. user in editor opens $DIR/newfile.go and newfile.go doesn't yet exist on disk. - // The goimports on-save hook writes the buffer to a temp file - // first and runs goimports before the actual save to newfile.go. - // The editor's buffer is named "newfile.go" so that is passed to goimports as: - // goimports -srcdir=/gopath/src/pkg/newfile.go /tmp/gofmtXXXXXXXX.go - // and then the editor reloads the result from the tmp file and writes - // it to newfile.go. - target = *srcdir - } else { - // Pretend that file is from *srcdir in order to decide - // visible imports correctly. - target = filepath.Join(*srcdir, filepath.Base(filename)) - } - } - - res, err := imports.Process(target, src, opt) - if err != nil { - return err - } - - if !bytes.Equal(src, res) { - // formatting has changed - if *list { - fmt.Fprintln(out, filename) - } - if *write { - if argType == fromStdin { - // filename is "" - return errors.New("can't use -w on stdin") - } - // On Windows, we need to re-set the permissions from the file. See golang/go#38225. - var perms os.FileMode - if fi, err := os.Stat(filename); err == nil { - perms = fi.Mode() & os.ModePerm - } - err = os.WriteFile(filename, res, perms) - if err != nil { - return err - } - } - if *doDiff { - if argType == fromStdin { - filename = "stdin.go" // because .orig looks silly - } - data, err := diff(src, res, filename) - if err != nil { - return fmt.Errorf("computing diff: %s", err) - } - fmt.Printf("diff -u %s %s\n", filepath.ToSlash(filename+".orig"), filepath.ToSlash(filename)) - out.Write(data) - } - } - - if !*list && !*write && !*doDiff { - _, err = out.Write(res) - } - - return err -} - -func visitFile(path string, f os.FileInfo, err error) error { - if err == nil && isGoFile(f) { - err = processFile(path, nil, os.Stdout, multipleArg) - } - if err != nil { - report(err) - } - return nil -} - -func walkDir(path string) { - filepath.Walk(path, visitFile) -} - -func main() { - runtime.GOMAXPROCS(runtime.NumCPU()) - - // call gofmtMain in a separate function - // so that it can use defer and have them - // run before the exit. - gofmtMain() - os.Exit(exitCode) -} - -// parseFlags parses command line flags and returns the paths to process. -// It's a var so that custom implementations can replace it in other files. -var parseFlags = func() []string { - flag.BoolVar(&verbose, "v", false, "verbose logging") - - flag.Parse() - return flag.Args() -} - -func bufferedFileWriter(dest string) (w io.Writer, close func()) { - f, err := os.Create(dest) - if err != nil { - log.Fatal(err) - } - bw := bufio.NewWriter(f) - return bw, func() { - if err := bw.Flush(); err != nil { - log.Fatalf("error flushing %v: %v", dest, err) - } - if err := f.Close(); err != nil { - log.Fatal(err) - } - } -} - -func gofmtMain() { - flag.Usage = usage - paths := parseFlags() - - if *cpuProfile != "" { - bw, flush := bufferedFileWriter(*cpuProfile) - pprof.StartCPUProfile(bw) - defer flush() - defer pprof.StopCPUProfile() - } - // doTrace is a conditionally compiled wrapper around runtime/trace. It is - // used to allow goimports to compile under gccgo, which does not support - // runtime/trace. See https://golang.org/issue/15544. - defer doTrace()() - if *memProfileRate > 0 { - runtime.MemProfileRate = *memProfileRate - bw, flush := bufferedFileWriter(*memProfile) - defer func() { - runtime.GC() // materialize all statistics - if err := pprof.WriteHeapProfile(bw); err != nil { - log.Fatal(err) - } - flush() - }() - } - - if verbose { - log.SetFlags(log.LstdFlags | log.Lmicroseconds) - options.Env.Logf = log.Printf - } - if options.TabWidth < 0 { - fmt.Fprintf(os.Stderr, "negative tabwidth %d\n", options.TabWidth) - exitCode = 2 - return - } - - if len(paths) == 0 { - if err := processFile("", os.Stdin, os.Stdout, fromStdin); err != nil { - report(err) - } - return - } - - argType := singleArg - if len(paths) > 1 { - argType = multipleArg - } - - for _, path := range paths { - switch dir, err := os.Stat(path); { - case err != nil: - report(err) - case dir.IsDir(): - walkDir(path) - default: - if err := processFile(path, nil, os.Stdout, argType); err != nil { - report(err) - } - } - } -} - -func writeTempFile(dir, prefix string, data []byte) (string, error) { - file, err := os.CreateTemp(dir, prefix) - if err != nil { - return "", err - } - _, err = file.Write(data) - if err1 := file.Close(); err == nil { - err = err1 - } - if err != nil { - os.Remove(file.Name()) - return "", err - } - return file.Name(), nil -} - -func diff(b1, b2 []byte, filename string) (data []byte, err error) { - f1, err := writeTempFile("", "gofmt", b1) - if err != nil { - return - } - defer os.Remove(f1) - - f2, err := writeTempFile("", "gofmt", b2) - if err != nil { - return - } - defer os.Remove(f2) - - cmd := "diff" - if runtime.GOOS == "plan9" { - cmd = "/bin/ape/diff" - } - - data, err = exec.Command(cmd, "-u", f1, f2).CombinedOutput() - if len(data) > 0 { - // diff exits with a non-zero status when the files don't match. - // Ignore that failure as long as we get output. - return replaceTempFilename(data, filename) - } - return -} - -// replaceTempFilename replaces temporary filenames in diff with actual one. -// -// --- /tmp/gofmt316145376 2017-02-03 19:13:00.280468375 -0500 -// +++ /tmp/gofmt617882815 2017-02-03 19:13:00.280468375 -0500 -// ... -// -> -// --- path/to/file.go.orig 2017-02-03 19:13:00.280468375 -0500 -// +++ path/to/file.go 2017-02-03 19:13:00.280468375 -0500 -// ... -func replaceTempFilename(diff []byte, filename string) ([]byte, error) { - bs := bytes.SplitN(diff, []byte{'\n'}, 3) - if len(bs) < 3 { - return nil, fmt.Errorf("got unexpected diff for %s", filename) - } - // Preserve timestamps. - var t0, t1 []byte - if i := bytes.LastIndexByte(bs[0], '\t'); i != -1 { - t0 = bs[0][i:] - } - if i := bytes.LastIndexByte(bs[1], '\t'); i != -1 { - t1 = bs[1][i:] - } - // Always print filepath with slash separator. - f := filepath.ToSlash(filename) - bs[0] = []byte(fmt.Sprintf("--- %s%s", f+".orig", t0)) - bs[1] = []byte(fmt.Sprintf("+++ %s%s", f, t1)) - return bytes.Join(bs, []byte{'\n'}), nil -} - -// isFile reports whether name is a file. -func isFile(name string) bool { - fi, err := os.Stat(name) - return err == nil && fi.Mode().IsRegular() -} - -// isDir reports whether name is a directory. -func isDir(name string) bool { - fi, err := os.Stat(name) - return err == nil && fi.IsDir() -} diff --git a/sdk/vendor/golang.org/x/tools/cmd/goimports/goimports_gc.go b/sdk/vendor/golang.org/x/tools/cmd/goimports/goimports_gc.go deleted file mode 100644 index 3326646d03..0000000000 --- a/sdk/vendor/golang.org/x/tools/cmd/goimports/goimports_gc.go +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2016 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 gc -// +build gc - -package main - -import ( - "flag" - "runtime/trace" -) - -var traceProfile = flag.String("trace", "", "trace profile output") - -func doTrace() func() { - if *traceProfile != "" { - bw, flush := bufferedFileWriter(*traceProfile) - trace.Start(bw) - return func() { - trace.Stop() - flush() - } - } - return func() {} -} diff --git a/sdk/vendor/golang.org/x/tools/cmd/goimports/goimports_not_gc.go b/sdk/vendor/golang.org/x/tools/cmd/goimports/goimports_not_gc.go deleted file mode 100644 index 344fe7576b..0000000000 --- a/sdk/vendor/golang.org/x/tools/cmd/goimports/goimports_not_gc.go +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright 2016 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 !gc -// +build !gc - -package main - -func doTrace() func() { - return func() {} -} diff --git a/sdk/vendor/golang.org/x/tools/go/ast/astutil/imports.go b/sdk/vendor/golang.org/x/tools/go/ast/astutil/imports.go index 18d1adb05d..a6b5ed0a89 100644 --- a/sdk/vendor/golang.org/x/tools/go/ast/astutil/imports.go +++ b/sdk/vendor/golang.org/x/tools/go/ast/astutil/imports.go @@ -344,7 +344,12 @@ func RewriteImport(fset *token.FileSet, f *ast.File, oldPath, newPath string) (r } // UsesImport reports whether a given import is used. +// The provided File must have been parsed with syntactic object resolution +// (not using go/parser.SkipObjectResolution). func UsesImport(f *ast.File, path string) (used bool) { + if f.Scope == nil { + panic("file f was not parsed with syntactic object resolution") + } spec := importSpec(f, path) if spec == nil { return diff --git a/sdk/vendor/golang.org/x/tools/go/ast/astutil/util.go b/sdk/vendor/golang.org/x/tools/go/ast/astutil/util.go index 6bdcf70ac2..ca71e3e105 100644 --- a/sdk/vendor/golang.org/x/tools/go/ast/astutil/util.go +++ b/sdk/vendor/golang.org/x/tools/go/ast/astutil/util.go @@ -7,13 +7,5 @@ package astutil import "go/ast" // Unparen returns e with any enclosing parentheses stripped. -// TODO(adonovan): use go1.22's ast.Unparen. -func Unparen(e ast.Expr) ast.Expr { - for { - p, ok := e.(*ast.ParenExpr) - if !ok { - return e - } - e = p.X - } -} +// Deprecated: use [ast.Unparen]. +func Unparen(e ast.Expr) ast.Expr { return ast.Unparen(e) } diff --git a/sdk/vendor/golang.org/x/tools/go/gcexportdata/gcexportdata.go b/sdk/vendor/golang.org/x/tools/go/gcexportdata/gcexportdata.go index 137cc8df1d..65fe2628e9 100644 --- a/sdk/vendor/golang.org/x/tools/go/gcexportdata/gcexportdata.go +++ b/sdk/vendor/golang.org/x/tools/go/gcexportdata/gcexportdata.go @@ -2,22 +2,64 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// Package gcexportdata provides functions for locating, reading, and -// writing export data files containing type information produced by the -// gc compiler. This package supports go1.7 export data format and all -// later versions. -// -// Although it might seem convenient for this package to live alongside -// go/types in the standard library, this would cause version skew -// problems for developer tools that use it, since they must be able to -// consume the outputs of the gc compiler both before and after a Go -// update such as from Go 1.7 to Go 1.8. Because this package lives in -// golang.org/x/tools, sites can update their version of this repo some -// time before the Go 1.8 release and rebuild and redeploy their -// developer tools, which will then be able to consume both Go 1.7 and -// Go 1.8 export data files, so they will work before and after the -// Go update. (See discussion at https://golang.org/issue/15651.) -package gcexportdata // import "golang.org/x/tools/go/gcexportdata" +// Package gcexportdata provides functions for reading and writing +// export data, which is a serialized description of the API of a Go +// package including the names, kinds, types, and locations of all +// exported declarations. +// +// The standard Go compiler (cmd/compile) writes an export data file +// for each package it compiles, which it later reads when compiling +// packages that import the earlier one. The compiler must thus +// contain logic to both write and read export data. +// (See the "Export" section in the cmd/compile/README file.) +// +// The [Read] function in this package can read files produced by the +// compiler, producing [go/types] data structures. As a matter of +// policy, Read supports export data files produced by only the last +// two Go releases plus tip; see https://go.dev/issue/68898. The +// export data files produced by the compiler contain additional +// details related to generics, inlining, and other optimizations that +// cannot be decoded by the [Read] function. +// +// In files written by the compiler, the export data is not at the +// start of the file. Before calling Read, use [NewReader] to locate +// the desired portion of the file. +// +// The [Write] function in this package encodes the exported API of a +// Go package ([types.Package]) as a file. Such files can be later +// decoded by Read, but cannot be consumed by the compiler. +// +// # Future changes +// +// Although Read supports the formats written by both Write and the +// compiler, the two are quite different, and there is an open +// proposal (https://go.dev/issue/69491) to separate these APIs. +// +// Under that proposal, this package would ultimately provide only the +// Read operation for compiler export data, which must be defined in +// this module (golang.org/x/tools), not in the standard library, to +// avoid version skew for developer tools that need to read compiler +// export data both before and after a Go release, such as from Go +// 1.23 to Go 1.24. Because this package lives in the tools module, +// clients can update their version of the module some time before the +// Go 1.24 release and rebuild and redeploy their tools, which will +// then be able to consume both Go 1.23 and Go 1.24 export data files, +// so they will work before and after the Go update. (See discussion +// at https://go.dev/issue/15651.) +// +// The operations to import and export [go/types] data structures +// would be defined in the go/types package as Import and Export. +// [Write] would (eventually) delegate to Export, +// and [Read], when it detects a file produced by Export, +// would delegate to Import. +// +// # Deprecations +// +// The [NewImporter] and [Find] functions are deprecated and should +// not be used in new code. The [WriteBundle] and [ReadBundle] +// functions are experimental, and there is an open proposal to +// deprecate them (https://go.dev/issue/69573). +package gcexportdata import ( "bufio" @@ -64,24 +106,18 @@ func Find(importPath, srcDir string) (filename, path string) { // additional trailing data beyond the end of the export data. func NewReader(r io.Reader) (io.Reader, error) { buf := bufio.NewReader(r) - _, size, err := gcimporter.FindExportData(buf) + size, err := gcimporter.FindExportData(buf) if err != nil { return nil, err } - if size >= 0 { - // We were given an archive and found the __.PKGDEF in it. - // This tells us the size of the export data, and we don't - // need to return the entire file. - return &io.LimitedReader{ - R: buf, - N: size, - }, nil - } else { - // We were given an object file. As such, we don't know how large - // the export data is and must return the entire file. - return buf, nil - } + // We were given an archive and found the __.PKGDEF in it. + // This tells us the size of the export data, and we don't + // need to return the entire file. + return &io.LimitedReader{ + R: buf, + N: size, + }, nil } // readAll works the same way as io.ReadAll, but avoids allocations and copies @@ -100,6 +136,11 @@ func readAll(r io.Reader) ([]byte, error) { // Read reads export data from in, decodes it, and returns type // information for the package. // +// Read is capable of reading export data produced by [Write] at the +// same source code version, or by the last two Go releases (plus tip) +// of the standard Go compiler. Reading files from older compilers may +// produce an error. +// // The package path (effectively its linker symbol prefix) is // specified by path, since unlike the package name, this information // may not be recorded in the export data. @@ -128,14 +169,26 @@ func Read(in io.Reader, fset *token.FileSet, imports map[string]*types.Package, // (from "version"). Select appropriate importer. if len(data) > 0 { switch data[0] { - case 'v', 'c', 'd': // binary, till go1.10 + case 'v', 'c', 'd': + // binary, produced by cmd/compile till go1.10 return nil, fmt.Errorf("binary (%c) import format is no longer supported", data[0]) - case 'i': // indexed, till go1.19 + case 'i': + // indexed, produced by cmd/compile till go1.19, + // and also by [Write]. + // + // If proposal #69491 is accepted, go/types + // serialization will be implemented by + // types.Export, to which Write would eventually + // delegate (explicitly dropping any pretence at + // inter-version Write-Read compatibility). + // This [Read] function would delegate to types.Import + // when it detects that the file was produced by Export. _, pkg, err := gcimporter.IImportData(fset, imports, data[1:], path) return pkg, err - case 'u': // unified, from go1.20 + case 'u': + // unified, produced by cmd/compile since go1.20 _, pkg, err := gcimporter.UImportData(fset, imports, data[1:], path) return pkg, err diff --git a/sdk/vendor/golang.org/x/tools/go/packages/doc.go b/sdk/vendor/golang.org/x/tools/go/packages/doc.go index 3531ac8f5f..f1931d10ee 100644 --- a/sdk/vendor/golang.org/x/tools/go/packages/doc.go +++ b/sdk/vendor/golang.org/x/tools/go/packages/doc.go @@ -64,7 +64,7 @@ graph using the Imports fields. The Load function can be configured by passing a pointer to a Config as the first argument. A nil Config is equivalent to the zero Config, which -causes Load to run in LoadFiles mode, collecting minimal information. +causes Load to run in [LoadFiles] mode, collecting minimal information. See the documentation for type Config for details. As noted earlier, the Config.Mode controls the amount of detail @@ -72,14 +72,14 @@ reported about the loaded packages. See the documentation for type LoadMode for details. Most tools should pass their command-line arguments (after any flags) -uninterpreted to [Load], so that it can interpret them +uninterpreted to Load, so that it can interpret them according to the conventions of the underlying build system. See the Example function for typical usage. # The driver protocol -[Load] may be used to load Go packages even in Go projects that use +Load may be used to load Go packages even in Go projects that use alternative build systems, by installing an appropriate "driver" program for the build system and specifying its location in the GOPACKAGESDRIVER environment variable. @@ -97,6 +97,15 @@ JSON-encoded [DriverRequest] message providing additional information is written to the driver's standard input. The driver must write a JSON-encoded [DriverResponse] message to its standard output. (This message differs from the JSON schema produced by 'go list'.) + +The value of the PWD environment variable seen by the driver process +is the preferred name of its working directory. (The working directory +may have other aliases due to symbolic links; see the comment on the +Dir field of [exec.Cmd] for related information.) +When the driver process emits in its response the name of a file +that is a descendant of this directory, it must use an absolute path +that has the value of PWD as a prefix, to ensure that the returned +filenames satisfy the original query. */ package packages // import "golang.org/x/tools/go/packages" diff --git a/sdk/vendor/golang.org/x/tools/go/packages/external.go b/sdk/vendor/golang.org/x/tools/go/packages/external.go index 8f7afcb5df..91bd62e83b 100644 --- a/sdk/vendor/golang.org/x/tools/go/packages/external.go +++ b/sdk/vendor/golang.org/x/tools/go/packages/external.go @@ -13,6 +13,7 @@ import ( "fmt" "os" "os/exec" + "slices" "strings" ) @@ -79,7 +80,7 @@ type DriverResponse struct { // driver is the type for functions that query the build system for the // packages named by the patterns. -type driver func(cfg *Config, patterns ...string) (*DriverResponse, error) +type driver func(cfg *Config, patterns []string) (*DriverResponse, error) // findExternalDriver returns the file path of a tool that supplies // the build system package structure, or "" if not found. @@ -103,7 +104,7 @@ func findExternalDriver(cfg *Config) driver { return nil } } - return func(cfg *Config, words ...string) (*DriverResponse, error) { + return func(cfg *Config, patterns []string) (*DriverResponse, error) { req, err := json.Marshal(DriverRequest{ Mode: cfg.Mode, Env: cfg.Env, @@ -117,7 +118,7 @@ func findExternalDriver(cfg *Config) driver { buf := new(bytes.Buffer) stderr := new(bytes.Buffer) - cmd := exec.CommandContext(cfg.Context, tool, words...) + cmd := exec.CommandContext(cfg.Context, tool, patterns...) cmd.Dir = cfg.Dir // The cwd gets resolved to the real path. On Darwin, where // /tmp is a symlink, this breaks anything that expects the @@ -131,7 +132,7 @@ func findExternalDriver(cfg *Config) driver { // command. // // (See similar trick in Invocation.run in ../../internal/gocommand/invoke.go) - cmd.Env = append(slicesClip(cfg.Env), "PWD="+cfg.Dir) + cmd.Env = append(slices.Clip(cfg.Env), "PWD="+cfg.Dir) cmd.Stdin = bytes.NewReader(req) cmd.Stdout = buf cmd.Stderr = stderr @@ -150,7 +151,3 @@ func findExternalDriver(cfg *Config) driver { return &response, nil } } - -// slicesClip removes unused capacity from the slice, returning s[:len(s):len(s)]. -// TODO(adonovan): use go1.21 slices.Clip. -func slicesClip[S ~[]E, E any](s S) S { return s[:len(s):len(s)] } diff --git a/sdk/vendor/golang.org/x/tools/go/packages/golist.go b/sdk/vendor/golang.org/x/tools/go/packages/golist.go index 1a3a5b44f5..0458b4f9c4 100644 --- a/sdk/vendor/golang.org/x/tools/go/packages/golist.go +++ b/sdk/vendor/golang.org/x/tools/go/packages/golist.go @@ -80,6 +80,12 @@ type golistState struct { cfg *Config ctx context.Context + runner *gocommand.Runner + + // overlay is the JSON file that encodes the Config.Overlay + // mapping, used by 'go list -overlay=...'. + overlay string + envOnce sync.Once goEnvError error goEnv map[string]string @@ -127,7 +133,10 @@ func (state *golistState) mustGetEnv() map[string]string { // goListDriver uses the go list command to interpret the patterns and produce // the build system package structure. // See driver for more details. -func goListDriver(cfg *Config, patterns ...string) (_ *DriverResponse, err error) { +// +// overlay is the JSON file that encodes the cfg.Overlay +// mapping, used by 'go list -overlay=...' +func goListDriver(cfg *Config, runner *gocommand.Runner, overlay string, patterns []string) (_ *DriverResponse, err error) { // Make sure that any asynchronous go commands are killed when we return. parentCtx := cfg.Context if parentCtx == nil { @@ -142,13 +151,15 @@ func goListDriver(cfg *Config, patterns ...string) (_ *DriverResponse, err error cfg: cfg, ctx: ctx, vendorDirs: map[string]bool{}, + overlay: overlay, + runner: runner, } // Fill in response.Sizes asynchronously if necessary. - if cfg.Mode&NeedTypesSizes != 0 || cfg.Mode&NeedTypes != 0 { + if cfg.Mode&NeedTypesSizes != 0 || cfg.Mode&(NeedTypes|NeedTypesInfo) != 0 { errCh := make(chan error) go func() { - compiler, arch, err := getSizesForArgs(ctx, state.cfgInvocation(), cfg.gocmdRunner) + compiler, arch, err := getSizesForArgs(ctx, state.cfgInvocation(), runner) response.dr.Compiler = compiler response.dr.Arch = arch errCh <- err @@ -311,6 +322,7 @@ type jsonPackage struct { ImportPath string Dir string Name string + Target string Export string GoFiles []string CompiledGoFiles []string @@ -494,13 +506,15 @@ func (state *golistState) createDriverResponse(words ...string) (*DriverResponse pkg := &Package{ Name: p.Name, ID: p.ImportPath, + Dir: p.Dir, + Target: p.Target, GoFiles: absJoin(p.Dir, p.GoFiles, p.CgoFiles), CompiledGoFiles: absJoin(p.Dir, p.CompiledGoFiles), OtherFiles: absJoin(p.Dir, otherFiles(p)...), EmbedFiles: absJoin(p.Dir, p.EmbedFiles), EmbedPatterns: absJoin(p.Dir, p.EmbedPatterns), IgnoredFiles: absJoin(p.Dir, p.IgnoredGoFiles, p.IgnoredOtherFiles), - forTest: p.ForTest, + ForTest: p.ForTest, depsErrors: p.DepsErrors, Module: p.Module, } @@ -681,7 +695,7 @@ func (state *golistState) shouldAddFilenameFromError(p *jsonPackage) bool { // getGoVersion returns the effective minor version of the go command. func (state *golistState) getGoVersion() (int, error) { state.goVersionOnce.Do(func() { - state.goVersion, state.goVersionError = gocommand.GoVersion(state.ctx, state.cfgInvocation(), state.cfg.gocmdRunner) + state.goVersion, state.goVersionError = gocommand.GoVersion(state.ctx, state.cfgInvocation(), state.runner) }) return state.goVersion, state.goVersionError } @@ -751,7 +765,7 @@ func jsonFlag(cfg *Config, goVersion int) string { } } addFields("Name", "ImportPath", "Error") // These fields are always needed - if cfg.Mode&NeedFiles != 0 || cfg.Mode&NeedTypes != 0 { + if cfg.Mode&NeedFiles != 0 || cfg.Mode&(NeedTypes|NeedTypesInfo) != 0 { addFields("Dir", "GoFiles", "IgnoredGoFiles", "IgnoredOtherFiles", "CFiles", "CgoFiles", "CXXFiles", "MFiles", "HFiles", "FFiles", "SFiles", "SwigFiles", "SwigCXXFiles", "SysoFiles") @@ -759,7 +773,7 @@ func jsonFlag(cfg *Config, goVersion int) string { addFields("TestGoFiles", "XTestGoFiles") } } - if cfg.Mode&NeedTypes != 0 { + if cfg.Mode&(NeedTypes|NeedTypesInfo) != 0 { // CompiledGoFiles seems to be required for the test case TestCgoNoSyntax, // even when -compiled isn't passed in. // TODO(#52435): Should we make the test ask for -compiled, or automatically @@ -784,7 +798,7 @@ func jsonFlag(cfg *Config, goVersion int) string { // Request Dir in the unlikely case Export is not absolute. addFields("Dir", "Export") } - if cfg.Mode&needInternalForTest != 0 { + if cfg.Mode&NeedForTest != 0 { addFields("ForTest") } if cfg.Mode&needInternalDepsErrors != 0 { @@ -799,6 +813,9 @@ func jsonFlag(cfg *Config, goVersion int) string { if cfg.Mode&NeedEmbedPatterns != 0 { addFields("EmbedPatterns") } + if cfg.Mode&NeedTarget != 0 { + addFields("Target") + } return "-json=" + strings.Join(fields, ",") } @@ -840,7 +857,7 @@ func (state *golistState) cfgInvocation() gocommand.Invocation { Env: cfg.Env, Logf: cfg.Logf, WorkingDir: cfg.Dir, - Overlay: cfg.goListOverlayFile, + Overlay: state.overlay, } } @@ -851,11 +868,8 @@ func (state *golistState) invokeGo(verb string, args ...string) (*bytes.Buffer, inv := state.cfgInvocation() inv.Verb = verb inv.Args = args - gocmdRunner := cfg.gocmdRunner - if gocmdRunner == nil { - gocmdRunner = &gocommand.Runner{} - } - stdout, stderr, friendlyErr, err := gocmdRunner.RunRaw(cfg.Context, inv) + + stdout, stderr, friendlyErr, err := state.runner.RunRaw(cfg.Context, inv) if err != nil { // Check for 'go' executable not being found. if ee, ok := err.(*exec.Error); ok && ee.Err == exec.ErrNotFound { @@ -879,6 +893,12 @@ func (state *golistState) invokeGo(verb string, args ...string) (*bytes.Buffer, return nil, friendlyErr } + // Return an error if 'go list' failed due to missing tools in + // $GOROOT/pkg/tool/$GOOS_$GOARCH (#69606). + if len(stderr.String()) > 0 && strings.Contains(stderr.String(), `go: no such tool`) { + return nil, friendlyErr + } + // Is there an error running the C compiler in cgo? This will be reported in the "Error" field // and should be suppressed by go list -e. // diff --git a/sdk/vendor/golang.org/x/tools/go/packages/loadmode_string.go b/sdk/vendor/golang.org/x/tools/go/packages/loadmode_string.go index 5c080d21b5..69eec9f44d 100644 --- a/sdk/vendor/golang.org/x/tools/go/packages/loadmode_string.go +++ b/sdk/vendor/golang.org/x/tools/go/packages/loadmode_string.go @@ -9,49 +9,48 @@ import ( "strings" ) -var allModes = []LoadMode{ - NeedName, - NeedFiles, - NeedCompiledGoFiles, - NeedImports, - NeedDeps, - NeedExportFile, - NeedTypes, - NeedSyntax, - NeedTypesInfo, - NeedTypesSizes, +var modes = [...]struct { + mode LoadMode + name string +}{ + {NeedName, "NeedName"}, + {NeedFiles, "NeedFiles"}, + {NeedCompiledGoFiles, "NeedCompiledGoFiles"}, + {NeedImports, "NeedImports"}, + {NeedDeps, "NeedDeps"}, + {NeedExportFile, "NeedExportFile"}, + {NeedTypes, "NeedTypes"}, + {NeedSyntax, "NeedSyntax"}, + {NeedTypesInfo, "NeedTypesInfo"}, + {NeedTypesSizes, "NeedTypesSizes"}, + {NeedForTest, "NeedForTest"}, + {NeedModule, "NeedModule"}, + {NeedEmbedFiles, "NeedEmbedFiles"}, + {NeedEmbedPatterns, "NeedEmbedPatterns"}, + {NeedTarget, "NeedTarget"}, } -var modeStrings = []string{ - "NeedName", - "NeedFiles", - "NeedCompiledGoFiles", - "NeedImports", - "NeedDeps", - "NeedExportFile", - "NeedTypes", - "NeedSyntax", - "NeedTypesInfo", - "NeedTypesSizes", -} - -func (mod LoadMode) String() string { - m := mod - if m == 0 { +func (mode LoadMode) String() string { + if mode == 0 { return "LoadMode(0)" } var out []string - for i, x := range allModes { - if x > m { - break + // named bits + for _, item := range modes { + if (mode & item.mode) != 0 { + mode ^= item.mode + out = append(out, item.name) } - if (m & x) != 0 { - out = append(out, modeStrings[i]) - m = m ^ x + } + // unnamed residue + if mode != 0 { + if out == nil { + return fmt.Sprintf("LoadMode(%#x)", int(mode)) } + out = append(out, fmt.Sprintf("%#x", int(mode))) } - if m != 0 { - out = append(out, "Unknown") + if len(out) == 1 { + return out[0] } - return fmt.Sprintf("LoadMode(%s)", strings.Join(out, "|")) + return "(" + strings.Join(out, "|") + ")" } diff --git a/sdk/vendor/golang.org/x/tools/go/packages/packages.go b/sdk/vendor/golang.org/x/tools/go/packages/packages.go index 0b6bfaff80..0147d9080a 100644 --- a/sdk/vendor/golang.org/x/tools/go/packages/packages.go +++ b/sdk/vendor/golang.org/x/tools/go/packages/packages.go @@ -16,13 +16,13 @@ import ( "go/scanner" "go/token" "go/types" - "io" "log" "os" "path/filepath" "runtime" "strings" "sync" + "sync/atomic" "time" "golang.org/x/sync/errgroup" @@ -31,7 +31,6 @@ import ( "golang.org/x/tools/internal/gocommand" "golang.org/x/tools/internal/packagesinternal" "golang.org/x/tools/internal/typesinternal" - "golang.org/x/tools/internal/versions" ) // A LoadMode controls the amount of detail to return when loading. @@ -44,19 +43,33 @@ import ( // ID and Errors (if present) will always be filled. // [Load] may return more information than requested. // +// The Mode flag is a union of several bits named NeedName, +// NeedFiles, and so on, each of which determines whether +// a given field of Package (Name, Files, etc) should be +// populated. +// +// For convenience, we provide named constants for the most +// common combinations of Need flags: +// +// [LoadFiles] lists of files in each package +// [LoadImports] ... plus imports +// [LoadTypes] ... plus type information +// [LoadSyntax] ... plus type-annotated syntax +// [LoadAllSyntax] ... for all dependencies +// // Unfortunately there are a number of open bugs related to // interactions among the LoadMode bits: -// - https://github.com/golang/go/issues/56633 -// - https://github.com/golang/go/issues/56677 -// - https://github.com/golang/go/issues/58726 -// - https://github.com/golang/go/issues/63517 +// - https://github.com/golang/go/issues/56633 +// - https://github.com/golang/go/issues/56677 +// - https://github.com/golang/go/issues/58726 +// - https://github.com/golang/go/issues/63517 type LoadMode int const ( // NeedName adds Name and PkgPath. NeedName LoadMode = 1 << iota - // NeedFiles adds GoFiles and OtherFiles. + // NeedFiles adds Dir, GoFiles, OtherFiles, and IgnoredFiles NeedFiles // NeedCompiledGoFiles adds CompiledGoFiles. @@ -78,7 +91,7 @@ const ( // NeedSyntax adds Syntax and Fset. NeedSyntax - // NeedTypesInfo adds TypesInfo. + // NeedTypesInfo adds TypesInfo and Fset. NeedTypesInfo // NeedTypesSizes adds TypesSizes. @@ -87,9 +100,10 @@ const ( // needInternalDepsErrors adds the internal deps errors field for use by gopls. needInternalDepsErrors - // needInternalForTest adds the internal forTest field. + // NeedForTest adds ForTest. + // // Tests must also be set on the context for this field to be populated. - needInternalForTest + NeedForTest // typecheckCgo enables full support for type checking cgo. Requires Go 1.15+. // Modifies CompiledGoFiles and Types, and has no effect on its own. @@ -103,27 +117,27 @@ const ( // NeedEmbedPatterns adds EmbedPatterns. NeedEmbedPatterns + + // NeedTarget adds Target. + NeedTarget + + // Be sure to update loadmode_string.go when adding new items! ) const ( - // Deprecated: LoadFiles exists for historical compatibility - // and should not be used. Please directly specify the needed fields using the Need values. + // LoadFiles loads the name and file names for the initial packages. LoadFiles = NeedName | NeedFiles | NeedCompiledGoFiles - // Deprecated: LoadImports exists for historical compatibility - // and should not be used. Please directly specify the needed fields using the Need values. + // LoadImports loads the name, file names, and import mapping for the initial packages. LoadImports = LoadFiles | NeedImports - // Deprecated: LoadTypes exists for historical compatibility - // and should not be used. Please directly specify the needed fields using the Need values. + // LoadTypes loads exported type information for the initial packages. LoadTypes = LoadImports | NeedTypes | NeedTypesSizes - // Deprecated: LoadSyntax exists for historical compatibility - // and should not be used. Please directly specify the needed fields using the Need values. + // LoadSyntax loads typed syntax for the initial packages. LoadSyntax = LoadTypes | NeedSyntax | NeedTypesInfo - // Deprecated: LoadAllSyntax exists for historical compatibility - // and should not be used. Please directly specify the needed fields using the Need values. + // LoadAllSyntax loads typed syntax for the initial packages and all dependencies. LoadAllSyntax = LoadSyntax | NeedDeps // Deprecated: NeedExportsFile is a historical misspelling of NeedExportFile. @@ -133,13 +147,7 @@ const ( // A Config specifies details about how packages should be loaded. // The zero value is a valid configuration. // -// Calls to Load do not modify this struct. -// -// TODO(adonovan): #67702: this is currently false: in fact, -// calls to [Load] do not modify the public fields of this struct, but -// may modify hidden fields, so concurrent calls to [Load] must not -// use the same Config. But perhaps we should reestablish the -// documented invariant. +// Calls to [Load] do not modify this struct. type Config struct { // Mode controls the level of information returned for each package. Mode LoadMode @@ -170,19 +178,10 @@ type Config struct { // Env []string - // gocmdRunner guards go command calls from concurrency errors. - gocmdRunner *gocommand.Runner - // BuildFlags is a list of command-line flags to be passed through to // the build system's query tool. BuildFlags []string - // modFile will be used for -modfile in go command invocations. - modFile string - - // modFlag will be used for -modfile in go command invocations. - modFlag string - // Fset provides source position information for syntax trees and types. // If Fset is nil, Load will use a new fileset, but preserve Fset's value. Fset *token.FileSet @@ -229,21 +228,24 @@ type Config struct { // drivers may vary in their level of support for overlays. Overlay map[string][]byte - // goListOverlayFile is the JSON file that encodes the Overlay - // mapping, used by 'go list -overlay=...' - goListOverlayFile string + // -- Hidden configuration fields only for use in x/tools -- + + // modFile will be used for -modfile in go command invocations. + modFile string + + // modFlag will be used for -modfile in go command invocations. + modFlag string } // Load loads and returns the Go packages named by the given patterns. // -// Config specifies loading options; -// nil behaves the same as an empty Config. +// The cfg parameter specifies loading options; nil behaves the same as an empty [Config]. // // The [Config.Mode] field is a set of bits that determine what kinds // of information should be computed and returned. Modes that require // more information tend to be slower. See [LoadMode] for details // and important caveats. Its zero value is equivalent to -// NeedName | NeedFiles | NeedCompiledGoFiles. +// [NeedName] | [NeedFiles] | [NeedCompiledGoFiles]. // // Each call to Load returns a new set of [Package] instances. // The Packages and their Imports form a directed acyclic graph. @@ -260,7 +262,7 @@ type Config struct { // Errors associated with a particular package are recorded in the // corresponding Package's Errors list, and do not cause Load to // return an error. Clients may need to handle such errors before -// proceeding with further analysis. The PrintErrors function is +// proceeding with further analysis. The [PrintErrors] function is // provided for convenient display of all errors. func Load(cfg *Config, patterns ...string) ([]*Package, error) { ld := newLoader(cfg) @@ -323,21 +325,24 @@ func defaultDriver(cfg *Config, patterns ...string) (*DriverResponse, bool, erro } else if !response.NotHandled { return response, true, nil } - // (fall through) + // not handled: fall through } // go list fallback - // + // Write overlays once, as there are many calls // to 'go list' (one per chunk plus others too). - overlay, cleanupOverlay, err := gocommand.WriteOverlays(cfg.Overlay) + overlayFile, cleanupOverlay, err := gocommand.WriteOverlays(cfg.Overlay) if err != nil { return nil, false, err } defer cleanupOverlay() - cfg.goListOverlayFile = overlay - response, err := callDriverOnChunks(goListDriver, cfg, chunks) + var runner gocommand.Runner // (shared across many 'go list' calls) + driver := func(cfg *Config, patterns []string) (*DriverResponse, error) { + return goListDriver(cfg, &runner, overlayFile, patterns) + } + response, err := callDriverOnChunks(driver, cfg, chunks) if err != nil { return nil, false, err } @@ -375,16 +380,14 @@ func splitIntoChunks(patterns []string, argMax int) ([][]string, error) { func callDriverOnChunks(driver driver, cfg *Config, chunks [][]string) (*DriverResponse, error) { if len(chunks) == 0 { - return driver(cfg) + return driver(cfg, nil) } responses := make([]*DriverResponse, len(chunks)) errNotHandled := errors.New("driver returned NotHandled") var g errgroup.Group for i, chunk := range chunks { - i := i - chunk := chunk g.Go(func() (err error) { - responses[i], err = driver(cfg, chunk...) + responses[i], err = driver(cfg, chunk) if responses[i] != nil && responses[i].NotHandled { err = errNotHandled } @@ -434,6 +437,12 @@ type Package struct { // PkgPath is the package path as used by the go/types package. PkgPath string + // Dir is the directory associated with the package, if it exists. + // + // For packages listed by the go command, this is the directory containing + // the package files. + Dir string + // Errors contains any errors encountered querying the metadata // of the package, or while parsing or type-checking its files. Errors []Error @@ -473,6 +482,10 @@ type Package struct { // information for the package as provided by the build system. ExportFile string + // Target is the absolute install path of the .a file, for libraries, + // and of the executable file, for binaries. + Target string + // Imports maps import paths appearing in the package's Go source files // to corresponding loaded Packages. Imports map[string]*Package @@ -521,8 +534,8 @@ type Package struct { // -- internal -- - // forTest is the package under test, if any. - forTest string + // ForTest is the package under test, if any. + ForTest string // depsErrors is the DepsErrors field from the go list response, if any. depsErrors []*packagesinternal.PackageError @@ -551,9 +564,6 @@ type ModuleError struct { } func init() { - packagesinternal.GetForTest = func(p interface{}) string { - return p.(*Package).forTest - } packagesinternal.GetDepsErrors = func(p interface{}) []*packagesinternal.PackageError { return p.(*Package).depsErrors } @@ -565,7 +575,6 @@ func init() { } packagesinternal.TypecheckCgo = int(typecheckCgo) packagesinternal.DepsErrors = int(needInternalDepsErrors) - packagesinternal.ForTest = int(needInternalForTest) } // An Error describes a problem with a package's metadata, syntax, or types. @@ -681,18 +690,19 @@ func (p *Package) String() string { return p.ID } // loaderPackage augments Package with state used during the loading phase type loaderPackage struct { *Package - importErrors map[string]error // maps each bad import to its error - loadOnce sync.Once - color uint8 // for cycle detection - needsrc bool // load from source (Mode >= LoadTypes) - needtypes bool // type information is either requested or depended on - initial bool // package was matched by a pattern - goVersion int // minor version number of go command on PATH + importErrors map[string]error // maps each bad import to its error + preds []*loaderPackage // packages that import this one + unfinishedSuccs atomic.Int32 // number of direct imports not yet loaded + color uint8 // for cycle detection + needsrc bool // load from source (Mode >= LoadTypes) + needtypes bool // type information is either requested or depended on + initial bool // package was matched by a pattern + goVersion int // minor version number of go command on PATH } // loader holds the working state of a single call to load. type loader struct { - pkgs map[string]*loaderPackage + pkgs map[string]*loaderPackage // keyed by Package.ID Config sizes types.Sizes // non-nil if needed by mode parseCache map[string]*parseValue @@ -738,9 +748,6 @@ func newLoader(cfg *Config) *loader { if ld.Config.Env == nil { ld.Config.Env = os.Environ() } - if ld.Config.gocmdRunner == nil { - ld.Config.gocmdRunner = &gocommand.Runner{} - } if ld.Context == nil { ld.Context = context.Background() } @@ -754,7 +761,7 @@ func newLoader(cfg *Config) *loader { ld.requestedMode = ld.Mode ld.Mode = impliedLoadMode(ld.Mode) - if ld.Mode&NeedTypes != 0 || ld.Mode&NeedSyntax != 0 { + if ld.Mode&(NeedSyntax|NeedTypes|NeedTypesInfo) != 0 { if ld.Fset == nil { ld.Fset = token.NewFileSet() } @@ -763,6 +770,7 @@ func newLoader(cfg *Config) *loader { // because we load source if export data is missing. if ld.ParseFile == nil { ld.ParseFile = func(fset *token.FileSet, filename string, src []byte) (*ast.File, error) { + // We implicitly promise to keep doing ast.Object resolution. :( const mode = parser.AllErrors | parser.ParseComments return parser.ParseFile(fset, filename, src, mode) } @@ -794,7 +802,7 @@ func (ld *loader) refine(response *DriverResponse) ([]*Package, error) { exportDataInvalid := len(ld.Overlay) > 0 || pkg.ExportFile == "" && pkg.PkgPath != "unsafe" // This package needs type information if the caller requested types and the package is // either a root, or it's a non-root and the user requested dependencies ... - needtypes := (ld.Mode&NeedTypes|NeedTypesInfo != 0 && (rootIndex >= 0 || ld.Mode&NeedDeps != 0)) + needtypes := (ld.Mode&(NeedTypes|NeedTypesInfo) != 0 && (rootIndex >= 0 || ld.Mode&NeedDeps != 0)) // This package needs source if the call requested source (or types info, which implies source) // and the package is either a root, or itas a non- root and the user requested dependencies... needsrc := ((ld.Mode&(NeedSyntax|NeedTypesInfo) != 0 && (rootIndex >= 0 || ld.Mode&NeedDeps != 0)) || @@ -819,9 +827,10 @@ func (ld *loader) refine(response *DriverResponse) ([]*Package, error) { } } - if ld.Mode&NeedImports != 0 { - // Materialize the import graph. - + // Materialize the import graph if it is needed (NeedImports), + // or if we'll be using loadPackages (Need{Syntax|Types|TypesInfo}). + var leaves []*loaderPackage // packages with no unfinished successors + if ld.Mode&(NeedImports|NeedSyntax|NeedTypes|NeedTypesInfo) != 0 { const ( white = 0 // new grey = 1 // in progress @@ -840,63 +849,76 @@ func (ld *loader) refine(response *DriverResponse) ([]*Package, error) { // dependency on a package that does. These are the only packages // for which we load source code. var stack []*loaderPackage - var visit func(lpkg *loaderPackage) bool - visit = func(lpkg *loaderPackage) bool { - switch lpkg.color { - case black: - return lpkg.needsrc - case grey: + var visit func(from, lpkg *loaderPackage) bool + visit = func(from, lpkg *loaderPackage) bool { + if lpkg.color == grey { panic("internal error: grey node") } - lpkg.color = grey - stack = append(stack, lpkg) // push - stubs := lpkg.Imports // the structure form has only stubs with the ID in the Imports - lpkg.Imports = make(map[string]*Package, len(stubs)) - for importPath, ipkg := range stubs { - var importErr error - imp := ld.pkgs[ipkg.ID] - if imp == nil { - // (includes package "C" when DisableCgo) - importErr = fmt.Errorf("missing package: %q", ipkg.ID) - } else if imp.color == grey { - importErr = fmt.Errorf("import cycle: %s", stack) + if lpkg.color == white { + lpkg.color = grey + stack = append(stack, lpkg) // push + stubs := lpkg.Imports // the structure form has only stubs with the ID in the Imports + lpkg.Imports = make(map[string]*Package, len(stubs)) + for importPath, ipkg := range stubs { + var importErr error + imp := ld.pkgs[ipkg.ID] + if imp == nil { + // (includes package "C" when DisableCgo) + importErr = fmt.Errorf("missing package: %q", ipkg.ID) + } else if imp.color == grey { + importErr = fmt.Errorf("import cycle: %s", stack) + } + if importErr != nil { + if lpkg.importErrors == nil { + lpkg.importErrors = make(map[string]error) + } + lpkg.importErrors[importPath] = importErr + continue + } + + if visit(lpkg, imp) { + lpkg.needsrc = true + } + lpkg.Imports[importPath] = imp.Package } - if importErr != nil { - if lpkg.importErrors == nil { - lpkg.importErrors = make(map[string]error) + + // -- postorder -- + + // Complete type information is required for the + // immediate dependencies of each source package. + if lpkg.needsrc && ld.Mode&NeedTypes != 0 { + for _, ipkg := range lpkg.Imports { + ld.pkgs[ipkg.ID].needtypes = true } - lpkg.importErrors[importPath] = importErr - continue } - if visit(imp) { - lpkg.needsrc = true + // NeedTypeSizes causes TypeSizes to be set even + // on packages for which types aren't needed. + if ld.Mode&NeedTypesSizes != 0 { + lpkg.TypesSizes = ld.sizes } - lpkg.Imports[importPath] = imp.Package - } - // Complete type information is required for the - // immediate dependencies of each source package. - if lpkg.needsrc && ld.Mode&NeedTypes != 0 { - for _, ipkg := range lpkg.Imports { - ld.pkgs[ipkg.ID].needtypes = true + // Add packages with no imports directly to the queue of leaves. + if len(lpkg.Imports) == 0 { + leaves = append(leaves, lpkg) } + + stack = stack[:len(stack)-1] // pop + lpkg.color = black } - // NeedTypeSizes causes TypeSizes to be set even - // on packages for which types aren't needed. - if ld.Mode&NeedTypesSizes != 0 { - lpkg.TypesSizes = ld.sizes + // Add edge from predecessor. + if from != nil { + from.unfinishedSuccs.Add(+1) // incref + lpkg.preds = append(lpkg.preds, from) } - stack = stack[:len(stack)-1] // pop - lpkg.color = black return lpkg.needsrc } // For each initial package, create its import DAG. for _, lpkg := range initial { - visit(lpkg) + visit(nil, lpkg) } } else { @@ -909,16 +931,45 @@ func (ld *loader) refine(response *DriverResponse) ([]*Package, error) { // Load type data and syntax if needed, starting at // the initial packages (roots of the import DAG). - if ld.Mode&NeedTypes != 0 || ld.Mode&NeedSyntax != 0 { - var wg sync.WaitGroup - for _, lpkg := range initial { - wg.Add(1) - go func(lpkg *loaderPackage) { - ld.loadRecursive(lpkg) - wg.Done() - }(lpkg) + if ld.Mode&(NeedSyntax|NeedTypes|NeedTypesInfo) != 0 { + + // We avoid using g.SetLimit to limit concurrency as + // it makes g.Go stop accepting work, which prevents + // workers from enqeuing, and thus finishing, and thus + // allowing the group to make progress: deadlock. + // + // Instead we use the ioLimit and cpuLimit semaphores. + g, _ := errgroup.WithContext(ld.Context) + + // enqueues adds a package to the type-checking queue. + // It must have no unfinished successors. + var enqueue func(*loaderPackage) + enqueue = func(lpkg *loaderPackage) { + g.Go(func() error { + // Parse and type-check. + ld.loadPackage(lpkg) + + // Notify each waiting predecessor, + // and enqueue it when it becomes a leaf. + for _, pred := range lpkg.preds { + if pred.unfinishedSuccs.Add(-1) == 0 { // decref + enqueue(pred) + } + } + + return nil + }) + } + + // Load leaves first, adding new packages + // to the queue as they become leaves. + for _, leaf := range leaves { + enqueue(leaf) + } + + if err := g.Wait(); err != nil { + return nil, err // cancelled } - wg.Wait() } // If the context is done, return its error and @@ -965,7 +1016,7 @@ func (ld *loader) refine(response *DriverResponse) ([]*Package, error) { if ld.requestedMode&NeedSyntax == 0 { ld.pkgs[i].Syntax = nil } - if ld.requestedMode&NeedTypes == 0 && ld.requestedMode&NeedSyntax == 0 { + if ld.requestedMode&(NeedSyntax|NeedTypes|NeedTypesInfo) == 0 { ld.pkgs[i].Fset = nil } if ld.requestedMode&NeedTypesInfo == 0 { @@ -982,31 +1033,10 @@ func (ld *loader) refine(response *DriverResponse) ([]*Package, error) { return result, nil } -// loadRecursive loads the specified package and its dependencies, -// recursively, in parallel, in topological order. -// It is atomic and idempotent. -// Precondition: ld.Mode&NeedTypes. -func (ld *loader) loadRecursive(lpkg *loaderPackage) { - lpkg.loadOnce.Do(func() { - // Load the direct dependencies, in parallel. - var wg sync.WaitGroup - for _, ipkg := range lpkg.Imports { - imp := ld.pkgs[ipkg.ID] - wg.Add(1) - go func(imp *loaderPackage) { - ld.loadRecursive(imp) - wg.Done() - }(imp) - } - wg.Wait() - ld.loadPackage(lpkg) - }) -} - -// loadPackage loads the specified package. +// loadPackage loads/parses/typechecks the specified package. // It must be called only once per Package, // after immediate dependencies are loaded. -// Precondition: ld.Mode & NeedTypes. +// Precondition: ld.Mode&(NeedSyntax|NeedTypes|NeedTypesInfo) != 0. func (ld *loader) loadPackage(lpkg *loaderPackage) { if lpkg.PkgPath == "unsafe" { // Fill in the blanks to avoid surprises. @@ -1042,6 +1072,10 @@ func (ld *loader) loadPackage(lpkg *loaderPackage) { if !lpkg.needtypes && !lpkg.needsrc { return } + + // TODO(adonovan): this condition looks wrong: + // I think it should be lpkg.needtypes && !lpg.needsrc, + // so that NeedSyntax without NeedTypes can be satisfied by export data. if !lpkg.needsrc { if err := ld.loadFromExportData(lpkg); err != nil { lpkg.Errors = append(lpkg.Errors, Error{ @@ -1147,7 +1181,7 @@ func (ld *loader) loadPackage(lpkg *loaderPackage) { } lpkg.Syntax = files - if ld.Config.Mode&NeedTypes == 0 { + if ld.Config.Mode&(NeedTypes|NeedTypesInfo) == 0 { return } @@ -1158,16 +1192,20 @@ func (ld *loader) loadPackage(lpkg *loaderPackage) { return } - lpkg.TypesInfo = &types.Info{ - Types: make(map[ast.Expr]types.TypeAndValue), - Defs: make(map[*ast.Ident]types.Object), - Uses: make(map[*ast.Ident]types.Object), - Implicits: make(map[ast.Node]types.Object), - Instances: make(map[*ast.Ident]types.Instance), - Scopes: make(map[ast.Node]*types.Scope), - Selections: make(map[*ast.SelectorExpr]*types.Selection), + // Populate TypesInfo only if needed, as it + // causes the type checker to work much harder. + if ld.Config.Mode&NeedTypesInfo != 0 { + lpkg.TypesInfo = &types.Info{ + Types: make(map[ast.Expr]types.TypeAndValue), + Defs: make(map[*ast.Ident]types.Object), + Uses: make(map[*ast.Ident]types.Object), + Implicits: make(map[ast.Node]types.Object), + Instances: make(map[*ast.Ident]types.Instance), + Scopes: make(map[ast.Node]*types.Scope), + Selections: make(map[*ast.SelectorExpr]*types.Selection), + FileVersions: make(map[*ast.File]string), + } } - versions.InitFileVersions(lpkg.TypesInfo) lpkg.TypesSizes = ld.sizes importer := importerFunc(func(path string) (*types.Package, error) { @@ -1220,6 +1258,10 @@ func (ld *loader) loadPackage(lpkg *loaderPackage) { } } + // Type-checking is CPU intensive. + cpuLimit <- unit{} // acquire a token + defer func() { <-cpuLimit }() // release a token + typErr := types.NewChecker(tc, ld.Fset, lpkg.Types, lpkg.TypesInfo).Files(lpkg.Syntax) lpkg.importErrors = nil // no longer needed @@ -1284,8 +1326,11 @@ type importerFunc func(path string) (*types.Package, error) func (f importerFunc) Import(path string) (*types.Package, error) { return f(path) } // We use a counting semaphore to limit -// the number of parallel I/O calls per process. -var ioLimit = make(chan bool, 20) +// the number of parallel I/O calls or CPU threads per process. +var ( + ioLimit = make(chan unit, 20) + cpuLimit = make(chan unit, runtime.GOMAXPROCS(0)) +) func (ld *loader) parseFile(filename string) (*ast.File, error) { ld.parseCacheMu.Lock() @@ -1302,20 +1347,28 @@ func (ld *loader) parseFile(filename string) (*ast.File, error) { var src []byte for f, contents := range ld.Config.Overlay { + // TODO(adonovan): Inefficient for large overlays. + // Do an exact name-based map lookup + // (for nonexistent files) followed by a + // FileID-based map lookup (for existing ones). if sameFile(f, filename) { src = contents + break } } var err error if src == nil { - ioLimit <- true // wait + ioLimit <- unit{} // acquire a token src, err = os.ReadFile(filename) - <-ioLimit // signal + <-ioLimit // release a token } if err != nil { v.err = err } else { + // Parsing is CPU intensive. + cpuLimit <- unit{} // acquire a token v.f, v.err = ld.ParseFile(ld.Fset, filename, src) + <-cpuLimit // release a token } close(v.ready) @@ -1330,18 +1383,21 @@ func (ld *loader) parseFile(filename string) (*ast.File, error) { // Because files are scanned in parallel, the token.Pos // positions of the resulting ast.Files are not ordered. func (ld *loader) parseFiles(filenames []string) ([]*ast.File, []error) { - var wg sync.WaitGroup - n := len(filenames) - parsed := make([]*ast.File, n) - errors := make([]error, n) - for i, file := range filenames { - wg.Add(1) - go func(i int, filename string) { + var ( + n = len(filenames) + parsed = make([]*ast.File, n) + errors = make([]error, n) + ) + var g errgroup.Group + for i, filename := range filenames { + // This creates goroutines unnecessarily in the + // cache-hit case, but that case is uncommon. + g.Go(func() error { parsed[i], errors[i] = ld.parseFile(filename) - wg.Done() - }(i, file) + return nil + }) } - wg.Wait() + g.Wait() // Eliminate nils, preserving order. var o int @@ -1512,4 +1568,4 @@ func usesExportData(cfg *Config) bool { return cfg.Mode&NeedExportFile != 0 || cfg.Mode&NeedTypes != 0 && cfg.Mode&NeedDeps == 0 } -var _ interface{} = io.Discard // assert build toolchain is go1.16 or later +type unit struct{} diff --git a/sdk/vendor/golang.org/x/tools/go/types/objectpath/objectpath.go b/sdk/vendor/golang.org/x/tools/go/types/objectpath/objectpath.go index 9ada177758..16ed3c1780 100644 --- a/sdk/vendor/golang.org/x/tools/go/types/objectpath/objectpath.go +++ b/sdk/vendor/golang.org/x/tools/go/types/objectpath/objectpath.go @@ -228,7 +228,7 @@ func (enc *Encoder) For(obj types.Object) (Path, error) { // Reject obviously non-viable cases. switch obj := obj.(type) { case *types.TypeName: - if _, ok := aliases.Unalias(obj.Type()).(*types.TypeParam); !ok { + if _, ok := types.Unalias(obj.Type()).(*types.TypeParam); !ok { // With the exception of type parameters, only package-level type names // have a path. return "", fmt.Errorf("no path for %v", obj) @@ -280,26 +280,26 @@ func (enc *Encoder) For(obj types.Object) (Path, error) { path = append(path, opType) T := o.Type() - if alias, ok := T.(*aliases.Alias); ok { - if r := findTypeParam(obj, aliases.TypeParams(alias), path, opTypeParam, nil); r != nil { + if alias, ok := T.(*types.Alias); ok { + if r := findTypeParam(obj, aliases.TypeParams(alias), path, opTypeParam); r != nil { return Path(r), nil } - if r := find(obj, aliases.Rhs(alias), append(path, opRhs), nil); r != nil { + if r := find(obj, aliases.Rhs(alias), append(path, opRhs)); r != nil { return Path(r), nil } } else if tname.IsAlias() { // legacy alias - if r := find(obj, T, path, nil); r != nil { + if r := find(obj, T, path); r != nil { return Path(r), nil } } else if named, ok := T.(*types.Named); ok { // defined (named) type - if r := findTypeParam(obj, named.TypeParams(), path, opTypeParam, nil); r != nil { + if r := findTypeParam(obj, named.TypeParams(), path, opTypeParam); r != nil { return Path(r), nil } - if r := find(obj, named.Underlying(), append(path, opUnderlying), nil); r != nil { + if r := find(obj, named.Underlying(), append(path, opUnderlying)); r != nil { return Path(r), nil } } @@ -312,7 +312,7 @@ func (enc *Encoder) For(obj types.Object) (Path, error) { if _, ok := o.(*types.TypeName); !ok { if o.Exported() { // exported non-type (const, var, func) - if r := find(obj, o.Type(), append(path, opType), nil); r != nil { + if r := find(obj, o.Type(), append(path, opType)); r != nil { return Path(r), nil } } @@ -320,7 +320,7 @@ func (enc *Encoder) For(obj types.Object) (Path, error) { } // Inspect declared methods of defined types. - if T, ok := aliases.Unalias(o.Type()).(*types.Named); ok { + if T, ok := types.Unalias(o.Type()).(*types.Named); ok { path = append(path, opType) // The method index here is always with respect // to the underlying go/types data structures, @@ -332,7 +332,7 @@ func (enc *Encoder) For(obj types.Object) (Path, error) { if m == obj { return Path(path2), nil // found declared method } - if r := find(obj, m.Type(), append(path2, opType), nil); r != nil { + if r := find(obj, m.Type(), append(path2, opType)); r != nil { return Path(r), nil } } @@ -447,46 +447,64 @@ func (enc *Encoder) concreteMethod(meth *types.Func) (Path, bool) { // // The seen map is used to short circuit cycles through type parameters. If // nil, it will be allocated as necessary. -func find(obj types.Object, T types.Type, path []byte, seen map[*types.TypeName]bool) []byte { +// +// The seenMethods map is used internally to short circuit cycles through +// interface methods, such as occur in the following example: +// +// type I interface { f() interface{I} } +// +// See golang/go#68046 for details. +func find(obj types.Object, T types.Type, path []byte) []byte { + return (&finder{obj: obj}).find(T, path) +} + +// finder closes over search state for a call to find. +type finder struct { + obj types.Object // the sought object + seenTParamNames map[*types.TypeName]bool // for cycle breaking through type parameters + seenMethods map[*types.Func]bool // for cycle breaking through recursive interfaces +} + +func (f *finder) find(T types.Type, path []byte) []byte { switch T := T.(type) { - case *aliases.Alias: - return find(obj, aliases.Unalias(T), path, seen) + case *types.Alias: + return f.find(types.Unalias(T), path) case *types.Basic, *types.Named: // Named types belonging to pkg were handled already, // so T must belong to another package. No path. return nil case *types.Pointer: - return find(obj, T.Elem(), append(path, opElem), seen) + return f.find(T.Elem(), append(path, opElem)) case *types.Slice: - return find(obj, T.Elem(), append(path, opElem), seen) + return f.find(T.Elem(), append(path, opElem)) case *types.Array: - return find(obj, T.Elem(), append(path, opElem), seen) + return f.find(T.Elem(), append(path, opElem)) case *types.Chan: - return find(obj, T.Elem(), append(path, opElem), seen) + return f.find(T.Elem(), append(path, opElem)) case *types.Map: - if r := find(obj, T.Key(), append(path, opKey), seen); r != nil { + if r := f.find(T.Key(), append(path, opKey)); r != nil { return r } - return find(obj, T.Elem(), append(path, opElem), seen) + return f.find(T.Elem(), append(path, opElem)) case *types.Signature: - if r := findTypeParam(obj, T.RecvTypeParams(), path, opRecvTypeParam, nil); r != nil { + if r := f.findTypeParam(T.RecvTypeParams(), path, opRecvTypeParam); r != nil { return r } - if r := findTypeParam(obj, T.TypeParams(), path, opTypeParam, seen); r != nil { + if r := f.findTypeParam(T.TypeParams(), path, opTypeParam); r != nil { return r } - if r := find(obj, T.Params(), append(path, opParams), seen); r != nil { + if r := f.find(T.Params(), append(path, opParams)); r != nil { return r } - return find(obj, T.Results(), append(path, opResults), seen) + return f.find(T.Results(), append(path, opResults)) case *types.Struct: for i := 0; i < T.NumFields(); i++ { fld := T.Field(i) path2 := appendOpArg(path, opField, i) - if fld == obj { + if fld == f.obj { return path2 // found field var } - if r := find(obj, fld.Type(), append(path2, opType), seen); r != nil { + if r := f.find(fld.Type(), append(path2, opType)); r != nil { return r } } @@ -495,10 +513,10 @@ func find(obj types.Object, T types.Type, path []byte, seen map[*types.TypeName] for i := 0; i < T.Len(); i++ { v := T.At(i) path2 := appendOpArg(path, opAt, i) - if v == obj { + if v == f.obj { return path2 // found param/result var } - if r := find(obj, v.Type(), append(path2, opType), seen); r != nil { + if r := f.find(v.Type(), append(path2, opType)); r != nil { return r } } @@ -506,28 +524,35 @@ func find(obj types.Object, T types.Type, path []byte, seen map[*types.TypeName] case *types.Interface: for i := 0; i < T.NumMethods(); i++ { m := T.Method(i) + if f.seenMethods[m] { + return nil + } path2 := appendOpArg(path, opMethod, i) - if m == obj { + if m == f.obj { return path2 // found interface method } - if r := find(obj, m.Type(), append(path2, opType), seen); r != nil { + if f.seenMethods == nil { + f.seenMethods = make(map[*types.Func]bool) + } + f.seenMethods[m] = true + if r := f.find(m.Type(), append(path2, opType)); r != nil { return r } } return nil case *types.TypeParam: name := T.Obj() - if name == obj { - return append(path, opObj) - } - if seen[name] { + if f.seenTParamNames[name] { return nil } - if seen == nil { - seen = make(map[*types.TypeName]bool) + if name == f.obj { + return append(path, opObj) } - seen[name] = true - if r := find(obj, T.Constraint(), append(path, opConstraint), seen); r != nil { + if f.seenTParamNames == nil { + f.seenTParamNames = make(map[*types.TypeName]bool) + } + f.seenTParamNames[name] = true + if r := f.find(T.Constraint(), append(path, opConstraint)); r != nil { return r } return nil @@ -535,11 +560,15 @@ func find(obj types.Object, T types.Type, path []byte, seen map[*types.TypeName] panic(T) } -func findTypeParam(obj types.Object, list *types.TypeParamList, path []byte, op byte, seen map[*types.TypeName]bool) []byte { +func findTypeParam(obj types.Object, list *types.TypeParamList, path []byte, op byte) []byte { + return (&finder{obj: obj}).findTypeParam(list, path, op) +} + +func (f *finder) findTypeParam(list *types.TypeParamList, path []byte, op byte) []byte { for i := 0; i < list.Len(); i++ { tparam := list.At(i) path2 := appendOpArg(path, op, i) - if r := find(obj, tparam, path2, seen); r != nil { + if r := f.find(tparam, path2); r != nil { return r } } @@ -626,7 +655,7 @@ func Object(pkg *types.Package, p Path) (types.Object, error) { // Inv: t != nil, obj == nil - t = aliases.Unalias(t) + t = types.Unalias(t) switch code { case opElem: hasElem, ok := t.(hasElem) // Pointer, Slice, Array, Chan, Map @@ -664,7 +693,7 @@ func Object(pkg *types.Package, p Path) (types.Object, error) { t = named.Underlying() case opRhs: - if alias, ok := t.(*aliases.Alias); ok { + if alias, ok := t.(*types.Alias); ok { t = aliases.Rhs(alias) } else if false && aliases.Enabled() { // The Enabled check is too expensive, so for now we diff --git a/sdk/vendor/golang.org/x/tools/go/types/typeutil/callee.go b/sdk/vendor/golang.org/x/tools/go/types/typeutil/callee.go index 90dc541adf..754380351e 100644 --- a/sdk/vendor/golang.org/x/tools/go/types/typeutil/callee.go +++ b/sdk/vendor/golang.org/x/tools/go/types/typeutil/callee.go @@ -8,7 +8,6 @@ import ( "go/ast" "go/types" - "golang.org/x/tools/go/ast/astutil" "golang.org/x/tools/internal/typeparams" ) @@ -17,7 +16,7 @@ import ( // // Functions and methods may potentially have type parameters. func Callee(info *types.Info, call *ast.CallExpr) types.Object { - fun := astutil.Unparen(call.Fun) + fun := ast.Unparen(call.Fun) // Look through type instantiation if necessary. isInstance := false diff --git a/sdk/vendor/golang.org/x/tools/go/types/typeutil/map.go b/sdk/vendor/golang.org/x/tools/go/types/typeutil/map.go index a92f80dd2d..93b3090c68 100644 --- a/sdk/vendor/golang.org/x/tools/go/types/typeutil/map.go +++ b/sdk/vendor/golang.org/x/tools/go/types/typeutil/map.go @@ -2,31 +2,35 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// Package typeutil defines various utilities for types, such as Map, -// a mapping from types.Type to any values. -package typeutil // import "golang.org/x/tools/go/types/typeutil" +// Package typeutil defines various utilities for types, such as [Map], +// a hash table that maps [types.Type] to any value. +package typeutil import ( "bytes" "fmt" "go/types" - "reflect" + "hash/maphash" + "unsafe" - "golang.org/x/tools/internal/aliases" "golang.org/x/tools/internal/typeparams" ) // Map is a hash-table-based mapping from types (types.Type) to -// arbitrary any values. The concrete types that implement +// arbitrary values. The concrete types that implement // the Type interface are pointers. Since they are not canonicalized, // == cannot be used to check for equivalence, and thus we cannot // simply use a Go map. // // Just as with map[K]V, a nil *Map is a valid empty map. // -// Not thread-safe. +// Read-only map operations ([Map.At], [Map.Len], and so on) may +// safely be called concurrently. +// +// TODO(adonovan): deprecate in favor of https://go.dev/issues/69420 +// and 69559, if the latter proposals for a generic hash-map type and +// a types.Hash function are accepted. type Map struct { - hasher Hasher // shared by many Maps table map[uint32][]entry // maps hash to bucket; entry.key==nil means unused length int // number of map entries } @@ -37,35 +41,17 @@ type entry struct { value any } -// SetHasher sets the hasher used by Map. -// -// All Hashers are functionally equivalent but contain internal state -// used to cache the results of hashing previously seen types. -// -// A single Hasher created by MakeHasher() may be shared among many -// Maps. This is recommended if the instances have many keys in -// common, as it will amortize the cost of hash computation. -// -// A Hasher may grow without bound as new types are seen. Even when a -// type is deleted from the map, the Hasher never shrinks, since other -// types in the map may reference the deleted type indirectly. +// SetHasher has no effect. // -// Hashers are not thread-safe, and read-only operations such as -// Map.Lookup require updates to the hasher, so a full Mutex lock (not a -// read-lock) is require around all Map operations if a shared -// hasher is accessed from multiple threads. -// -// If SetHasher is not called, the Map will create a private hasher at -// the first call to Insert. -func (m *Map) SetHasher(hasher Hasher) { - m.hasher = hasher -} +// It is a relic of an optimization that is no longer profitable. Do +// not use [Hasher], [MakeHasher], or [SetHasher] in new code. +func (m *Map) SetHasher(Hasher) {} // Delete removes the entry with the given key, if any. // It returns true if the entry was found. func (m *Map) Delete(key types.Type) bool { if m != nil && m.table != nil { - hash := m.hasher.Hash(key) + hash := hash(key) bucket := m.table[hash] for i, e := range bucket { if e.key != nil && types.Identical(key, e.key) { @@ -84,7 +70,7 @@ func (m *Map) Delete(key types.Type) bool { // The result is nil if the entry is not present. func (m *Map) At(key types.Type) any { if m != nil && m.table != nil { - for _, e := range m.table[m.hasher.Hash(key)] { + for _, e := range m.table[hash(key)] { if e.key != nil && types.Identical(key, e.key) { return e.value } @@ -97,7 +83,7 @@ func (m *Map) At(key types.Type) any { // and returns the previous entry, if any. func (m *Map) Set(key types.Type, value any) (prev any) { if m.table != nil { - hash := m.hasher.Hash(key) + hash := hash(key) bucket := m.table[hash] var hole *entry for i, e := range bucket { @@ -116,10 +102,7 @@ func (m *Map) Set(key types.Type, value any) (prev any) { m.table[hash] = append(bucket, entry{key, value}) } } else { - if m.hasher.memo == nil { - m.hasher = MakeHasher() - } - hash := m.hasher.Hash(key) + hash := hash(key) m.table = map[uint32][]entry{hash: {entry{key, value}}} } @@ -196,53 +179,35 @@ func (m *Map) KeysString() string { return m.toString(false) } -//////////////////////////////////////////////////////////////////////// -// Hasher - -// A Hasher maps each type to its hash value. -// For efficiency, a hasher uses memoization; thus its memory -// footprint grows monotonically over time. -// Hashers are not thread-safe. -// Hashers have reference semantics. -// Call MakeHasher to create a Hasher. -type Hasher struct { - memo map[types.Type]uint32 - - // ptrMap records pointer identity. - ptrMap map[any]uint32 - - // sigTParams holds type parameters from the signature being hashed. - // Signatures are considered identical modulo renaming of type parameters, so - // within the scope of a signature type the identity of the signature's type - // parameters is just their index. - // - // Since the language does not currently support referring to uninstantiated - // generic types or functions, and instantiated signatures do not have type - // parameter lists, we should never encounter a second non-empty type - // parameter list when hashing a generic signature. - sigTParams *types.TypeParamList -} +// -- Hasher -- -// MakeHasher returns a new Hasher instance. -func MakeHasher() Hasher { - return Hasher{ - memo: make(map[types.Type]uint32), - ptrMap: make(map[any]uint32), - sigTParams: nil, - } +// hash returns the hash of type t. +// TODO(adonovan): replace by types.Hash when Go proposal #69420 is accepted. +func hash(t types.Type) uint32 { + return theHasher.Hash(t) } +// A Hasher provides a [Hasher.Hash] method to map a type to its hash value. +// Hashers are stateless, and all are equivalent. +type Hasher struct{} + +var theHasher Hasher + +// MakeHasher returns Hasher{}. +// Hashers are stateless; all are equivalent. +func MakeHasher() Hasher { return theHasher } + // Hash computes a hash value for the given type t such that // Identical(t, t') => Hash(t) == Hash(t'). func (h Hasher) Hash(t types.Type) uint32 { - hash, ok := h.memo[t] - if !ok { - hash = h.hashFor(t) - h.memo[t] = hash - } - return hash + return hasher{inGenericSig: false}.hash(t) } +// hasher holds the state of a single Hash traversal: whether we are +// inside the signature of a generic function; this is used to +// optimize [hasher.hashTypeParam]. +type hasher struct{ inGenericSig bool } + // hashString computes the Fowler–Noll–Vo hash of s. func hashString(s string) uint32 { var h uint32 @@ -253,21 +218,21 @@ func hashString(s string) uint32 { return h } -// hashFor computes the hash of t. -func (h Hasher) hashFor(t types.Type) uint32 { +// hash computes the hash of t. +func (h hasher) hash(t types.Type) uint32 { // See Identical for rationale. switch t := t.(type) { case *types.Basic: return uint32(t.Kind()) - case *aliases.Alias: - return h.Hash(aliases.Unalias(t)) + case *types.Alias: + return h.hash(types.Unalias(t)) case *types.Array: - return 9043 + 2*uint32(t.Len()) + 3*h.Hash(t.Elem()) + return 9043 + 2*uint32(t.Len()) + 3*h.hash(t.Elem()) case *types.Slice: - return 9049 + 2*h.Hash(t.Elem()) + return 9049 + 2*h.hash(t.Elem()) case *types.Struct: var hash uint32 = 9059 @@ -278,12 +243,12 @@ func (h Hasher) hashFor(t types.Type) uint32 { } hash += hashString(t.Tag(i)) hash += hashString(f.Name()) // (ignore f.Pkg) - hash += h.Hash(f.Type()) + hash += h.hash(f.Type()) } return hash case *types.Pointer: - return 9067 + 2*h.Hash(t.Elem()) + return 9067 + 2*h.hash(t.Elem()) case *types.Signature: var hash uint32 = 9091 @@ -291,33 +256,11 @@ func (h Hasher) hashFor(t types.Type) uint32 { hash *= 8863 } - // Use a separate hasher for types inside of the signature, where type - // parameter identity is modified to be (index, constraint). We must use a - // new memo for this hasher as type identity may be affected by this - // masking. For example, in func[T any](*T), the identity of *T depends on - // whether we are mapping the argument in isolation, or recursively as part - // of hashing the signature. - // - // We should never encounter a generic signature while hashing another - // generic signature, but defensively set sigTParams only if h.mask is - // unset. tparams := t.TypeParams() - if h.sigTParams == nil && tparams.Len() != 0 { - h = Hasher{ - // There may be something more efficient than discarding the existing - // memo, but it would require detecting whether types are 'tainted' by - // references to type parameters. - memo: make(map[types.Type]uint32), - // Re-using ptrMap ensures that pointer identity is preserved in this - // hasher. - ptrMap: h.ptrMap, - sigTParams: tparams, - } - } - - for i := 0; i < tparams.Len(); i++ { + for i := range tparams.Len() { + h.inGenericSig = true tparam := tparams.At(i) - hash += 7 * h.Hash(tparam.Constraint()) + hash += 7 * h.hash(tparam.Constraint()) } return hash + 3*h.hashTuple(t.Params()) + 5*h.hashTuple(t.Results()) @@ -351,17 +294,17 @@ func (h Hasher) hashFor(t types.Type) uint32 { return hash case *types.Map: - return 9109 + 2*h.Hash(t.Key()) + 3*h.Hash(t.Elem()) + return 9109 + 2*h.hash(t.Key()) + 3*h.hash(t.Elem()) case *types.Chan: - return 9127 + 2*uint32(t.Dir()) + 3*h.Hash(t.Elem()) + return 9127 + 2*uint32(t.Dir()) + 3*h.hash(t.Elem()) case *types.Named: - hash := h.hashPtr(t.Obj()) + hash := h.hashTypeName(t.Obj()) targs := t.TypeArgs() for i := 0; i < targs.Len(); i++ { targ := targs.At(i) - hash += 2 * h.Hash(targ) + hash += 2 * h.hash(targ) } return hash @@ -375,17 +318,17 @@ func (h Hasher) hashFor(t types.Type) uint32 { panic(fmt.Sprintf("%T: %v", t, t)) } -func (h Hasher) hashTuple(tuple *types.Tuple) uint32 { +func (h hasher) hashTuple(tuple *types.Tuple) uint32 { // See go/types.identicalTypes for rationale. n := tuple.Len() hash := 9137 + 2*uint32(n) - for i := 0; i < n; i++ { - hash += 3 * h.Hash(tuple.At(i).Type()) + for i := range n { + hash += 3 * h.hash(tuple.At(i).Type()) } return hash } -func (h Hasher) hashUnion(t *types.Union) uint32 { +func (h hasher) hashUnion(t *types.Union) uint32 { // Hash type restrictions. terms, err := typeparams.UnionTermSet(t) // if err != nil t has invalid type restrictions. Fall back on a non-zero @@ -396,11 +339,11 @@ func (h Hasher) hashUnion(t *types.Union) uint32 { return h.hashTermSet(terms) } -func (h Hasher) hashTermSet(terms []*types.Term) uint32 { +func (h hasher) hashTermSet(terms []*types.Term) uint32 { hash := 9157 + 2*uint32(len(terms)) for _, term := range terms { // term order is not significant. - termHash := h.Hash(term.Type()) + termHash := h.hash(term.Type()) if term.Tilde() { termHash *= 9161 } @@ -409,36 +352,42 @@ func (h Hasher) hashTermSet(terms []*types.Term) uint32 { return hash } -// hashTypeParam returns a hash of the type parameter t, with a hash value -// depending on whether t is contained in h.sigTParams. -// -// If h.sigTParams is set and contains t, then we are in the process of hashing -// a signature, and the hash value of t must depend only on t's index and -// constraint: signatures are considered identical modulo type parameter -// renaming. To avoid infinite recursion, we only hash the type parameter -// index, and rely on types.Identical to handle signatures where constraints -// are not identical. -// -// Otherwise the hash of t depends only on t's pointer identity. -func (h Hasher) hashTypeParam(t *types.TypeParam) uint32 { - if h.sigTParams != nil { - i := t.Index() - if i >= 0 && i < h.sigTParams.Len() && t == h.sigTParams.At(i) { - return 9173 + 3*uint32(i) - } +// hashTypeParam returns the hash of a type parameter. +func (h hasher) hashTypeParam(t *types.TypeParam) uint32 { + // Within the signature of a generic function, TypeParams are + // identical if they have the same index and constraint, so we + // hash them based on index. + // + // When we are outside a generic function, free TypeParams are + // identical iff they are the same object, so we can use a + // more discriminating hash consistent with object identity. + // This optimization saves [Map] about 4% when hashing all the + // types.Info.Types in the forward closure of net/http. + if !h.inGenericSig { + // Optimization: outside a generic function signature, + // use a more discrimating hash consistent with object identity. + return h.hashTypeName(t.Obj()) } - return h.hashPtr(t.Obj()) + return 9173 + 3*uint32(t.Index()) } -// hashPtr hashes the pointer identity of ptr. It uses h.ptrMap to ensure that -// pointers values are not dependent on the GC. -func (h Hasher) hashPtr(ptr any) uint32 { - if hash, ok := h.ptrMap[ptr]; ok { - return hash - } - hash := uint32(reflect.ValueOf(ptr).Pointer()) - h.ptrMap[ptr] = hash - return hash +var theSeed = maphash.MakeSeed() + +// hashTypeName hashes the pointer of tname. +func (hasher) hashTypeName(tname *types.TypeName) uint32 { + // Since types.Identical uses == to compare TypeNames, + // the Hash function uses maphash.Comparable. + // TODO(adonovan): or will, when it becomes available in go1.24. + // In the meantime we use the pointer's numeric value. + // + // hash := maphash.Comparable(theSeed, tname) + // + // (Another approach would be to hash the name and package + // path, and whether or not it is a package-level typename. It + // is rare for a package to define multiple local types with + // the same name.) + hash := uintptr(unsafe.Pointer(tname)) + return uint32(hash ^ (hash >> 32)) } // shallowHash computes a hash of t without looking at any of its @@ -455,14 +404,14 @@ func (h Hasher) hashPtr(ptr any) uint32 { // include m itself; there is no mention of the named type X that // might help us break the cycle. // (See comment in go/types.identical, case *Interface, for more.) -func (h Hasher) shallowHash(t types.Type) uint32 { +func (h hasher) shallowHash(t types.Type) uint32 { // t is the type of an interface method (Signature), // its params or results (Tuples), or their immediate // elements (mostly Slice, Pointer, Basic, Named), // so there's no need to optimize anything else. switch t := t.(type) { - case *aliases.Alias: - return h.shallowHash(aliases.Unalias(t)) + case *types.Alias: + return h.shallowHash(types.Unalias(t)) case *types.Signature: var hash uint32 = 604171 @@ -476,7 +425,7 @@ func (h Hasher) shallowHash(t types.Type) uint32 { case *types.Tuple: n := t.Len() hash := 9137 + 2*uint32(n) - for i := 0; i < n; i++ { + for i := range n { hash += 53471161 * h.shallowHash(t.At(i).Type()) } return hash @@ -509,10 +458,10 @@ func (h Hasher) shallowHash(t types.Type) uint32 { return 9127 case *types.Named: - return h.hashPtr(t.Obj()) + return h.hashTypeName(t.Obj()) case *types.TypeParam: - return h.hashPtr(t.Obj()) + return h.hashTypeParam(t) } panic(fmt.Sprintf("shallowHash: %T: %v", t, t)) } diff --git a/sdk/vendor/golang.org/x/tools/go/types/typeutil/methodsetcache.go b/sdk/vendor/golang.org/x/tools/go/types/typeutil/methodsetcache.go index bd71aafaaa..f7666028fe 100644 --- a/sdk/vendor/golang.org/x/tools/go/types/typeutil/methodsetcache.go +++ b/sdk/vendor/golang.org/x/tools/go/types/typeutil/methodsetcache.go @@ -9,8 +9,6 @@ package typeutil import ( "go/types" "sync" - - "golang.org/x/tools/internal/aliases" ) // A MethodSetCache records the method set of each type T for which @@ -34,12 +32,12 @@ func (cache *MethodSetCache) MethodSet(T types.Type) *types.MethodSet { cache.mu.Lock() defer cache.mu.Unlock() - switch T := aliases.Unalias(T).(type) { + switch T := types.Unalias(T).(type) { case *types.Named: return cache.lookupNamed(T).value case *types.Pointer: - if N, ok := aliases.Unalias(T.Elem()).(*types.Named); ok { + if N, ok := types.Unalias(T.Elem()).(*types.Named); ok { return cache.lookupNamed(N).pointer } } diff --git a/sdk/vendor/golang.org/x/tools/go/types/typeutil/ui.go b/sdk/vendor/golang.org/x/tools/go/types/typeutil/ui.go index a0c1a60ac0..9dda6a25df 100644 --- a/sdk/vendor/golang.org/x/tools/go/types/typeutil/ui.go +++ b/sdk/vendor/golang.org/x/tools/go/types/typeutil/ui.go @@ -8,8 +8,6 @@ package typeutil import ( "go/types" - - "golang.org/x/tools/internal/aliases" ) // IntuitiveMethodSet returns the intuitive method set of a type T, @@ -28,7 +26,7 @@ import ( // The order of the result is as for types.MethodSet(T). func IntuitiveMethodSet(T types.Type, msets *MethodSetCache) []*types.Selection { isPointerToConcrete := func(T types.Type) bool { - ptr, ok := aliases.Unalias(T).(*types.Pointer) + ptr, ok := types.Unalias(T).(*types.Pointer) return ok && !types.IsInterface(ptr.Elem()) } diff --git a/sdk/vendor/golang.org/x/tools/internal/aliases/aliases.go b/sdk/vendor/golang.org/x/tools/internal/aliases/aliases.go index f7798e3354..b9425f5a20 100644 --- a/sdk/vendor/golang.org/x/tools/internal/aliases/aliases.go +++ b/sdk/vendor/golang.org/x/tools/internal/aliases/aliases.go @@ -28,7 +28,7 @@ import ( func NewAlias(enabled bool, pos token.Pos, pkg *types.Package, name string, rhs types.Type, tparams []*types.TypeParam) *types.TypeName { if enabled { tname := types.NewTypeName(pos, pkg, name, nil) - newAlias(tname, rhs, tparams) + SetTypeParams(types.NewAlias(tname, rhs), tparams) return tname } if len(tparams) > 0 { diff --git a/sdk/vendor/golang.org/x/tools/internal/aliases/aliases_go121.go b/sdk/vendor/golang.org/x/tools/internal/aliases/aliases_go121.go deleted file mode 100644 index a775fcc4be..0000000000 --- a/sdk/vendor/golang.org/x/tools/internal/aliases/aliases_go121.go +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2024 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 !go1.22 -// +build !go1.22 - -package aliases - -import ( - "go/types" -) - -// Alias is a placeholder for a go/types.Alias for <=1.21. -// It will never be created by go/types. -type Alias struct{} - -func (*Alias) String() string { panic("unreachable") } -func (*Alias) Underlying() types.Type { panic("unreachable") } -func (*Alias) Obj() *types.TypeName { panic("unreachable") } -func Rhs(alias *Alias) types.Type { panic("unreachable") } -func TypeParams(alias *Alias) *types.TypeParamList { panic("unreachable") } -func SetTypeParams(alias *Alias, tparams []*types.TypeParam) { panic("unreachable") } -func TypeArgs(alias *Alias) *types.TypeList { panic("unreachable") } -func Origin(alias *Alias) *Alias { panic("unreachable") } - -// Unalias returns the type t for go <=1.21. -func Unalias(t types.Type) types.Type { return t } - -func newAlias(name *types.TypeName, rhs types.Type, tparams []*types.TypeParam) *Alias { - panic("unreachable") -} - -// Enabled reports whether [NewAlias] should create [types.Alias] types. -// -// Before go1.22, this function always returns false. -func Enabled() bool { return false } diff --git a/sdk/vendor/golang.org/x/tools/internal/aliases/aliases_go122.go b/sdk/vendor/golang.org/x/tools/internal/aliases/aliases_go122.go index 31c159e42e..7716a3331d 100644 --- a/sdk/vendor/golang.org/x/tools/internal/aliases/aliases_go122.go +++ b/sdk/vendor/golang.org/x/tools/internal/aliases/aliases_go122.go @@ -2,9 +2,6 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:build go1.22 -// +build go1.22 - package aliases import ( @@ -14,22 +11,19 @@ import ( "go/types" ) -// Alias is an alias of types.Alias. -type Alias = types.Alias - // Rhs returns the type on the right-hand side of the alias declaration. -func Rhs(alias *Alias) types.Type { +func Rhs(alias *types.Alias) types.Type { if alias, ok := any(alias).(interface{ Rhs() types.Type }); ok { return alias.Rhs() // go1.23+ } // go1.22's Alias didn't have the Rhs method, // so Unalias is the best we can do. - return Unalias(alias) + return types.Unalias(alias) } // TypeParams returns the type parameter list of the alias. -func TypeParams(alias *Alias) *types.TypeParamList { +func TypeParams(alias *types.Alias) *types.TypeParamList { if alias, ok := any(alias).(interface{ TypeParams() *types.TypeParamList }); ok { return alias.TypeParams() // go1.23+ } @@ -37,7 +31,7 @@ func TypeParams(alias *Alias) *types.TypeParamList { } // SetTypeParams sets the type parameters of the alias type. -func SetTypeParams(alias *Alias, tparams []*types.TypeParam) { +func SetTypeParams(alias *types.Alias, tparams []*types.TypeParam) { if alias, ok := any(alias).(interface { SetTypeParams(tparams []*types.TypeParam) }); ok { @@ -48,7 +42,7 @@ func SetTypeParams(alias *Alias, tparams []*types.TypeParam) { } // TypeArgs returns the type arguments used to instantiate the Alias type. -func TypeArgs(alias *Alias) *types.TypeList { +func TypeArgs(alias *types.Alias) *types.TypeList { if alias, ok := any(alias).(interface{ TypeArgs() *types.TypeList }); ok { return alias.TypeArgs() // go1.23+ } @@ -57,25 +51,13 @@ func TypeArgs(alias *Alias) *types.TypeList { // Origin returns the generic Alias type of which alias is an instance. // If alias is not an instance of a generic alias, Origin returns alias. -func Origin(alias *Alias) *Alias { +func Origin(alias *types.Alias) *types.Alias { if alias, ok := any(alias).(interface{ Origin() *types.Alias }); ok { return alias.Origin() // go1.23+ } return alias // not an instance of a generic alias (go1.22) } -// Unalias is a wrapper of types.Unalias. -func Unalias(t types.Type) types.Type { return types.Unalias(t) } - -// newAlias is an internal alias around types.NewAlias. -// Direct usage is discouraged as the moment. -// Try to use NewAlias instead. -func newAlias(tname *types.TypeName, rhs types.Type, tparams []*types.TypeParam) *Alias { - a := types.NewAlias(tname, rhs) - SetTypeParams(a, tparams) - return a -} - // Enabled reports whether [NewAlias] should create [types.Alias] types. // // This function is expensive! Call it sparingly. @@ -91,7 +73,7 @@ func Enabled() bool { // many tests. Therefore any attempt to cache the result // is just incorrect. fset := token.NewFileSet() - f, _ := parser.ParseFile(fset, "a.go", "package p; type A = int", 0) + f, _ := parser.ParseFile(fset, "a.go", "package p; type A = int", parser.SkipObjectResolution) pkg, _ := new(types.Config).Check("p", fset, []*ast.File{f}, nil) _, enabled := pkg.Scope().Lookup("A").Type().(*types.Alias) return enabled diff --git a/sdk/vendor/golang.org/x/tools/internal/gcimporter/bimport.go b/sdk/vendor/golang.org/x/tools/internal/gcimporter/bimport.go index d98b0db2a9..d79a605ed1 100644 --- a/sdk/vendor/golang.org/x/tools/internal/gcimporter/bimport.go +++ b/sdk/vendor/golang.org/x/tools/internal/gcimporter/bimport.go @@ -87,64 +87,3 @@ func chanDir(d int) types.ChanDir { return 0 } } - -var predeclOnce sync.Once -var predecl []types.Type // initialized lazily - -func predeclared() []types.Type { - predeclOnce.Do(func() { - // initialize lazily to be sure that all - // elements have been initialized before - predecl = []types.Type{ // basic types - types.Typ[types.Bool], - types.Typ[types.Int], - types.Typ[types.Int8], - types.Typ[types.Int16], - types.Typ[types.Int32], - types.Typ[types.Int64], - types.Typ[types.Uint], - types.Typ[types.Uint8], - types.Typ[types.Uint16], - types.Typ[types.Uint32], - types.Typ[types.Uint64], - types.Typ[types.Uintptr], - types.Typ[types.Float32], - types.Typ[types.Float64], - types.Typ[types.Complex64], - types.Typ[types.Complex128], - types.Typ[types.String], - - // basic type aliases - types.Universe.Lookup("byte").Type(), - types.Universe.Lookup("rune").Type(), - - // error - types.Universe.Lookup("error").Type(), - - // untyped types - types.Typ[types.UntypedBool], - types.Typ[types.UntypedInt], - types.Typ[types.UntypedRune], - types.Typ[types.UntypedFloat], - types.Typ[types.UntypedComplex], - types.Typ[types.UntypedString], - types.Typ[types.UntypedNil], - - // package unsafe - types.Typ[types.UnsafePointer], - - // invalid type - types.Typ[types.Invalid], // only appears in packages with errors - - // used internally by gc; never used by this package or in .a files - anyType{}, - } - predecl = append(predecl, additionalPredeclared()...) - }) - return predecl -} - -type anyType struct{} - -func (t anyType) Underlying() types.Type { return t } -func (t anyType) String() string { return "any" } diff --git a/sdk/vendor/golang.org/x/tools/internal/gcimporter/exportdata.go b/sdk/vendor/golang.org/x/tools/internal/gcimporter/exportdata.go index f6437feb1c..5662a311da 100644 --- a/sdk/vendor/golang.org/x/tools/internal/gcimporter/exportdata.go +++ b/sdk/vendor/golang.org/x/tools/internal/gcimporter/exportdata.go @@ -2,49 +2,183 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// This file is a copy of $GOROOT/src/go/internal/gcimporter/exportdata.go. - -// This file implements FindExportData. +// This file should be kept in sync with $GOROOT/src/internal/exportdata/exportdata.go. +// This file also additionally implements FindExportData for gcexportdata.NewReader. package gcimporter import ( "bufio" + "bytes" + "errors" "fmt" + "go/build" "io" - "strconv" + "os" + "os/exec" + "path/filepath" "strings" + "sync" ) -func readGopackHeader(r *bufio.Reader) (name string, size int64, err error) { - // See $GOROOT/include/ar.h. - hdr := make([]byte, 16+12+6+6+8+10+2) - _, err = io.ReadFull(r, hdr) +// FindExportData positions the reader r at the beginning of the +// export data section of an underlying cmd/compile created archive +// file by reading from it. The reader must be positioned at the +// start of the file before calling this function. +// This returns the length of the export data in bytes. +// +// This function is needed by [gcexportdata.Read], which must +// accept inputs produced by the last two releases of cmd/compile, +// plus tip. +func FindExportData(r *bufio.Reader) (size int64, err error) { + arsize, err := FindPackageDefinition(r) + if err != nil { + return + } + size = int64(arsize) + + objapi, headers, err := ReadObjectHeaders(r) if err != nil { return } - // leave for debugging - if false { - fmt.Printf("header: %s", hdr) + size -= int64(len(objapi)) + for _, h := range headers { + size -= int64(len(h)) + } + + // Check for the binary export data section header "$$B\n". + // TODO(taking): Unify with ReadExportDataHeader so that it stops at the 'u' instead of reading + line, err := r.ReadSlice('\n') + if err != nil { + return + } + hdr := string(line) + if hdr != "$$B\n" { + err = fmt.Errorf("unknown export data header: %q", hdr) + return } - s := strings.TrimSpace(string(hdr[16+12+6+6+8:][:10])) - length, err := strconv.Atoi(s) - size = int64(length) - if err != nil || hdr[len(hdr)-2] != '`' || hdr[len(hdr)-1] != '\n' { - err = fmt.Errorf("invalid archive header") + size -= int64(len(hdr)) + + // For files with a binary export data header "$$B\n", + // these are always terminated by an end-of-section marker "\n$$\n". + // So the last bytes must always be this constant. + // + // The end-of-section marker is not a part of the export data itself. + // Do not include these in size. + // + // It would be nice to have sanity check that the final bytes after + // the export data are indeed the end-of-section marker. The split + // of gcexportdata.NewReader and gcexportdata.Read make checking this + // ugly so gcimporter gives up enforcing this. The compiler and go/types + // importer do enforce this, which seems good enough. + const endofsection = "\n$$\n" + size -= int64(len(endofsection)) + + if size < 0 { + err = fmt.Errorf("invalid size (%d) in the archive file: %d bytes remain without section headers (recompile package)", arsize, size) return } - name = strings.TrimSpace(string(hdr[:16])) + return } -// FindExportData positions the reader r at the beginning of the -// export data section of an underlying GC-created object/archive -// file by reading from it. The reader must be positioned at the -// start of the file before calling this function. The hdr result -// is the string before the export data, either "$$" or "$$B". -// The size result is the length of the export data in bytes, or -1 if not known. -func FindExportData(r *bufio.Reader) (hdr string, size int64, err error) { +// ReadUnified reads the contents of the unified export data from a reader r +// that contains the contents of a GC-created archive file. +// +// On success, the reader will be positioned after the end-of-section marker "\n$$\n". +// +// Supported GC-created archive files have 4 layers of nesting: +// - An archive file containing a package definition file. +// - The package definition file contains headers followed by a data section. +// Headers are lines (≤ 4kb) that do not start with "$$". +// - The data section starts with "$$B\n" followed by export data followed +// by an end of section marker "\n$$\n". (The section start "$$\n" is no +// longer supported.) +// - The export data starts with a format byte ('u') followed by the in +// the given format. (See ReadExportDataHeader for older formats.) +// +// Putting this together, the bytes in a GC-created archive files are expected +// to look like the following. +// See cmd/internal/archive for more details on ar file headers. +// +// | \n | ar file signature +// | __.PKGDEF...size...\n | ar header for __.PKGDEF including size. +// | go object <...>\n | objabi header +// | \n | other headers such as build id +// | $$B\n | binary format marker +// | u\n | unified export +// | $$\n | end-of-section marker +// | [optional padding] | padding byte (0x0A) if size is odd +// | [ar file header] | other ar files +// | [ar file data] | +func ReadUnified(r *bufio.Reader) (data []byte, err error) { + // We historically guaranteed headers at the default buffer size (4096) work. + // This ensures we can use ReadSlice throughout. + const minBufferSize = 4096 + r = bufio.NewReaderSize(r, minBufferSize) + + size, err := FindPackageDefinition(r) + if err != nil { + return + } + n := size + + objapi, headers, err := ReadObjectHeaders(r) + if err != nil { + return + } + n -= len(objapi) + for _, h := range headers { + n -= len(h) + } + + hdrlen, err := ReadExportDataHeader(r) + if err != nil { + return + } + n -= hdrlen + + // size also includes the end of section marker. Remove that many bytes from the end. + const marker = "\n$$\n" + n -= len(marker) + + if n < 0 { + err = fmt.Errorf("invalid size (%d) in the archive file: %d bytes remain without section headers (recompile package)", size, n) + return + } + + // Read n bytes from buf. + data = make([]byte, n) + _, err = io.ReadFull(r, data) + if err != nil { + return + } + + // Check for marker at the end. + var suffix [len(marker)]byte + _, err = io.ReadFull(r, suffix[:]) + if err != nil { + return + } + if s := string(suffix[:]); s != marker { + err = fmt.Errorf("read %q instead of end-of-section marker (%q)", s, marker) + return + } + + return +} + +// FindPackageDefinition positions the reader r at the beginning of a package +// definition file ("__.PKGDEF") within a GC-created archive by reading +// from it, and returns the size of the package definition file in the archive. +// +// The reader must be positioned at the start of the archive file before calling +// this function, and "__.PKGDEF" is assumed to be the first file in the archive. +// +// See cmd/internal/archive for details on the archive format. +func FindPackageDefinition(r *bufio.Reader) (size int, err error) { + // Uses ReadSlice to limit risk of malformed inputs. + // Read first line to make sure this is an object file. line, err := r.ReadSlice('\n') if err != nil { @@ -52,48 +186,236 @@ func FindExportData(r *bufio.Reader) (hdr string, size int64, err error) { return } - if string(line) == "!\n" { - // Archive file. Scan to __.PKGDEF. - var name string - if name, size, err = readGopackHeader(r); err != nil { - return - } + // Is the first line an archive file signature? + if string(line) != "!\n" { + err = fmt.Errorf("not the start of an archive file (%q)", line) + return + } + + // package export block should be first + size = readArchiveHeader(r, "__.PKGDEF") + if size <= 0 { + err = fmt.Errorf("not a package file") + return + } + + return +} - // First entry should be __.PKGDEF. - if name != "__.PKGDEF" { - err = fmt.Errorf("go archive is missing __.PKGDEF") +// ReadObjectHeaders reads object headers from the reader. Object headers are +// lines that do not start with an end-of-section marker "$$". The first header +// is the objabi header. On success, the reader will be positioned at the beginning +// of the end-of-section marker. +// +// It returns an error if any header does not fit in r.Size() bytes. +func ReadObjectHeaders(r *bufio.Reader) (objapi string, headers []string, err error) { + // line is a temporary buffer for headers. + // Use bounded reads (ReadSlice, Peek) to limit risk of malformed inputs. + var line []byte + + // objapi header should be the first line + if line, err = r.ReadSlice('\n'); err != nil { + err = fmt.Errorf("can't find export data (%v)", err) + return + } + objapi = string(line) + + // objapi header begins with "go object ". + if !strings.HasPrefix(objapi, "go object ") { + err = fmt.Errorf("not a go object file: %s", objapi) + return + } + + // process remaining object header lines + for { + // check for an end of section marker "$$" + line, err = r.Peek(2) + if err != nil { return } + if string(line) == "$$" { + return // stop + } - // Read first line of __.PKGDEF data, so that line - // is once again the first line of the input. - if line, err = r.ReadSlice('\n'); err != nil { - err = fmt.Errorf("can't find export data (%v)", err) + // read next header + line, err = r.ReadSlice('\n') + if err != nil { return } - size -= int64(len(line)) + headers = append(headers, string(line)) } +} - // Now at __.PKGDEF in archive or still at beginning of file. - // Either way, line should begin with "go object ". - if !strings.HasPrefix(string(line), "go object ") { - err = fmt.Errorf("not a Go object file") +// ReadExportDataHeader reads the export data header and format from r. +// It returns the number of bytes read, or an error if the format is no longer +// supported or it failed to read. +// +// The only currently supported format is binary export data in the +// unified export format. +func ReadExportDataHeader(r *bufio.Reader) (n int, err error) { + // Read export data header. + line, err := r.ReadSlice('\n') + if err != nil { return } - // Skip over object header to export data. - // Begins after first line starting with $$. - for line[0] != '$' { - if line, err = r.ReadSlice('\n'); err != nil { - err = fmt.Errorf("can't find export data (%v)", err) + hdr := string(line) + switch hdr { + case "$$\n": + err = fmt.Errorf("old textual export format no longer supported (recompile package)") + return + + case "$$B\n": + var format byte + format, err = r.ReadByte() + if err != nil { return } - size -= int64(len(line)) - } - hdr = string(line) - if size < 0 { - size = -1 + // The unified export format starts with a 'u'. + switch format { + case 'u': + default: + // Older no longer supported export formats include: + // indexed export format which started with an 'i'; and + // the older binary export format which started with a 'c', + // 'd', or 'v' (from "version"). + err = fmt.Errorf("binary export format %q is no longer supported (recompile package)", format) + return + } + + default: + err = fmt.Errorf("unknown export data header: %q", hdr) + return } + n = len(hdr) + 1 // + 1 is for 'u' return } + +// FindPkg returns the filename and unique package id for an import +// path based on package information provided by build.Import (using +// the build.Default build.Context). A relative srcDir is interpreted +// relative to the current working directory. +// +// FindPkg is only used in tests within x/tools. +func FindPkg(path, srcDir string) (filename, id string, err error) { + // TODO(taking): Move internal/exportdata.FindPkg into its own file, + // and then this copy into a _test package. + if path == "" { + return "", "", errors.New("path is empty") + } + + var noext string + switch { + default: + // "x" -> "$GOPATH/pkg/$GOOS_$GOARCH/x.ext", "x" + // Don't require the source files to be present. + if abs, err := filepath.Abs(srcDir); err == nil { // see issue 14282 + srcDir = abs + } + var bp *build.Package + bp, err = build.Import(path, srcDir, build.FindOnly|build.AllowBinary) + if bp.PkgObj == "" { + if bp.Goroot && bp.Dir != "" { + filename, err = lookupGorootExport(bp.Dir) + if err == nil { + _, err = os.Stat(filename) + } + if err == nil { + return filename, bp.ImportPath, nil + } + } + goto notfound + } else { + noext = strings.TrimSuffix(bp.PkgObj, ".a") + } + id = bp.ImportPath + + case build.IsLocalImport(path): + // "./x" -> "/this/directory/x.ext", "/this/directory/x" + noext = filepath.Join(srcDir, path) + id = noext + + case filepath.IsAbs(path): + // for completeness only - go/build.Import + // does not support absolute imports + // "/x" -> "/x.ext", "/x" + noext = path + id = path + } + + if false { // for debugging + if path != id { + fmt.Printf("%s -> %s\n", path, id) + } + } + + // try extensions + for _, ext := range pkgExts { + filename = noext + ext + f, statErr := os.Stat(filename) + if statErr == nil && !f.IsDir() { + return filename, id, nil + } + if err == nil { + err = statErr + } + } + +notfound: + if err == nil { + return "", path, fmt.Errorf("can't find import: %q", path) + } + return "", path, fmt.Errorf("can't find import: %q: %w", path, err) +} + +var pkgExts = [...]string{".a", ".o"} // a file from the build cache will have no extension + +var exportMap sync.Map // package dir → func() (string, error) + +// lookupGorootExport returns the location of the export data +// (normally found in the build cache, but located in GOROOT/pkg +// in prior Go releases) for the package located in pkgDir. +// +// (We use the package's directory instead of its import path +// mainly to simplify handling of the packages in src/vendor +// and cmd/vendor.) +// +// lookupGorootExport is only used in tests within x/tools. +func lookupGorootExport(pkgDir string) (string, error) { + f, ok := exportMap.Load(pkgDir) + if !ok { + var ( + listOnce sync.Once + exportPath string + err error + ) + f, _ = exportMap.LoadOrStore(pkgDir, func() (string, error) { + listOnce.Do(func() { + cmd := exec.Command(filepath.Join(build.Default.GOROOT, "bin", "go"), "list", "-export", "-f", "{{.Export}}", pkgDir) + cmd.Dir = build.Default.GOROOT + cmd.Env = append(os.Environ(), "PWD="+cmd.Dir, "GOROOT="+build.Default.GOROOT) + var output []byte + output, err = cmd.Output() + if err != nil { + if ee, ok := err.(*exec.ExitError); ok && len(ee.Stderr) > 0 { + err = errors.New(string(ee.Stderr)) + } + return + } + + exports := strings.Split(string(bytes.TrimSpace(output)), "\n") + if len(exports) != 1 { + err = fmt.Errorf("go list reported %d exports; expected 1", len(exports)) + return + } + + exportPath = exports[0] + }) + + return exportPath, err + }) + } + + return f.(func() (string, error))() +} diff --git a/sdk/vendor/golang.org/x/tools/internal/gcimporter/gcimporter.go b/sdk/vendor/golang.org/x/tools/internal/gcimporter/gcimporter.go index 39df91124a..3dbd21d1b9 100644 --- a/sdk/vendor/golang.org/x/tools/internal/gcimporter/gcimporter.go +++ b/sdk/vendor/golang.org/x/tools/internal/gcimporter/gcimporter.go @@ -23,17 +23,11 @@ package gcimporter // import "golang.org/x/tools/internal/gcimporter" import ( "bufio" - "bytes" "fmt" - "go/build" "go/token" "go/types" "io" "os" - "os/exec" - "path/filepath" - "strings" - "sync" ) const ( @@ -45,125 +39,14 @@ const ( trace = false ) -var exportMap sync.Map // package dir → func() (string, bool) - -// lookupGorootExport returns the location of the export data -// (normally found in the build cache, but located in GOROOT/pkg -// in prior Go releases) for the package located in pkgDir. -// -// (We use the package's directory instead of its import path -// mainly to simplify handling of the packages in src/vendor -// and cmd/vendor.) -func lookupGorootExport(pkgDir string) (string, bool) { - f, ok := exportMap.Load(pkgDir) - if !ok { - var ( - listOnce sync.Once - exportPath string - ) - f, _ = exportMap.LoadOrStore(pkgDir, func() (string, bool) { - listOnce.Do(func() { - cmd := exec.Command("go", "list", "-export", "-f", "{{.Export}}", pkgDir) - cmd.Dir = build.Default.GOROOT - var output []byte - output, err := cmd.Output() - if err != nil { - return - } - - exports := strings.Split(string(bytes.TrimSpace(output)), "\n") - if len(exports) != 1 { - return - } - - exportPath = exports[0] - }) - - return exportPath, exportPath != "" - }) - } - - return f.(func() (string, bool))() -} - -var pkgExts = [...]string{".a", ".o"} - -// FindPkg returns the filename and unique package id for an import -// path based on package information provided by build.Import (using -// the build.Default build.Context). A relative srcDir is interpreted -// relative to the current working directory. -// If no file was found, an empty filename is returned. -func FindPkg(path, srcDir string) (filename, id string) { - if path == "" { - return - } - - var noext string - switch { - default: - // "x" -> "$GOPATH/pkg/$GOOS_$GOARCH/x.ext", "x" - // Don't require the source files to be present. - if abs, err := filepath.Abs(srcDir); err == nil { // see issue 14282 - srcDir = abs - } - bp, _ := build.Import(path, srcDir, build.FindOnly|build.AllowBinary) - if bp.PkgObj == "" { - var ok bool - if bp.Goroot && bp.Dir != "" { - filename, ok = lookupGorootExport(bp.Dir) - } - if !ok { - id = path // make sure we have an id to print in error message - return - } - } else { - noext = strings.TrimSuffix(bp.PkgObj, ".a") - id = bp.ImportPath - } - - case build.IsLocalImport(path): - // "./x" -> "/this/directory/x.ext", "/this/directory/x" - noext = filepath.Join(srcDir, path) - id = noext - - case filepath.IsAbs(path): - // for completeness only - go/build.Import - // does not support absolute imports - // "/x" -> "/x.ext", "/x" - noext = path - id = path - } - - if false { // for debugging - if path != id { - fmt.Printf("%s -> %s\n", path, id) - } - } - - if filename != "" { - if f, err := os.Stat(filename); err == nil && !f.IsDir() { - return - } - } - - // try extensions - for _, ext := range pkgExts { - filename = noext + ext - if f, err := os.Stat(filename); err == nil && !f.IsDir() { - return - } - } - - filename = "" // not found - return -} - // Import imports a gc-generated package given its import path and srcDir, adds // the corresponding package object to the packages map, and returns the object. // The packages map must contain all packages already imported. -func Import(packages map[string]*types.Package, path, srcDir string, lookup func(path string) (io.ReadCloser, error)) (pkg *types.Package, err error) { +// +// Import is only used in tests. +func Import(fset *token.FileSet, packages map[string]*types.Package, path, srcDir string, lookup func(path string) (io.ReadCloser, error)) (pkg *types.Package, err error) { var rc io.ReadCloser - var filename, id string + var id string if lookup != nil { // With custom lookup specified, assume that caller has // converted path to a canonical import path for use in the map. @@ -182,12 +65,13 @@ func Import(packages map[string]*types.Package, path, srcDir string, lookup func } rc = f } else { - filename, id = FindPkg(path, srcDir) + var filename string + filename, id, err = FindPkg(path, srcDir) if filename == "" { if path == "unsafe" { return types.Unsafe, nil } - return nil, fmt.Errorf("can't find import: %q", id) + return nil, err } // no need to re-import if the package was imported completely before @@ -210,57 +94,15 @@ func Import(packages map[string]*types.Package, path, srcDir string, lookup func } defer rc.Close() - var hdr string - var size int64 buf := bufio.NewReader(rc) - if hdr, size, err = FindExportData(buf); err != nil { + data, err := ReadUnified(buf) + if err != nil { + err = fmt.Errorf("import %q: %v", path, err) return } - switch hdr { - case "$$B\n": - var data []byte - data, err = io.ReadAll(buf) - if err != nil { - break - } - - // TODO(gri): allow clients of go/importer to provide a FileSet. - // Or, define a new standard go/types/gcexportdata package. - fset := token.NewFileSet() - - // Select appropriate importer. - if len(data) > 0 { - switch data[0] { - case 'v', 'c', 'd': // binary, till go1.10 - return nil, fmt.Errorf("binary (%c) import format is no longer supported", data[0]) - - case 'i': // indexed, till go1.19 - _, pkg, err := IImportData(fset, packages, data[1:], id) - return pkg, err - - case 'u': // unified, from go1.20 - _, pkg, err := UImportData(fset, packages, data[1:size], id) - return pkg, err - - default: - l := len(data) - if l > 10 { - l = 10 - } - return nil, fmt.Errorf("unexpected export data with prefix %q for path %s", string(data[:l]), id) - } - } - - default: - err = fmt.Errorf("unknown export data header: %q", hdr) - } + // unified: emitted by cmd/compile since go1.20. + _, pkg, err = UImportData(fset, packages, data, id) return } - -type byPath []*types.Package - -func (a byPath) Len() int { return len(a) } -func (a byPath) Swap(i, j int) { a[i], a[j] = a[j], a[i] } -func (a byPath) Less(i, j int) bool { return a[i].Path() < a[j].Path() } diff --git a/sdk/vendor/golang.org/x/tools/internal/gcimporter/iexport.go b/sdk/vendor/golang.org/x/tools/internal/gcimporter/iexport.go index 5f283281a2..7dfc31a37d 100644 --- a/sdk/vendor/golang.org/x/tools/internal/gcimporter/iexport.go +++ b/sdk/vendor/golang.org/x/tools/internal/gcimporter/iexport.go @@ -242,11 +242,30 @@ import ( "golang.org/x/tools/go/types/objectpath" "golang.org/x/tools/internal/aliases" - "golang.org/x/tools/internal/tokeninternal" ) // IExportShallow encodes "shallow" export data for the specified package. // +// For types, we use "shallow" export data. Historically, the Go +// compiler always produced a summary of the types for a given package +// that included types from other packages that it indirectly +// referenced: "deep" export data. This had the advantage that the +// compiler (and analogous tools such as gopls) need only load one +// file per direct import. However, it meant that the files tended to +// get larger based on the level of the package in the import +// graph. For example, higher-level packages in the kubernetes module +// have over 1MB of "deep" export data, even when they have almost no +// content of their own, merely because they mention a major type that +// references many others. In pathological cases the export data was +// 300x larger than the source for a package due to this quadratic +// growth. +// +// "Shallow" export data means that the serialized types describe only +// a single package. If those types mention types from other packages, +// the type checker may need to request additional packages beyond +// just the direct imports. Type information for the entire transitive +// closure of imports is provided (lazily) by the DAG. +// // No promises are made about the encoding other than that it can be decoded by // the same version of IIExportShallow. If you plan to save export data in the // file system, be sure to include a cryptographic digest of the executable in @@ -269,8 +288,8 @@ func IExportShallow(fset *token.FileSet, pkg *types.Package, reportf ReportFunc) } // IImportShallow decodes "shallow" types.Package data encoded by -// IExportShallow in the same executable. This function cannot import data from -// cmd/compile or gcexportdata.Write. +// [IExportShallow] in the same executable. This function cannot import data +// from cmd/compile or gcexportdata.Write. // // The importer calls getPackages to obtain package symbols for all // packages mentioned in the export data, including the one being @@ -441,7 +460,7 @@ func (p *iexporter) encodeFile(w *intWriter, file *token.File, needed []uint64) // Sort the set of needed offsets. Duplicates are harmless. sort.Slice(needed, func(i, j int) bool { return needed[i] < needed[j] }) - lines := tokeninternal.GetLines(file) // byte offset of each line start + lines := file.Lines() // byte offset of each line start w.uint64(uint64(len(lines))) // Rather than record the entire array of line start offsets, @@ -725,13 +744,13 @@ func (p *iexporter) doDecl(obj types.Object) { case *types.TypeName: t := obj.Type() - if tparam, ok := aliases.Unalias(t).(*types.TypeParam); ok { + if tparam, ok := types.Unalias(t).(*types.TypeParam); ok { w.tag(typeParamTag) w.pos(obj.Pos()) constraint := tparam.Constraint() if p.version >= iexportVersionGo1_18 { implicit := false - if iface, _ := aliases.Unalias(constraint).(*types.Interface); iface != nil { + if iface, _ := types.Unalias(constraint).(*types.Interface); iface != nil { implicit = iface.IsImplicit() } w.bool(implicit) @@ -741,7 +760,7 @@ func (p *iexporter) doDecl(obj types.Object) { } if obj.IsAlias() { - alias, materialized := t.(*aliases.Alias) // may fail when aliases are not enabled + alias, materialized := t.(*types.Alias) // may fail when aliases are not enabled var tparams *types.TypeParamList if materialized { @@ -975,7 +994,7 @@ func (w *exportWriter) doTyp(t types.Type, pkg *types.Package) { }() } switch t := t.(type) { - case *aliases.Alias: + case *types.Alias: if targs := aliases.TypeArgs(t); targs.Len() > 0 { w.startType(instanceType) w.pos(t.Obj().Pos()) @@ -1091,7 +1110,7 @@ func (w *exportWriter) doTyp(t types.Type, pkg *types.Package) { for i := 0; i < n; i++ { ft := t.EmbeddedType(i) tPkg := pkg - if named, _ := aliases.Unalias(ft).(*types.Named); named != nil { + if named, _ := types.Unalias(ft).(*types.Named); named != nil { w.pos(named.Obj().Pos()) } else { w.pos(token.NoPos) diff --git a/sdk/vendor/golang.org/x/tools/internal/gcimporter/iimport.go b/sdk/vendor/golang.org/x/tools/internal/gcimporter/iimport.go index ed2d562959..69b1d697cb 100644 --- a/sdk/vendor/golang.org/x/tools/internal/gcimporter/iimport.go +++ b/sdk/vendor/golang.org/x/tools/internal/gcimporter/iimport.go @@ -5,8 +5,6 @@ // Indexed package import. // See iexport.go for the export data format. -// This file is a copy of $GOROOT/src/go/internal/gcimporter/iimport.go. - package gcimporter import ( @@ -53,6 +51,7 @@ const ( iexportVersionPosCol = 1 iexportVersionGo1_18 = 2 iexportVersionGenerics = 2 + iexportVersion = iexportVersionGenerics iexportVersionCurrent = 2 ) @@ -540,7 +539,7 @@ func canReuse(def *types.Named, rhs types.Type) bool { if def == nil { return true } - iface, _ := aliases.Unalias(rhs).(*types.Interface) + iface, _ := types.Unalias(rhs).(*types.Interface) if iface == nil { return true } @@ -557,6 +556,14 @@ type importReader struct { prevColumn int64 } +// markBlack is redefined in iimport_go123.go, to work around golang/go#69912. +// +// If TypeNames are not marked black (in the sense of go/types cycle +// detection), they may be mutated when dot-imported. Fix this by punching a +// hole through the type, when compiling with Go 1.23. (The bug has been fixed +// for 1.24, but the fix was not worth back-porting). +var markBlack = func(name *types.TypeName) {} + func (r *importReader) obj(name string) { tag := r.byte() pos := r.pos() @@ -569,6 +576,7 @@ func (r *importReader) obj(name string) { } typ := r.typ() obj := aliases.NewAlias(r.p.aliases, pos, r.currPkg, name, typ, tparams) + markBlack(obj) // workaround for golang/go#69912 r.declare(obj) case constTag: @@ -589,6 +597,9 @@ func (r *importReader) obj(name string) { // declaration before recursing. obj := types.NewTypeName(pos, r.currPkg, name, nil) named := types.NewNamed(obj, nil, nil) + + markBlack(obj) // workaround for golang/go#69912 + // Declare obj before calling r.tparamList, so the new type name is recognized // if used in the constraint of one of its own typeparams (see #48280). r.declare(obj) @@ -615,7 +626,7 @@ func (r *importReader) obj(name string) { if targs.Len() > 0 { rparams = make([]*types.TypeParam, targs.Len()) for i := range rparams { - rparams[i] = aliases.Unalias(targs.At(i)).(*types.TypeParam) + rparams[i] = types.Unalias(targs.At(i)).(*types.TypeParam) } } msig := r.signature(recv, rparams, nil) @@ -645,7 +656,7 @@ func (r *importReader) obj(name string) { } constraint := r.typ() if implicit { - iface, _ := aliases.Unalias(constraint).(*types.Interface) + iface, _ := types.Unalias(constraint).(*types.Interface) if iface == nil { errorf("non-interface constraint marked implicit") } @@ -852,7 +863,7 @@ func (r *importReader) typ() types.Type { } func isInterface(t types.Type) bool { - _, ok := aliases.Unalias(t).(*types.Interface) + _, ok := types.Unalias(t).(*types.Interface) return ok } @@ -959,7 +970,7 @@ func (r *importReader) doType(base *types.Named) (res types.Type) { methods[i] = method } - typ := newInterface(methods, embeddeds) + typ := types.NewInterfaceType(methods, embeddeds) r.p.interfaceList = append(r.p.interfaceList, typ) return typ @@ -1051,7 +1062,7 @@ func (r *importReader) tparamList() []*types.TypeParam { for i := range xs { // Note: the standard library importer is tolerant of nil types here, // though would panic in SetTypeParams. - xs[i] = aliases.Unalias(r.typ()).(*types.TypeParam) + xs[i] = types.Unalias(r.typ()).(*types.TypeParam) } return xs } @@ -1098,3 +1109,9 @@ func (r *importReader) byte() byte { } return x } + +type byPath []*types.Package + +func (a byPath) Len() int { return len(a) } +func (a byPath) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a byPath) Less(i, j int) bool { return a[i].Path() < a[j].Path() } diff --git a/sdk/vendor/golang.org/x/tools/internal/gcimporter/iimport_go122.go b/sdk/vendor/golang.org/x/tools/internal/gcimporter/iimport_go122.go new file mode 100644 index 0000000000..7586bfaca6 --- /dev/null +++ b/sdk/vendor/golang.org/x/tools/internal/gcimporter/iimport_go122.go @@ -0,0 +1,53 @@ +// Copyright 2024 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 go1.22 && !go1.24 + +package gcimporter + +import ( + "go/token" + "go/types" + "unsafe" +) + +// TODO(rfindley): delete this workaround once go1.24 is assured. + +func init() { + // Update markBlack so that it correctly sets the color + // of imported TypeNames. + // + // See the doc comment for markBlack for details. + + type color uint32 + const ( + white color = iota + black + grey + ) + type object struct { + _ *types.Scope + _ token.Pos + _ *types.Package + _ string + _ types.Type + _ uint32 + color_ color + _ token.Pos + } + type typeName struct { + object + } + + // If the size of types.TypeName changes, this will fail to compile. + const delta = int64(unsafe.Sizeof(typeName{})) - int64(unsafe.Sizeof(types.TypeName{})) + var _ [-delta * delta]int + + markBlack = func(obj *types.TypeName) { + type uP = unsafe.Pointer + var ptr *typeName + *(*uP)(uP(&ptr)) = uP(obj) + ptr.color_ = black + } +} diff --git a/sdk/vendor/golang.org/x/tools/internal/gcimporter/newInterface10.go b/sdk/vendor/golang.org/x/tools/internal/gcimporter/newInterface10.go deleted file mode 100644 index 8b163e3d05..0000000000 --- a/sdk/vendor/golang.org/x/tools/internal/gcimporter/newInterface10.go +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2018 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 !go1.11 -// +build !go1.11 - -package gcimporter - -import "go/types" - -func newInterface(methods []*types.Func, embeddeds []types.Type) *types.Interface { - named := make([]*types.Named, len(embeddeds)) - for i, e := range embeddeds { - var ok bool - named[i], ok = e.(*types.Named) - if !ok { - panic("embedding of non-defined interfaces in interfaces is not supported before Go 1.11") - } - } - return types.NewInterface(methods, named) -} diff --git a/sdk/vendor/golang.org/x/tools/internal/gcimporter/newInterface11.go b/sdk/vendor/golang.org/x/tools/internal/gcimporter/newInterface11.go deleted file mode 100644 index 49984f40fd..0000000000 --- a/sdk/vendor/golang.org/x/tools/internal/gcimporter/newInterface11.go +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2018 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 go1.11 -// +build go1.11 - -package gcimporter - -import "go/types" - -func newInterface(methods []*types.Func, embeddeds []types.Type) *types.Interface { - return types.NewInterfaceType(methods, embeddeds) -} diff --git a/sdk/vendor/golang.org/x/tools/internal/gcimporter/predeclared.go b/sdk/vendor/golang.org/x/tools/internal/gcimporter/predeclared.go new file mode 100644 index 0000000000..907c8557a5 --- /dev/null +++ b/sdk/vendor/golang.org/x/tools/internal/gcimporter/predeclared.go @@ -0,0 +1,91 @@ +// Copyright 2024 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 gcimporter + +import ( + "go/types" + "sync" +) + +// predecl is a cache for the predeclared types in types.Universe. +// +// Cache a distinct result based on the runtime value of any. +// The pointer value of the any type varies based on GODEBUG settings. +var predeclMu sync.Mutex +var predecl map[types.Type][]types.Type + +func predeclared() []types.Type { + anyt := types.Universe.Lookup("any").Type() + + predeclMu.Lock() + defer predeclMu.Unlock() + + if pre, ok := predecl[anyt]; ok { + return pre + } + + if predecl == nil { + predecl = make(map[types.Type][]types.Type) + } + + decls := []types.Type{ // basic types + types.Typ[types.Bool], + types.Typ[types.Int], + types.Typ[types.Int8], + types.Typ[types.Int16], + types.Typ[types.Int32], + types.Typ[types.Int64], + types.Typ[types.Uint], + types.Typ[types.Uint8], + types.Typ[types.Uint16], + types.Typ[types.Uint32], + types.Typ[types.Uint64], + types.Typ[types.Uintptr], + types.Typ[types.Float32], + types.Typ[types.Float64], + types.Typ[types.Complex64], + types.Typ[types.Complex128], + types.Typ[types.String], + + // basic type aliases + types.Universe.Lookup("byte").Type(), + types.Universe.Lookup("rune").Type(), + + // error + types.Universe.Lookup("error").Type(), + + // untyped types + types.Typ[types.UntypedBool], + types.Typ[types.UntypedInt], + types.Typ[types.UntypedRune], + types.Typ[types.UntypedFloat], + types.Typ[types.UntypedComplex], + types.Typ[types.UntypedString], + types.Typ[types.UntypedNil], + + // package unsafe + types.Typ[types.UnsafePointer], + + // invalid type + types.Typ[types.Invalid], // only appears in packages with errors + + // used internally by gc; never used by this package or in .a files + anyType{}, + + // comparable + types.Universe.Lookup("comparable").Type(), + + // any + anyt, + } + + predecl[anyt] = decls + return decls +} + +type anyType struct{} + +func (t anyType) Underlying() types.Type { return t } +func (t anyType) String() string { return "any" } diff --git a/sdk/vendor/golang.org/x/tools/internal/gcimporter/support.go b/sdk/vendor/golang.org/x/tools/internal/gcimporter/support.go new file mode 100644 index 0000000000..4af810dc41 --- /dev/null +++ b/sdk/vendor/golang.org/x/tools/internal/gcimporter/support.go @@ -0,0 +1,30 @@ +// Copyright 2024 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 gcimporter + +import ( + "bufio" + "io" + "strconv" + "strings" +) + +// Copy of $GOROOT/src/cmd/internal/archive.ReadHeader. +func readArchiveHeader(b *bufio.Reader, name string) int { + // architecture-independent object file output + const HeaderSize = 60 + + var buf [HeaderSize]byte + if _, err := io.ReadFull(b, buf[:]); err != nil { + return -1 + } + aname := strings.Trim(string(buf[0:16]), " ") + if !strings.HasPrefix(aname, name) { + return -1 + } + asize := strings.Trim(string(buf[48:58]), " ") + i, _ := strconv.Atoi(asize) + return i +} diff --git a/sdk/vendor/golang.org/x/tools/internal/gcimporter/support_go118.go b/sdk/vendor/golang.org/x/tools/internal/gcimporter/support_go118.go deleted file mode 100644 index 0cd3b91b65..0000000000 --- a/sdk/vendor/golang.org/x/tools/internal/gcimporter/support_go118.go +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2021 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 gcimporter - -import "go/types" - -const iexportVersion = iexportVersionGenerics - -// additionalPredeclared returns additional predeclared types in go.1.18. -func additionalPredeclared() []types.Type { - return []types.Type{ - // comparable - types.Universe.Lookup("comparable").Type(), - - // any - types.Universe.Lookup("any").Type(), - } -} - -// See cmd/compile/internal/types.SplitVargenSuffix. -func splitVargenSuffix(name string) (base, suffix string) { - i := len(name) - for i > 0 && name[i-1] >= '0' && name[i-1] <= '9' { - i-- - } - const dot = "·" - if i >= len(dot) && name[i-len(dot):i] == dot { - i -= len(dot) - return name[:i], name[i:] - } - return name, "" -} diff --git a/sdk/vendor/golang.org/x/tools/internal/gcimporter/unified_no.go b/sdk/vendor/golang.org/x/tools/internal/gcimporter/unified_no.go deleted file mode 100644 index 38b624cada..0000000000 --- a/sdk/vendor/golang.org/x/tools/internal/gcimporter/unified_no.go +++ /dev/null @@ -1,10 +0,0 @@ -// 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 !goexperiment.unified -// +build !goexperiment.unified - -package gcimporter - -const unifiedIR = false diff --git a/sdk/vendor/golang.org/x/tools/internal/gcimporter/unified_yes.go b/sdk/vendor/golang.org/x/tools/internal/gcimporter/unified_yes.go deleted file mode 100644 index b5118d0b3a..0000000000 --- a/sdk/vendor/golang.org/x/tools/internal/gcimporter/unified_yes.go +++ /dev/null @@ -1,10 +0,0 @@ -// 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 goexperiment.unified -// +build goexperiment.unified - -package gcimporter - -const unifiedIR = true diff --git a/sdk/vendor/golang.org/x/tools/internal/gcimporter/ureader_yes.go b/sdk/vendor/golang.org/x/tools/internal/gcimporter/ureader_yes.go index f0742f5404..6cdab448ec 100644 --- a/sdk/vendor/golang.org/x/tools/internal/gcimporter/ureader_yes.go +++ b/sdk/vendor/golang.org/x/tools/internal/gcimporter/ureader_yes.go @@ -11,7 +11,6 @@ import ( "go/token" "go/types" "sort" - "strings" "golang.org/x/tools/internal/aliases" "golang.org/x/tools/internal/pkgbits" @@ -71,7 +70,6 @@ func UImportData(fset *token.FileSet, imports map[string]*types.Package, data [] } s := string(data) - s = s[:strings.LastIndex(s, "\n$$\n")] input := pkgbits.NewPkgDecoder(path, s) pkg = readUnifiedPackage(fset, nil, imports, input) return @@ -266,7 +264,12 @@ func (pr *pkgReader) pkgIdx(idx pkgbits.Index) *types.Package { func (r *reader) doPkg() *types.Package { path := r.String() switch path { - case "": + // cmd/compile emits path="main" for main packages because + // that's the linker symbol prefix it used; but we need + // the package's path as it would be reported by go list, + // hence "main" below. + // See test at go/packages.TestMainPackagePathInModeTypes. + case "", "main": path = r.p.PkgPath() case "builtin": return nil // universe @@ -562,7 +565,7 @@ func (pr *pkgReader) objIdx(idx pkgbits.Index) (*types.Package, string) { // If the underlying type is an interface, we need to // duplicate its methods so we can replace the receiver // parameter's type (#49906). - if iface, ok := aliases.Unalias(underlying).(*types.Interface); ok && iface.NumExplicitMethods() != 0 { + if iface, ok := types.Unalias(underlying).(*types.Interface); ok && iface.NumExplicitMethods() != 0 { methods := make([]*types.Func, iface.NumExplicitMethods()) for i := range methods { fn := iface.ExplicitMethod(i) @@ -738,3 +741,17 @@ func pkgScope(pkg *types.Package) *types.Scope { } return types.Universe } + +// See cmd/compile/internal/types.SplitVargenSuffix. +func splitVargenSuffix(name string) (base, suffix string) { + i := len(name) + for i > 0 && name[i-1] >= '0' && name[i-1] <= '9' { + i-- + } + const dot = "·" + if i >= len(dot) && name[i-len(dot):i] == dot { + i -= len(dot) + return name[:i], name[i:] + } + return name, "" +} diff --git a/sdk/vendor/golang.org/x/tools/internal/gocommand/invoke.go b/sdk/vendor/golang.org/x/tools/internal/gocommand/invoke.go index 2e59ff8558..e333efc87f 100644 --- a/sdk/vendor/golang.org/x/tools/internal/gocommand/invoke.go +++ b/sdk/vendor/golang.org/x/tools/internal/gocommand/invoke.go @@ -16,7 +16,6 @@ import ( "os" "os/exec" "path/filepath" - "reflect" "regexp" "runtime" "strconv" @@ -250,16 +249,13 @@ func (i *Invocation) run(ctx context.Context, stdout, stderr io.Writer) error { cmd.Stdout = stdout cmd.Stderr = stderr - // cmd.WaitDelay was added only in go1.20 (see #50436). - if waitDelay := reflect.ValueOf(cmd).Elem().FieldByName("WaitDelay"); waitDelay.IsValid() { - // https://go.dev/issue/59541: don't wait forever copying stderr - // after the command has exited. - // After CL 484741 we copy stdout manually, so we we'll stop reading that as - // soon as ctx is done. However, we also don't want to wait around forever - // for stderr. Give a much-longer-than-reasonable delay and then assume that - // something has wedged in the kernel or runtime. - waitDelay.Set(reflect.ValueOf(30 * time.Second)) - } + // https://go.dev/issue/59541: don't wait forever copying stderr + // after the command has exited. + // After CL 484741 we copy stdout manually, so we we'll stop reading that as + // soon as ctx is done. However, we also don't want to wait around forever + // for stderr. Give a much-longer-than-reasonable delay and then assume that + // something has wedged in the kernel or runtime. + cmd.WaitDelay = 30 * time.Second // The cwd gets resolved to the real path. On Darwin, where // /tmp is a symlink, this breaks anything that expects the diff --git a/sdk/vendor/golang.org/x/tools/internal/imports/fix.go b/sdk/vendor/golang.org/x/tools/internal/imports/fix.go index dc7d50a7a4..5ae576977a 100644 --- a/sdk/vendor/golang.org/x/tools/internal/imports/fix.go +++ b/sdk/vendor/golang.org/x/tools/internal/imports/fix.go @@ -27,7 +27,6 @@ import ( "unicode" "unicode/utf8" - "golang.org/x/sync/errgroup" "golang.org/x/tools/go/ast/astutil" "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/gocommand" @@ -91,18 +90,6 @@ type ImportFix struct { Relevance float64 // see pkg } -// An ImportInfo represents a single import statement. -type ImportInfo struct { - ImportPath string // import path, e.g. "crypto/rand". - Name string // import name, e.g. "crand", or "" if none. -} - -// A packageInfo represents what's known about a package. -type packageInfo struct { - name string // real package name, if known. - exports map[string]bool // known exports. -} - // parseOtherFiles parses all the Go files in srcDir except filename, including // test files if filename looks like a test. // @@ -131,7 +118,7 @@ func parseOtherFiles(ctx context.Context, fset *token.FileSet, srcDir, filename continue } - f, err := parser.ParseFile(fset, filepath.Join(srcDir, fi.Name()), nil, 0) + f, err := parser.ParseFile(fset, filepath.Join(srcDir, fi.Name()), nil, parser.SkipObjectResolution) if err != nil { continue } @@ -162,8 +149,8 @@ func addGlobals(f *ast.File, globals map[string]bool) { // collectReferences builds a map of selector expressions, from // left hand side (X) to a set of right hand sides (Sel). -func collectReferences(f *ast.File) references { - refs := references{} +func collectReferences(f *ast.File) References { + refs := References{} var visitor visitFn visitor = func(node ast.Node) ast.Visitor { @@ -233,7 +220,7 @@ func (p *pass) findMissingImport(pkg string, syms map[string]bool) *ImportInfo { allFound := true for right := range syms { - if !pkgInfo.exports[right] { + if !pkgInfo.Exports[right] { allFound = false break } @@ -246,11 +233,6 @@ func (p *pass) findMissingImport(pkg string, syms map[string]bool) *ImportInfo { return nil } -// references is set of references found in a Go file. The first map key is the -// left hand side of a selector expression, the second key is the right hand -// side, and the value should always be true. -type references map[string]map[string]bool - // A pass contains all the inputs and state necessary to fix a file's imports. // It can be modified in some ways during use; see comments below. type pass struct { @@ -258,27 +240,29 @@ type pass struct { fset *token.FileSet // fset used to parse f and its siblings. f *ast.File // the file being fixed. srcDir string // the directory containing f. - env *ProcessEnv // the environment to use for go commands, etc. - loadRealPackageNames bool // if true, load package names from disk rather than guessing them. - otherFiles []*ast.File // sibling files. + logf func(string, ...any) + source Source // the environment to use for go commands, etc. + loadRealPackageNames bool // if true, load package names from disk rather than guessing them. + otherFiles []*ast.File // sibling files. + goroot string // Intermediate state, generated by load. existingImports map[string][]*ImportInfo - allRefs references - missingRefs references + allRefs References + missingRefs References // Inputs to fix. These can be augmented between successive fix calls. lastTry bool // indicates that this is the last call and fix should clean up as best it can. candidates []*ImportInfo // candidate imports in priority order. - knownPackages map[string]*packageInfo // information about all known packages. + knownPackages map[string]*PackageInfo // information about all known packages. } // loadPackageNames saves the package names for everything referenced by imports. -func (p *pass) loadPackageNames(imports []*ImportInfo) error { - if p.env.Logf != nil { - p.env.Logf("loading package names for %v packages", len(imports)) +func (p *pass) loadPackageNames(ctx context.Context, imports []*ImportInfo) error { + if p.logf != nil { + p.logf("loading package names for %v packages", len(imports)) defer func() { - p.env.Logf("done loading package names for %v packages", len(imports)) + p.logf("done loading package names for %v packages", len(imports)) }() } var unknown []string @@ -289,20 +273,17 @@ func (p *pass) loadPackageNames(imports []*ImportInfo) error { unknown = append(unknown, imp.ImportPath) } - resolver, err := p.env.GetResolver() - if err != nil { - return err - } - - names, err := resolver.loadPackageNames(unknown, p.srcDir) + names, err := p.source.LoadPackageNames(ctx, p.srcDir, unknown) if err != nil { return err } + // TODO(rfindley): revisit this. Why do we need to store known packages with + // no exports? The inconsistent data is confusing. for path, name := range names { - p.knownPackages[path] = &packageInfo{ - name: name, - exports: map[string]bool{}, + p.knownPackages[path] = &PackageInfo{ + Name: name, + Exports: map[string]bool{}, } } return nil @@ -330,8 +311,8 @@ func (p *pass) importIdentifier(imp *ImportInfo) string { return imp.Name } known := p.knownPackages[imp.ImportPath] - if known != nil && known.name != "" { - return withoutVersion(known.name) + if known != nil && known.Name != "" { + return withoutVersion(known.Name) } return ImportPathToAssumedName(imp.ImportPath) } @@ -339,9 +320,9 @@ func (p *pass) importIdentifier(imp *ImportInfo) string { // load reads in everything necessary to run a pass, and reports whether the // file already has all the imports it needs. It fills in p.missingRefs with the // file's missing symbols, if any, or removes unused imports if not. -func (p *pass) load() ([]*ImportFix, bool) { - p.knownPackages = map[string]*packageInfo{} - p.missingRefs = references{} +func (p *pass) load(ctx context.Context) ([]*ImportFix, bool) { + p.knownPackages = map[string]*PackageInfo{} + p.missingRefs = References{} p.existingImports = map[string][]*ImportInfo{} // Load basic information about the file in question. @@ -364,9 +345,11 @@ func (p *pass) load() ([]*ImportFix, bool) { // f's imports by the identifier they introduce. imports := collectImports(p.f) if p.loadRealPackageNames { - err := p.loadPackageNames(append(imports, p.candidates...)) + err := p.loadPackageNames(ctx, append(imports, p.candidates...)) if err != nil { - p.env.logf("loading package names: %v", err) + if p.logf != nil { + p.logf("loading package names: %v", err) + } return nil, false } } @@ -535,9 +518,10 @@ func (p *pass) assumeSiblingImportsValid() { // We have the stdlib in memory; no need to guess. rights = symbolNameSet(m) } - p.addCandidate(imp, &packageInfo{ + // TODO(rfindley): we should set package name here, for consistency. + p.addCandidate(imp, &PackageInfo{ // no name; we already know it. - exports: rights, + Exports: rights, }) } } @@ -546,14 +530,14 @@ func (p *pass) assumeSiblingImportsValid() { // addCandidate adds a candidate import to p, and merges in the information // in pkg. -func (p *pass) addCandidate(imp *ImportInfo, pkg *packageInfo) { +func (p *pass) addCandidate(imp *ImportInfo, pkg *PackageInfo) { p.candidates = append(p.candidates, imp) if existing, ok := p.knownPackages[imp.ImportPath]; ok { - if existing.name == "" { - existing.name = pkg.name + if existing.Name == "" { + existing.Name = pkg.Name } - for export := range pkg.exports { - existing.exports[export] = true + for export := range pkg.Exports { + existing.Exports[export] = true } } else { p.knownPackages[imp.ImportPath] = pkg @@ -581,19 +565,42 @@ func fixImportsDefault(fset *token.FileSet, f *ast.File, filename string, env *P // getFixes gets the import fixes that need to be made to f in order to fix the imports. // It does not modify the ast. func getFixes(ctx context.Context, fset *token.FileSet, f *ast.File, filename string, env *ProcessEnv) ([]*ImportFix, error) { + source, err := NewProcessEnvSource(env, filename, f.Name.Name) + if err != nil { + return nil, err + } + goEnv, err := env.goEnv() + if err != nil { + return nil, err + } + return getFixesWithSource(ctx, fset, f, filename, goEnv["GOROOT"], env.logf, source) +} + +func getFixesWithSource(ctx context.Context, fset *token.FileSet, f *ast.File, filename string, goroot string, logf func(string, ...any), source Source) ([]*ImportFix, error) { + // This logic is defensively duplicated from getFixes. abs, err := filepath.Abs(filename) if err != nil { return nil, err } srcDir := filepath.Dir(abs) - env.logf("fixImports(filename=%q), abs=%q, srcDir=%q ...", filename, abs, srcDir) + + if logf != nil { + logf("fixImports(filename=%q), srcDir=%q ...", filename, abs, srcDir) + } // First pass: looking only at f, and using the naive algorithm to // derive package names from import paths, see if the file is already // complete. We can't add any imports yet, because we don't know // if missing references are actually package vars. - p := &pass{fset: fset, f: f, srcDir: srcDir, env: env} - if fixes, done := p.load(); done { + p := &pass{ + fset: fset, + f: f, + srcDir: srcDir, + logf: logf, + goroot: goroot, + source: source, + } + if fixes, done := p.load(ctx); done { return fixes, nil } @@ -605,7 +612,7 @@ func getFixes(ctx context.Context, fset *token.FileSet, f *ast.File, filename st // Second pass: add information from other files in the same package, // like their package vars and imports. p.otherFiles = otherFiles - if fixes, done := p.load(); done { + if fixes, done := p.load(ctx); done { return fixes, nil } @@ -618,10 +625,17 @@ func getFixes(ctx context.Context, fset *token.FileSet, f *ast.File, filename st // Third pass: get real package names where we had previously used // the naive algorithm. - p = &pass{fset: fset, f: f, srcDir: srcDir, env: env} + p = &pass{ + fset: fset, + f: f, + srcDir: srcDir, + logf: logf, + goroot: goroot, + source: p.source, // safe to reuse, as it's just a wrapper around env + } p.loadRealPackageNames = true p.otherFiles = otherFiles - if fixes, done := p.load(); done { + if fixes, done := p.load(ctx); done { return fixes, nil } @@ -835,7 +849,7 @@ func GetPackageExports(ctx context.Context, wrapped func(PackageExport), searchP return true }, dirFound: func(pkg *pkg) bool { - return pkgIsCandidate(filename, references{searchPkg: nil}, pkg) + return pkgIsCandidate(filename, References{searchPkg: nil}, pkg) }, packageNameLoaded: func(pkg *pkg) bool { return pkg.packageName == searchPkg @@ -1086,11 +1100,7 @@ func (e *ProcessEnv) invokeGo(ctx context.Context, verb string, args ...string) return e.GocmdRunner.Run(ctx, inv) } -func addStdlibCandidates(pass *pass, refs references) error { - goenv, err := pass.env.goEnv() - if err != nil { - return err - } +func addStdlibCandidates(pass *pass, refs References) error { localbase := func(nm string) string { ans := path.Base(nm) if ans[0] == 'v' { @@ -1105,13 +1115,13 @@ func addStdlibCandidates(pass *pass, refs references) error { } add := func(pkg string) { // Prevent self-imports. - if path.Base(pkg) == pass.f.Name.Name && filepath.Join(goenv["GOROOT"], "src", pkg) == pass.srcDir { + if path.Base(pkg) == pass.f.Name.Name && filepath.Join(pass.goroot, "src", pkg) == pass.srcDir { return } exports := symbolNameSet(stdlib.PackageSymbols[pkg]) pass.addCandidate( &ImportInfo{ImportPath: pkg}, - &packageInfo{name: localbase(pkg), exports: exports}) + &PackageInfo{Name: localbase(pkg), Exports: exports}) } for left := range refs { if left == "rand" { @@ -1175,91 +1185,14 @@ type scanCallback struct { exportsLoaded func(pkg *pkg, exports []stdlib.Symbol) } -func addExternalCandidates(ctx context.Context, pass *pass, refs references, filename string) error { +func addExternalCandidates(ctx context.Context, pass *pass, refs References, filename string) error { ctx, done := event.Start(ctx, "imports.addExternalCandidates") defer done() - var mu sync.Mutex - found := make(map[string][]pkgDistance) - callback := &scanCallback{ - rootFound: func(gopathwalk.Root) bool { - return true // We want everything. - }, - dirFound: func(pkg *pkg) bool { - return pkgIsCandidate(filename, refs, pkg) - }, - packageNameLoaded: func(pkg *pkg) bool { - if _, want := refs[pkg.packageName]; !want { - return false - } - if pkg.dir == pass.srcDir && pass.f.Name.Name == pkg.packageName { - // The candidate is in the same directory and has the - // same package name. Don't try to import ourselves. - return false - } - if !canUse(filename, pkg.dir) { - return false - } - mu.Lock() - defer mu.Unlock() - found[pkg.packageName] = append(found[pkg.packageName], pkgDistance{pkg, distance(pass.srcDir, pkg.dir)}) - return false // We'll do our own loading after we sort. - }, - } - resolver, err := pass.env.GetResolver() + results, err := pass.source.ResolveReferences(ctx, filename, refs) if err != nil { return err } - if err = resolver.scan(ctx, callback); err != nil { - return err - } - - // Search for imports matching potential package references. - type result struct { - imp *ImportInfo - pkg *packageInfo - } - results := make([]*result, len(refs)) - - g, ctx := errgroup.WithContext(ctx) - - searcher := symbolSearcher{ - logf: pass.env.logf, - srcDir: pass.srcDir, - xtest: strings.HasSuffix(pass.f.Name.Name, "_test"), - loadExports: resolver.loadExports, - } - - i := 0 - for pkgName, symbols := range refs { - index := i // claim an index in results - i++ - pkgName := pkgName - symbols := symbols - - g.Go(func() error { - found, err := searcher.search(ctx, found[pkgName], pkgName, symbols) - if err != nil { - return err - } - if found == nil { - return nil // No matching package. - } - - imp := &ImportInfo{ - ImportPath: found.importPathShort, - } - pkg := &packageInfo{ - name: pkgName, - exports: symbols, - } - results[index] = &result{imp, pkg} - return nil - }) - } - if err := g.Wait(); err != nil { - return err - } for _, result := range results { if result == nil { @@ -1267,7 +1200,7 @@ func addExternalCandidates(ctx context.Context, pass *pass, refs references, fil } // Don't offer completions that would shadow predeclared // names, such as github.com/coreos/etcd/error. - if types.Universe.Lookup(result.pkg.name) != nil { // predeclared + if types.Universe.Lookup(result.Package.Name) != nil { // predeclared // Ideally we would skip this candidate only // if the predeclared name is actually // referenced by the file, but that's a lot @@ -1276,7 +1209,7 @@ func addExternalCandidates(ctx context.Context, pass *pass, refs references, fil // user before long. continue } - pass.addCandidate(result.imp, result.pkg) + pass.addCandidate(result.Import, result.Package) } return nil } @@ -1620,6 +1553,7 @@ func loadExportsFromFiles(ctx context.Context, env *ProcessEnv, dir string, incl } fullFile := filepath.Join(dir, fi.Name()) + // Legacy ast.Object resolution is needed here. f, err := parser.ParseFile(fset, fullFile, nil, 0) if err != nil { env.logf("error parsing %v: %v", fullFile, err) @@ -1800,7 +1734,7 @@ func (s *symbolSearcher) searchOne(ctx context.Context, c pkgDistance, symbols m // filename is the file being formatted. // pkgIdent is the package being searched for, like "client" (if // searching for "client.New") -func pkgIsCandidate(filename string, refs references, pkg *pkg) bool { +func pkgIsCandidate(filename string, refs References, pkg *pkg) bool { // Check "internal" and "vendor" visibility: if !canUse(filename, pkg.dir) { return false diff --git a/sdk/vendor/golang.org/x/tools/internal/imports/imports.go b/sdk/vendor/golang.org/x/tools/internal/imports/imports.go index f83465520a..2215a12880 100644 --- a/sdk/vendor/golang.org/x/tools/internal/imports/imports.go +++ b/sdk/vendor/golang.org/x/tools/internal/imports/imports.go @@ -47,7 +47,14 @@ type Options struct { // Process implements golang.org/x/tools/imports.Process with explicit context in opt.Env. func Process(filename string, src []byte, opt *Options) (formatted []byte, err error) { fileSet := token.NewFileSet() - file, adjust, err := parse(fileSet, filename, src, opt) + var parserMode parser.Mode + if opt.Comments { + parserMode |= parser.ParseComments + } + if opt.AllErrors { + parserMode |= parser.AllErrors + } + file, adjust, err := parse(fileSet, filename, src, parserMode, opt.Fragment) if err != nil { return nil, err } @@ -66,17 +73,19 @@ func Process(filename string, src []byte, opt *Options) (formatted []byte, err e // // Note that filename's directory influences which imports can be chosen, // so it is important that filename be accurate. -func FixImports(ctx context.Context, filename string, src []byte, opt *Options) (fixes []*ImportFix, err error) { +func FixImports(ctx context.Context, filename string, src []byte, goroot string, logf func(string, ...any), source Source) (fixes []*ImportFix, err error) { ctx, done := event.Start(ctx, "imports.FixImports") defer done() fileSet := token.NewFileSet() - file, _, err := parse(fileSet, filename, src, opt) + // TODO(rfindley): these default values for ParseComments and AllErrors were + // extracted from gopls, but are they even needed? + file, _, err := parse(fileSet, filename, src, parser.ParseComments|parser.AllErrors, true) if err != nil { return nil, err } - return getFixes(ctx, fileSet, file, filename, opt.Env) + return getFixesWithSource(ctx, fileSet, file, filename, goroot, logf, source) } // ApplyFixes applies all of the fixes to the file and formats it. extraMode @@ -86,7 +95,7 @@ func ApplyFixes(fixes []*ImportFix, filename string, src []byte, opt *Options, e // Don't use parse() -- we don't care about fragments or statement lists // here, and we need to work with unparseable files. fileSet := token.NewFileSet() - parserMode := parser.Mode(0) + parserMode := parser.SkipObjectResolution if opt.Comments { parserMode |= parser.ParseComments } @@ -114,7 +123,7 @@ func ApplyFixes(fixes []*ImportFix, filename string, src []byte, opt *Options, e // formatted file, and returns the postpocessed result. func formatFile(fset *token.FileSet, file *ast.File, src []byte, adjust func(orig []byte, src []byte) []byte, opt *Options) ([]byte, error) { mergeImports(file) - sortImports(opt.LocalPrefix, fset.File(file.Pos()), file) + sortImports(opt.LocalPrefix, fset.File(file.FileStart), file) var spacesBefore []string // import paths we need spaces before for _, impSection := range astutil.Imports(fset, file) { // Within each block of contiguous imports, see if any @@ -164,13 +173,9 @@ func formatFile(fset *token.FileSet, file *ast.File, src []byte, adjust func(ori // parse parses src, which was read from filename, // as a Go source file or statement list. -func parse(fset *token.FileSet, filename string, src []byte, opt *Options) (*ast.File, func(orig, src []byte) []byte, error) { - parserMode := parser.Mode(0) - if opt.Comments { - parserMode |= parser.ParseComments - } - if opt.AllErrors { - parserMode |= parser.AllErrors +func parse(fset *token.FileSet, filename string, src []byte, parserMode parser.Mode, fragment bool) (*ast.File, func(orig, src []byte) []byte, error) { + if parserMode&parser.SkipObjectResolution != 0 { + panic("legacy ast.Object resolution is required") } // Try as whole source file. @@ -181,7 +186,7 @@ func parse(fset *token.FileSet, filename string, src []byte, opt *Options) (*ast // If the error is that the source file didn't begin with a // package line and we accept fragmented input, fall through to // try as a source fragment. Stop and return on any other error. - if !opt.Fragment || !strings.Contains(err.Error(), "expected 'package'") { + if !fragment || !strings.Contains(err.Error(), "expected 'package'") { return nil, nil, err } diff --git a/sdk/vendor/golang.org/x/tools/internal/imports/source.go b/sdk/vendor/golang.org/x/tools/internal/imports/source.go new file mode 100644 index 0000000000..cbe4f3c5ba --- /dev/null +++ b/sdk/vendor/golang.org/x/tools/internal/imports/source.go @@ -0,0 +1,63 @@ +// Copyright 2024 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 imports + +import "context" + +// These types document the APIs below. +// +// TODO(rfindley): consider making these defined types rather than aliases. +type ( + ImportPath = string + PackageName = string + Symbol = string + + // References is set of References found in a Go file. The first map key is the + // left hand side of a selector expression, the second key is the right hand + // side, and the value should always be true. + References = map[PackageName]map[Symbol]bool +) + +// A Result satisfies a missing import. +// +// The Import field describes the missing import spec, and the Package field +// summarizes the package exports. +type Result struct { + Import *ImportInfo + Package *PackageInfo +} + +// An ImportInfo represents a single import statement. +type ImportInfo struct { + ImportPath string // import path, e.g. "crypto/rand". + Name string // import name, e.g. "crand", or "" if none. +} + +// A PackageInfo represents what's known about a package. +type PackageInfo struct { + Name string // package name in the package declaration, if known + Exports map[string]bool // set of names of known package level sortSymbols +} + +// A Source provides imports to satisfy unresolved references in the file being +// fixed. +type Source interface { + // LoadPackageNames queries PackageName information for the requested import + // paths, when operating from the provided srcDir. + // + // TODO(rfindley): try to refactor to remove this operation. + LoadPackageNames(ctx context.Context, srcDir string, paths []ImportPath) (map[ImportPath]PackageName, error) + + // ResolveReferences asks the Source for the best package name to satisfy + // each of the missing references, in the context of fixing the given + // filename. + // + // Returns a map from package name to a [Result] for that package name that + // provides the required symbols. Keys may be omitted in the map if no + // candidates satisfy all missing references for that package name. It is up + // to each data source to select the best result for each entry in the + // missing map. + ResolveReferences(ctx context.Context, filename string, missing References) ([]*Result, error) +} diff --git a/sdk/vendor/golang.org/x/tools/internal/imports/source_env.go b/sdk/vendor/golang.org/x/tools/internal/imports/source_env.go new file mode 100644 index 0000000000..d14abaa319 --- /dev/null +++ b/sdk/vendor/golang.org/x/tools/internal/imports/source_env.go @@ -0,0 +1,129 @@ +// Copyright 2024 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 imports + +import ( + "context" + "path/filepath" + "strings" + "sync" + + "golang.org/x/sync/errgroup" + "golang.org/x/tools/internal/gopathwalk" +) + +// ProcessEnvSource implements the [Source] interface using the legacy +// [ProcessEnv] abstraction. +type ProcessEnvSource struct { + env *ProcessEnv + srcDir string + filename string + pkgName string +} + +// NewProcessEnvSource returns a [ProcessEnvSource] wrapping the given +// env, to be used for fixing imports in the file with name filename in package +// named pkgName. +func NewProcessEnvSource(env *ProcessEnv, filename, pkgName string) (*ProcessEnvSource, error) { + abs, err := filepath.Abs(filename) + if err != nil { + return nil, err + } + srcDir := filepath.Dir(abs) + return &ProcessEnvSource{ + env: env, + srcDir: srcDir, + filename: filename, + pkgName: pkgName, + }, nil +} + +func (s *ProcessEnvSource) LoadPackageNames(ctx context.Context, srcDir string, unknown []string) (map[string]string, error) { + r, err := s.env.GetResolver() + if err != nil { + return nil, err + } + return r.loadPackageNames(unknown, srcDir) +} + +func (s *ProcessEnvSource) ResolveReferences(ctx context.Context, filename string, refs map[string]map[string]bool) ([]*Result, error) { + var mu sync.Mutex + found := make(map[string][]pkgDistance) + callback := &scanCallback{ + rootFound: func(gopathwalk.Root) bool { + return true // We want everything. + }, + dirFound: func(pkg *pkg) bool { + return pkgIsCandidate(filename, refs, pkg) + }, + packageNameLoaded: func(pkg *pkg) bool { + if _, want := refs[pkg.packageName]; !want { + return false + } + if pkg.dir == s.srcDir && s.pkgName == pkg.packageName { + // The candidate is in the same directory and has the + // same package name. Don't try to import ourselves. + return false + } + if !canUse(filename, pkg.dir) { + return false + } + mu.Lock() + defer mu.Unlock() + found[pkg.packageName] = append(found[pkg.packageName], pkgDistance{pkg, distance(s.srcDir, pkg.dir)}) + return false // We'll do our own loading after we sort. + }, + } + resolver, err := s.env.GetResolver() + if err != nil { + return nil, err + } + if err := resolver.scan(ctx, callback); err != nil { + return nil, err + } + + g, ctx := errgroup.WithContext(ctx) + + searcher := symbolSearcher{ + logf: s.env.logf, + srcDir: s.srcDir, + xtest: strings.HasSuffix(s.pkgName, "_test"), + loadExports: resolver.loadExports, + } + + var resultMu sync.Mutex + results := make(map[string]*Result, len(refs)) + for pkgName, symbols := range refs { + g.Go(func() error { + found, err := searcher.search(ctx, found[pkgName], pkgName, symbols) + if err != nil { + return err + } + if found == nil { + return nil // No matching package. + } + + imp := &ImportInfo{ + ImportPath: found.importPathShort, + } + pkg := &PackageInfo{ + Name: pkgName, + Exports: symbols, + } + resultMu.Lock() + results[pkgName] = &Result{Import: imp, Package: pkg} + resultMu.Unlock() + return nil + }) + } + if err := g.Wait(); err != nil { + return nil, err + } + var ans []*Result + for _, x := range results { + ans = append(ans, x) + } + return ans, nil +} diff --git a/sdk/vendor/golang.org/x/tools/internal/imports/source_modindex.go b/sdk/vendor/golang.org/x/tools/internal/imports/source_modindex.go new file mode 100644 index 0000000000..05229f06ce --- /dev/null +++ b/sdk/vendor/golang.org/x/tools/internal/imports/source_modindex.go @@ -0,0 +1,103 @@ +// Copyright 2024 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 imports + +import ( + "context" + "sync" + "time" + + "golang.org/x/tools/internal/modindex" +) + +// This code is here rather than in the modindex package +// to avoid import loops + +// implements Source using modindex, so only for module cache. +// +// this is perhaps over-engineered. A new Index is read at first use. +// And then Update is called after every 15 minutes, and a new Index +// is read if the index changed. It is not clear the Mutex is needed. +type IndexSource struct { + modcachedir string + mutex sync.Mutex + ix *modindex.Index + expires time.Time +} + +// create a new Source. Called from NewView in cache/session.go. +func NewIndexSource(cachedir string) *IndexSource { + return &IndexSource{modcachedir: cachedir} +} + +func (s *IndexSource) LoadPackageNames(ctx context.Context, srcDir string, paths []ImportPath) (map[ImportPath]PackageName, error) { + /// This is used by goimports to resolve the package names of imports of the + // current package, which is irrelevant for the module cache. + return nil, nil +} + +func (s *IndexSource) ResolveReferences(ctx context.Context, filename string, missing References) ([]*Result, error) { + if err := s.maybeReadIndex(); err != nil { + return nil, err + } + var cs []modindex.Candidate + for pkg, nms := range missing { + for nm := range nms { + x := s.ix.Lookup(pkg, nm, false) + cs = append(cs, x...) + } + } + found := make(map[string]*Result) + for _, c := range cs { + var x *Result + if x = found[c.ImportPath]; x == nil { + x = &Result{ + Import: &ImportInfo{ + ImportPath: c.ImportPath, + Name: "", + }, + Package: &PackageInfo{ + Name: c.PkgName, + Exports: make(map[string]bool), + }, + } + found[c.ImportPath] = x + } + x.Package.Exports[c.Name] = true + } + var ans []*Result + for _, x := range found { + ans = append(ans, x) + } + return ans, nil +} + +func (s *IndexSource) maybeReadIndex() error { + s.mutex.Lock() + defer s.mutex.Unlock() + + var readIndex bool + if time.Now().After(s.expires) { + ok, err := modindex.Update(s.modcachedir) + if err != nil { + return err + } + if ok { + readIndex = true + } + } + + if readIndex || s.ix == nil { + ix, err := modindex.ReadIndex(s.modcachedir) + if err != nil { + return err + } + s.ix = ix + // for now refresh every 15 minutes + s.expires = time.Now().Add(time.Minute * 15) + } + + return nil +} diff --git a/sdk/vendor/golang.org/x/tools/internal/modindex/directories.go b/sdk/vendor/golang.org/x/tools/internal/modindex/directories.go new file mode 100644 index 0000000000..1e1a02f239 --- /dev/null +++ b/sdk/vendor/golang.org/x/tools/internal/modindex/directories.go @@ -0,0 +1,135 @@ +// Copyright 2024 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 modindex + +import ( + "fmt" + "log" + "os" + "path/filepath" + "regexp" + "slices" + "strings" + "sync" + "time" + + "golang.org/x/mod/semver" + "golang.org/x/tools/internal/gopathwalk" +) + +type directory struct { + path Relpath + importPath string + version string // semantic version + syms []symbol +} + +// filterDirs groups the directories by import path, +// sorting the ones with the same import path by semantic version, +// most recent first. +func byImportPath(dirs []Relpath) (map[string][]*directory, error) { + ans := make(map[string][]*directory) // key is import path + for _, d := range dirs { + ip, sv, err := DirToImportPathVersion(d) + if err != nil { + return nil, err + } + ans[ip] = append(ans[ip], &directory{ + path: d, + importPath: ip, + version: sv, + }) + } + for k, v := range ans { + semanticSort(v) + ans[k] = v + } + return ans, nil +} + +// sort the directories by semantic version, latest first +func semanticSort(v []*directory) { + slices.SortFunc(v, func(l, r *directory) int { + if n := semver.Compare(l.version, r.version); n != 0 { + return -n // latest first + } + return strings.Compare(string(l.path), string(r.path)) + }) +} + +// modCacheRegexp splits a relpathpath into module, module version, and package. +var modCacheRegexp = regexp.MustCompile(`(.*)@([^/\\]*)(.*)`) + +// DirToImportPathVersion computes import path and semantic version +func DirToImportPathVersion(dir Relpath) (string, string, error) { + m := modCacheRegexp.FindStringSubmatch(string(dir)) + // m[1] is the module path + // m[2] is the version major.minor.patch(-
 1 && flds[1][1] == 'D',
+			}
+			if px.Type == Func {
+				n, err := strconv.Atoi(flds[2])
+				if err != nil {
+					continue // should never happen
+				}
+				px.Results = int16(n)
+				if len(flds) >= 4 {
+					sig := strings.Split(flds[3], " ")
+					for i := 0; i < len(sig); i++ {
+						// $ cannot otherwise occur. removing the spaces
+						// almost works, but for chan struct{}, e.g.
+						sig[i] = strings.Replace(sig[i], "$", " ", -1)
+					}
+					px.Sig = toFields(sig)
+				}
+			}
+			ans = append(ans, px)
+		}
+	}
+	return ans
+}
+
+func toFields(sig []string) []Field {
+	ans := make([]Field, len(sig)/2)
+	for i := 0; i < len(ans); i++ {
+		ans[i] = Field{Arg: sig[2*i], Type: sig[2*i+1]}
+	}
+	return ans
+}
+
+// benchmarks show this is measurably better than strings.Split
+// split into first 4 fields separated by single space
+func fastSplit(x string) []string {
+	ans := make([]string, 0, 4)
+	nxt := 0
+	start := 0
+	for i := 0; i < len(x); i++ {
+		if x[i] != ' ' {
+			continue
+		}
+		ans = append(ans, x[start:i])
+		nxt++
+		start = i + 1
+		if nxt >= 3 {
+			break
+		}
+	}
+	ans = append(ans, x[start:])
+	return ans
+}
+
+func asLexType(c byte) LexType {
+	switch c {
+	case 'C':
+		return Const
+	case 'V':
+		return Var
+	case 'T':
+		return Type
+	case 'F':
+		return Func
+	}
+	return -1
+}
diff --git a/sdk/vendor/golang.org/x/tools/internal/modindex/modindex.go b/sdk/vendor/golang.org/x/tools/internal/modindex/modindex.go
new file mode 100644
index 0000000000..355a53e71a
--- /dev/null
+++ b/sdk/vendor/golang.org/x/tools/internal/modindex/modindex.go
@@ -0,0 +1,164 @@
+// Copyright 2024 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 modindex contains code for building and searching an index to
+// the Go module cache. The directory containing the index, returned by
+// IndexDir(), contains a file index-name- that contains the name
+// of the current index. We believe writing that short file is atomic.
+// ReadIndex reads that file to get the file name of the index.
+// WriteIndex writes an index with a unique name and then
+// writes that name into a new version of index-name-.
+// ( stands for the CurrentVersion of the index format.)
+package modindex
+
+import (
+	"path/filepath"
+	"slices"
+	"strings"
+	"time"
+
+	"golang.org/x/mod/semver"
+)
+
+// Create always creates a new index for the go module cache that is in cachedir.
+func Create(cachedir string) error {
+	_, err := indexModCache(cachedir, true)
+	return err
+}
+
+// Update the index for the go module cache that is in cachedir,
+// If there is no existing index it will build one.
+// If there are changed directories since the last index, it will
+// write a new one and return true. Otherwise it returns false.
+func Update(cachedir string) (bool, error) {
+	return indexModCache(cachedir, false)
+}
+
+// indexModCache writes an index current as of when it is called.
+// If clear is true the index is constructed from all of GOMODCACHE
+// otherwise the index is constructed from the last previous index
+// and the updates to the cache. It returns true if it wrote an index,
+// false otherwise.
+func indexModCache(cachedir string, clear bool) (bool, error) {
+	cachedir, err := filepath.Abs(cachedir)
+	if err != nil {
+		return false, err
+	}
+	cd := Abspath(cachedir)
+	future := time.Now().Add(24 * time.Hour) // safely in the future
+	ok, err := modindexTimed(future, cd, clear)
+	if err != nil {
+		return false, err
+	}
+	return ok, nil
+}
+
+// modindexTimed writes an index current as of onlyBefore.
+// If clear is true the index is constructed from all of GOMODCACHE
+// otherwise the index is constructed from the last previous index
+// and all the updates to the cache before onlyBefore.
+// It returns true if it wrote a new index, false if it wrote nothing.
+func modindexTimed(onlyBefore time.Time, cachedir Abspath, clear bool) (bool, error) {
+	var curIndex *Index
+	if !clear {
+		var err error
+		curIndex, err = ReadIndex(string(cachedir))
+		if clear && err != nil {
+			return false, err
+		}
+		// TODO(pjw): check that most of those directories still exist
+	}
+	cfg := &work{
+		onlyBefore: onlyBefore,
+		oldIndex:   curIndex,
+		cacheDir:   cachedir,
+	}
+	if curIndex != nil {
+		cfg.onlyAfter = curIndex.Changed
+	}
+	if err := cfg.buildIndex(); err != nil {
+		return false, err
+	}
+	if len(cfg.newIndex.Entries) == 0 && curIndex != nil {
+		// no changes from existing curIndex, don't write a new index
+		return false, nil
+	}
+	if err := cfg.writeIndex(); err != nil {
+		return false, err
+	}
+	return true, nil
+}
+
+type work struct {
+	onlyBefore time.Time // do not use directories later than this
+	onlyAfter  time.Time // only interested in directories after this
+	// directories from before onlyAfter come from oldIndex
+	oldIndex *Index
+	newIndex *Index
+	cacheDir Abspath
+}
+
+func (w *work) buildIndex() error {
+	// The effective date of the new index should be at least
+	// slightly earlier than when the directories are scanned
+	// so set it now.
+	w.newIndex = &Index{Changed: time.Now(), Cachedir: w.cacheDir}
+	dirs := findDirs(string(w.cacheDir), w.onlyAfter, w.onlyBefore)
+	if len(dirs) == 0 {
+		return nil
+	}
+	newdirs, err := byImportPath(dirs)
+	if err != nil {
+		return err
+	}
+	// for each import path it might occur only in newdirs,
+	// only in w.oldIndex, or in both.
+	// If it occurs in both, use the semantically later one
+	if w.oldIndex != nil {
+		for _, e := range w.oldIndex.Entries {
+			found, ok := newdirs[e.ImportPath]
+			if !ok {
+				w.newIndex.Entries = append(w.newIndex.Entries, e)
+				continue // use this one, there is no new one
+			}
+			if semver.Compare(found[0].version, e.Version) > 0 {
+				// use the new one
+			} else {
+				// use the old one, forget the new one
+				w.newIndex.Entries = append(w.newIndex.Entries, e)
+				delete(newdirs, e.ImportPath)
+			}
+		}
+	}
+	// get symbol information for all the new diredtories
+	getSymbols(w.cacheDir, newdirs)
+	// assemble the new index entries
+	for k, v := range newdirs {
+		d := v[0]
+		pkg, names := processSyms(d.syms)
+		if pkg == "" {
+			continue // PJW: does this ever happen?
+		}
+		entry := Entry{
+			PkgName:    pkg,
+			Dir:        d.path,
+			ImportPath: k,
+			Version:    d.version,
+			Names:      names,
+		}
+		w.newIndex.Entries = append(w.newIndex.Entries, entry)
+	}
+	// sort the entries in the new index
+	slices.SortFunc(w.newIndex.Entries, func(l, r Entry) int {
+		if n := strings.Compare(l.PkgName, r.PkgName); n != 0 {
+			return n
+		}
+		return strings.Compare(l.ImportPath, r.ImportPath)
+	})
+	return nil
+}
+
+func (w *work) writeIndex() error {
+	return writeIndex(w.cacheDir, w.newIndex)
+}
diff --git a/sdk/vendor/golang.org/x/tools/internal/modindex/symbols.go b/sdk/vendor/golang.org/x/tools/internal/modindex/symbols.go
new file mode 100644
index 0000000000..33bf2641f7
--- /dev/null
+++ b/sdk/vendor/golang.org/x/tools/internal/modindex/symbols.go
@@ -0,0 +1,217 @@
+// Copyright 2024 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 modindex
+
+import (
+	"fmt"
+	"go/ast"
+	"go/parser"
+	"go/token"
+	"go/types"
+	"os"
+	"path/filepath"
+	"slices"
+	"strings"
+
+	"golang.org/x/sync/errgroup"
+)
+
+// The name of a symbol contains information about the symbol:
+//  T for types, TD if the type is deprecated
+//  C for consts, CD if the const is deprecated
+//  V for vars, VD if the var is deprecated
+// and for funcs:  F  ( )*
+// any spaces in  are replaced by $s so that the fields
+// of the name are space separated. F is replaced by FD if the func
+// is deprecated.
+type symbol struct {
+	pkg  string // name of the symbols's package
+	name string // declared name
+	kind string // T, C, V, or F
+	sig  string // signature information, for F
+}
+
+// find the symbols for the best directories
+func getSymbols(cd Abspath, dirs map[string][]*directory) {
+	var g errgroup.Group
+	g.SetLimit(-1) // maybe throttle this some day
+	for _, vv := range dirs {
+		// throttling some day?
+		d := vv[0]
+		g.Go(func() error {
+			thedir := filepath.Join(string(cd), string(d.path))
+			mode := parser.SkipObjectResolution | parser.ParseComments
+
+			fi, err := os.ReadDir(thedir)
+			if err != nil {
+				return nil // log this someday?
+			}
+			for _, fx := range fi {
+				if !strings.HasSuffix(fx.Name(), ".go") || strings.HasSuffix(fx.Name(), "_test.go") {
+					continue
+				}
+				fname := filepath.Join(thedir, fx.Name())
+				tr, err := parser.ParseFile(token.NewFileSet(), fname, nil, mode)
+				if err != nil {
+					continue // ignore errors, someday log them?
+				}
+				d.syms = append(d.syms, getFileExports(tr)...)
+			}
+			return nil
+		})
+	}
+	g.Wait()
+}
+
+func getFileExports(f *ast.File) []symbol {
+	pkg := f.Name.Name
+	if pkg == "main" {
+		return nil
+	}
+	var ans []symbol
+	// should we look for //go:build ignore?
+	for _, decl := range f.Decls {
+		switch decl := decl.(type) {
+		case *ast.FuncDecl:
+			if decl.Recv != nil {
+				// ignore methods, as we are completing package selections
+				continue
+			}
+			name := decl.Name.Name
+			dtype := decl.Type
+			// not looking at dtype.TypeParams. That is, treating
+			// generic functions just like non-generic ones.
+			sig := dtype.Params
+			kind := "F"
+			if isDeprecated(decl.Doc) {
+				kind += "D"
+			}
+			result := []string{fmt.Sprintf("%d", dtype.Results.NumFields())}
+			for _, x := range sig.List {
+				// This code creates a string representing the type.
+				// TODO(pjw): it may be fragile:
+				// 1. x.Type could be nil, perhaps in ill-formed code
+				// 2. ExprString might someday change incompatibly to
+				//    include struct tags, which can be arbitrary strings
+				if x.Type == nil {
+					// Can this happen without a parse error? (Files with parse
+					// errors are ignored in getSymbols)
+					continue // maybe report this someday
+				}
+				tp := types.ExprString(x.Type)
+				if len(tp) == 0 {
+					// Can this happen?
+					continue // maybe report this someday
+				}
+				// This is only safe if ExprString never returns anything with a $
+				// The only place a $ can occur seems to be in a struct tag, which
+				// can be an arbitrary string literal, and ExprString does not presently
+				// print struct tags. So for this to happen the type of a formal parameter
+				// has to be a explict struct, e.g. foo(x struct{a int "$"}) and ExprString
+				// would have to show the struct tag. Even testing for this case seems
+				// a waste of effort, but let's not ignore such pathologies
+				if strings.Contains(tp, "$") {
+					continue
+				}
+				tp = strings.Replace(tp, " ", "$", -1)
+				if len(x.Names) == 0 {
+					result = append(result, "_")
+					result = append(result, tp)
+				} else {
+					for _, y := range x.Names {
+						result = append(result, y.Name)
+						result = append(result, tp)
+					}
+				}
+			}
+			sigs := strings.Join(result, " ")
+			if s := newsym(pkg, name, kind, sigs); s != nil {
+				ans = append(ans, *s)
+			}
+		case *ast.GenDecl:
+			depr := isDeprecated(decl.Doc)
+			switch decl.Tok {
+			case token.CONST, token.VAR:
+				tp := "V"
+				if decl.Tok == token.CONST {
+					tp = "C"
+				}
+				if depr {
+					tp += "D"
+				}
+				for _, sp := range decl.Specs {
+					for _, x := range sp.(*ast.ValueSpec).Names {
+						if s := newsym(pkg, x.Name, tp, ""); s != nil {
+							ans = append(ans, *s)
+						}
+					}
+				}
+			case token.TYPE:
+				tp := "T"
+				if depr {
+					tp += "D"
+				}
+				for _, sp := range decl.Specs {
+					if s := newsym(pkg, sp.(*ast.TypeSpec).Name.Name, tp, ""); s != nil {
+						ans = append(ans, *s)
+					}
+				}
+			}
+		}
+	}
+	return ans
+}
+
+func newsym(pkg, name, kind, sig string) *symbol {
+	if len(name) == 0 || !ast.IsExported(name) {
+		return nil
+	}
+	sym := symbol{pkg: pkg, name: name, kind: kind, sig: sig}
+	return &sym
+}
+
+func isDeprecated(doc *ast.CommentGroup) bool {
+	if doc == nil {
+		return false
+	}
+	// go.dev/wiki/Deprecated Paragraph starting 'Deprecated:'
+	// This code fails for /* Deprecated: */, but it's the code from
+	// gopls/internal/analysis/deprecated
+	lines := strings.Split(doc.Text(), "\n\n")
+	for _, line := range lines {
+		if strings.HasPrefix(line, "Deprecated:") {
+			return true
+		}
+	}
+	return false
+}
+
+// return the package name and the value for the symbols.
+// if there are multiple packages, choose one arbitrarily
+// the returned slice is sorted lexicographically
+func processSyms(syms []symbol) (string, []string) {
+	if len(syms) == 0 {
+		return "", nil
+	}
+	slices.SortFunc(syms, func(l, r symbol) int {
+		return strings.Compare(l.name, r.name)
+	})
+	pkg := syms[0].pkg
+	var names []string
+	for _, s := range syms {
+		var nx string
+		if s.pkg == pkg {
+			if s.sig != "" {
+				nx = fmt.Sprintf("%s %s %s", s.name, s.kind, s.sig)
+			} else {
+				nx = fmt.Sprintf("%s %s", s.name, s.kind)
+			}
+			names = append(names, nx)
+		} else {
+			continue // PJW: do we want to keep track of these?
+		}
+	}
+	return pkg, names
+}
diff --git a/sdk/vendor/golang.org/x/tools/internal/modindex/types.go b/sdk/vendor/golang.org/x/tools/internal/modindex/types.go
new file mode 100644
index 0000000000..ece4488630
--- /dev/null
+++ b/sdk/vendor/golang.org/x/tools/internal/modindex/types.go
@@ -0,0 +1,25 @@
+// Copyright 2024 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 modindex
+
+import (
+	"strings"
+)
+
+// some special types to avoid confusions
+
+// distinguish various types of directory names. It's easy to get confused.
+type Abspath string // absolute paths
+type Relpath string // paths with GOMODCACHE prefix removed
+
+func toRelpath(cachedir Abspath, s string) Relpath {
+	if strings.HasPrefix(s, string(cachedir)) {
+		if s == string(cachedir) {
+			return Relpath("")
+		}
+		return Relpath(s[len(cachedir)+1:])
+	}
+	return Relpath(s)
+}
diff --git a/sdk/vendor/golang.org/x/tools/internal/packagesinternal/packages.go b/sdk/vendor/golang.org/x/tools/internal/packagesinternal/packages.go
index 44719de173..66e69b4389 100644
--- a/sdk/vendor/golang.org/x/tools/internal/packagesinternal/packages.go
+++ b/sdk/vendor/golang.org/x/tools/internal/packagesinternal/packages.go
@@ -5,7 +5,6 @@
 // Package packagesinternal exposes internal-only fields from go/packages.
 package packagesinternal
 
-var GetForTest = func(p interface{}) string { return "" }
 var GetDepsErrors = func(p interface{}) []*PackageError { return nil }
 
 type PackageError struct {
@@ -16,7 +15,6 @@ type PackageError struct {
 
 var TypecheckCgo int
 var DepsErrors int // must be set as a LoadMode to call GetDepsErrors
-var ForTest int    // must be set as a LoadMode to call GetForTest
 
 var SetModFlag = func(config interface{}, value string) {}
 var SetModFile = func(config interface{}, value string) {}
diff --git a/sdk/vendor/golang.org/x/tools/internal/stdlib/manifest.go b/sdk/vendor/golang.org/x/tools/internal/stdlib/manifest.go
index cdaac9ab34..9f0b871ff6 100644
--- a/sdk/vendor/golang.org/x/tools/internal/stdlib/manifest.go
+++ b/sdk/vendor/golang.org/x/tools/internal/stdlib/manifest.go
@@ -268,6 +268,8 @@ var PackageSymbols = map[string][]Symbol{
 		{"ErrTooLarge", Var, 0},
 		{"Fields", Func, 0},
 		{"FieldsFunc", Func, 0},
+		{"FieldsFuncSeq", Func, 24},
+		{"FieldsSeq", Func, 24},
 		{"HasPrefix", Func, 0},
 		{"HasSuffix", Func, 0},
 		{"Index", Func, 0},
@@ -280,6 +282,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"LastIndexAny", Func, 0},
 		{"LastIndexByte", Func, 5},
 		{"LastIndexFunc", Func, 0},
+		{"Lines", Func, 24},
 		{"Map", Func, 0},
 		{"MinRead", Const, 0},
 		{"NewBuffer", Func, 0},
@@ -293,7 +296,9 @@ var PackageSymbols = map[string][]Symbol{
 		{"Split", Func, 0},
 		{"SplitAfter", Func, 0},
 		{"SplitAfterN", Func, 0},
+		{"SplitAfterSeq", Func, 24},
 		{"SplitN", Func, 0},
+		{"SplitSeq", Func, 24},
 		{"Title", Func, 0},
 		{"ToLower", Func, 0},
 		{"ToLowerSpecial", Func, 0},
@@ -535,6 +540,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"NewCTR", Func, 0},
 		{"NewGCM", Func, 2},
 		{"NewGCMWithNonceSize", Func, 5},
+		{"NewGCMWithRandomNonce", Func, 24},
 		{"NewGCMWithTagSize", Func, 11},
 		{"NewOFB", Func, 0},
 		{"Stream", Type, 0},
@@ -673,6 +679,14 @@ var PackageSymbols = map[string][]Symbol{
 		{"Unmarshal", Func, 0},
 		{"UnmarshalCompressed", Func, 15},
 	},
+	"crypto/fips140": {
+		{"Enabled", Func, 24},
+	},
+	"crypto/hkdf": {
+		{"Expand", Func, 24},
+		{"Extract", Func, 24},
+		{"Key", Func, 24},
+	},
 	"crypto/hmac": {
 		{"Equal", Func, 1},
 		{"New", Func, 0},
@@ -683,11 +697,43 @@ var PackageSymbols = map[string][]Symbol{
 		{"Size", Const, 0},
 		{"Sum", Func, 2},
 	},
+	"crypto/mlkem": {
+		{"(*DecapsulationKey1024).Bytes", Method, 24},
+		{"(*DecapsulationKey1024).Decapsulate", Method, 24},
+		{"(*DecapsulationKey1024).EncapsulationKey", Method, 24},
+		{"(*DecapsulationKey768).Bytes", Method, 24},
+		{"(*DecapsulationKey768).Decapsulate", Method, 24},
+		{"(*DecapsulationKey768).EncapsulationKey", Method, 24},
+		{"(*EncapsulationKey1024).Bytes", Method, 24},
+		{"(*EncapsulationKey1024).Encapsulate", Method, 24},
+		{"(*EncapsulationKey768).Bytes", Method, 24},
+		{"(*EncapsulationKey768).Encapsulate", Method, 24},
+		{"CiphertextSize1024", Const, 24},
+		{"CiphertextSize768", Const, 24},
+		{"DecapsulationKey1024", Type, 24},
+		{"DecapsulationKey768", Type, 24},
+		{"EncapsulationKey1024", Type, 24},
+		{"EncapsulationKey768", Type, 24},
+		{"EncapsulationKeySize1024", Const, 24},
+		{"EncapsulationKeySize768", Const, 24},
+		{"GenerateKey1024", Func, 24},
+		{"GenerateKey768", Func, 24},
+		{"NewDecapsulationKey1024", Func, 24},
+		{"NewDecapsulationKey768", Func, 24},
+		{"NewEncapsulationKey1024", Func, 24},
+		{"NewEncapsulationKey768", Func, 24},
+		{"SeedSize", Const, 24},
+		{"SharedKeySize", Const, 24},
+	},
+	"crypto/pbkdf2": {
+		{"Key", Func, 24},
+	},
 	"crypto/rand": {
 		{"Int", Func, 0},
 		{"Prime", Func, 0},
 		{"Read", Func, 0},
 		{"Reader", Var, 0},
+		{"Text", Func, 24},
 	},
 	"crypto/rc4": {
 		{"(*Cipher).Reset", Method, 0},
@@ -766,6 +812,39 @@ var PackageSymbols = map[string][]Symbol{
 		{"Sum224", Func, 2},
 		{"Sum256", Func, 2},
 	},
+	"crypto/sha3": {
+		{"(*SHA3).AppendBinary", Method, 24},
+		{"(*SHA3).BlockSize", Method, 24},
+		{"(*SHA3).MarshalBinary", Method, 24},
+		{"(*SHA3).Reset", Method, 24},
+		{"(*SHA3).Size", Method, 24},
+		{"(*SHA3).Sum", Method, 24},
+		{"(*SHA3).UnmarshalBinary", Method, 24},
+		{"(*SHA3).Write", Method, 24},
+		{"(*SHAKE).AppendBinary", Method, 24},
+		{"(*SHAKE).BlockSize", Method, 24},
+		{"(*SHAKE).MarshalBinary", Method, 24},
+		{"(*SHAKE).Read", Method, 24},
+		{"(*SHAKE).Reset", Method, 24},
+		{"(*SHAKE).UnmarshalBinary", Method, 24},
+		{"(*SHAKE).Write", Method, 24},
+		{"New224", Func, 24},
+		{"New256", Func, 24},
+		{"New384", Func, 24},
+		{"New512", Func, 24},
+		{"NewCSHAKE128", Func, 24},
+		{"NewCSHAKE256", Func, 24},
+		{"NewSHAKE128", Func, 24},
+		{"NewSHAKE256", Func, 24},
+		{"SHA3", Type, 24},
+		{"SHAKE", Type, 24},
+		{"Sum224", Func, 24},
+		{"Sum256", Func, 24},
+		{"Sum384", Func, 24},
+		{"Sum512", Func, 24},
+		{"SumSHAKE128", Func, 24},
+		{"SumSHAKE256", Func, 24},
+	},
 	"crypto/sha512": {
 		{"BlockSize", Const, 0},
 		{"New", Func, 0},
@@ -788,6 +867,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"ConstantTimeEq", Func, 0},
 		{"ConstantTimeLessOrEq", Func, 2},
 		{"ConstantTimeSelect", Func, 0},
+		{"WithDataIndependentTiming", Func, 24},
 		{"XORBytes", Func, 20},
 	},
 	"crypto/tls": {
@@ -864,6 +944,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"ClientHelloInfo", Type, 4},
 		{"ClientHelloInfo.CipherSuites", Field, 4},
 		{"ClientHelloInfo.Conn", Field, 8},
+		{"ClientHelloInfo.Extensions", Field, 24},
 		{"ClientHelloInfo.ServerName", Field, 4},
 		{"ClientHelloInfo.SignatureSchemes", Field, 8},
 		{"ClientHelloInfo.SupportedCurves", Field, 4},
@@ -881,6 +962,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"Config.CurvePreferences", Field, 3},
 		{"Config.DynamicRecordSizingDisabled", Field, 7},
 		{"Config.EncryptedClientHelloConfigList", Field, 23},
+		{"Config.EncryptedClientHelloKeys", Field, 24},
 		{"Config.EncryptedClientHelloRejectionVerify", Field, 23},
 		{"Config.GetCertificate", Field, 4},
 		{"Config.GetClientCertificate", Field, 8},
@@ -934,6 +1016,10 @@ var PackageSymbols = map[string][]Symbol{
 		{"ECHRejectionError", Type, 23},
 		{"ECHRejectionError.RetryConfigList", Field, 23},
 		{"Ed25519", Const, 13},
+		{"EncryptedClientHelloKey", Type, 24},
+		{"EncryptedClientHelloKey.Config", Field, 24},
+		{"EncryptedClientHelloKey.PrivateKey", Field, 24},
+		{"EncryptedClientHelloKey.SendAsRetry", Field, 24},
 		{"InsecureCipherSuites", Func, 14},
 		{"Listen", Func, 0},
 		{"LoadX509KeyPair", Func, 0},
@@ -1032,6 +1118,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"VersionTLS12", Const, 2},
 		{"VersionTLS13", Const, 12},
 		{"X25519", Const, 8},
+		{"X25519MLKEM768", Const, 24},
 		{"X509KeyPair", Func, 0},
 	},
 	"crypto/x509": {
@@ -1056,6 +1143,8 @@ var PackageSymbols = map[string][]Symbol{
 		{"(ConstraintViolationError).Error", Method, 0},
 		{"(HostnameError).Error", Method, 0},
 		{"(InsecureAlgorithmError).Error", Method, 6},
+		{"(OID).AppendBinary", Method, 24},
+		{"(OID).AppendText", Method, 24},
 		{"(OID).Equal", Method, 22},
 		{"(OID).EqualASN1OID", Method, 22},
 		{"(OID).MarshalBinary", Method, 23},
@@ -1084,6 +1173,10 @@ var PackageSymbols = map[string][]Symbol{
 		{"Certificate.Extensions", Field, 2},
 		{"Certificate.ExtraExtensions", Field, 2},
 		{"Certificate.IPAddresses", Field, 1},
+		{"Certificate.InhibitAnyPolicy", Field, 24},
+		{"Certificate.InhibitAnyPolicyZero", Field, 24},
+		{"Certificate.InhibitPolicyMapping", Field, 24},
+		{"Certificate.InhibitPolicyMappingZero", Field, 24},
 		{"Certificate.IsCA", Field, 0},
 		{"Certificate.Issuer", Field, 0},
 		{"Certificate.IssuingCertificateURL", Field, 2},
@@ -1100,6 +1193,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"Certificate.PermittedURIDomains", Field, 10},
 		{"Certificate.Policies", Field, 22},
 		{"Certificate.PolicyIdentifiers", Field, 0},
+		{"Certificate.PolicyMappings", Field, 24},
 		{"Certificate.PublicKey", Field, 0},
 		{"Certificate.PublicKeyAlgorithm", Field, 0},
 		{"Certificate.Raw", Field, 0},
@@ -1107,6 +1201,8 @@ var PackageSymbols = map[string][]Symbol{
 		{"Certificate.RawSubject", Field, 0},
 		{"Certificate.RawSubjectPublicKeyInfo", Field, 0},
 		{"Certificate.RawTBSCertificate", Field, 0},
+		{"Certificate.RequireExplicitPolicy", Field, 24},
+		{"Certificate.RequireExplicitPolicyZero", Field, 24},
 		{"Certificate.SerialNumber", Field, 0},
 		{"Certificate.Signature", Field, 0},
 		{"Certificate.SignatureAlgorithm", Field, 0},
@@ -1198,6 +1294,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"NameConstraintsWithoutSANs", Const, 10},
 		{"NameMismatch", Const, 8},
 		{"NewCertPool", Func, 0},
+		{"NoValidChains", Const, 24},
 		{"NotAuthorizedToSign", Const, 0},
 		{"OID", Type, 22},
 		{"OIDFromInts", Func, 22},
@@ -1219,6 +1316,9 @@ var PackageSymbols = map[string][]Symbol{
 		{"ParsePKCS8PrivateKey", Func, 0},
 		{"ParsePKIXPublicKey", Func, 0},
 		{"ParseRevocationList", Func, 19},
+		{"PolicyMapping", Type, 24},
+		{"PolicyMapping.IssuerDomainPolicy", Field, 24},
+		{"PolicyMapping.SubjectDomainPolicy", Field, 24},
 		{"PublicKeyAlgorithm", Type, 0},
 		{"PureEd25519", Const, 13},
 		{"RSA", Const, 0},
@@ -1265,6 +1365,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"UnknownPublicKeyAlgorithm", Const, 0},
 		{"UnknownSignatureAlgorithm", Const, 0},
 		{"VerifyOptions", Type, 0},
+		{"VerifyOptions.CertificatePolicies", Field, 24},
 		{"VerifyOptions.CurrentTime", Field, 0},
 		{"VerifyOptions.DNSName", Field, 0},
 		{"VerifyOptions.Intermediates", Field, 0},
@@ -1975,6 +2076,8 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*File).DynString", Method, 1},
 		{"(*File).DynValue", Method, 21},
 		{"(*File).DynamicSymbols", Method, 4},
+		{"(*File).DynamicVersionNeeds", Method, 24},
+		{"(*File).DynamicVersions", Method, 24},
 		{"(*File).ImportedLibraries", Method, 0},
 		{"(*File).ImportedSymbols", Method, 0},
 		{"(*File).Section", Method, 0},
@@ -2240,6 +2343,19 @@ var PackageSymbols = map[string][]Symbol{
 		{"DynFlag", Type, 0},
 		{"DynFlag1", Type, 21},
 		{"DynTag", Type, 0},
+		{"DynamicVersion", Type, 24},
+		{"DynamicVersion.Deps", Field, 24},
+		{"DynamicVersion.Flags", Field, 24},
+		{"DynamicVersion.Index", Field, 24},
+		{"DynamicVersion.Name", Field, 24},
+		{"DynamicVersionDep", Type, 24},
+		{"DynamicVersionDep.Dep", Field, 24},
+		{"DynamicVersionDep.Flags", Field, 24},
+		{"DynamicVersionDep.Index", Field, 24},
+		{"DynamicVersionFlag", Type, 24},
+		{"DynamicVersionNeed", Type, 24},
+		{"DynamicVersionNeed.Name", Field, 24},
+		{"DynamicVersionNeed.Needs", Field, 24},
 		{"EI_ABIVERSION", Const, 0},
 		{"EI_CLASS", Const, 0},
 		{"EI_DATA", Const, 0},
@@ -3726,8 +3842,19 @@ var PackageSymbols = map[string][]Symbol{
 		{"Symbol.Size", Field, 0},
 		{"Symbol.Value", Field, 0},
 		{"Symbol.Version", Field, 13},
+		{"Symbol.VersionIndex", Field, 24},
+		{"Symbol.VersionScope", Field, 24},
+		{"SymbolVersionScope", Type, 24},
 		{"Type", Type, 0},
+		{"VER_FLG_BASE", Const, 24},
+		{"VER_FLG_INFO", Const, 24},
+		{"VER_FLG_WEAK", Const, 24},
 		{"Version", Type, 0},
+		{"VersionScopeGlobal", Const, 24},
+		{"VersionScopeHidden", Const, 24},
+		{"VersionScopeLocal", Const, 24},
+		{"VersionScopeNone", Const, 24},
+		{"VersionScopeSpecific", Const, 24},
 	},
 	"debug/gosym": {
 		{"(*DecodingError).Error", Method, 0},
@@ -4453,8 +4580,10 @@ var PackageSymbols = map[string][]Symbol{
 		{"FS", Type, 16},
 	},
 	"encoding": {
+		{"BinaryAppender", Type, 24},
 		{"BinaryMarshaler", Type, 2},
 		{"BinaryUnmarshaler", Type, 2},
+		{"TextAppender", Type, 24},
 		{"TextMarshaler", Type, 2},
 		{"TextUnmarshaler", Type, 2},
 	},
@@ -5984,13 +6113,16 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*Interface).Complete", Method, 5},
 		{"(*Interface).Embedded", Method, 5},
 		{"(*Interface).EmbeddedType", Method, 11},
+		{"(*Interface).EmbeddedTypes", Method, 24},
 		{"(*Interface).Empty", Method, 5},
 		{"(*Interface).ExplicitMethod", Method, 5},
+		{"(*Interface).ExplicitMethods", Method, 24},
 		{"(*Interface).IsComparable", Method, 18},
 		{"(*Interface).IsImplicit", Method, 18},
 		{"(*Interface).IsMethodSet", Method, 18},
 		{"(*Interface).MarkImplicit", Method, 18},
 		{"(*Interface).Method", Method, 5},
+		{"(*Interface).Methods", Method, 24},
 		{"(*Interface).NumEmbeddeds", Method, 5},
 		{"(*Interface).NumExplicitMethods", Method, 5},
 		{"(*Interface).NumMethods", Method, 5},
@@ -6011,9 +6143,11 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*MethodSet).At", Method, 5},
 		{"(*MethodSet).Len", Method, 5},
 		{"(*MethodSet).Lookup", Method, 5},
+		{"(*MethodSet).Methods", Method, 24},
 		{"(*MethodSet).String", Method, 5},
 		{"(*Named).AddMethod", Method, 5},
 		{"(*Named).Method", Method, 5},
+		{"(*Named).Methods", Method, 24},
 		{"(*Named).NumMethods", Method, 5},
 		{"(*Named).Obj", Method, 5},
 		{"(*Named).Origin", Method, 18},
@@ -6054,6 +6188,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*Pointer).String", Method, 5},
 		{"(*Pointer).Underlying", Method, 5},
 		{"(*Scope).Child", Method, 5},
+		{"(*Scope).Children", Method, 24},
 		{"(*Scope).Contains", Method, 5},
 		{"(*Scope).End", Method, 5},
 		{"(*Scope).Innermost", Method, 5},
@@ -6089,6 +6224,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*StdSizes).Offsetsof", Method, 5},
 		{"(*StdSizes).Sizeof", Method, 5},
 		{"(*Struct).Field", Method, 5},
+		{"(*Struct).Fields", Method, 24},
 		{"(*Struct).NumFields", Method, 5},
 		{"(*Struct).String", Method, 5},
 		{"(*Struct).Tag", Method, 5},
@@ -6100,8 +6236,10 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*Tuple).Len", Method, 5},
 		{"(*Tuple).String", Method, 5},
 		{"(*Tuple).Underlying", Method, 5},
+		{"(*Tuple).Variables", Method, 24},
 		{"(*TypeList).At", Method, 18},
 		{"(*TypeList).Len", Method, 18},
+		{"(*TypeList).Types", Method, 24},
 		{"(*TypeName).Exported", Method, 5},
 		{"(*TypeName).Id", Method, 5},
 		{"(*TypeName).IsAlias", Method, 9},
@@ -6119,9 +6257,11 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*TypeParam).Underlying", Method, 18},
 		{"(*TypeParamList).At", Method, 18},
 		{"(*TypeParamList).Len", Method, 18},
+		{"(*TypeParamList).TypeParams", Method, 24},
 		{"(*Union).Len", Method, 18},
 		{"(*Union).String", Method, 18},
 		{"(*Union).Term", Method, 18},
+		{"(*Union).Terms", Method, 24},
 		{"(*Union).Underlying", Method, 18},
 		{"(*Var).Anonymous", Method, 5},
 		{"(*Var).Embedded", Method, 11},
@@ -6392,10 +6532,12 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*Hash).WriteByte", Method, 14},
 		{"(*Hash).WriteString", Method, 14},
 		{"Bytes", Func, 19},
+		{"Comparable", Func, 24},
 		{"Hash", Type, 14},
 		{"MakeSeed", Func, 14},
 		{"Seed", Type, 14},
 		{"String", Func, 19},
+		{"WriteComparable", Func, 24},
 	},
 	"html": {
 		{"EscapeString", Func, 0},
@@ -7082,6 +7224,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*JSONHandler).WithGroup", Method, 21},
 		{"(*Level).UnmarshalJSON", Method, 21},
 		{"(*Level).UnmarshalText", Method, 21},
+		{"(*LevelVar).AppendText", Method, 24},
 		{"(*LevelVar).Level", Method, 21},
 		{"(*LevelVar).MarshalText", Method, 21},
 		{"(*LevelVar).Set", Method, 21},
@@ -7110,6 +7253,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"(Attr).Equal", Method, 21},
 		{"(Attr).String", Method, 21},
 		{"(Kind).String", Method, 21},
+		{"(Level).AppendText", Method, 24},
 		{"(Level).Level", Method, 21},
 		{"(Level).MarshalJSON", Method, 21},
 		{"(Level).MarshalText", Method, 21},
@@ -7140,6 +7284,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"Debug", Func, 21},
 		{"DebugContext", Func, 21},
 		{"Default", Func, 21},
+		{"DiscardHandler", Var, 24},
 		{"Duration", Func, 21},
 		{"DurationValue", Func, 21},
 		{"Error", Func, 21},
@@ -7375,6 +7520,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*Float).Acc", Method, 5},
 		{"(*Float).Add", Method, 5},
 		{"(*Float).Append", Method, 5},
+		{"(*Float).AppendText", Method, 24},
 		{"(*Float).Cmp", Method, 5},
 		{"(*Float).Copy", Method, 5},
 		{"(*Float).Float32", Method, 5},
@@ -7421,6 +7567,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*Int).And", Method, 0},
 		{"(*Int).AndNot", Method, 0},
 		{"(*Int).Append", Method, 6},
+		{"(*Int).AppendText", Method, 24},
 		{"(*Int).Binomial", Method, 0},
 		{"(*Int).Bit", Method, 0},
 		{"(*Int).BitLen", Method, 0},
@@ -7477,6 +7624,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*Int).Xor", Method, 0},
 		{"(*Rat).Abs", Method, 0},
 		{"(*Rat).Add", Method, 0},
+		{"(*Rat).AppendText", Method, 24},
 		{"(*Rat).Cmp", Method, 0},
 		{"(*Rat).Denom", Method, 0},
 		{"(*Rat).Float32", Method, 4},
@@ -7659,11 +7807,13 @@ var PackageSymbols = map[string][]Symbol{
 		{"Zipf", Type, 0},
 	},
 	"math/rand/v2": {
+		{"(*ChaCha8).AppendBinary", Method, 24},
 		{"(*ChaCha8).MarshalBinary", Method, 22},
 		{"(*ChaCha8).Read", Method, 23},
 		{"(*ChaCha8).Seed", Method, 22},
 		{"(*ChaCha8).Uint64", Method, 22},
 		{"(*ChaCha8).UnmarshalBinary", Method, 22},
+		{"(*PCG).AppendBinary", Method, 24},
 		{"(*PCG).MarshalBinary", Method, 22},
 		{"(*PCG).Seed", Method, 22},
 		{"(*PCG).Uint64", Method, 22},
@@ -7931,6 +8081,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*UnixListener).SyscallConn", Method, 10},
 		{"(Flags).String", Method, 0},
 		{"(HardwareAddr).String", Method, 0},
+		{"(IP).AppendText", Method, 24},
 		{"(IP).DefaultMask", Method, 0},
 		{"(IP).Equal", Method, 0},
 		{"(IP).IsGlobalUnicast", Method, 0},
@@ -8131,6 +8282,9 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*MaxBytesError).Error", Method, 19},
 		{"(*ProtocolError).Error", Method, 0},
 		{"(*ProtocolError).Is", Method, 21},
+		{"(*Protocols).SetHTTP1", Method, 24},
+		{"(*Protocols).SetHTTP2", Method, 24},
+		{"(*Protocols).SetUnencryptedHTTP2", Method, 24},
 		{"(*Request).AddCookie", Method, 0},
 		{"(*Request).BasicAuth", Method, 4},
 		{"(*Request).Clone", Method, 13},
@@ -8190,6 +8344,10 @@ var PackageSymbols = map[string][]Symbol{
 		{"(Header).Values", Method, 14},
 		{"(Header).Write", Method, 0},
 		{"(Header).WriteSubset", Method, 0},
+		{"(Protocols).HTTP1", Method, 24},
+		{"(Protocols).HTTP2", Method, 24},
+		{"(Protocols).String", Method, 24},
+		{"(Protocols).UnencryptedHTTP2", Method, 24},
 		{"AllowQuerySemicolons", Func, 17},
 		{"CanonicalHeaderKey", Func, 0},
 		{"Client", Type, 0},
@@ -8252,6 +8410,18 @@ var PackageSymbols = map[string][]Symbol{
 		{"FileSystem", Type, 0},
 		{"Flusher", Type, 0},
 		{"Get", Func, 0},
+		{"HTTP2Config", Type, 24},
+		{"HTTP2Config.CountError", Field, 24},
+		{"HTTP2Config.MaxConcurrentStreams", Field, 24},
+		{"HTTP2Config.MaxDecoderHeaderTableSize", Field, 24},
+		{"HTTP2Config.MaxEncoderHeaderTableSize", Field, 24},
+		{"HTTP2Config.MaxReadFrameSize", Field, 24},
+		{"HTTP2Config.MaxReceiveBufferPerConnection", Field, 24},
+		{"HTTP2Config.MaxReceiveBufferPerStream", Field, 24},
+		{"HTTP2Config.PermitProhibitedCipherSuites", Field, 24},
+		{"HTTP2Config.PingTimeout", Field, 24},
+		{"HTTP2Config.SendPingTimeout", Field, 24},
+		{"HTTP2Config.WriteByteTimeout", Field, 24},
 		{"Handle", Func, 0},
 		{"HandleFunc", Func, 0},
 		{"Handler", Type, 0},
@@ -8292,6 +8462,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"PostForm", Func, 0},
 		{"ProtocolError", Type, 0},
 		{"ProtocolError.ErrorString", Field, 0},
+		{"Protocols", Type, 24},
 		{"ProxyFromEnvironment", Func, 0},
 		{"ProxyURL", Func, 0},
 		{"PushOptions", Type, 8},
@@ -8361,9 +8532,11 @@ var PackageSymbols = map[string][]Symbol{
 		{"Server.ConnState", Field, 3},
 		{"Server.DisableGeneralOptionsHandler", Field, 20},
 		{"Server.ErrorLog", Field, 3},
+		{"Server.HTTP2", Field, 24},
 		{"Server.Handler", Field, 0},
 		{"Server.IdleTimeout", Field, 8},
 		{"Server.MaxHeaderBytes", Field, 0},
+		{"Server.Protocols", Field, 24},
 		{"Server.ReadHeaderTimeout", Field, 8},
 		{"Server.ReadTimeout", Field, 0},
 		{"Server.TLSConfig", Field, 0},
@@ -8453,12 +8626,14 @@ var PackageSymbols = map[string][]Symbol{
 		{"Transport.ExpectContinueTimeout", Field, 6},
 		{"Transport.ForceAttemptHTTP2", Field, 13},
 		{"Transport.GetProxyConnectHeader", Field, 16},
+		{"Transport.HTTP2", Field, 24},
 		{"Transport.IdleConnTimeout", Field, 7},
 		{"Transport.MaxConnsPerHost", Field, 11},
 		{"Transport.MaxIdleConns", Field, 7},
 		{"Transport.MaxIdleConnsPerHost", Field, 0},
 		{"Transport.MaxResponseHeaderBytes", Field, 7},
 		{"Transport.OnProxyConnectResponse", Field, 20},
+		{"Transport.Protocols", Field, 24},
 		{"Transport.Proxy", Field, 0},
 		{"Transport.ProxyConnectHeader", Field, 8},
 		{"Transport.ReadBufferSize", Field, 13},
@@ -8646,6 +8821,8 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*AddrPort).UnmarshalText", Method, 18},
 		{"(*Prefix).UnmarshalBinary", Method, 18},
 		{"(*Prefix).UnmarshalText", Method, 18},
+		{"(Addr).AppendBinary", Method, 24},
+		{"(Addr).AppendText", Method, 24},
 		{"(Addr).AppendTo", Method, 18},
 		{"(Addr).As16", Method, 18},
 		{"(Addr).As4", Method, 18},
@@ -8676,6 +8853,8 @@ var PackageSymbols = map[string][]Symbol{
 		{"(Addr).WithZone", Method, 18},
 		{"(Addr).Zone", Method, 18},
 		{"(AddrPort).Addr", Method, 18},
+		{"(AddrPort).AppendBinary", Method, 24},
+		{"(AddrPort).AppendText", Method, 24},
 		{"(AddrPort).AppendTo", Method, 18},
 		{"(AddrPort).Compare", Method, 22},
 		{"(AddrPort).IsValid", Method, 18},
@@ -8684,6 +8863,8 @@ var PackageSymbols = map[string][]Symbol{
 		{"(AddrPort).Port", Method, 18},
 		{"(AddrPort).String", Method, 18},
 		{"(Prefix).Addr", Method, 18},
+		{"(Prefix).AppendBinary", Method, 24},
+		{"(Prefix).AppendText", Method, 24},
 		{"(Prefix).AppendTo", Method, 18},
 		{"(Prefix).Bits", Method, 18},
 		{"(Prefix).Contains", Method, 18},
@@ -8868,6 +9049,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*Error).Temporary", Method, 6},
 		{"(*Error).Timeout", Method, 6},
 		{"(*Error).Unwrap", Method, 13},
+		{"(*URL).AppendBinary", Method, 24},
 		{"(*URL).EscapedFragment", Method, 15},
 		{"(*URL).EscapedPath", Method, 5},
 		{"(*URL).Hostname", Method, 8},
@@ -8967,6 +9149,17 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*ProcessState).SysUsage", Method, 0},
 		{"(*ProcessState).SystemTime", Method, 0},
 		{"(*ProcessState).UserTime", Method, 0},
+		{"(*Root).Close", Method, 24},
+		{"(*Root).Create", Method, 24},
+		{"(*Root).FS", Method, 24},
+		{"(*Root).Lstat", Method, 24},
+		{"(*Root).Mkdir", Method, 24},
+		{"(*Root).Name", Method, 24},
+		{"(*Root).Open", Method, 24},
+		{"(*Root).OpenFile", Method, 24},
+		{"(*Root).OpenRoot", Method, 24},
+		{"(*Root).Remove", Method, 24},
+		{"(*Root).Stat", Method, 24},
 		{"(*SyscallError).Error", Method, 0},
 		{"(*SyscallError).Timeout", Method, 10},
 		{"(*SyscallError).Unwrap", Method, 13},
@@ -9060,6 +9253,8 @@ var PackageSymbols = map[string][]Symbol{
 		{"O_WRONLY", Const, 0},
 		{"Open", Func, 0},
 		{"OpenFile", Func, 0},
+		{"OpenInRoot", Func, 24},
+		{"OpenRoot", Func, 24},
 		{"PathError", Type, 0},
 		{"PathError.Err", Field, 0},
 		{"PathError.Op", Field, 0},
@@ -9081,6 +9276,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"Remove", Func, 0},
 		{"RemoveAll", Func, 0},
 		{"Rename", Func, 0},
+		{"Root", Type, 24},
 		{"SEEK_CUR", Const, 0},
 		{"SEEK_END", Const, 0},
 		{"SEEK_SET", Const, 0},
@@ -9422,6 +9618,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"Zero", Func, 0},
 	},
 	"regexp": {
+		{"(*Regexp).AppendText", Method, 24},
 		{"(*Regexp).Copy", Method, 6},
 		{"(*Regexp).Expand", Method, 0},
 		{"(*Regexp).ExpandString", Method, 0},
@@ -9602,6 +9799,8 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*StackRecord).Stack", Method, 0},
 		{"(*TypeAssertionError).Error", Method, 0},
 		{"(*TypeAssertionError).RuntimeError", Method, 0},
+		{"(Cleanup).Stop", Method, 24},
+		{"AddCleanup", Func, 24},
 		{"BlockProfile", Func, 1},
 		{"BlockProfileRecord", Type, 1},
 		{"BlockProfileRecord.Count", Field, 1},
@@ -9612,6 +9811,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"Caller", Func, 0},
 		{"Callers", Func, 0},
 		{"CallersFrames", Func, 7},
+		{"Cleanup", Type, 24},
 		{"Compiler", Const, 0},
 		{"Error", Type, 0},
 		{"Frame", Type, 7},
@@ -9974,6 +10174,8 @@ var PackageSymbols = map[string][]Symbol{
 		{"EqualFold", Func, 0},
 		{"Fields", Func, 0},
 		{"FieldsFunc", Func, 0},
+		{"FieldsFuncSeq", Func, 24},
+		{"FieldsSeq", Func, 24},
 		{"HasPrefix", Func, 0},
 		{"HasSuffix", Func, 0},
 		{"Index", Func, 0},
@@ -9986,6 +10188,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"LastIndexAny", Func, 0},
 		{"LastIndexByte", Func, 5},
 		{"LastIndexFunc", Func, 0},
+		{"Lines", Func, 24},
 		{"Map", Func, 0},
 		{"NewReader", Func, 0},
 		{"NewReplacer", Func, 0},
@@ -9997,7 +10200,9 @@ var PackageSymbols = map[string][]Symbol{
 		{"Split", Func, 0},
 		{"SplitAfter", Func, 0},
 		{"SplitAfterN", Func, 0},
+		{"SplitAfterSeq", Func, 24},
 		{"SplitN", Func, 0},
+		{"SplitSeq", Func, 24},
 		{"Title", Func, 0},
 		{"ToLower", Func, 0},
 		{"ToLowerSpecial", Func, 0},
@@ -16413,7 +16618,9 @@ var PackageSymbols = map[string][]Symbol{
 		{"ValueOf", Func, 0},
 	},
 	"testing": {
+		{"(*B).Chdir", Method, 24},
 		{"(*B).Cleanup", Method, 14},
+		{"(*B).Context", Method, 24},
 		{"(*B).Elapsed", Method, 20},
 		{"(*B).Error", Method, 0},
 		{"(*B).Errorf", Method, 0},
@@ -16425,6 +16632,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*B).Helper", Method, 9},
 		{"(*B).Log", Method, 0},
 		{"(*B).Logf", Method, 0},
+		{"(*B).Loop", Method, 24},
 		{"(*B).Name", Method, 8},
 		{"(*B).ReportAllocs", Method, 1},
 		{"(*B).ReportMetric", Method, 13},
@@ -16442,7 +16650,9 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*B).StopTimer", Method, 0},
 		{"(*B).TempDir", Method, 15},
 		{"(*F).Add", Method, 18},
+		{"(*F).Chdir", Method, 24},
 		{"(*F).Cleanup", Method, 18},
+		{"(*F).Context", Method, 24},
 		{"(*F).Error", Method, 18},
 		{"(*F).Errorf", Method, 18},
 		{"(*F).Fail", Method, 18},
@@ -16463,7 +16673,9 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*F).TempDir", Method, 18},
 		{"(*M).Run", Method, 4},
 		{"(*PB).Next", Method, 3},
+		{"(*T).Chdir", Method, 24},
 		{"(*T).Cleanup", Method, 14},
+		{"(*T).Context", Method, 24},
 		{"(*T).Deadline", Method, 15},
 		{"(*T).Error", Method, 0},
 		{"(*T).Errorf", Method, 0},
@@ -16954,7 +17166,9 @@ var PackageSymbols = map[string][]Symbol{
 		{"(Time).Add", Method, 0},
 		{"(Time).AddDate", Method, 0},
 		{"(Time).After", Method, 0},
+		{"(Time).AppendBinary", Method, 24},
 		{"(Time).AppendFormat", Method, 5},
+		{"(Time).AppendText", Method, 24},
 		{"(Time).Before", Method, 0},
 		{"(Time).Clock", Method, 0},
 		{"(Time).Compare", Method, 20},
@@ -17428,4 +17642,9 @@ var PackageSymbols = map[string][]Symbol{
 		{"String", Func, 0},
 		{"StringData", Func, 0},
 	},
+	"weak": {
+		{"(Pointer).Value", Method, 24},
+		{"Make", Func, 24},
+		{"Pointer", Type, 24},
+	},
 }
diff --git a/sdk/vendor/golang.org/x/tools/internal/tokeninternal/tokeninternal.go b/sdk/vendor/golang.org/x/tools/internal/tokeninternal/tokeninternal.go
deleted file mode 100644
index ff9437a36c..0000000000
--- a/sdk/vendor/golang.org/x/tools/internal/tokeninternal/tokeninternal.go
+++ /dev/null
@@ -1,137 +0,0 @@
-// Copyright 2023 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 tokeninternal provides access to some internal features of the token
-// package.
-package tokeninternal
-
-import (
-	"fmt"
-	"go/token"
-	"sort"
-	"sync"
-	"unsafe"
-)
-
-// GetLines returns the table of line-start offsets from a token.File.
-func GetLines(file *token.File) []int {
-	// token.File has a Lines method on Go 1.21 and later.
-	if file, ok := (interface{})(file).(interface{ Lines() []int }); ok {
-		return file.Lines()
-	}
-
-	// This declaration must match that of token.File.
-	// This creates a risk of dependency skew.
-	// For now we check that the size of the two
-	// declarations is the same, on the (fragile) assumption
-	// that future changes would add fields.
-	type tokenFile119 struct {
-		_     string
-		_     int
-		_     int
-		mu    sync.Mutex // we're not complete monsters
-		lines []int
-		_     []struct{}
-	}
-
-	if unsafe.Sizeof(*file) != unsafe.Sizeof(tokenFile119{}) {
-		panic("unexpected token.File size")
-	}
-	var ptr *tokenFile119
-	type uP = unsafe.Pointer
-	*(*uP)(uP(&ptr)) = uP(file)
-	ptr.mu.Lock()
-	defer ptr.mu.Unlock()
-	return ptr.lines
-}
-
-// AddExistingFiles adds the specified files to the FileSet if they
-// are not already present. It panics if any pair of files in the
-// resulting FileSet would overlap.
-func AddExistingFiles(fset *token.FileSet, files []*token.File) {
-	// Punch through the FileSet encapsulation.
-	type tokenFileSet struct {
-		// This type remained essentially consistent from go1.16 to go1.21.
-		mutex sync.RWMutex
-		base  int
-		files []*token.File
-		_     *token.File // changed to atomic.Pointer[token.File] in go1.19
-	}
-
-	// If the size of token.FileSet changes, this will fail to compile.
-	const delta = int64(unsafe.Sizeof(tokenFileSet{})) - int64(unsafe.Sizeof(token.FileSet{}))
-	var _ [-delta * delta]int
-
-	type uP = unsafe.Pointer
-	var ptr *tokenFileSet
-	*(*uP)(uP(&ptr)) = uP(fset)
-	ptr.mutex.Lock()
-	defer ptr.mutex.Unlock()
-
-	// Merge and sort.
-	newFiles := append(ptr.files, files...)
-	sort.Slice(newFiles, func(i, j int) bool {
-		return newFiles[i].Base() < newFiles[j].Base()
-	})
-
-	// Reject overlapping files.
-	// Discard adjacent identical files.
-	out := newFiles[:0]
-	for i, file := range newFiles {
-		if i > 0 {
-			prev := newFiles[i-1]
-			if file == prev {
-				continue
-			}
-			if prev.Base()+prev.Size()+1 > file.Base() {
-				panic(fmt.Sprintf("file %s (%d-%d) overlaps with file %s (%d-%d)",
-					prev.Name(), prev.Base(), prev.Base()+prev.Size(),
-					file.Name(), file.Base(), file.Base()+file.Size()))
-			}
-		}
-		out = append(out, file)
-	}
-	newFiles = out
-
-	ptr.files = newFiles
-
-	// Advance FileSet.Base().
-	if len(newFiles) > 0 {
-		last := newFiles[len(newFiles)-1]
-		newBase := last.Base() + last.Size() + 1
-		if ptr.base < newBase {
-			ptr.base = newBase
-		}
-	}
-}
-
-// FileSetFor returns a new FileSet containing a sequence of new Files with
-// the same base, size, and line as the input files, for use in APIs that
-// require a FileSet.
-//
-// Precondition: the input files must be non-overlapping, and sorted in order
-// of their Base.
-func FileSetFor(files ...*token.File) *token.FileSet {
-	fset := token.NewFileSet()
-	for _, f := range files {
-		f2 := fset.AddFile(f.Name(), f.Base(), f.Size())
-		lines := GetLines(f)
-		f2.SetLines(lines)
-	}
-	return fset
-}
-
-// CloneFileSet creates a new FileSet holding all files in fset. It does not
-// create copies of the token.Files in fset: they are added to the resulting
-// FileSet unmodified.
-func CloneFileSet(fset *token.FileSet) *token.FileSet {
-	var files []*token.File
-	fset.Iterate(func(f *token.File) bool {
-		files = append(files, f)
-		return true
-	})
-	newFileSet := token.NewFileSet()
-	AddExistingFiles(newFileSet, files)
-	return newFileSet
-}
diff --git a/sdk/vendor/golang.org/x/tools/internal/typeparams/common.go b/sdk/vendor/golang.org/x/tools/internal/typeparams/common.go
index 89bd256dc6..cdae2b8e81 100644
--- a/sdk/vendor/golang.org/x/tools/internal/typeparams/common.go
+++ b/sdk/vendor/golang.org/x/tools/internal/typeparams/common.go
@@ -16,8 +16,6 @@ import (
 	"go/ast"
 	"go/token"
 	"go/types"
-
-	"golang.org/x/tools/internal/aliases"
 )
 
 // UnpackIndexExpr extracts data from AST nodes that represent index
@@ -65,78 +63,6 @@ func PackIndexExpr(x ast.Expr, lbrack token.Pos, indices []ast.Expr, rbrack toke
 
 // IsTypeParam reports whether t is a type parameter (or an alias of one).
 func IsTypeParam(t types.Type) bool {
-	_, ok := aliases.Unalias(t).(*types.TypeParam)
+	_, ok := types.Unalias(t).(*types.TypeParam)
 	return ok
 }
-
-// GenericAssignableTo is a generalization of types.AssignableTo that
-// implements the following rule for uninstantiated generic types:
-//
-// If V and T are generic named types, then V is considered assignable to T if,
-// for every possible instantiation of V[A_1, ..., A_N], the instantiation
-// T[A_1, ..., A_N] is valid and V[A_1, ..., A_N] implements T[A_1, ..., A_N].
-//
-// If T has structural constraints, they must be satisfied by V.
-//
-// For example, consider the following type declarations:
-//
-//	type Interface[T any] interface {
-//		Accept(T)
-//	}
-//
-//	type Container[T any] struct {
-//		Element T
-//	}
-//
-//	func (c Container[T]) Accept(t T) { c.Element = t }
-//
-// In this case, GenericAssignableTo reports that instantiations of Container
-// are assignable to the corresponding instantiation of Interface.
-func GenericAssignableTo(ctxt *types.Context, V, T types.Type) bool {
-	V = aliases.Unalias(V)
-	T = aliases.Unalias(T)
-
-	// If V and T are not both named, or do not have matching non-empty type
-	// parameter lists, fall back on types.AssignableTo.
-
-	VN, Vnamed := V.(*types.Named)
-	TN, Tnamed := T.(*types.Named)
-	if !Vnamed || !Tnamed {
-		return types.AssignableTo(V, T)
-	}
-
-	vtparams := VN.TypeParams()
-	ttparams := TN.TypeParams()
-	if vtparams.Len() == 0 || vtparams.Len() != ttparams.Len() || VN.TypeArgs().Len() != 0 || TN.TypeArgs().Len() != 0 {
-		return types.AssignableTo(V, T)
-	}
-
-	// V and T have the same (non-zero) number of type params. Instantiate both
-	// with the type parameters of V. This must always succeed for V, and will
-	// succeed for T if and only if the type set of each type parameter of V is a
-	// subset of the type set of the corresponding type parameter of T, meaning
-	// that every instantiation of V corresponds to a valid instantiation of T.
-
-	// Minor optimization: ensure we share a context across the two
-	// instantiations below.
-	if ctxt == nil {
-		ctxt = types.NewContext()
-	}
-
-	var targs []types.Type
-	for i := 0; i < vtparams.Len(); i++ {
-		targs = append(targs, vtparams.At(i))
-	}
-
-	vinst, err := types.Instantiate(ctxt, V, targs, true)
-	if err != nil {
-		panic("type parameters should satisfy their own constraints")
-	}
-
-	tinst, err := types.Instantiate(ctxt, T, targs, true)
-	if err != nil {
-		return false
-	}
-
-	return types.AssignableTo(vinst, tinst)
-}
diff --git a/sdk/vendor/golang.org/x/tools/internal/typeparams/free.go b/sdk/vendor/golang.org/x/tools/internal/typeparams/free.go
index a1d138226c..0ade5c2949 100644
--- a/sdk/vendor/golang.org/x/tools/internal/typeparams/free.go
+++ b/sdk/vendor/golang.org/x/tools/internal/typeparams/free.go
@@ -37,8 +37,20 @@ func (w *Free) Has(typ types.Type) (res bool) {
 	case nil, *types.Basic: // TODO(gri) should nil be handled here?
 		break
 
-	case *aliases.Alias:
-		return w.Has(aliases.Unalias(t))
+	case *types.Alias:
+		if aliases.TypeParams(t).Len() > aliases.TypeArgs(t).Len() {
+			return true // This is an uninstantiated Alias.
+		}
+		// The expansion of an alias can have free type parameters,
+		// whether or not the alias itself has type parameters:
+		//
+		//   func _[K comparable]() {
+		//     type Set      = map[K]bool // free(Set)      = {K}
+		//     type MapTo[V] = map[K]V    // free(Map[foo]) = {V}
+		//   }
+		//
+		// So, we must Unalias.
+		return w.Has(types.Unalias(t))
 
 	case *types.Array:
 		return w.Has(t.Elem())
@@ -98,9 +110,8 @@ func (w *Free) Has(typ types.Type) (res bool) {
 
 	case *types.Named:
 		args := t.TypeArgs()
-		// TODO(taking): this does not match go/types/infer.go. Check with rfindley.
 		if params := t.TypeParams(); params.Len() > args.Len() {
-			return true
+			return true // this is an uninstantiated named type.
 		}
 		for i, n := 0, args.Len(); i < n; i++ {
 			if w.Has(args.At(i)) {
diff --git a/sdk/vendor/golang.org/x/tools/internal/typesinternal/element.go b/sdk/vendor/golang.org/x/tools/internal/typesinternal/element.go
new file mode 100644
index 0000000000..4957f02164
--- /dev/null
+++ b/sdk/vendor/golang.org/x/tools/internal/typesinternal/element.go
@@ -0,0 +1,133 @@
+// Copyright 2024 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 typesinternal
+
+import (
+	"fmt"
+	"go/types"
+
+	"golang.org/x/tools/go/types/typeutil"
+)
+
+// ForEachElement calls f for type T and each type reachable from its
+// type through reflection. It does this by recursively stripping off
+// type constructors; in addition, for each named type N, the type *N
+// is added to the result as it may have additional methods.
+//
+// The caller must provide an initially empty set used to de-duplicate
+// identical types, potentially across multiple calls to ForEachElement.
+// (Its final value holds all the elements seen, matching the arguments
+// passed to f.)
+//
+// TODO(adonovan): share/harmonize with go/callgraph/rta.
+func ForEachElement(rtypes *typeutil.Map, msets *typeutil.MethodSetCache, T types.Type, f func(types.Type)) {
+	var visit func(T types.Type, skip bool)
+	visit = func(T types.Type, skip bool) {
+		if !skip {
+			if seen, _ := rtypes.Set(T, true).(bool); seen {
+				return // de-dup
+			}
+
+			f(T) // notify caller of new element type
+		}
+
+		// Recursion over signatures of each method.
+		tmset := msets.MethodSet(T)
+		for i := 0; i < tmset.Len(); i++ {
+			sig := tmset.At(i).Type().(*types.Signature)
+			// It is tempting to call visit(sig, false)
+			// but, as noted in golang.org/cl/65450043,
+			// the Signature.Recv field is ignored by
+			// types.Identical and typeutil.Map, which
+			// is confusing at best.
+			//
+			// More importantly, the true signature rtype
+			// reachable from a method using reflection
+			// has no receiver but an extra ordinary parameter.
+			// For the Read method of io.Reader we want:
+			//   func(Reader, []byte) (int, error)
+			// but here sig is:
+			//   func([]byte) (int, error)
+			// with .Recv = Reader (though it is hard to
+			// notice because it doesn't affect Signature.String
+			// or types.Identical).
+			//
+			// TODO(adonovan): construct and visit the correct
+			// non-method signature with an extra parameter
+			// (though since unnamed func types have no methods
+			// there is essentially no actual demand for this).
+			//
+			// TODO(adonovan): document whether or not it is
+			// safe to skip non-exported methods (as RTA does).
+			visit(sig.Params(), true)  // skip the Tuple
+			visit(sig.Results(), true) // skip the Tuple
+		}
+
+		switch T := T.(type) {
+		case *types.Alias:
+			visit(types.Unalias(T), skip) // emulates the pre-Alias behavior
+
+		case *types.Basic:
+			// nop
+
+		case *types.Interface:
+			// nop---handled by recursion over method set.
+
+		case *types.Pointer:
+			visit(T.Elem(), false)
+
+		case *types.Slice:
+			visit(T.Elem(), false)
+
+		case *types.Chan:
+			visit(T.Elem(), false)
+
+		case *types.Map:
+			visit(T.Key(), false)
+			visit(T.Elem(), false)
+
+		case *types.Signature:
+			if T.Recv() != nil {
+				panic(fmt.Sprintf("Signature %s has Recv %s", T, T.Recv()))
+			}
+			visit(T.Params(), true)  // skip the Tuple
+			visit(T.Results(), true) // skip the Tuple
+
+		case *types.Named:
+			// A pointer-to-named type can be derived from a named
+			// type via reflection.  It may have methods too.
+			visit(types.NewPointer(T), false)
+
+			// Consider 'type T struct{S}' where S has methods.
+			// Reflection provides no way to get from T to struct{S},
+			// only to S, so the method set of struct{S} is unwanted,
+			// so set 'skip' flag during recursion.
+			visit(T.Underlying(), true) // skip the unnamed type
+
+		case *types.Array:
+			visit(T.Elem(), false)
+
+		case *types.Struct:
+			for i, n := 0, T.NumFields(); i < n; i++ {
+				// TODO(adonovan): document whether or not
+				// it is safe to skip non-exported fields.
+				visit(T.Field(i).Type(), false)
+			}
+
+		case *types.Tuple:
+			for i, n := 0, T.Len(); i < n; i++ {
+				visit(T.At(i).Type(), false)
+			}
+
+		case *types.TypeParam, *types.Union:
+			// forEachReachable must not be called on parameterized types.
+			panic(T)
+
+		default:
+			panic(T)
+		}
+	}
+	visit(T, false)
+}
diff --git a/sdk/vendor/golang.org/x/tools/internal/typesinternal/qualifier.go b/sdk/vendor/golang.org/x/tools/internal/typesinternal/qualifier.go
new file mode 100644
index 0000000000..b64f714eb3
--- /dev/null
+++ b/sdk/vendor/golang.org/x/tools/internal/typesinternal/qualifier.go
@@ -0,0 +1,46 @@
+// Copyright 2024 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 typesinternal
+
+import (
+	"go/ast"
+	"go/types"
+	"strconv"
+)
+
+// FileQualifier returns a [types.Qualifier] function that qualifies
+// imported symbols appropriately based on the import environment of a given
+// file.
+// If the same package is imported multiple times, the last appearance is
+// recorded.
+func FileQualifier(f *ast.File, pkg *types.Package) types.Qualifier {
+	// Construct mapping of import paths to their defined names.
+	// It is only necessary to look at renaming imports.
+	imports := make(map[string]string)
+	for _, imp := range f.Imports {
+		if imp.Name != nil && imp.Name.Name != "_" {
+			path, _ := strconv.Unquote(imp.Path.Value)
+			imports[path] = imp.Name.Name
+		}
+	}
+
+	// Define qualifier to replace full package paths with names of the imports.
+	return func(p *types.Package) string {
+		if p == nil || p == pkg {
+			return ""
+		}
+
+		if name, ok := imports[p.Path()]; ok {
+			if name == "." {
+				return ""
+			} else {
+				return name
+			}
+		}
+
+		// If there is no local renaming, fall back to the package name.
+		return p.Name()
+	}
+}
diff --git a/sdk/vendor/golang.org/x/tools/internal/typesinternal/recv.go b/sdk/vendor/golang.org/x/tools/internal/typesinternal/recv.go
index fea7c8b75e..e54accc69a 100644
--- a/sdk/vendor/golang.org/x/tools/internal/typesinternal/recv.go
+++ b/sdk/vendor/golang.org/x/tools/internal/typesinternal/recv.go
@@ -6,20 +6,20 @@ package typesinternal
 
 import (
 	"go/types"
-
-	"golang.org/x/tools/internal/aliases"
 )
 
 // ReceiverNamed returns the named type (if any) associated with the
 // type of recv, which may be of the form N or *N, or aliases thereof.
 // It also reports whether a Pointer was present.
+//
+// The named result may be nil in ill-typed code.
 func ReceiverNamed(recv *types.Var) (isPtr bool, named *types.Named) {
 	t := recv.Type()
-	if ptr, ok := aliases.Unalias(t).(*types.Pointer); ok {
+	if ptr, ok := types.Unalias(t).(*types.Pointer); ok {
 		isPtr = true
 		t = ptr.Elem()
 	}
-	named, _ = aliases.Unalias(t).(*types.Named)
+	named, _ = types.Unalias(t).(*types.Named)
 	return
 }
 
@@ -36,7 +36,7 @@ func ReceiverNamed(recv *types.Var) (isPtr bool, named *types.Named) {
 // indirection from the type, regardless of named types (analogous to
 // a LOAD instruction).
 func Unpointer(t types.Type) types.Type {
-	if ptr, ok := aliases.Unalias(t).(*types.Pointer); ok {
+	if ptr, ok := types.Unalias(t).(*types.Pointer); ok {
 		return ptr.Elem()
 	}
 	return t
diff --git a/sdk/vendor/golang.org/x/tools/internal/typesinternal/types.go b/sdk/vendor/golang.org/x/tools/internal/typesinternal/types.go
index 8392328612..a93d51f988 100644
--- a/sdk/vendor/golang.org/x/tools/internal/typesinternal/types.go
+++ b/sdk/vendor/golang.org/x/tools/internal/typesinternal/types.go
@@ -11,6 +11,8 @@ import (
 	"go/types"
 	"reflect"
 	"unsafe"
+
+	"golang.org/x/tools/internal/aliases"
 )
 
 func SetUsesCgo(conf *types.Config) bool {
@@ -63,3 +65,58 @@ func NameRelativeTo(pkg *types.Package) types.Qualifier {
 		return other.Name()
 	}
 }
+
+// A NamedOrAlias is a [types.Type] that is named (as
+// defined by the spec) and capable of bearing type parameters: it
+// abstracts aliases ([types.Alias]) and defined types
+// ([types.Named]).
+//
+// Every type declared by an explicit "type" declaration is a
+// NamedOrAlias. (Built-in type symbols may additionally
+// have type [types.Basic], which is not a NamedOrAlias,
+// though the spec regards them as "named".)
+//
+// NamedOrAlias cannot expose the Origin method, because
+// [types.Alias.Origin] and [types.Named.Origin] have different
+// (covariant) result types; use [Origin] instead.
+type NamedOrAlias interface {
+	types.Type
+	Obj() *types.TypeName
+	// TODO(hxjiang): add method TypeArgs() *types.TypeList after stop supporting go1.22.
+}
+
+// TypeParams is a light shim around t.TypeParams().
+// (go/types.Alias).TypeParams requires >= 1.23.
+func TypeParams(t NamedOrAlias) *types.TypeParamList {
+	switch t := t.(type) {
+	case *types.Alias:
+		return aliases.TypeParams(t)
+	case *types.Named:
+		return t.TypeParams()
+	}
+	return nil
+}
+
+// TypeArgs is a light shim around t.TypeArgs().
+// (go/types.Alias).TypeArgs requires >= 1.23.
+func TypeArgs(t NamedOrAlias) *types.TypeList {
+	switch t := t.(type) {
+	case *types.Alias:
+		return aliases.TypeArgs(t)
+	case *types.Named:
+		return t.TypeArgs()
+	}
+	return nil
+}
+
+// Origin returns the generic type of the Named or Alias type t if it
+// is instantiated, otherwise it returns t.
+func Origin(t NamedOrAlias) NamedOrAlias {
+	switch t := t.(type) {
+	case *types.Alias:
+		return aliases.Origin(t)
+	case *types.Named:
+		return t.Origin()
+	}
+	return t
+}
diff --git a/sdk/vendor/golang.org/x/tools/internal/typesinternal/zerovalue.go b/sdk/vendor/golang.org/x/tools/internal/typesinternal/zerovalue.go
new file mode 100644
index 0000000000..d272949c17
--- /dev/null
+++ b/sdk/vendor/golang.org/x/tools/internal/typesinternal/zerovalue.go
@@ -0,0 +1,392 @@
+// Copyright 2024 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 typesinternal
+
+import (
+	"fmt"
+	"go/ast"
+	"go/token"
+	"go/types"
+	"strings"
+)
+
+// ZeroString returns the string representation of the zero value for any type t.
+// The boolean result indicates whether the type is or contains an invalid type
+// or a non-basic (constraint) interface type.
+//
+// Even for invalid input types, ZeroString may return a partially correct
+// string representation. The caller should use the returned isValid boolean
+// to determine the validity of the expression.
+//
+// When assigning to a wider type (such as 'any'), it's the caller's
+// responsibility to handle any necessary type conversions.
+//
+// This string can be used on the right-hand side of an assignment where the
+// left-hand side has that explicit type.
+// References to named types are qualified by an appropriate (optional)
+// qualifier function.
+// Exception: This does not apply to tuples. Their string representation is
+// informational only and cannot be used in an assignment.
+//
+// See [ZeroExpr] for a variant that returns an [ast.Expr].
+func ZeroString(t types.Type, qual types.Qualifier) (_ string, isValid bool) {
+	switch t := t.(type) {
+	case *types.Basic:
+		switch {
+		case t.Info()&types.IsBoolean != 0:
+			return "false", true
+		case t.Info()&types.IsNumeric != 0:
+			return "0", true
+		case t.Info()&types.IsString != 0:
+			return `""`, true
+		case t.Kind() == types.UnsafePointer:
+			fallthrough
+		case t.Kind() == types.UntypedNil:
+			return "nil", true
+		case t.Kind() == types.Invalid:
+			return "invalid", false
+		default:
+			panic(fmt.Sprintf("ZeroString for unexpected type %v", t))
+		}
+
+	case *types.Pointer, *types.Slice, *types.Chan, *types.Map, *types.Signature:
+		return "nil", true
+
+	case *types.Interface:
+		if !t.IsMethodSet() {
+			return "invalid", false
+		}
+		return "nil", true
+
+	case *types.Named:
+		switch under := t.Underlying().(type) {
+		case *types.Struct, *types.Array:
+			return types.TypeString(t, qual) + "{}", true
+		default:
+			return ZeroString(under, qual)
+		}
+
+	case *types.Alias:
+		switch t.Underlying().(type) {
+		case *types.Struct, *types.Array:
+			return types.TypeString(t, qual) + "{}", true
+		default:
+			// A type parameter can have alias but alias type's underlying type
+			// can never be a type parameter.
+			// Use types.Unalias to preserve the info of type parameter instead
+			// of call Underlying() going right through and get the underlying
+			// type of the type parameter which is always an interface.
+			return ZeroString(types.Unalias(t), qual)
+		}
+
+	case *types.Array, *types.Struct:
+		return types.TypeString(t, qual) + "{}", true
+
+	case *types.TypeParam:
+		// Assumes func new is not shadowed.
+		return "*new(" + types.TypeString(t, qual) + ")", true
+
+	case *types.Tuple:
+		// Tuples are not normal values.
+		// We are currently format as "(t[0], ..., t[n])". Could be something else.
+		isValid := true
+		components := make([]string, t.Len())
+		for i := 0; i < t.Len(); i++ {
+			comp, ok := ZeroString(t.At(i).Type(), qual)
+
+			components[i] = comp
+			isValid = isValid && ok
+		}
+		return "(" + strings.Join(components, ", ") + ")", isValid
+
+	case *types.Union:
+		// Variables of these types cannot be created, so it makes
+		// no sense to ask for their zero value.
+		panic(fmt.Sprintf("invalid type for a variable: %v", t))
+
+	default:
+		panic(t) // unreachable.
+	}
+}
+
+// ZeroExpr returns the ast.Expr representation of the zero value for any type t.
+// The boolean result indicates whether the type is or contains an invalid type
+// or a non-basic (constraint) interface type.
+//
+// Even for invalid input types, ZeroExpr may return a partially correct ast.Expr
+// representation. The caller should use the returned isValid boolean to determine
+// the validity of the expression.
+//
+// This function is designed for types suitable for variables and should not be
+// used with Tuple or Union types.References to named types are qualified by an
+// appropriate (optional) qualifier function.
+//
+// See [ZeroString] for a variant that returns a string.
+func ZeroExpr(t types.Type, qual types.Qualifier) (_ ast.Expr, isValid bool) {
+	switch t := t.(type) {
+	case *types.Basic:
+		switch {
+		case t.Info()&types.IsBoolean != 0:
+			return &ast.Ident{Name: "false"}, true
+		case t.Info()&types.IsNumeric != 0:
+			return &ast.BasicLit{Kind: token.INT, Value: "0"}, true
+		case t.Info()&types.IsString != 0:
+			return &ast.BasicLit{Kind: token.STRING, Value: `""`}, true
+		case t.Kind() == types.UnsafePointer:
+			fallthrough
+		case t.Kind() == types.UntypedNil:
+			return ast.NewIdent("nil"), true
+		case t.Kind() == types.Invalid:
+			return &ast.BasicLit{Kind: token.STRING, Value: `"invalid"`}, false
+		default:
+			panic(fmt.Sprintf("ZeroExpr for unexpected type %v", t))
+		}
+
+	case *types.Pointer, *types.Slice, *types.Chan, *types.Map, *types.Signature:
+		return ast.NewIdent("nil"), true
+
+	case *types.Interface:
+		if !t.IsMethodSet() {
+			return &ast.BasicLit{Kind: token.STRING, Value: `"invalid"`}, false
+		}
+		return ast.NewIdent("nil"), true
+
+	case *types.Named:
+		switch under := t.Underlying().(type) {
+		case *types.Struct, *types.Array:
+			return &ast.CompositeLit{
+				Type: TypeExpr(t, qual),
+			}, true
+		default:
+			return ZeroExpr(under, qual)
+		}
+
+	case *types.Alias:
+		switch t.Underlying().(type) {
+		case *types.Struct, *types.Array:
+			return &ast.CompositeLit{
+				Type: TypeExpr(t, qual),
+			}, true
+		default:
+			return ZeroExpr(types.Unalias(t), qual)
+		}
+
+	case *types.Array, *types.Struct:
+		return &ast.CompositeLit{
+			Type: TypeExpr(t, qual),
+		}, true
+
+	case *types.TypeParam:
+		return &ast.StarExpr{ // *new(T)
+			X: &ast.CallExpr{
+				// Assumes func new is not shadowed.
+				Fun: ast.NewIdent("new"),
+				Args: []ast.Expr{
+					ast.NewIdent(t.Obj().Name()),
+				},
+			},
+		}, true
+
+	case *types.Tuple:
+		// Unlike ZeroString, there is no ast.Expr can express tuple by
+		// "(t[0], ..., t[n])".
+		panic(fmt.Sprintf("invalid type for a variable: %v", t))
+
+	case *types.Union:
+		// Variables of these types cannot be created, so it makes
+		// no sense to ask for their zero value.
+		panic(fmt.Sprintf("invalid type for a variable: %v", t))
+
+	default:
+		panic(t) // unreachable.
+	}
+}
+
+// IsZeroExpr uses simple syntactic heuristics to report whether expr
+// is a obvious zero value, such as 0, "", nil, or false.
+// It cannot do better without type information.
+func IsZeroExpr(expr ast.Expr) bool {
+	switch e := expr.(type) {
+	case *ast.BasicLit:
+		return e.Value == "0" || e.Value == `""`
+	case *ast.Ident:
+		return e.Name == "nil" || e.Name == "false"
+	default:
+		return false
+	}
+}
+
+// TypeExpr returns syntax for the specified type. References to named types
+// are qualified by an appropriate (optional) qualifier function.
+// It may panic for types such as Tuple or Union.
+func TypeExpr(t types.Type, qual types.Qualifier) ast.Expr {
+	switch t := t.(type) {
+	case *types.Basic:
+		switch t.Kind() {
+		case types.UnsafePointer:
+			return &ast.SelectorExpr{X: ast.NewIdent(qual(types.NewPackage("unsafe", "unsafe"))), Sel: ast.NewIdent("Pointer")}
+		default:
+			return ast.NewIdent(t.Name())
+		}
+
+	case *types.Pointer:
+		return &ast.UnaryExpr{
+			Op: token.MUL,
+			X:  TypeExpr(t.Elem(), qual),
+		}
+
+	case *types.Array:
+		return &ast.ArrayType{
+			Len: &ast.BasicLit{
+				Kind:  token.INT,
+				Value: fmt.Sprintf("%d", t.Len()),
+			},
+			Elt: TypeExpr(t.Elem(), qual),
+		}
+
+	case *types.Slice:
+		return &ast.ArrayType{
+			Elt: TypeExpr(t.Elem(), qual),
+		}
+
+	case *types.Map:
+		return &ast.MapType{
+			Key:   TypeExpr(t.Key(), qual),
+			Value: TypeExpr(t.Elem(), qual),
+		}
+
+	case *types.Chan:
+		dir := ast.ChanDir(t.Dir())
+		if t.Dir() == types.SendRecv {
+			dir = ast.SEND | ast.RECV
+		}
+		return &ast.ChanType{
+			Dir:   dir,
+			Value: TypeExpr(t.Elem(), qual),
+		}
+
+	case *types.Signature:
+		var params []*ast.Field
+		for i := 0; i < t.Params().Len(); i++ {
+			params = append(params, &ast.Field{
+				Type: TypeExpr(t.Params().At(i).Type(), qual),
+				Names: []*ast.Ident{
+					{
+						Name: t.Params().At(i).Name(),
+					},
+				},
+			})
+		}
+		if t.Variadic() {
+			last := params[len(params)-1]
+			last.Type = &ast.Ellipsis{Elt: last.Type.(*ast.ArrayType).Elt}
+		}
+		var returns []*ast.Field
+		for i := 0; i < t.Results().Len(); i++ {
+			returns = append(returns, &ast.Field{
+				Type: TypeExpr(t.Results().At(i).Type(), qual),
+			})
+		}
+		return &ast.FuncType{
+			Params: &ast.FieldList{
+				List: params,
+			},
+			Results: &ast.FieldList{
+				List: returns,
+			},
+		}
+
+	case *types.TypeParam:
+		pkgName := qual(t.Obj().Pkg())
+		if pkgName == "" || t.Obj().Pkg() == nil {
+			return ast.NewIdent(t.Obj().Name())
+		}
+		return &ast.SelectorExpr{
+			X:   ast.NewIdent(pkgName),
+			Sel: ast.NewIdent(t.Obj().Name()),
+		}
+
+	// types.TypeParam also implements interface NamedOrAlias. To differentiate,
+	// case TypeParam need to be present before case NamedOrAlias.
+	// TODO(hxjiang): remove this comment once TypeArgs() is added to interface
+	// NamedOrAlias.
+	case NamedOrAlias:
+		var expr ast.Expr = ast.NewIdent(t.Obj().Name())
+		if pkgName := qual(t.Obj().Pkg()); pkgName != "." && pkgName != "" {
+			expr = &ast.SelectorExpr{
+				X:   ast.NewIdent(pkgName),
+				Sel: expr.(*ast.Ident),
+			}
+		}
+
+		// TODO(hxjiang): call t.TypeArgs after adding method TypeArgs() to
+		// typesinternal.NamedOrAlias.
+		if hasTypeArgs, ok := t.(interface{ TypeArgs() *types.TypeList }); ok {
+			if typeArgs := hasTypeArgs.TypeArgs(); typeArgs != nil && typeArgs.Len() > 0 {
+				var indices []ast.Expr
+				for i := range typeArgs.Len() {
+					indices = append(indices, TypeExpr(typeArgs.At(i), qual))
+				}
+				expr = &ast.IndexListExpr{
+					X:       expr,
+					Indices: indices,
+				}
+			}
+		}
+
+		return expr
+
+	case *types.Struct:
+		return ast.NewIdent(t.String())
+
+	case *types.Interface:
+		return ast.NewIdent(t.String())
+
+	case *types.Union:
+		if t.Len() == 0 {
+			panic("Union type should have at least one term")
+		}
+		// Same as go/ast, the return expression will put last term in the
+		// Y field at topmost level of BinaryExpr.
+		// For union of type "float32 | float64 | int64", the structure looks
+		// similar to:
+		// {
+		// 	X: {
+		// 		X: float32,
+		// 		Op: |
+		// 		Y: float64,
+		// 	}
+		// 	Op: |,
+		// 	Y: int64,
+		// }
+		var union ast.Expr
+		for i := range t.Len() {
+			term := t.Term(i)
+			termExpr := TypeExpr(term.Type(), qual)
+			if term.Tilde() {
+				termExpr = &ast.UnaryExpr{
+					Op: token.TILDE,
+					X:  termExpr,
+				}
+			}
+			if i == 0 {
+				union = termExpr
+			} else {
+				union = &ast.BinaryExpr{
+					X:  union,
+					Op: token.OR,
+					Y:  termExpr,
+				}
+			}
+		}
+		return union
+
+	case *types.Tuple:
+		panic("invalid input type types.Tuple")
+
+	default:
+		panic("unreachable")
+	}
+}
diff --git a/sdk/vendor/golang.org/x/tools/internal/versions/constraint.go b/sdk/vendor/golang.org/x/tools/internal/versions/constraint.go
deleted file mode 100644
index 179063d484..0000000000
--- a/sdk/vendor/golang.org/x/tools/internal/versions/constraint.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2024 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 versions
-
-import "go/build/constraint"
-
-// ConstraintGoVersion is constraint.GoVersion (if built with go1.21+).
-// Otherwise nil.
-//
-// Deprecate once x/tools is after go1.21.
-var ConstraintGoVersion func(x constraint.Expr) string
diff --git a/sdk/vendor/golang.org/x/tools/internal/versions/constraint_go121.go b/sdk/vendor/golang.org/x/tools/internal/versions/constraint_go121.go
deleted file mode 100644
index 38011407d5..0000000000
--- a/sdk/vendor/golang.org/x/tools/internal/versions/constraint_go121.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2024 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 go1.21
-// +build go1.21
-
-package versions
-
-import "go/build/constraint"
-
-func init() {
-	ConstraintGoVersion = constraint.GoVersion
-}
diff --git a/sdk/vendor/golang.org/x/tools/internal/versions/toolchain.go b/sdk/vendor/golang.org/x/tools/internal/versions/toolchain.go
deleted file mode 100644
index 377bf7a53b..0000000000
--- a/sdk/vendor/golang.org/x/tools/internal/versions/toolchain.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2024 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 versions
-
-// toolchain is maximum version (<1.22) that the go toolchain used
-// to build the current tool is known to support.
-//
-// When a tool is built with >=1.22, the value of toolchain is unused.
-//
-// x/tools does not support building with go <1.18. So we take this
-// as the minimum possible maximum.
-var toolchain string = Go1_18
diff --git a/sdk/vendor/golang.org/x/tools/internal/versions/toolchain_go119.go b/sdk/vendor/golang.org/x/tools/internal/versions/toolchain_go119.go
deleted file mode 100644
index f65beed9d8..0000000000
--- a/sdk/vendor/golang.org/x/tools/internal/versions/toolchain_go119.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2024 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 go1.19
-// +build go1.19
-
-package versions
-
-func init() {
-	if Compare(toolchain, Go1_19) < 0 {
-		toolchain = Go1_19
-	}
-}
diff --git a/sdk/vendor/golang.org/x/tools/internal/versions/toolchain_go120.go b/sdk/vendor/golang.org/x/tools/internal/versions/toolchain_go120.go
deleted file mode 100644
index 1a9efa126c..0000000000
--- a/sdk/vendor/golang.org/x/tools/internal/versions/toolchain_go120.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2024 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 go1.20
-// +build go1.20
-
-package versions
-
-func init() {
-	if Compare(toolchain, Go1_20) < 0 {
-		toolchain = Go1_20
-	}
-}
diff --git a/sdk/vendor/golang.org/x/tools/internal/versions/toolchain_go121.go b/sdk/vendor/golang.org/x/tools/internal/versions/toolchain_go121.go
deleted file mode 100644
index b7ef216dfe..0000000000
--- a/sdk/vendor/golang.org/x/tools/internal/versions/toolchain_go121.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2024 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 go1.21
-// +build go1.21
-
-package versions
-
-func init() {
-	if Compare(toolchain, Go1_21) < 0 {
-		toolchain = Go1_21
-	}
-}
diff --git a/sdk/vendor/golang.org/x/tools/internal/versions/types.go b/sdk/vendor/golang.org/x/tools/internal/versions/types.go
index 562eef21fa..0fc10ce4eb 100644
--- a/sdk/vendor/golang.org/x/tools/internal/versions/types.go
+++ b/sdk/vendor/golang.org/x/tools/internal/versions/types.go
@@ -5,15 +5,29 @@
 package versions
 
 import (
+	"go/ast"
 	"go/types"
 )
 
-// GoVersion returns the Go version of the type package.
-// It returns zero if no version can be determined.
-func GoVersion(pkg *types.Package) string {
-	// TODO(taking): x/tools can call GoVersion() [from 1.21] after 1.25.
-	if pkg, ok := any(pkg).(interface{ GoVersion() string }); ok {
-		return pkg.GoVersion()
+// FileVersion returns a file's Go version.
+// The reported version is an unknown Future version if a
+// version cannot be determined.
+func FileVersion(info *types.Info, file *ast.File) string {
+	// In tools built with Go >= 1.22, the Go version of a file
+	// follow a cascades of sources:
+	// 1) types.Info.FileVersion, which follows the cascade:
+	//   1.a) file version (ast.File.GoVersion),
+	//   1.b) the package version (types.Config.GoVersion), or
+	// 2) is some unknown Future version.
+	//
+	// File versions require a valid package version to be provided to types
+	// in Config.GoVersion. Config.GoVersion is either from the package's module
+	// or the toolchain (go run). This value should be provided by go/packages
+	// or unitchecker.Config.GoVersion.
+	if v := info.FileVersions[file]; IsValid(v) {
+		return v
 	}
-	return ""
+	// Note: we could instead return runtime.Version() [if valid].
+	// This would act as a max version on what a tool can support.
+	return Future
 }
diff --git a/sdk/vendor/golang.org/x/tools/internal/versions/types_go121.go b/sdk/vendor/golang.org/x/tools/internal/versions/types_go121.go
deleted file mode 100644
index b4345d3349..0000000000
--- a/sdk/vendor/golang.org/x/tools/internal/versions/types_go121.go
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2023 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 !go1.22
-// +build !go1.22
-
-package versions
-
-import (
-	"go/ast"
-	"go/types"
-)
-
-// FileVersion returns a language version (<=1.21) derived from runtime.Version()
-// or an unknown future version.
-func FileVersion(info *types.Info, file *ast.File) string {
-	// In x/tools built with Go <= 1.21, we do not have Info.FileVersions
-	// available. We use a go version derived from the toolchain used to
-	// compile the tool by default.
-	// This will be <= go1.21. We take this as the maximum version that
-	// this tool can support.
-	//
-	// There are no features currently in x/tools that need to tell fine grained
-	// differences for versions <1.22.
-	return toolchain
-}
-
-// InitFileVersions is a noop when compiled with this Go version.
-func InitFileVersions(*types.Info) {}
diff --git a/sdk/vendor/golang.org/x/tools/internal/versions/types_go122.go b/sdk/vendor/golang.org/x/tools/internal/versions/types_go122.go
deleted file mode 100644
index aac5db62c9..0000000000
--- a/sdk/vendor/golang.org/x/tools/internal/versions/types_go122.go
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2023 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 go1.22
-// +build go1.22
-
-package versions
-
-import (
-	"go/ast"
-	"go/types"
-)
-
-// FileVersion returns a file's Go version.
-// The reported version is an unknown Future version if a
-// version cannot be determined.
-func FileVersion(info *types.Info, file *ast.File) string {
-	// In tools built with Go >= 1.22, the Go version of a file
-	// follow a cascades of sources:
-	// 1) types.Info.FileVersion, which follows the cascade:
-	//   1.a) file version (ast.File.GoVersion),
-	//   1.b) the package version (types.Config.GoVersion), or
-	// 2) is some unknown Future version.
-	//
-	// File versions require a valid package version to be provided to types
-	// in Config.GoVersion. Config.GoVersion is either from the package's module
-	// or the toolchain (go run). This value should be provided by go/packages
-	// or unitchecker.Config.GoVersion.
-	if v := info.FileVersions[file]; IsValid(v) {
-		return v
-	}
-	// Note: we could instead return runtime.Version() [if valid].
-	// This would act as a max version on what a tool can support.
-	return Future
-}
-
-// InitFileVersions initializes info to record Go versions for Go files.
-func InitFileVersions(info *types.Info) {
-	info.FileVersions = make(map[*ast.File]string)
-}
diff --git a/sdk/vendor/modules.txt b/sdk/vendor/modules.txt
index f4ec1ccba8..a64126d08d 100644
--- a/sdk/vendor/modules.txt
+++ b/sdk/vendor/modules.txt
@@ -30,21 +30,16 @@ github.com/grpc-ecosystem/go-grpc-middleware/util/metautils
 github.com/grpc-ecosystem/go-grpc-middleware/validator
 # github.com/jstemmer/go-junit-report v1.0.0
 ## explicit; go 1.2
-github.com/jstemmer/go-junit-report
-github.com/jstemmer/go-junit-report/formatter
 github.com/jstemmer/go-junit-report/parser
 # github.com/kr/text v0.2.0
 ## explicit
-# github.com/maxbrunsfeld/counterfeiter/v6 v6.8.1
-## explicit; go 1.20
-github.com/maxbrunsfeld/counterfeiter/v6
-github.com/maxbrunsfeld/counterfeiter/v6/arguments
-github.com/maxbrunsfeld/counterfeiter/v6/command
+# github.com/maxbrunsfeld/counterfeiter/v6 v6.11.2
+## explicit; go 1.23
 github.com/maxbrunsfeld/counterfeiter/v6/generator
 # github.com/mitchellh/mapstructure v1.5.0
 ## explicit; go 1.14
 github.com/mitchellh/mapstructure
-# github.com/nginxinc/nginx-go-crossplane v0.4.48
+# github.com/nginxinc/nginx-go-crossplane v0.4.70
 ## explicit; go 1.19
 github.com/nginxinc/nginx-go-crossplane
 # github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2
@@ -58,17 +53,18 @@ github.com/sirupsen/logrus
 # github.com/stretchr/objx v0.5.2
 ## explicit; go 1.20
 github.com/stretchr/objx
-# github.com/stretchr/testify v1.9.0
+# github.com/stretchr/testify v1.10.0
 ## explicit; go 1.17
 github.com/stretchr/testify/assert
+github.com/stretchr/testify/assert/yaml
 github.com/stretchr/testify/mock
 github.com/stretchr/testify/require
-# golang.org/x/mod v0.21.0
+# golang.org/x/mod v0.22.0
 ## explicit; go 1.22.0
 golang.org/x/mod/internal/lazyregexp
 golang.org/x/mod/module
 golang.org/x/mod/semver
-# golang.org/x/net v0.33.0
+# golang.org/x/net v0.34.0
 ## explicit; go 1.18
 golang.org/x/net/http/httpguts
 golang.org/x/net/http2
@@ -79,7 +75,7 @@ golang.org/x/net/trace
 # golang.org/x/sync v0.10.0
 ## explicit; go 1.18
 golang.org/x/sync/errgroup
-# golang.org/x/sys v0.28.0
+# golang.org/x/sys v0.29.0
 ## explicit; go 1.18
 golang.org/x/sys/unix
 golang.org/x/sys/windows
@@ -95,9 +91,8 @@ golang.org/x/text/secure/bidirule
 golang.org/x/text/transform
 golang.org/x/text/unicode/bidi
 golang.org/x/text/unicode/norm
-# golang.org/x/tools v0.25.0
+# golang.org/x/tools v0.29.0
 ## explicit; go 1.22.0
-golang.org/x/tools/cmd/goimports
 golang.org/x/tools/go/ast/astutil
 golang.org/x/tools/go/gcexportdata
 golang.org/x/tools/go/packages
@@ -113,10 +108,10 @@ golang.org/x/tools/internal/gcimporter
 golang.org/x/tools/internal/gocommand
 golang.org/x/tools/internal/gopathwalk
 golang.org/x/tools/internal/imports
+golang.org/x/tools/internal/modindex
 golang.org/x/tools/internal/packagesinternal
 golang.org/x/tools/internal/pkgbits
 golang.org/x/tools/internal/stdlib
-golang.org/x/tools/internal/tokeninternal
 golang.org/x/tools/internal/typeparams
 golang.org/x/tools/internal/typesinternal
 golang.org/x/tools/internal/versions
diff --git a/test/integration/go.mod b/test/integration/go.mod
index dc126c60f7..0f3804ce01 100644
--- a/test/integration/go.mod
+++ b/test/integration/go.mod
@@ -9,7 +9,7 @@ require (
 	github.com/nginx/agent/sdk/v2 v2.38.0
 	github.com/nginx/agent/v2 v2.0.0-00010101000000-000000000000
 	github.com/sirupsen/logrus v1.9.3
-	github.com/stretchr/testify v1.9.0
+	github.com/stretchr/testify v1.10.0
 	github.com/testcontainers/testcontainers-go v0.23.0
 	github.com/testcontainers/testcontainers-go/modules/compose v0.23.0
 	google.golang.org/grpc v1.60.1
@@ -106,7 +106,7 @@ require (
 	github.com/mattn/go-isatty v0.0.20 // indirect
 	github.com/mattn/go-runewidth v0.0.15 // indirect
 	github.com/mattn/go-shellwords v1.0.12 // indirect
-	github.com/maxbrunsfeld/counterfeiter/v6 v6.8.1 // indirect
+	github.com/maxbrunsfeld/counterfeiter/v6 v6.11.2 // indirect
 	github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect
 	github.com/miekg/pkcs11 v1.1.1 // indirect
 	github.com/mitchellh/mapstructure v1.5.0 // indirect
@@ -124,7 +124,7 @@ require (
 	github.com/modern-go/reflect2 v1.0.2 // indirect
 	github.com/morikuni/aec v1.0.0 // indirect
 	github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
-	github.com/nginxinc/nginx-go-crossplane v0.4.48 // indirect
+	github.com/nginxinc/nginx-go-crossplane v0.4.70 // indirect
 	github.com/onsi/ginkgo/v2 v2.13.0 // indirect
 	github.com/opencontainers/go-digest v1.0.0 // indirect
 	github.com/opencontainers/image-spec v1.1.0-rc5 // indirect
@@ -181,17 +181,17 @@ require (
 	go.opentelemetry.io/otel/trace v1.22.0 // indirect
 	go.opentelemetry.io/proto/otlp v1.0.0 // indirect
 	go.uber.org/multierr v1.11.0 // indirect
-	golang.org/x/crypto v0.31.0 // indirect
+	golang.org/x/crypto v0.32.0 // indirect
 	golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 // indirect
-	golang.org/x/mod v0.21.0 // indirect
-	golang.org/x/net v0.33.0 // indirect
+	golang.org/x/mod v0.22.0 // indirect
+	golang.org/x/net v0.34.0 // indirect
 	golang.org/x/oauth2 v0.21.0 // indirect
 	golang.org/x/sync v0.10.0 // indirect
-	golang.org/x/sys v0.28.0 // indirect
-	golang.org/x/term v0.27.0 // indirect
+	golang.org/x/sys v0.29.0 // indirect
+	golang.org/x/term v0.28.0 // indirect
 	golang.org/x/text v0.21.0 // indirect
 	golang.org/x/time v0.5.0 // indirect
-	golang.org/x/tools v0.25.0 // indirect
+	golang.org/x/tools v0.29.0 // indirect
 	google.golang.org/genproto v0.0.0-20240108191215-35c7eff3a6b1 // indirect
 	google.golang.org/genproto/googleapis/api v0.0.0-20240116215550-a9fa1716bcac // indirect
 	google.golang.org/genproto/googleapis/rpc v0.0.0-20240116215550-a9fa1716bcac // indirect
diff --git a/test/integration/go.sum b/test/integration/go.sum
index 6977a4faf9..34d75671c5 100644
--- a/test/integration/go.sum
+++ b/test/integration/go.sum
@@ -352,8 +352,8 @@ github.com/mattn/go-shellwords v1.0.12 h1:M2zGm7EW6UQJvDeQxo4T51eKPurbeFbe8WtebG
 github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y=
 github.com/mattn/go-sqlite3 v1.6.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
 github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
-github.com/maxbrunsfeld/counterfeiter/v6 v6.8.1 h1:NicmruxkeqHjDv03SfSxqmaLuisddudfP3h5wdXFbhM=
-github.com/maxbrunsfeld/counterfeiter/v6 v6.8.1/go.mod h1:eyp4DdUJAKkr9tvxR3jWhw2mDK7CWABMG5r9uyaKC7I=
+github.com/maxbrunsfeld/counterfeiter/v6 v6.11.2 h1:yVCLo4+ACVroOEr4iFU1iH46Ldlzz2rTuu18Ra7M8sU=
+github.com/maxbrunsfeld/counterfeiter/v6 v6.11.2/go.mod h1:VzB2VoMh1Y32/QqDfg9ZJYHj99oM4LiGtqPZydTiQSQ=
 github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=
 github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQE9x6ikvDFZS2mDVS3drnohI=
 github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=
@@ -395,8 +395,8 @@ github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7P
 github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
 github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
 github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
-github.com/nginxinc/nginx-go-crossplane v0.4.48 h1:Cf8sn8dTLJevtvNjGsla/wwa+rPTjm8eTfwSMqWisoI=
-github.com/nginxinc/nginx-go-crossplane v0.4.48/go.mod h1:fgSibLM12jGRsh7QHpgL8wTKMEbfc594vSLK9ovwM6U=
+github.com/nginxinc/nginx-go-crossplane v0.4.70 h1:zrmF8rk97TgB3uy5QtRZ4mY0tFAdhKG97H3XAM2LOBA=
+github.com/nginxinc/nginx-go-crossplane v0.4.70/go.mod h1:o0dpGb2Nw1nYKHp8+b2dCxwrMWXGkjaVsZL1Jm3ouvQ=
 github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
 github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg=
@@ -404,8 +404,8 @@ github.com/onsi/ginkgo/v2 v2.13.0 h1:0jY9lJquiL8fcf3M4LAXN5aMlS/b2BV86HFFPCPMgE4
 github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o=
 github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
 github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA=
-github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8=
-github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ=
+github.com/onsi/gomega v1.36.1 h1:bJDPBO7ibjxcbHMgSCoo4Yj18UWbKDlLwX1x9sybDcw=
+github.com/onsi/gomega v1.36.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog=
 github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
 github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
 github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
@@ -525,8 +525,8 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
 github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
 github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
-github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
-github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
+github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
+github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
 github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
 github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
 github.com/testcontainers/testcontainers-go v0.23.0 h1:ERYTSikX01QczBLPZpqsETTBO7lInqEP349phDOVJVs=
@@ -615,8 +615,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y
 golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
 golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio=
 golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
-golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
-golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
+golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc=
+golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 h1:e66Fs6Z+fZTbFBAxKfP3PALWBtpfqks2bwGcexMxgtk=
 golang.org/x/exp v0.0.0-20240909161429-701f63a606c0/go.mod h1:2TbTHSBQa924w8M6Xs1QcRcFwyucIwBGpK1p2f1YFFY=
@@ -629,8 +629,8 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
 golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
-golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0=
-golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
+golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4=
+golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -651,8 +651,8 @@ golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
 golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
 golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA=
 golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
-golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
-golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
+golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0=
+golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw=
 golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs=
@@ -702,8 +702,8 @@ golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
-golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU=
+golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
@@ -712,8 +712,8 @@ golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
 golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
 golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o=
 golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=
-golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q=
-golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM=
+golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg=
+golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
@@ -741,8 +741,8 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f
 golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
 golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
 golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
-golang.org/x/tools v0.25.0 h1:oFU9pkj/iJgs+0DT+VMHrx+oBKs/LJMV+Uvg78sl+fE=
-golang.org/x/tools v0.25.0/go.mod h1:/vtpO8WL1N9cQC3FN5zPqb//fRXskFHbLKk4OW1Q7rg=
+golang.org/x/tools v0.29.0 h1:Xx0h3TtM9rzQpQuR4dKLrdglAmCEN5Oi+P74JdhdzXE=
+golang.org/x/tools v0.29.0/go.mod h1:KMQVMRsVxU6nHCFXrBPhDB8XncLNLM0lIy/F14RP588=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
diff --git a/test/integration/vendor/github.com/jstemmer/go-junit-report/.gitignore b/test/integration/vendor/github.com/jstemmer/go-junit-report/.gitignore
deleted file mode 100644
index 7216c087e1..0000000000
--- a/test/integration/vendor/github.com/jstemmer/go-junit-report/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-go-junit-report
-build/
diff --git a/test/integration/vendor/github.com/jstemmer/go-junit-report/.travis.yml b/test/integration/vendor/github.com/jstemmer/go-junit-report/.travis.yml
deleted file mode 100644
index d0dff3ef8e..0000000000
--- a/test/integration/vendor/github.com/jstemmer/go-junit-report/.travis.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-language: go
-
-go:
-  - tip
-  - "1.13.x"
-  - "1.12.x"
-  - "1.11.x"
-  - "1.10.x"
-  - "1.9.x"
-  - "1.8.x"
-  - "1.7.x"
-  - "1.6.x"
-  - "1.5.x"
-  - "1.4.x"
-  - "1.3.x"
-  - "1.2.x"
diff --git a/test/integration/vendor/github.com/jstemmer/go-junit-report/CONTRIBUTING.md b/test/integration/vendor/github.com/jstemmer/go-junit-report/CONTRIBUTING.md
deleted file mode 100644
index 125d350e11..0000000000
--- a/test/integration/vendor/github.com/jstemmer/go-junit-report/CONTRIBUTING.md
+++ /dev/null
@@ -1,21 +0,0 @@
-# Contributing
-
-## Bug reports
-
-- Before reporting a bug, have a look at the [issue
-  list](https://github.com/jstemmer/go-junit-report/issues) to see if an issue
-  already exists for your problem.
-- Include as much information as you can in the bug report, e.g.: the versions
-  of go-junit-report and the Go compiler, how go-junit-report was called, what
-  input was given to go-junit-report, what the actual output was, was the
-  expected output was.
-
-## Pull requests
-
-- Before sending a pull request for new features, open an issue to discuss it.
-- Run `go fmt` to format your code.
-- Add test coverage and run all tests.
-- Prefer small PRs, avoid making unrelated changes in the same PR.
-- Limit the first line of the commit message to 72 characters.
-- Write commit messages in the imperative mood ("Fix bug", not "Fixed bug" or
-  "Fixes bug") .
diff --git a/test/integration/vendor/github.com/jstemmer/go-junit-report/Makefile b/test/integration/vendor/github.com/jstemmer/go-junit-report/Makefile
deleted file mode 100644
index 4c0aaf218f..0000000000
--- a/test/integration/vendor/github.com/jstemmer/go-junit-report/Makefile
+++ /dev/null
@@ -1,26 +0,0 @@
-VERSION=$(shell git describe --match="v*")
-REVISION=$(shell git rev-parse HEAD)
-TIMESTAMP=$(shell date +%FT%T)
-
-test:
-	go test ./...
-
-build/go-junit-report build/go-junit-report.exe: clean
-	go build --ldflags "-s -X main.Version=$(VERSION) -X main.Revision=$(REVISION) -X main.BuildTime=$(TIMESTAMP)" -o $@
-
-build/go-junit-report-$(VERSION)-$(GOOS)-$(GOARCH).tar.gz: build/go-junit-report
-	tar czf $@ -C build go-junit-report
-
-build/go-junit-report-$(VERSION)-windows-amd64.zip: build/go-junit-report.exe
-	zip -j $@ build/go-junit-report.exe
-
-release: test
-	$(MAKE) GOOS=linux GOARCH=amd64 build/go-junit-report-$(VERSION)-linux-amd64.tar.gz
-	$(MAKE) GOOS=windows GOARCH=amd64 build/go-junit-report-$(VERSION)-windows-amd64.zip
-	$(MAKE) GOOS=darwin GOARCH=amd64 build/go-junit-report-$(VERSION)-darwin-amd64.tar.gz
-
-clean:
-	rm -f build/go-junit-report
-	rm -f build/go-junit-report.exe
-
-.PHONY: build clean release test
diff --git a/test/integration/vendor/github.com/jstemmer/go-junit-report/README.md b/test/integration/vendor/github.com/jstemmer/go-junit-report/README.md
deleted file mode 100644
index a81ad10e46..0000000000
--- a/test/integration/vendor/github.com/jstemmer/go-junit-report/README.md
+++ /dev/null
@@ -1,56 +0,0 @@
-# go-junit-report
-
-go-junit-report is a tool that converts [`go test`] output to an XML report,
-suitable for applications that expect JUnit-style XML reports (e.g.
-[Jenkins](http://jenkins-ci.org)).
-
-The test output [parser] and JUnit report [formatter] are also available as Go
-packages.
-
-[![Build Status][travis-badge]][travis-link]
-
-## Install from package (recommended)
-
-Pre-built packages for Windows, macOS and Linux are found on the [Releases]
-page.
-
-## Install from source
-
-Download and install the latest stable version from source by running:
-
-```bash
-go install github.com/jstemmer/go-junit-report@latest
-```
-
-## Usage
-
-go-junit-report reads the full `go test` output from stdin and writes JUnit
-compatible XML to stdout. In order to capture build errors as well as test
-output, redirect both stdout and stderr to go-junit-report.
-
-```bash
-go test -v 2>&1 | go-junit-report > report.xml
-```
-
-Parsing benchmark output is also supported, for example:
-
-```bash
-go test -v -bench . -count 5 2>&1 | go-junit-report > report.xml
-```
-
-If you want go-junit-report to exit with a non-zero exit code when it encounters
-build errors or test failures, set the `-set-exit-code` flag.
-
-Run `go-junit-report -help` for a list of all supported flags.
-
-## Contributing
-
-See [CONTRIBUTING.md].
-
-[`go test`]: https://pkg.go.dev/cmd/go#hdr-Test_packages
-[parser]: https://pkg.go.dev/github.com/jstemmer/go-junit-report/parser
-[formatter]: https://pkg.go.dev/github.com/jstemmer/go-junit-report/formatter
-[travis-badge]: https://travis-ci.org/jstemmer/go-junit-report.svg?branch=master
-[travis-link]: https://travis-ci.org/jstemmer/go-junit-report
-[Releases]: https://github.com/jstemmer/go-junit-report/releases
-[CONTRIBUTING.md]: https://github.com/jstemmer/go-junit-report/blob/master/CONTRIBUTING.md
diff --git a/test/integration/vendor/github.com/jstemmer/go-junit-report/formatter/formatter.go b/test/integration/vendor/github.com/jstemmer/go-junit-report/formatter/formatter.go
deleted file mode 100644
index 6e1a0f31d6..0000000000
--- a/test/integration/vendor/github.com/jstemmer/go-junit-report/formatter/formatter.go
+++ /dev/null
@@ -1,182 +0,0 @@
-package formatter
-
-import (
-	"bufio"
-	"encoding/xml"
-	"fmt"
-	"io"
-	"runtime"
-	"strings"
-	"time"
-
-	"github.com/jstemmer/go-junit-report/parser"
-)
-
-// JUnitTestSuites is a collection of JUnit test suites.
-type JUnitTestSuites struct {
-	XMLName xml.Name         `xml:"testsuites"`
-	Suites  []JUnitTestSuite `xml:"testsuite"`
-}
-
-// JUnitTestSuite is a single JUnit test suite which may contain many
-// testcases.
-type JUnitTestSuite struct {
-	XMLName    xml.Name        `xml:"testsuite"`
-	Tests      int             `xml:"tests,attr"`
-	Failures   int             `xml:"failures,attr"`
-	Time       string          `xml:"time,attr"`
-	Name       string          `xml:"name,attr"`
-	Properties []JUnitProperty `xml:"properties>property,omitempty"`
-	TestCases  []JUnitTestCase `xml:"testcase"`
-}
-
-// JUnitTestCase is a single test case with its result.
-type JUnitTestCase struct {
-	XMLName     xml.Name          `xml:"testcase"`
-	Classname   string            `xml:"classname,attr"`
-	Name        string            `xml:"name,attr"`
-	Time        string            `xml:"time,attr"`
-	SkipMessage *JUnitSkipMessage `xml:"skipped,omitempty"`
-	Failure     *JUnitFailure     `xml:"failure,omitempty"`
-}
-
-// JUnitSkipMessage contains the reason why a testcase was skipped.
-type JUnitSkipMessage struct {
-	Message string `xml:"message,attr"`
-}
-
-// JUnitProperty represents a key/value pair used to define properties.
-type JUnitProperty struct {
-	Name  string `xml:"name,attr"`
-	Value string `xml:"value,attr"`
-}
-
-// JUnitFailure contains data related to a failed test.
-type JUnitFailure struct {
-	Message  string `xml:"message,attr"`
-	Type     string `xml:"type,attr"`
-	Contents string `xml:",chardata"`
-}
-
-// JUnitReportXML writes a JUnit xml representation of the given report to w
-// in the format described at http://windyroad.org/dl/Open%20Source/JUnit.xsd
-func JUnitReportXML(report *parser.Report, noXMLHeader bool, goVersion string, w io.Writer) error {
-	suites := JUnitTestSuites{}
-
-	// convert Report to JUnit test suites
-	for _, pkg := range report.Packages {
-		pkg.Benchmarks = mergeBenchmarks(pkg.Benchmarks)
-		ts := JUnitTestSuite{
-			Tests:      len(pkg.Tests) + len(pkg.Benchmarks),
-			Failures:   0,
-			Time:       formatTime(pkg.Duration),
-			Name:       pkg.Name,
-			Properties: []JUnitProperty{},
-			TestCases:  []JUnitTestCase{},
-		}
-
-		classname := pkg.Name
-		if idx := strings.LastIndex(classname, "/"); idx > -1 && idx < len(pkg.Name) {
-			classname = pkg.Name[idx+1:]
-		}
-
-		// properties
-		if goVersion == "" {
-			// if goVersion was not specified as a flag, fall back to version reported by runtime
-			goVersion = runtime.Version()
-		}
-		ts.Properties = append(ts.Properties, JUnitProperty{"go.version", goVersion})
-		if pkg.CoveragePct != "" {
-			ts.Properties = append(ts.Properties, JUnitProperty{"coverage.statements.pct", pkg.CoveragePct})
-		}
-
-		// individual test cases
-		for _, test := range pkg.Tests {
-			testCase := JUnitTestCase{
-				Classname: classname,
-				Name:      test.Name,
-				Time:      formatTime(test.Duration),
-				Failure:   nil,
-			}
-
-			if test.Result == parser.FAIL {
-				ts.Failures++
-				testCase.Failure = &JUnitFailure{
-					Message:  "Failed",
-					Type:     "",
-					Contents: strings.Join(test.Output, "\n"),
-				}
-			}
-
-			if test.Result == parser.SKIP {
-				testCase.SkipMessage = &JUnitSkipMessage{strings.Join(test.Output, "\n")}
-			}
-
-			ts.TestCases = append(ts.TestCases, testCase)
-		}
-
-		// individual benchmarks
-		for _, benchmark := range pkg.Benchmarks {
-			benchmarkCase := JUnitTestCase{
-				Classname: classname,
-				Name:      benchmark.Name,
-				Time:      formatBenchmarkTime(benchmark.Duration),
-			}
-
-			ts.TestCases = append(ts.TestCases, benchmarkCase)
-		}
-
-		suites.Suites = append(suites.Suites, ts)
-	}
-
-	// to xml
-	bytes, err := xml.MarshalIndent(suites, "", "\t")
-	if err != nil {
-		return err
-	}
-
-	writer := bufio.NewWriter(w)
-
-	if !noXMLHeader {
-		writer.WriteString(xml.Header)
-	}
-
-	writer.Write(bytes)
-	writer.WriteByte('\n')
-	writer.Flush()
-
-	return nil
-}
-
-func mergeBenchmarks(benchmarks []*parser.Benchmark) []*parser.Benchmark {
-	var merged []*parser.Benchmark
-	benchmap := make(map[string][]*parser.Benchmark)
-	for _, bm := range benchmarks {
-		if _, ok := benchmap[bm.Name]; !ok {
-			merged = append(merged, &parser.Benchmark{Name: bm.Name})
-		}
-		benchmap[bm.Name] = append(benchmap[bm.Name], bm)
-	}
-
-	for _, bm := range merged {
-		for _, b := range benchmap[bm.Name] {
-			bm.Allocs += b.Allocs
-			bm.Bytes += b.Bytes
-			bm.Duration += b.Duration
-		}
-		n := len(benchmap[bm.Name])
-		bm.Allocs /= n
-		bm.Bytes /= n
-		bm.Duration /= time.Duration(n)
-	}
-
-	return merged
-}
-
-func formatTime(d time.Duration) string {
-	return fmt.Sprintf("%.3f", d.Seconds())
-}
-
-func formatBenchmarkTime(d time.Duration) string {
-	return fmt.Sprintf("%.9f", d.Seconds())
-}
diff --git a/test/integration/vendor/github.com/jstemmer/go-junit-report/go-junit-report.go b/test/integration/vendor/github.com/jstemmer/go-junit-report/go-junit-report.go
deleted file mode 100644
index 24de3d9c4a..0000000000
--- a/test/integration/vendor/github.com/jstemmer/go-junit-report/go-junit-report.go
+++ /dev/null
@@ -1,57 +0,0 @@
-package main
-
-import (
-	"flag"
-	"fmt"
-	"os"
-
-	"github.com/jstemmer/go-junit-report/formatter"
-	"github.com/jstemmer/go-junit-report/parser"
-)
-
-var (
-	Version   = "v1.0.0-dev"
-	Revision  = "HEAD"
-	BuildTime string
-)
-
-var (
-	noXMLHeader   = flag.Bool("no-xml-header", false, "do not print xml header")
-	packageName   = flag.String("package-name", "", "specify a package name (compiled test have no package name in output)")
-	goVersionFlag = flag.String("go-version", "", "specify the value to use for the go.version property in the generated XML")
-	setExitCode   = flag.Bool("set-exit-code", false, "set exit code to 1 if tests failed")
-	version       = flag.Bool("version", false, "print version")
-)
-
-func main() {
-	flag.Parse()
-
-	if *version {
-		fmt.Printf("go-junit-report %s %s (%s)\n", Version, BuildTime, Revision)
-		return
-	}
-
-	if flag.NArg() != 0 {
-		fmt.Fprintf(os.Stderr, "%s does not accept positional arguments\n", os.Args[0])
-		flag.Usage()
-		os.Exit(1)
-	}
-
-	// Read input
-	report, err := parser.Parse(os.Stdin, *packageName)
-	if err != nil {
-		fmt.Printf("Error reading input: %s\n", err)
-		os.Exit(1)
-	}
-
-	// Write xml
-	err = formatter.JUnitReportXML(report, *noXMLHeader, *goVersionFlag, os.Stdout)
-	if err != nil {
-		fmt.Printf("Error writing XML: %s\n", err)
-		os.Exit(1)
-	}
-
-	if *setExitCode && report.Failures() > 0 {
-		os.Exit(1)
-	}
-}
diff --git a/test/integration/vendor/github.com/maxbrunsfeld/counterfeiter/v6/.gitattributes b/test/integration/vendor/github.com/maxbrunsfeld/counterfeiter/v6/.gitattributes
deleted file mode 100644
index fcadb2cf97..0000000000
--- a/test/integration/vendor/github.com/maxbrunsfeld/counterfeiter/v6/.gitattributes
+++ /dev/null
@@ -1 +0,0 @@
-* text eol=lf
diff --git a/test/integration/vendor/github.com/maxbrunsfeld/counterfeiter/v6/.gitignore b/test/integration/vendor/github.com/maxbrunsfeld/counterfeiter/v6/.gitignore
deleted file mode 100644
index 1597f12b71..0000000000
--- a/test/integration/vendor/github.com/maxbrunsfeld/counterfeiter/v6/.gitignore
+++ /dev/null
@@ -1,32 +0,0 @@
-# Compiled Object files, Static and Dynamic libs (Shared Objects)
-*.o
-*.a
-*.so
-
-# Folders
-_obj
-_test
-
-# Architecture specific extensions/prefixes
-*.[568vq]
-[568vq].out
-
-*.cgo1.go
-*.cgo2.c
-_cgo_defun.c
-_cgo_gotypes.go
-_cgo_export.*
-
-_testmain.go
-
-*.exe
-*.test
-*.iml
-.idea
-.envrc
-
-/counterfeiter
-integration/testdata/output
-*.profile
-*.bench
-/.vscode
diff --git a/test/integration/vendor/github.com/maxbrunsfeld/counterfeiter/v6/.golangci.yaml b/test/integration/vendor/github.com/maxbrunsfeld/counterfeiter/v6/.golangci.yaml
deleted file mode 100644
index 1f2afa43bb..0000000000
--- a/test/integration/vendor/github.com/maxbrunsfeld/counterfeiter/v6/.golangci.yaml
+++ /dev/null
@@ -1,3 +0,0 @@
-run:
-  skip-dirs:
-    - fixtures
\ No newline at end of file
diff --git a/test/integration/vendor/github.com/maxbrunsfeld/counterfeiter/v6/README.md b/test/integration/vendor/github.com/maxbrunsfeld/counterfeiter/v6/README.md
deleted file mode 100644
index 5d471d6431..0000000000
--- a/test/integration/vendor/github.com/maxbrunsfeld/counterfeiter/v6/README.md
+++ /dev/null
@@ -1,228 +0,0 @@
-# `counterfeiter` [![GitHub Actions](https://github.com/maxbrunsfeld/counterfeiter/actions/workflows/go.yml/badge.svg)](https://github.com/maxbrunsfeld/counterfeiter/actions/workflows/go.yml) [![Go Report Card](https://goreportcard.com/badge/github.com/maxbrunsfeld/counterfeiter/v6)](https://goreportcard.com/report/github.com/maxbrunsfeld/counterfeiter/v6) [![GoDoc](https://godoc.org/github.com/maxbrunsfeld/counterfeiter/v6?status.svg)](https://godoc.org/github.com/maxbrunsfeld/counterfeiter/v6)
-
-When writing unit-tests for an object, it is often useful to have fake implementations
-of the object's collaborators. In go, such fake implementations cannot be generated
-automatically at runtime, and writing them by hand can be quite arduous.
-
-`counterfeiter` allows you to simply generate test doubles for a given interface.
-
-### Supported Versions Of `go`
-
-`counterfeiter` follows the [support policy of `go` itself](https://golang.org/doc/devel/release.html#policy):
-
-> Each major Go release is supported until there are two newer major releases. For example, Go 1.5 was supported until the Go 1.7 release, and Go 1.6 was supported until the Go 1.8 release. We fix critical problems, including [critical security problems](https://golang.org/security), in supported releases as needed by issuing minor revisions (for example, Go 1.6.1, Go 1.6.2, and so on).
-
-If you are having problems with `counterfeiter` and are not using a supported version of go, please update to use a supported version of go before opening an issue.
-
-### Using `counterfeiter`
-
-⚠️ Please use [`go modules`](https://blog.golang.org/using-go-modules) when working with counterfeiter.
-
-Typically, `counterfeiter` is used in `go generate` directives. It can be frustrating when you change your interface declaration and suddenly all of your generated code is suddenly out-of-date. The best practice here is to use the [`go generate` command](https://blog.golang.org/generate) to make it easier to keep your test doubles up to date.
-
-#### Step 1 - Create `tools.go`
-
-You can take a dependency on tools by creating a `tools.go` file, as described in [How can I track tool dependencies for a module?](https://github.com/golang/go/wiki/Modules#how-can-i-track-tool-dependencies-for-a-module). This ensures that everyone working with your module is using the same version of each tool you use.
-
-```shell
-$ cat tools/tools.go
-```
-
-```go
-//go:build tools
-
-package tools
-
-import (
-	_ "github.com/maxbrunsfeld/counterfeiter/v6"
-)
-
-// This file imports packages that are used when running go generate, or used
-// during the development process but not otherwise depended on by built code.
-```
-
-#### Step 2a - Add `go:generate` Directives
-
-You can add directives right next to your interface definitions (or not), in any `.go` file in your module.
-
-```shell
-$ cat myinterface.go
-```
-
-```go
-package foo
-
-//go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 . MySpecialInterface
-
-type MySpecialInterface interface {
-	DoThings(string, uint64) (int, error)
-}
-```
-
-```shell
-$ go generate ./...
-Writing `FakeMySpecialInterface` to `foofakes/fake_my_special_interface.go`... Done
-```
-
-#### Step 2b - Add `counterfeiter:generate` Directives
-
-If you plan to have many directives in a single package, consider using this
-option. You can add directives right next to your interface definitions
-(or not), in any `.go` file in your module.
-
-```shell
-$ cat myinterface.go
-```
-
-```go
-package foo
-
-// You only need **one** of these per package!
-//go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -generate
-
-// You will add lots of directives like these in the same package...
-//counterfeiter:generate . MySpecialInterface
-type MySpecialInterface interface {
-	DoThings(string, uint64) (int, error)
-}
-
-// Like this...
-//counterfeiter:generate . MyOtherInterface
-type MyOtherInterface interface {
-	DoOtherThings(string, uint64) (int, error)
-}
-```
-
-```shell
-$ go generate ./...
-Writing `FakeMySpecialInterface` to `foofakes/fake_my_special_interface.go`... Done
-Writing `FakeMyOtherInterface` to `foofakes/fake_my_other_interface.go`... Done
-```
-
-#### Step 3 - Run `go generate`
-
-You can run `go generate` in the directory with your directive, or in the root of your module (to ensure you generate for all packages in your module):
-
-```shell
-$ go generate ./...
-```
-
-#### Invoking `counterfeiter` from the shell
-
-You can use the following command to invoke `counterfeiter` from within a go module:
-
-```shell
-$ go run github.com/maxbrunsfeld/counterfeiter/v6
-
-USAGE
-	counterfeiter
-		[-generate>] [-o ] [-p] [--fake-name ]
-		[-header ]
-		[]  [-]
-```
-
-#### Installing `counterfeiter` to `$GOPATH/bin`
-
-This is unnecessary if you're using the approach described above, but does allow you to invoke `counterfeiter` in your shell _outside_ of a module:
-
-```shell
-$ go install github.com/maxbrunsfeld/counterfeiter/v6
-$ ~/go/bin/counterfeiter
-
-USAGE
-	counterfeiter
-		[-generate>] [-o ] [-p] [--fake-name ]
-		[-header ]
-		[]  [-]
-```
-
-### Generating Test Doubles
-
-Given a path to a package and an interface name, you can generate a test double.
-
-```shell
-$ cat path/to/foo/file.go
-```
-
-```go
-package foo
-
-type MySpecialInterface interface {
-		DoThings(string, uint64) (int, error)
-}
-```
-
-```shell
-$ go run github.com/maxbrunsfeld/counterfeiter/v6 path/to/foo MySpecialInterface
-Wrote `FakeMySpecialInterface` to `path/to/foo/foofakes/fake_my_special_interface.go`
-```
-
-### Using Test Doubles In Your Tests
-
-Instantiate fakes`:
-
-```go
-import "my-repo/path/to/foo/foofakes"
-
-var fake = &foofakes.FakeMySpecialInterface{}
-```
-
-Fakes record the arguments they were called with:
-
-```go
-fake.DoThings("stuff", 5)
-
-Expect(fake.DoThingsCallCount()).To(Equal(1))
-
-str, num := fake.DoThingsArgsForCall(0)
-Expect(str).To(Equal("stuff"))
-Expect(num).To(Equal(uint64(5)))
-```
-
-You can stub their return values:
-
-```go
-fake.DoThingsReturns(3, errors.New("the-error"))
-
-num, err := fake.DoThings("stuff", 5)
-Expect(num).To(Equal(3))
-Expect(err).To(Equal(errors.New("the-error")))
-```
-
-For more examples of using the `counterfeiter` API, look at [some of the provided examples](https://github.com/maxbrunsfeld/counterfeiter/blob/master/generated_fakes_test.go).
-
-### Generating Test Doubles For Third Party Interfaces
-
-For third party interfaces, you can specify the interface using the alternative syntax `.`, for example:
-
-```shell
-$ go run github.com/maxbrunsfeld/counterfeiter/v6 github.com/go-redis/redis.Pipeliner
-```
-
-### Running The Tests For `counterfeiter`
-
-If you want to run the tests for `counterfeiter` (perhaps, because you want to contribute a PR), all you have to do is run `scripts/ci.sh`.
-
-### Contributions
-
-So you want to contribute to `counterfeiter`! That's great, here's exactly what you should do:
-
-- open a new github issue, describing your problem, or use case
-- help us understand how you want to fix or extend `counterfeiter`
-- write one or more unit tests for the behavior you want
-- write the simplest code you can for the feature you're working on
-- try to find any opportunities to refactor
-- avoid writing code that isn't covered by unit tests
-
-`counterfeiter` has a few high level goals for contributors to keep in mind
-
-- keep unit-level test coverage as high as possible
-- keep `main.go` as simple as possible
-- avoid making the command line options any more complicated
-- avoid making the internals of `counterfeiter` any more complicated
-
-If you have any questions about how to contribute, rest assured that @tjarratt and other maintainers will work with you to ensure we make `counterfeiter` better, together. This project has largely been maintained by the community, and we greatly appreciate any PR (whether big or small).
-
-### License
-
-`counterfeiter` is MIT-licensed.
diff --git a/test/integration/vendor/github.com/maxbrunsfeld/counterfeiter/v6/arguments/files.go b/test/integration/vendor/github.com/maxbrunsfeld/counterfeiter/v6/arguments/files.go
deleted file mode 100644
index a2485878db..0000000000
--- a/test/integration/vendor/github.com/maxbrunsfeld/counterfeiter/v6/arguments/files.go
+++ /dev/null
@@ -1,6 +0,0 @@
-package arguments
-
-import "os"
-
-type Evaler func(string) (string, error)
-type Stater func(string) (os.FileInfo, error)
diff --git a/test/integration/vendor/github.com/maxbrunsfeld/counterfeiter/v6/arguments/parser.go b/test/integration/vendor/github.com/maxbrunsfeld/counterfeiter/v6/arguments/parser.go
deleted file mode 100644
index 557d4959f1..0000000000
--- a/test/integration/vendor/github.com/maxbrunsfeld/counterfeiter/v6/arguments/parser.go
+++ /dev/null
@@ -1,271 +0,0 @@
-package arguments
-
-import (
-	"encoding/json"
-	"errors"
-	"flag"
-	"fmt"
-	"path"
-	"path/filepath"
-	"regexp"
-	"strings"
-	"unicode"
-)
-
-func New(args []string, workingDir string, evaler Evaler, stater Stater) (*ParsedArguments, error) {
-	if len(args) == 0 {
-		return nil, errors.New("argument parsing requires at least one argument")
-	}
-
-	fs := flag.NewFlagSet("counterfeiter", flag.ContinueOnError)
-	fakeNameFlag := fs.String(
-		"fake-name",
-		"",
-		"The name of the fake struct",
-	)
-
-	outputPathFlag := fs.String(
-		"o",
-		"",
-		"The file or directory to which the generated fake will be written",
-	)
-
-	packageFlag := fs.Bool(
-		"p",
-		false,
-		"Whether or not to generate a package shim",
-	)
-	generateFlag := fs.Bool(
-		"generate",
-		false,
-		"Identify all //counterfeiter:generate directives in the current working directory and generate fakes for them",
-	)
-	headerFlag := fs.String(
-		"header",
-		"",
-		"A path to a file that should be used as a header for the generated fake",
-	)
-	quietFlag := fs.Bool(
-		"q",
-		false,
-		"Suppress status statements",
-	)
-	helpFlag := fs.Bool(
-		"help",
-		false,
-		"Display this help",
-	)
-
-	err := fs.Parse(args[1:])
-	if err != nil {
-		return nil, err
-	}
-	if *helpFlag {
-		return nil, errors.New(usage)
-	}
-	if len(fs.Args()) == 0 && !*generateFlag {
-		return nil, errors.New(usage)
-	}
-
-	packageMode := *packageFlag
-	result := &ParsedArguments{
-		PrintToStdOut: any(args, "-"),
-		GenerateInterfaceAndShimFromPackageDirectory: packageMode,
-		GenerateMode: *generateFlag,
-		HeaderFile:   *headerFlag,
-		Quiet:        *quietFlag,
-	}
-	if *generateFlag {
-		return result, nil
-	}
-	err = result.parseSourcePackageDir(packageMode, workingDir, evaler, stater, fs.Args())
-	if err != nil {
-		return nil, err
-	}
-	result.parseInterfaceName(packageMode, fs.Args())
-	result.parseFakeName(packageMode, *fakeNameFlag, fs.Args())
-	result.parseOutputPath(packageMode, workingDir, *outputPathFlag, fs.Args())
-	result.parseDestinationPackageName(packageMode, fs.Args())
-	result.parsePackagePath(packageMode, fs.Args())
-	return result, nil
-}
-
-func (a *ParsedArguments) PrettyPrint() {
-	b, _ := json.Marshal(a)
-	fmt.Println(string(b))
-}
-
-func (a *ParsedArguments) parseInterfaceName(packageMode bool, args []string) {
-	if packageMode {
-		a.InterfaceName = ""
-		return
-	}
-	if len(args) == 1 {
-		fullyQualifiedInterface := strings.Split(args[0], ".")
-		a.InterfaceName = fullyQualifiedInterface[len(fullyQualifiedInterface)-1]
-	} else {
-		a.InterfaceName = args[1]
-	}
-}
-
-func (a *ParsedArguments) parseSourcePackageDir(packageMode bool, workingDir string, evaler Evaler, stater Stater, args []string) error {
-	if packageMode {
-		a.SourcePackageDir = args[0]
-		return nil
-	}
-	if len(args) <= 1 {
-		return nil
-	}
-	s, err := getSourceDir(args[0], workingDir, evaler, stater)
-	if err != nil {
-		return err
-	}
-	a.SourcePackageDir = s
-	return nil
-}
-
-func (a *ParsedArguments) parseFakeName(packageMode bool, fakeName string, args []string) {
-	if packageMode {
-		a.parsePackagePath(packageMode, args)
-		a.FakeImplName = strings.ToUpper(path.Base(a.PackagePath))[:1] + path.Base(a.PackagePath)[1:]
-		return
-	}
-	if fakeName == "" {
-		fakeName = "Fake" + fixupUnexportedNames(a.InterfaceName)
-	}
-	a.FakeImplName = fakeName
-}
-
-func (a *ParsedArguments) parseOutputPath(packageMode bool, workingDir string, outputPath string, args []string) {
-	outputPathIsFilename := false
-	if strings.HasSuffix(outputPath, ".go") {
-		outputPathIsFilename = true
-	}
-	snakeCaseName := strings.ToLower(camelRegexp.ReplaceAllString(a.FakeImplName, "${1}_${2}"))
-
-	if outputPath != "" {
-		if !filepath.IsAbs(outputPath) {
-			outputPath = filepath.Join(workingDir, outputPath)
-		}
-		a.OutputPath = outputPath
-		if !outputPathIsFilename {
-			a.OutputPath = filepath.Join(a.OutputPath, snakeCaseName+".go")
-		}
-		return
-	}
-
-	if packageMode {
-		a.parseDestinationPackageName(packageMode, args)
-		a.OutputPath = path.Join(workingDir, a.DestinationPackageName, snakeCaseName+".go")
-		return
-	}
-
-	d := workingDir
-	if len(args) > 1 {
-		d = a.SourcePackageDir
-	}
-	a.OutputPath = filepath.Join(d, packageNameForPath(d), snakeCaseName+".go")
-}
-
-func (a *ParsedArguments) parseDestinationPackageName(packageMode bool, args []string) {
-	if packageMode {
-		a.parsePackagePath(packageMode, args)
-		a.DestinationPackageName = path.Base(a.PackagePath) + "shim"
-		return
-	}
-
-	a.DestinationPackageName = restrictToValidPackageName(filepath.Base(filepath.Dir(a.OutputPath)))
-}
-
-func (a *ParsedArguments) parsePackagePath(packageMode bool, args []string) {
-	if packageMode {
-		a.PackagePath = args[0]
-		return
-	}
-	if len(args) == 1 {
-		fullyQualifiedInterface := strings.Split(args[0], ".")
-		a.PackagePath = strings.Join(fullyQualifiedInterface[:len(fullyQualifiedInterface)-1], ".")
-	} else {
-		a.InterfaceName = args[1]
-	}
-
-	if a.PackagePath == "" {
-		a.PackagePath = a.SourcePackageDir
-	}
-}
-
-type ParsedArguments struct {
-	GenerateInterfaceAndShimFromPackageDirectory bool
-
-	SourcePackageDir string // abs path to the dir containing the interface to fake
-	PackagePath      string // package path to the package containing the interface to fake
-	OutputPath       string // path to write the fake file to
-
-	DestinationPackageName string // often the base-dir for OutputPath but must be a valid package name
-
-	InterfaceName string // the interface to counterfeit
-	FakeImplName  string // the name of the struct implementing the given interface
-
-	PrintToStdOut bool
-	GenerateMode  bool
-	Quiet         bool
-
-	HeaderFile string
-}
-
-func fixupUnexportedNames(interfaceName string) string {
-	asRunes := []rune(interfaceName)
-	if len(asRunes) == 0 || !unicode.IsLower(asRunes[0]) {
-		return interfaceName
-	}
-	asRunes[0] = unicode.ToUpper(asRunes[0])
-	return string(asRunes)
-}
-
-var camelRegexp = regexp.MustCompile("([a-z])([A-Z])")
-
-func packageNameForPath(pathToPackage string) string {
-	_, packageName := filepath.Split(pathToPackage)
-	return packageName + "fakes"
-}
-
-func getSourceDir(path string, workingDir string, evaler Evaler, stater Stater) (string, error) {
-	if !filepath.IsAbs(path) {
-		path = filepath.Join(workingDir, path)
-	}
-
-	evaluatedPath, err := evaler(path)
-	if err != nil {
-		return "", fmt.Errorf("No such file/directory/package [%s]: %v", path, err)
-	}
-
-	stat, err := stater(evaluatedPath)
-	if err != nil {
-		return "", fmt.Errorf("No such file/directory/package [%s]: %v", path, err)
-	}
-
-	if !stat.IsDir() {
-		return filepath.Dir(path), nil
-	}
-	return path, nil
-}
-
-func any(slice []string, needle string) bool {
-	for _, str := range slice {
-		if str == needle {
-			return true
-		}
-	}
-
-	return false
-}
-
-func restrictToValidPackageName(input string) string {
-	return strings.Map(func(r rune) rune {
-		if (r >= 'a' && r <= 'z') || (r >= 'A' && r <= 'Z') || (r >= '0' && r <= '9') || r == '_' {
-			return r
-		} else {
-			return -1
-		}
-	}, input)
-}
diff --git a/test/integration/vendor/github.com/maxbrunsfeld/counterfeiter/v6/arguments/usage.go b/test/integration/vendor/github.com/maxbrunsfeld/counterfeiter/v6/arguments/usage.go
deleted file mode 100644
index 0d707afaaa..0000000000
--- a/test/integration/vendor/github.com/maxbrunsfeld/counterfeiter/v6/arguments/usage.go
+++ /dev/null
@@ -1,112 +0,0 @@
-package arguments
-
-const usage = `
-USAGE
-	counterfeiter
-		[-generate>] [-o ] [-p] [--fake-name ]
-		[-header ]
-		[]  [-]
-
-ARGUMENTS
-	source-path
-		Path to the file or directory containing the interface to fake.
-		In package mode (-p), source-path should instead specify the path
-		of the input package; alternatively you can use the package name
-		(e.g. "os") and the path will be inferred from your GOROOT.
-
-	interface
-		If source-path is specified: Name of the interface to fake.
-		If no source-path is specified: Fully qualified interface path of the interface to fake.
-    If -p is specified, this will be the name of the interface to generate.
-
-	example:
-		# writes "FakeStdInterface" to ./packagefakes/fake_std_interface.go
-		counterfeiter package/subpackage.StdInterface
-
-	'-' argument
-		Write code to standard out instead of to a file
-
-OPTIONS
-	-generate
-		Identify all //counterfeiter:generate directives in .go file in the
-		current working directory and generate fakes for them. You can pass
-		arguments as usual.
-
-		NOTE: This is not the same as //go:generate directives
-		(used with the 'go generate' command), but it can be combined with
-		go generate by adding the following to a .go file:
-
-		# runs counterfeiter in generate mode
-		//go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -generate
-
-	example:
-		Add the following to a .go file:
-
-		//counterfeiter:generate . MyInterface
-		//counterfeiter:generate . MyOtherInterface
-		//counterfeiter:generate . MyThirdInterface
-
-		# run counterfeiter
-		counterfeiter -generate
-		# writes "FakeMyInterface" to ./mypackagefakes/fake_my_interface.go
-		# writes "FakeMyOtherInterface" to ./mypackagefakes/fake_my_other_interface.go
-		# writes "FakeMyThirdInterface" to ./mypackagefakes/fake_my_third_interface.go
-
-	-o
-		Path to the file or directory for the generated fakes.
-		This also determines the package name that will be used.
-		By default, the generated fakes will be generated in
-		the package "xyzfakes" which is nested in package "xyz",
-		where "xyz" is the name of referenced package.
-
-	example:
-		# writes "FakeMyInterface" to ./mySpecialFakesDir/specialFake.go
-		counterfeiter -o ./mySpecialFakesDir/specialFake.go ./mypackage MyInterface
-
-		# writes "FakeMyInterface" to ./mySpecialFakesDir/fake_my_interface.go
-		counterfeiter -o ./mySpecialFakesDir ./mypackage MyInterface
-
-	-p
-		Package mode:  When invoked in package mode, counterfeiter
-		will generate an interface and shim implementation from a
-		package in your module.  Counterfeiter finds the public methods
-		in the package  and adds those method signatures
-		to the generated interface .
-
-	example:
-		# generates os.go (interface) and osshim.go (shim) in ${PWD}/osshim
-		counterfeiter -p os
-		# now generate fake in ${PWD}/osshim/os_fake (fake_os.go)
-		go generate osshim/...
-
-	-header
-		Path to the file which should be used as a header for all generated fakes.
-		By default, no special header is used.
-		This is useful to e.g. add a licence header to every fake.
-
-		If the generate mode is used and both the "go:generate" and the
-		"counterfeiter:generate" specify a header file, the header file from the
-		"counterfeiter:generate" line takes precedence.
-
-	example:
-		# having the following code in a package ...
-		//go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -header ./generic.go.txt -generate
-		//counterfeiter:generate -header ./specific.go.txt . MyInterface
-		//counterfeiter:generate . MyOtherInterface
-		//counterfeiter:generate . MyThirdInterface
-
-		# ... generating the fakes ...
-		go generate .
-
-		# writes "FakeMyInterface" with ./specific.go.txt as a header
-		# writes "FakeMyOtherInterface" & "FakeMyThirdInterface" with ./generic.go.txt as a header
-
-	--fake-name
-		Name of the fake struct to generate. By default, 'Fake' will
-		be prepended to the name of the original interface. (ignored in
-		-p mode)
-
-	example:
-		# writes "CoolThing" to ./mypackagefakes/cool_thing.go
-		counterfeiter --fake-name CoolThing ./mypackage MyInterface
-`
diff --git a/test/integration/vendor/github.com/maxbrunsfeld/counterfeiter/v6/command/runner.go b/test/integration/vendor/github.com/maxbrunsfeld/counterfeiter/v6/command/runner.go
deleted file mode 100644
index 161fc4b2f4..0000000000
--- a/test/integration/vendor/github.com/maxbrunsfeld/counterfeiter/v6/command/runner.go
+++ /dev/null
@@ -1,117 +0,0 @@
-package command
-
-import (
-	"fmt"
-	"go/build"
-	"os"
-	"path/filepath"
-	"sort"
-	"strconv"
-	"strings"
-)
-
-func Detect(cwd string, args []string, generateMode bool) ([]Invocation, error) {
-	if generateMode {
-		return generateModeInvocations(cwd)
-	}
-
-	file := os.Getenv("GOFILE")
-	var lineno int
-	if goline, err := strconv.Atoi(os.Getenv("GOLINE")); err == nil {
-		lineno = goline
-	}
-
-	i, err := NewInvocation(file, lineno, args)
-	if err != nil {
-		return nil, err
-	}
-	return []Invocation{i}, nil
-}
-
-type Invocation struct {
-	Args []string
-	Line int
-	File string
-}
-
-func NewInvocation(file string, line int, args []string) (Invocation, error) {
-	if len(args) < 1 {
-		return Invocation{}, fmt.Errorf("%s:%v an invocation of counterfeiter must have arguments", file, line)
-	}
-	i := Invocation{
-		File: file,
-		Line: line,
-		Args: args,
-	}
-	return i, nil
-}
-
-func generateModeInvocations(cwd string) ([]Invocation, error) {
-	var result []Invocation
-	// Find all the go files
-	pkg, err := build.ImportDir(cwd, build.IgnoreVendor)
-	if err != nil {
-		return nil, err
-	}
-
-	gofiles := make([]string, 0, len(pkg.GoFiles)+len(pkg.CgoFiles)+len(pkg.TestGoFiles)+len(pkg.XTestGoFiles))
-	gofiles = append(gofiles, pkg.GoFiles...)
-	gofiles = append(gofiles, pkg.CgoFiles...)
-	gofiles = append(gofiles, pkg.TestGoFiles...)
-	gofiles = append(gofiles, pkg.XTestGoFiles...)
-	sort.Strings(gofiles)
-
-	for _, file := range gofiles {
-		invocations, err := invocationsInFile(cwd, file)
-		if err != nil {
-			return nil, err
-		}
-		result = append(result, invocations...)
-	}
-
-	return result, nil
-}
-
-func invocationsInFile(dir string, file string) ([]Invocation, error) {
-	str, err := os.ReadFile(filepath.Join(dir, file))
-	if err != nil {
-		return nil, err
-	}
-	lines := strings.Split(string(str), "\n")
-
-	var result []Invocation
-	line := 0
-	for i := range lines {
-		line++
-		args, ok := matchForString(lines[i])
-		if !ok {
-			continue
-		}
-		inv, err := NewInvocation(file, line, args)
-		if err != nil {
-			return nil, err
-		}
-
-		result = append(result, inv)
-	}
-
-	return result, nil
-}
-
-const generateDirectivePrefix = "//counterfeiter:generate "
-
-func matchForString(s string) ([]string, bool) {
-	if !strings.HasPrefix(s, generateDirectivePrefix) {
-		return nil, false
-	}
-	return stringToArgs(s[len(generateDirectivePrefix):]), true
-}
-
-func stringToArgs(s string) []string {
-	a := strings.Fields(s)
-	result := []string{
-		"counterfeiter",
-	}
-	result = append(result, a...)
-	return result
-}
diff --git a/test/integration/vendor/github.com/maxbrunsfeld/counterfeiter/v6/generator/fake.go b/test/integration/vendor/github.com/maxbrunsfeld/counterfeiter/v6/generator/fake.go
index bf88f18d79..5c2a6fd1ac 100644
--- a/test/integration/vendor/github.com/maxbrunsfeld/counterfeiter/v6/generator/fake.go
+++ b/test/integration/vendor/github.com/maxbrunsfeld/counterfeiter/v6/generator/fake.go
@@ -25,19 +25,22 @@ const (
 
 // Fake is used to generate a Fake implementation of an interface.
 type Fake struct {
-	Packages           []*packages.Package
-	Package            *packages.Package
-	Target             *types.TypeName
-	Mode               FakeMode
-	DestinationPackage string
-	Name               string
-	TargetAlias        string
-	TargetName         string
-	TargetPackage      string
-	Imports            Imports
-	Methods            []Method
-	Function           Method
-	Header             string
+	Packages                            []*packages.Package
+	Package                             *packages.Package
+	Target                              *types.TypeName
+	Mode                                FakeMode
+	DestinationPackage                  string
+	Name                                string
+	GenericTypeParametersAndConstraints string
+	GenericTypeParameters               string
+	GenericTypeConstraints              string
+	TargetAlias                         string
+	TargetName                          string
+	TargetPackage                       string
+	Imports                             Imports
+	Methods                             []Method
+	Function                            Method
+	Header                              string
 }
 
 // Method is a method of the interface.
diff --git a/test/integration/vendor/github.com/maxbrunsfeld/counterfeiter/v6/generator/interface_template.go b/test/integration/vendor/github.com/maxbrunsfeld/counterfeiter/v6/generator/interface_template.go
index 1a8fde9b46..3be9c1a5c3 100644
--- a/test/integration/vendor/github.com/maxbrunsfeld/counterfeiter/v6/generator/interface_template.go
+++ b/test/integration/vendor/github.com/maxbrunsfeld/counterfeiter/v6/generator/interface_template.go
@@ -27,7 +27,7 @@ import (
 	{{- end}}
 )
 
-type {{.Name}} struct {
+type {{.Name}}{{.GenericTypeParametersAndConstraints}} struct {
 	{{- range .Methods}}
 	{{.Name}}Stub func({{.Params.AsArgs}}) {{.Returns.AsReturnSignature}}
 	{{UnExport .Name}}Mutex sync.RWMutex
@@ -54,7 +54,7 @@ type {{.Name}} struct {
 }
 
 {{range .Methods -}}
-func (fake *{{$.Name}}) {{.Name}}({{.Params.AsNamedArgsWithTypes}}) {{.Returns.AsReturnSignature}} {
+func (fake *{{$.Name}}{{$.GenericTypeParameters}}) {{.Name}}({{.Params.AsNamedArgsWithTypes}}) {{.Returns.AsReturnSignature}} {
 	{{- range .Params.Slices}}
 	var {{UnExport .Name}}Copy {{.Type}}
 	if {{UnExport .Name}} != nil {
@@ -90,20 +90,20 @@ func (fake *{{$.Name}}) {{.Name}}({{.Params.AsNamedArgsWithTypes}}) {{.Returns.A
 	{{- end}}
 }
 
-func (fake *{{$.Name}}) {{Title .Name}}CallCount() int {
+func (fake *{{$.Name}}{{$.GenericTypeParameters}}) {{Title .Name}}CallCount() int {
 	fake.{{UnExport .Name}}Mutex.RLock()
 	defer fake.{{UnExport .Name}}Mutex.RUnlock()
 	return len(fake.{{UnExport .Name}}ArgsForCall)
 }
 
-func (fake *{{$.Name}}) {{Title .Name}}Calls(stub func({{.Params.AsArgs}}) {{.Returns.AsReturnSignature}}) {
+func (fake *{{$.Name}}{{$.GenericTypeParameters}}) {{Title .Name}}Calls(stub func({{.Params.AsArgs}}) {{.Returns.AsReturnSignature}}) {
 	fake.{{UnExport .Name}}Mutex.Lock()
 	defer fake.{{UnExport .Name}}Mutex.Unlock()
 	fake.{{.Name}}Stub = stub
 }
 
 {{if .Params.HasLength -}}
-func (fake *{{$.Name}}) {{Title .Name}}ArgsForCall(i int) {{.Params.AsReturnSignature}} {
+func (fake *{{$.Name}}{{$.GenericTypeParameters}}) {{Title .Name}}ArgsForCall(i int) {{.Params.AsReturnSignature}} {
 	fake.{{UnExport .Name}}Mutex.RLock()
 	defer fake.{{UnExport .Name}}Mutex.RUnlock()
 	argsForCall := fake.{{UnExport .Name}}ArgsForCall[i]
@@ -112,7 +112,7 @@ func (fake *{{$.Name}}) {{Title .Name}}ArgsForCall(i int) {{.Params.AsReturnSign
 {{- end}}
 
 {{if .Returns.HasLength -}}
-func (fake *{{$.Name}}) {{Title .Name}}Returns({{.Returns.AsNamedArgsWithTypes}}) {
+func (fake *{{$.Name}}{{$.GenericTypeParameters}}) {{Title .Name}}Returns({{.Returns.AsNamedArgsWithTypes}}) {
 	fake.{{UnExport .Name}}Mutex.Lock()
 	defer fake.{{UnExport .Name}}Mutex.Unlock()
 	fake.{{.Name}}Stub = nil
@@ -123,7 +123,7 @@ func (fake *{{$.Name}}) {{Title .Name}}Returns({{.Returns.AsNamedArgsWithTypes}}
 	}{ {{- .Returns.AsNamedArgs -}} }
 }
 
-func (fake *{{$.Name}}) {{Title .Name}}ReturnsOnCall(i int, {{.Returns.AsNamedArgsWithTypes}}) {
+func (fake *{{$.Name}}{{$.GenericTypeParameters}}) {{Title .Name}}ReturnsOnCall(i int, {{.Returns.AsNamedArgsWithTypes}}) {
 	fake.{{UnExport .Name}}Mutex.Lock()
 	defer fake.{{UnExport .Name}}Mutex.Unlock()
 	fake.{{.Name}}Stub = nil
@@ -144,7 +144,7 @@ func (fake *{{$.Name}}) {{Title .Name}}ReturnsOnCall(i int, {{.Returns.AsNamedAr
 {{end -}}
 {{end}}
 
-func (fake *{{.Name}}) Invocations() map[string][][]interface{} {
+func (fake *{{.Name}}{{$.GenericTypeParameters}}) Invocations() map[string][][]interface{} {
 	fake.invocationsMutex.RLock()
 	defer fake.invocationsMutex.RUnlock()
 	{{- range .Methods}}
@@ -158,7 +158,7 @@ func (fake *{{.Name}}) Invocations() map[string][][]interface{} {
 	return copiedInvocations
 }
 
-func (fake *{{.Name}}) recordInvocation(key string, args []interface{}) {
+func (fake *{{.Name}}{{$.GenericTypeParameters}}) recordInvocation(key string, args []interface{}) {
 	fake.invocationsMutex.Lock()
 	defer fake.invocationsMutex.Unlock()
 	if fake.invocations == nil {
@@ -171,6 +171,6 @@ func (fake *{{.Name}}) recordInvocation(key string, args []interface{}) {
 }
 
 {{if IsExported .TargetName -}}
-var _ {{.TargetAlias}}.{{.TargetName}} = new({{.Name}})
+var _ {{.TargetAlias}}.{{.TargetName}}{{.GenericTypeConstraints}} = new({{.Name}}{{.GenericTypeConstraints}})
 {{- end}}
 `
diff --git a/test/integration/vendor/github.com/maxbrunsfeld/counterfeiter/v6/generator/loader.go b/test/integration/vendor/github.com/maxbrunsfeld/counterfeiter/v6/generator/loader.go
index 4a8695b1ed..106ddfbd58 100644
--- a/test/integration/vendor/github.com/maxbrunsfeld/counterfeiter/v6/generator/loader.go
+++ b/test/integration/vendor/github.com/maxbrunsfeld/counterfeiter/v6/generator/loader.go
@@ -57,9 +57,34 @@ func (f *Fake) loadPackages(c Cacher, workingDir string) error {
 	return nil
 }
 
+func (f *Fake) getGenericTypeData(typeName *types.TypeName) (paramNames []string, constraintNames []string, paramAndConstraintNames []string, found bool) {
+	if named, ok := typeName.Type().(*types.Named); ok {
+		if _, ok := named.Underlying().(*types.Interface); ok {
+			typeParams := named.TypeParams()
+			if typeParams.Len() > 0 {
+				for i := 0; i < typeParams.Len(); i++ {
+					param := typeParams.At(i)
+					paramName := param.Obj().Name()
+					constraint := param.Constraint()
+					constraintSections := strings.Split(constraint.String(), "/")
+					constraintName := constraintSections[len(constraintSections)-1]
+					paramNames = append(paramNames, paramName)
+					constraintNames = append(constraintNames, constraintName)
+					paramAndConstraintNames = append(paramAndConstraintNames, fmt.Sprintf("%s %s", paramName, constraintName))
+					found = true
+				}
+			}
+		}
+	}
+	return
+}
+
 func (f *Fake) findPackage() error {
 	var target *types.TypeName
 	var pkg *packages.Package
+	genericTypeParametersAndConstraints := []string{}
+	genericTypeConstraints := []string{}
+	genericTypeParameters := []string{}
 	for i := range f.Packages {
 		if f.Packages[i].Types == nil || f.Packages[i].Types.Scope() == nil {
 			continue
@@ -72,6 +97,15 @@ func (f *Fake) findPackage() error {
 		raw := pkg.Types.Scope().Lookup(f.TargetName)
 		if raw != nil {
 			if typeName, ok := raw.(*types.TypeName); ok {
+				if paramNames, constraintNames, paramAndConstraintNames, found := f.getGenericTypeData(typeName); found {
+					genericTypeParameters = append(genericTypeParameters, paramNames...)
+					genericTypeConstraints = append(genericTypeConstraints, constraintNames...)
+					genericTypeParametersAndConstraints = append(
+						genericTypeParametersAndConstraints,
+						paramAndConstraintNames...,
+					)
+				}
+
 				target = typeName
 				break
 			}
@@ -89,6 +123,11 @@ func (f *Fake) findPackage() error {
 	f.Target = target
 	f.Package = pkg
 	f.TargetPackage = imports.VendorlessPath(pkg.PkgPath)
+	if len(genericTypeParameters) > 0 {
+		f.GenericTypeParametersAndConstraints = fmt.Sprintf("[%s]", strings.Join(genericTypeParametersAndConstraints, ", "))
+		f.GenericTypeParameters = fmt.Sprintf("[%s]", strings.Join(genericTypeParameters, ", "))
+		f.GenericTypeConstraints = fmt.Sprintf("[%s]", strings.Join(genericTypeConstraints, ", "))
+	}
 	t := f.Imports.Add(pkg.Name, f.TargetPackage)
 	f.TargetAlias = t.Alias
 	if f.Mode != Package {
@@ -97,7 +136,7 @@ func (f *Fake) findPackage() error {
 
 	if f.Mode == InterfaceOrFunction {
 		if !f.IsInterface() && !f.IsFunction() {
-			return fmt.Errorf("cannot generate an fake for %s because it is not an interface or function", f.TargetName)
+			return fmt.Errorf("cannot generate a fake for %s because it is not an interface or function", f.TargetName)
 		}
 	}
 
@@ -130,14 +169,10 @@ func (f *Fake) addImportsFor(typ types.Type) {
 		f.addImportsFor(t.Elem())
 	case *types.Chan:
 		f.addImportsFor(t.Elem())
+	case *types.Alias:
+		f.addImportsForNamedType(t)
 	case *types.Named:
-		if t.Obj() != nil && t.Obj().Pkg() != nil {
-			typeArgs := t.TypeArgs()
-			for i := 0; i < typeArgs.Len(); i++ {
-				f.addImportsFor(typeArgs.At(i))
-			}
-			f.Imports.Add(t.Obj().Pkg().Name(), t.Obj().Pkg().Path())
-		}
+		f.addImportsForNamedType(t)
 	case *types.Slice:
 		f.addImportsFor(t.Elem())
 	case *types.Array:
@@ -154,3 +189,16 @@ func (f *Fake) addImportsFor(typ types.Type) {
 		log.Printf("!!! WARNING: Missing case for type %s\n", reflect.TypeOf(typ).String())
 	}
 }
+
+func (f *Fake) addImportsForNamedType(t interface {
+	Obj() *types.TypeName
+	TypeArgs() *types.TypeList
+}) {
+	if t.Obj() != nil && t.Obj().Pkg() != nil {
+		typeArgs := t.TypeArgs()
+		for i := 0; i < typeArgs.Len(); i++ {
+			f.addImportsFor(typeArgs.At(i))
+		}
+		f.Imports.Add(t.Obj().Pkg().Name(), t.Obj().Pkg().Path())
+	}
+}
diff --git a/test/integration/vendor/github.com/maxbrunsfeld/counterfeiter/v6/main.go b/test/integration/vendor/github.com/maxbrunsfeld/counterfeiter/v6/main.go
deleted file mode 100644
index fcaf995a6f..0000000000
--- a/test/integration/vendor/github.com/maxbrunsfeld/counterfeiter/v6/main.go
+++ /dev/null
@@ -1,207 +0,0 @@
-package main
-
-import (
-	"errors"
-	"fmt"
-	"go/format"
-	"io"
-	"log"
-	"os"
-	"path/filepath"
-	"runtime/debug"
-	"runtime/pprof"
-
-	"github.com/maxbrunsfeld/counterfeiter/v6/arguments"
-	"github.com/maxbrunsfeld/counterfeiter/v6/command"
-	"github.com/maxbrunsfeld/counterfeiter/v6/generator"
-)
-
-func main() {
-	debug.SetGCPercent(-1)
-
-	if err := run(); err != nil {
-		fail("%v", err)
-	}
-}
-
-func run() error {
-	profile := os.Getenv("COUNTERFEITER_PROFILE") != ""
-	if profile {
-		p, err := filepath.Abs(filepath.Join(".", "counterfeiter.profile"))
-		if err != nil {
-			return err
-		}
-		f, err := os.Create(p)
-		if err != nil {
-			return err
-		}
-		if err := pprof.StartCPUProfile(f); err != nil {
-			return err
-		}
-		fmt.Printf("Profile: %s\n", p)
-		defer pprof.StopCPUProfile()
-	}
-
-	log.SetFlags(log.Lshortfile)
-	if !isDebug() {
-		log.SetOutput(io.Discard)
-	}
-
-	cwd, err := os.Getwd()
-	if err != nil {
-		return errors.New("Error - couldn't determine current working directory")
-	}
-
-	var cache generator.Cacher
-	var headerReader generator.FileReader
-	if disableCache() {
-		cache = &generator.FakeCache{}
-		headerReader = &generator.SimpleFileReader{}
-	} else {
-		cache = &generator.Cache{}
-		headerReader = &generator.CachedFileReader{}
-	}
-	var invocations []command.Invocation
-	var args *arguments.ParsedArguments
-	args, _ = arguments.New(os.Args, cwd, filepath.EvalSymlinks, os.Stat)
-	generateMode := false
-	if args != nil {
-		generateMode = args.GenerateMode
-	}
-	if !generateMode && shouldPrintGenerateWarning() {
-		fmt.Printf("\nWARNING: Invoking counterfeiter multiple times from \"go generate\" is slow.\nConsider using counterfeiter:generate directives to speed things up.\nSee https://github.com/maxbrunsfeld/counterfeiter#step-2b---add-counterfeitergenerate-directives for more information.\nSet the \"COUNTERFEITER_NO_GENERATE_WARNING\" environment variable to suppress this message.\n\n")
-	}
-	invocations, err = command.Detect(cwd, os.Args, generateMode)
-	if err != nil {
-		return err
-	}
-
-	for i := range invocations {
-		a, err := arguments.New(invocations[i].Args, cwd, filepath.EvalSymlinks, os.Stat)
-		if err != nil {
-			return err
-		}
-
-		// If the '//counterfeiter:generate ...' line does not have a '-header'
-		// flag, we use the one from the "global"
-		// '//go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -generate -header /some/header.txt'
-		// line (which defaults to none). By doing so, we can configure the header
-		// once per package, which is probably the most common case for adding
-		// licence headers (i.e. all the fakes will have the same licence headers).
-		a.HeaderFile = or(a.HeaderFile, args.HeaderFile)
-
-		err = generate(cwd, a, cache, headerReader)
-		if err != nil {
-			return err
-		}
-	}
-	return nil
-}
-
-func or(opts ...string) string {
-	for _, s := range opts {
-		if s != "" {
-			return s
-		}
-	}
-	return ""
-}
-
-func isDebug() bool {
-	return os.Getenv("COUNTERFEITER_DEBUG") != ""
-}
-
-func disableCache() bool {
-	return os.Getenv("COUNTERFEITER_DISABLECACHE") != ""
-}
-
-func shouldPrintGenerateWarning() bool {
-	return invokedByGoGenerate() && os.Getenv("COUNTERFEITER_NO_GENERATE_WARNING") == ""
-}
-
-func invokedByGoGenerate() bool {
-	return os.Getenv("DOLLAR") == "$"
-}
-
-func generate(workingDir string, args *arguments.ParsedArguments, cache generator.Cacher, headerReader generator.FileReader) error {
-	if !args.Quiet {
-		if err := reportStarting(workingDir, args.OutputPath, args.FakeImplName); err != nil {
-			return err
-		}
-	}
-
-	b, err := doGenerate(workingDir, args, cache, headerReader)
-	if err != nil {
-		return err
-	}
-
-	if err := printCode(b, args.OutputPath, args.PrintToStdOut); err != nil {
-		return err
-	}
-
-	if !args.Quiet {
-		fmt.Fprint(os.Stderr, "Done\n")
-	}
-
-	return nil
-}
-
-func doGenerate(workingDir string, args *arguments.ParsedArguments, cache generator.Cacher, headerReader generator.FileReader) ([]byte, error) {
-	mode := generator.InterfaceOrFunction
-	if args.GenerateInterfaceAndShimFromPackageDirectory {
-		mode = generator.Package
-	}
-
-	headerContent, err := headerReader.Get(workingDir, args.HeaderFile)
-	if err != nil {
-		return nil, err
-	}
-
-	f, err := generator.NewFake(mode, args.InterfaceName, args.PackagePath, args.FakeImplName, args.DestinationPackageName, headerContent, workingDir, cache)
-	if err != nil {
-		return nil, err
-	}
-	return f.Generate(true)
-}
-
-func printCode(code []byte, outputPath string, printToStdOut bool) error {
-	formattedCode, err := format.Source(code)
-	if err != nil {
-		return err
-	}
-
-	if printToStdOut {
-		fmt.Println(string(formattedCode))
-		return nil
-	}
-	_ = os.MkdirAll(filepath.Dir(outputPath), 0777)
-	file, err := os.Create(outputPath)
-	if err != nil {
-		return fmt.Errorf("Couldn't create fake file - %v", err)
-	}
-
-	_, err = file.Write(formattedCode)
-	if err != nil {
-		return fmt.Errorf("Couldn't write to fake file - %v", err)
-	}
-	return nil
-}
-
-func reportStarting(workingDir string, outputPath, fakeName string) error {
-	rel, err := filepath.Rel(workingDir, outputPath)
-	if err != nil {
-		return err
-	}
-
-	msg := fmt.Sprintf("Writing `%s` to `%s`... ", fakeName, rel)
-	if isDebug() {
-		msg = msg + "\n"
-	}
-	fmt.Fprint(os.Stderr, msg)
-	return nil
-}
-
-func fail(s string, args ...interface{}) {
-	fmt.Printf("\n"+s+"\n", args...)
-	os.Exit(1)
-}
diff --git a/test/integration/vendor/github.com/nginx/agent/sdk/v2/config_helpers.go b/test/integration/vendor/github.com/nginx/agent/sdk/v2/config_helpers.go
index ed2595be87..9baa07e828 100644
--- a/test/integration/vendor/github.com/nginx/agent/sdk/v2/config_helpers.go
+++ b/test/integration/vendor/github.com/nginx/agent/sdk/v2/config_helpers.go
@@ -125,6 +125,7 @@ func GetNginxConfigWithIgnoreDirectives(
 		},
 	)
 	if err != nil {
+		readLock.Unlock()
 		return nil, fmt.Errorf("error reading config from %s, error: %s", confFile, err)
 	}
 
@@ -144,10 +145,11 @@ func GetNginxConfigWithIgnoreDirectives(
 
 	err = updateNginxConfigFromPayload(confFile, payload, nginxConfig, allowedDirectories)
 	if err != nil {
+		readLock.Unlock()
 		return nil, fmt.Errorf("error assemble payload from %s, error: %s", confFile, err)
 	}
-	readLock.Unlock()
 
+	readLock.Unlock()
 	return nginxConfig, nil
 }
 
diff --git a/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/.gitignore b/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/.gitignore
index 82c668079f..e8838f9fa9 100644
--- a/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/.gitignore
+++ b/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/.gitignore
@@ -16,9 +16,6 @@ __pycache__/
 *.out
 coverage.*
 
-# Kubernetes Generated files - skip generated files, except for vendored files
-!vendor/**/zz_generated.*
-
 # editor and IDE paraphernalia
 .idea
 .vscode
diff --git a/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/.golangci.yml b/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/.golangci.yml
index 7888e9f1a6..593c5b9d06 100644
--- a/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/.golangci.yml
+++ b/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/.golangci.yml
@@ -40,9 +40,10 @@ linters:
 run:
   # 10 minute timeout for analysis
   timeout: 10m
-  modules-download-mode: vendor
+  modules-download-mode: mod
   skip-dirs-use-default: true
 
+
 # Specific linter settings
 linters-settings:
   gocyclo:
@@ -62,6 +63,9 @@ linters-settings:
     local-prefixes: gitswarm.f5net.com/indigo,gitlab.com/f5
   errcheck:
     ignore: ^Close.*,os:^Setenv.*,fmt:.*,io/ioutil:^Read.*,github.com/spf13/viper:.*,github.com/pkg/errors:^Wrap.*
+  funclen:
+    skip-ifles:
+        - ".*\\.gen\\.go"
 
   lll:
     line-length: 140
diff --git a/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/Makefile b/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/Makefile
index aada8bcacb..80ee2c08e4 100644
--- a/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/Makefile
+++ b/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/Makefile
@@ -1,6 +1,5 @@
 PACKAGE           = $(notdir $(patsubst %/,%,$(dir $(realpath $(lastword $(MAKEFILE_LIST))))))
 OUT_DIR          ?= build
-VENDOR_DIR       ?= vendor
 RESULTS_DIR		 ?= results
 DOCKER_REGISTRY  ?= local
 DOCKER_TAG       ?= latest
@@ -25,7 +24,6 @@ deps:
 	go mod download
 	go mod tidy
 	go mod verify
-	go mod vendor
 
 deps-upgrade:
 	GOFLAGS="" go get -u ./...
@@ -36,7 +34,7 @@ deps-upgrade:
 #######################################
 fmt:
 	$(info Running goimports...)
-	@goimports -w -e $$(find . -type f -name '*.go' -not -path "./vendor/*")
+	@goimports -w -e $$(find . -type f -name '*.go')
 
 test:
 	$(info Running unit tests...)
@@ -60,7 +58,7 @@ lint-docker:
 	docker run --rm -v "${PWD}":/app -w /app golangci/golangci-lint:v1.51.2 golangci-lint run
 
 lint-shell:
-	shellcheck -x $$(find . -name "*.sh" -type f -not -path "./vendor/*")
+	shellcheck -x $$(find . -name "*.sh" -type f)
 
 gen:
 	go generate -x ./...
diff --git a/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/README.md b/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/README.md
index 3f84bce266..e75f02cf44 100644
--- a/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/README.md
+++ b/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/README.md
@@ -74,7 +74,9 @@ func main() {
 ```
 
 # Generate support for third-party modules
-This is an example that takes the path of a third-party module source code to generate support for it. Assume the source code path of that module is `./src`. You can call `go run cmd/generate/main.go ./src`. The stdout will be like
+This is a simple example that takes the path of a third-party module source code to generate support for it. For detailed usage of the tool, please run
+`go run ./cmd/generate/ --help`.
+Assuming the source code path of that module is `./src`, you can call `go run ./cmd/generate/ --src-path=./src -directive-map-name=directives -match-func-name=Match -match-func-comment=comment`. The output will be similar to:
 
 ```go
 /**
@@ -107,8 +109,7 @@ var directives = map[string][]uint{
     },
 }
 
-// Match is a matchFunc for parsing an NGINX config that contains the
-// preceding directives.
+// comment
 func Match(directive string) ([]uint, bool) {
     m, ok := directives[directive]
     return m, ok
diff --git a/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze.go b/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze.go
index d453b3d67e..e1127b2da7 100644
--- a/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze.go
+++ b/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze.go
@@ -7,6 +7,39 @@
 
 package crossplane
 
+// Upgrade for .gen.go files. If you don't have access to some private modules,
+// please use -skip options to skip them. e.g. go generate -skip="nap".
+
+// Update for headersmore
+//go:generate sh -c "sh ./scripts/generate/generate.sh --url https://github.com/openresty/headers-more-nginx-module.git --config-path ./scripts/generate/configs/headersmore_config.json > ./analyze_headersMore_directives.gen.go"
+
+// Update for njs
+//go:generate sh -c "sh ./scripts/generate/generate.sh --url https://github.com/nginx/njs.git --config-path ./scripts/generate/configs/njs_config.json > ./analyze_njs_directives.gen.go"
+
+// Update for OSS, filter in config is the directives not in https://nginx.org/en/docs/dirindex.html but in source code.
+// Override in config is for the "if" directive. We create a bitmask ngxConfExpr for it in crossplane, which is not in source code.
+//go:generate sh -c "sh ./scripts/generate/generate.sh --url https://github.com/nginx/nginx.git --config-path ./scripts/generate/configs/oss_latest_config.json > ./analyze_oss_latest_directives.gen.go"
+//go:generate sh -c "sh ./scripts/generate/generate.sh --url https://github.com/nginx/nginx.git --config-path ./scripts/generate/configs/oss_126_config.json --branch branches/stable-1.26 > ./analyze_oss_126_directives.gen.go"
+//go:generate sh -c "sh ./scripts/generate/generate.sh --url https://github.com/nginx/nginx.git --config-path ./scripts/generate/configs/oss_124_config.json --branch branches/stable-1.24 > ./analyze_oss_124_directives.gen.go"
+
+// Update for lua, override is for the lua block directives, see https://github.com/nginxinc/nginx-go-crossplane/pull/86.
+//go:generate sh -c "sh ./scripts/generate/generate.sh --url https://github.com/openresty/lua-nginx-module.git --config-path ./scripts/generate/configs/lua_config.json  --path ./src > ./analyze_lua_directives.gen.go"
+
+// Update for otel. Filter is for some directives withou context.
+// Otel provides its own config handler for some directives and they don't have context. Currently we don't support them.
+//go:generate sh -c "sh ./scripts/generate/generate.sh --url https://github.com/nginxinc/nginx-otel.git --config-path ./scripts/generate/configs/otel_config.json --branch main > ./analyze_otel_directives.gen.go"
+
+// Update for NAP v4 and v5.
+// NAP is a private module. Please ensure you have correct access and put the url.
+// and branch of it in environment variable NAP_URL, NAP_V4_BRANCH, and NAP_V5_BRANCH.
+// Override is for flag dirctives. NAP used ngxConfTake1 for flag directives, we change them to ngxConfFlag in crossplane.
+// NAP v4
+//go:generate sh -c "sh ./scripts/generate/generate.sh --url $NAP_URL --config-path ./scripts/generate/configs/nap_v4_config.json --branch $NAP_V4_BRANCH --path ./src > analyze_appProtectWAFv4_directives.gen.go"
+// NAP v5
+//go:generate sh -c "sh ./scripts/generate/generate.sh --url $NAP_URL --config-path ./scripts/generate/configs/nap_v5_config.json --branch $NAP_V5_BRANCH --path ./src > analyze_appProtectWAFv5_directives.gen.go"
+
+// Update for geoip2
+//go:generate sh -c "sh ./scripts/generate/generate.sh --url https://github.com/leev/ngx_http_geoip2_module.git --config-path ./scripts/generate/configs/geoip2_config.json > ./analyze_geoip2_directives.gen.go"
 import (
 	"fmt"
 )
@@ -219,7 +252,7 @@ func unionBitmaskMaps(maps ...map[string][]uint) map[string][]uint {
 // not provided. It is union of latest Nplus, Njs, and Otel.
 //
 //nolint:gochecknoglobals
-var defaultDirectives = unionBitmaskMaps(ngxPlusLatestDirectives, moduleNjsDirectives, moduleOtelDirectives)
+var defaultDirectives = unionBitmaskMaps(nginxPlusLatestDirectives, njsDirectives, otelDirectives)
 
 func DefaultDirectivesMatchFunc(directive string) ([]uint, bool) {
 	masks, matched := defaultDirectives[directive]
diff --git a/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_appProtectWAFv4_directives.gen.go b/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_appProtectWAFv4_directives.gen.go
new file mode 100644
index 0000000000..c639b73fb4
--- /dev/null
+++ b/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_appProtectWAFv4_directives.gen.go
@@ -0,0 +1,88 @@
+/**
+ * Copyright (c) F5, Inc.
+ *
+ * This source code is licensed under the Apache License, Version 2.0 license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+// Code generated by generator; DO NOT EDIT.
+// All the definitions are extracted from the source code
+// Each bit mask describes these behaviors:
+//   - how many arguments the directive can take
+//   - whether or not it is a block directive
+//   - whether this is a flag (takes one argument that's either "on" or "off")
+//   - which contexts it's allowed to be in
+
+package crossplane
+
+var appProtectWAFv4Directives = map[string][]uint{
+    "app_protect_app_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "app_protect_compressed_requests_action": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_config_set_timeout": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_cookie_seed": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_cpu_thresholds": {
+        ngxHTTPMainConf | ngxConfTake2,
+    },
+    "app_protect_custom_log_attribute": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "app_protect_enable": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "app_protect_enforcer_address": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_enforcer_memory_limit_mb": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_failure_mode_action": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_global_settings": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_logging_str": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "app_protect_physical_memory_util_thresholds": {
+        ngxHTTPMainConf | ngxConfTake2,
+    },
+    "app_protect_policy_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "app_protect_reconnect_period_seconds": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_request_buffer_overflow_action": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_response_enforcement_disable": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_security_log": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "app_protect_security_log_enable": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "app_protect_streaming_buffer_watermarks": {
+        ngxHTTPMainConf | ngxConfTake2,
+    },
+    "app_protect_user_defined_signatures": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+}
+
+// MatchAppProtectWAFv4 is a MatchFunc for App Protect v4 module.
+func MatchAppProtectWAFv4(directive string) ([]uint, bool) {
+    m, ok := appProtectWAFv4Directives[directive]
+    return m, ok
+}
diff --git a/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_appProtectWAFv4_directives.go b/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_appProtectWAFv4_directives.go
deleted file mode 100644
index 4ef764f6f9..0000000000
--- a/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_appProtectWAFv4_directives.go
+++ /dev/null
@@ -1,51 +0,0 @@
-package crossplane
-
-// nginx app protect specific and global directives, inferred from
-// [https://docs.nginx.com/nginx-app-protect/configuration-guide/configuration/#directives]
-
-//nolint:gochecknoglobals
-var appProtectWAFv4Directives = map[string][]uint{
-	"app_protect_compressed_requests_action": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"app_protect_cookie_seed": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"app_protect_cpu_thresholds": {
-		ngxHTTPMainConf | ngxConfTake2,
-	},
-	"app_protect_enable": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"app_protect_failure_mode_action": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"app_protect_physical_memory_util_thresholds": {
-		ngxHTTPMainConf | ngxConfTake2,
-	},
-	"app_protect_policy_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"app_protect_reconnect_period_seconds": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"app_protect_request_buffer_overflow_action": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"app_protect_security_log_enable": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"app_protect_security_log": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"app_protect_user_defined_signatures": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-}
-
-// AppProtectWAFv4DirectivesMatchFn is a match function for parsing an NGINX config that contains the
-// App Protect v4 module.
-func AppProtectWAFv4DirectivesMatchFn(directive string) ([]uint, bool) {
-	masks, matched := appProtectWAFv4Directives[directive]
-	return masks, matched
-}
diff --git a/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_appProtectWAFv5_directives.gen.go b/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_appProtectWAFv5_directives.gen.go
new file mode 100644
index 0000000000..4601a25a1e
--- /dev/null
+++ b/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_appProtectWAFv5_directives.gen.go
@@ -0,0 +1,88 @@
+/**
+ * Copyright (c) F5, Inc.
+ *
+ * This source code is licensed under the Apache License, Version 2.0 license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+// Code generated by generator; DO NOT EDIT.
+// All the definitions are extracted from the source code
+// Each bit mask describes these behaviors:
+//   - how many arguments the directive can take
+//   - whether or not it is a block directive
+//   - whether this is a flag (takes one argument that's either "on" or "off")
+//   - which contexts it's allowed to be in
+
+package crossplane
+
+var appProtectWAFv5Directives = map[string][]uint{
+    "app_protect_app_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "app_protect_compressed_requests_action": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_config_set_timeout": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_cookie_seed": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_cpu_thresholds": {
+        ngxHTTPMainConf | ngxConfTake2,
+    },
+    "app_protect_custom_log_attribute": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "app_protect_enable": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "app_protect_enforcer_address": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_enforcer_memory_limit_mb": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_failure_mode_action": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_global_settings": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_logging_str": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "app_protect_physical_memory_util_thresholds": {
+        ngxHTTPMainConf | ngxConfTake2,
+    },
+    "app_protect_policy_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "app_protect_reconnect_period_seconds": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_request_buffer_overflow_action": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_response_enforcement_disable": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_security_log": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "app_protect_security_log_enable": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "app_protect_streaming_buffer_watermarks": {
+        ngxHTTPMainConf | ngxConfTake2,
+    },
+    "app_protect_user_defined_signatures": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+}
+
+// MatchAppProtectWAFv5 is a MatchFunc for App Protect v5 module.
+func MatchAppProtectWAFv5(directive string) ([]uint, bool) {
+    m, ok := appProtectWAFv5Directives[directive]
+    return m, ok
+}
diff --git a/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_appProtectWAFv5_directives.go b/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_appProtectWAFv5_directives.go
deleted file mode 100644
index bba7faa142..0000000000
--- a/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_appProtectWAFv5_directives.go
+++ /dev/null
@@ -1,51 +0,0 @@
-package crossplane
-
-// nginx app protect specific and global directives, inferred from
-// [https://docs.nginx.com/nginx-app-protect/configuration-guide/configuration/#directives]
-
-//nolint:gochecknoglobals
-var appProtectWAFv5Directives = map[string][]uint{
-	"app_protect_physical_memory_util_thresholds": {
-		ngxHTTPMainConf | ngxConfTake2,
-	},
-	"app_protect_cpu_thresholds": {
-		ngxHTTPMainConf | ngxConfTake2,
-	},
-	"app_protect_failure_mode_action": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"app_protect_cookie_seed": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"app_protect_request_buffer_overflow_action": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"app_protect_reconnect_period_seconds": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"app_protect_enforcer_address": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"app_protect_enable": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"app_protect_policy_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"app_protect_security_log_enable": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"app_protect_security_log": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"app_protect_custom_log_attribute": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-}
-
-// AppProtectWAFv5DirectivesMatchFn is a match function for parsing an NGINX config that contains the
-// App Protect v5 module.
-func AppProtectWAFv5DirectivesMatchFn(directive string) ([]uint, bool) {
-	masks, matched := appProtectWAFv5Directives[directive]
-	return masks, matched
-}
diff --git a/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_geoip2_directives.gen.go b/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_geoip2_directives.gen.go
new file mode 100644
index 0000000000..998d61a948
--- /dev/null
+++ b/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_geoip2_directives.gen.go
@@ -0,0 +1,35 @@
+/**
+ * Copyright (c) F5, Inc.
+ *
+ * This source code is licensed under the Apache License, Version 2.0 license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+// Code generated by generator; DO NOT EDIT.
+// All the definitions are extracted from the source code
+// Each bit mask describes these behaviors:
+//   - how many arguments the directive can take
+//   - whether or not it is a block directive
+//   - whether this is a flag (takes one argument that's either "on" or "off")
+//   - which contexts it's allowed to be in
+
+package crossplane
+
+var geoip2Directives = map[string][]uint{
+    "geoip2": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfTake1,
+        ngxStreamMainConf | ngxConfBlock | ngxConfTake1,
+    },
+    "geoip2_proxy": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "geoip2_proxy_recursive": {
+        ngxHTTPMainConf | ngxConfFlag,
+    },
+}
+
+// MatchGeoip2Latest is a MatchFunc for the latest version of geoip2.
+func MatchGeoip2Latest(directive string) ([]uint, bool) {
+    m, ok := geoip2Directives[directive]
+    return m, ok
+}
diff --git a/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_headersMore_directives.gen.go b/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_headersMore_directives.gen.go
new file mode 100644
index 0000000000..462a81bd82
--- /dev/null
+++ b/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_headersMore_directives.gen.go
@@ -0,0 +1,37 @@
+/**
+ * Copyright (c) F5, Inc.
+ *
+ * This source code is licensed under the Apache License, Version 2.0 license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+// Code generated by generator; DO NOT EDIT.
+// All the definitions are extracted from the source code
+// Each bit mask describes these behaviors:
+//   - how many arguments the directive can take
+//   - whether or not it is a block directive
+//   - whether this is a flag (takes one argument that's either "on" or "off")
+//   - which contexts it's allowed to be in
+
+package crossplane
+
+var headersMoreDirectives = map[string][]uint{
+    "more_clear_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf1More,
+    },
+    "more_clear_input_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf1More,
+    },
+    "more_set_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf1More,
+    },
+    "more_set_input_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf1More,
+    },
+}
+
+// MatchHeadersMoreLatest is a MatchFunc for the latest version of headersmore.
+func MatchHeadersMoreLatest(directive string) ([]uint, bool) {
+    m, ok := headersMoreDirectives[directive]
+    return m, ok
+}
diff --git a/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_headersMore_directives.go b/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_headersMore_directives.go
deleted file mode 100644
index d32558dfb9..0000000000
--- a/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_headersMore_directives.go
+++ /dev/null
@@ -1,36 +0,0 @@
-/**
- * Copyright (c) F5, Inc.
- *
- * This source code is licensed under the Apache License, Version 2.0 license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-// All the definitions are extracted from the source code
-// Each bit mask describes these behaviors:
-//   - how many arguments the directive can take
-//   - whether or not it is a block directive
-//   - whether this is a flag (takes one argument that's either "on" or "off")
-//   - which contexts it's allowed to be in
-
-package crossplane
-
-//nolint:gochecknoglobals
-var moduleHeadersMoreDirectives = map[string][]uint{
-	"more_clear_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf1More,
-	},
-	"more_clear_input_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf1More,
-	},
-	"more_set_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf1More,
-	},
-	"more_set_input_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf1More,
-	},
-}
-
-func HeadersMoreDirectivesMatchFn(directive string) ([]uint, bool) {
-	masks, matched := moduleHeadersMoreDirectives[directive]
-	return masks, matched
-}
diff --git a/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_lua_directives.gen.go b/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_lua_directives.gen.go
new file mode 100644
index 0000000000..d30e0b29d1
--- /dev/null
+++ b/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_lua_directives.gen.go
@@ -0,0 +1,262 @@
+/**
+ * Copyright (c) F5, Inc.
+ *
+ * This source code is licensed under the Apache License, Version 2.0 license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+// Code generated by generator; DO NOT EDIT.
+// All the definitions are extracted from the source code
+// Each bit mask describes these behaviors:
+//   - how many arguments the directive can take
+//   - whether or not it is a block directive
+//   - whether this is a flag (takes one argument that's either "on" or "off")
+//   - which contexts it's allowed to be in
+
+package crossplane
+
+var luaDirectives = map[string][]uint{
+    "access_by_lua": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "access_by_lua_block": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "access_by_lua_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "access_by_lua_no_postpone": {
+        ngxHTTPMainConf | ngxConfFlag,
+    },
+    "balancer_by_lua_block": {
+        ngxHTTPUpsConf | ngxConfTake1,
+    },
+    "balancer_by_lua_file": {
+        ngxHTTPUpsConf | ngxConfTake1,
+    },
+    "balancer_keepalive": {
+        ngxHTTPUpsConf | ngxConfTake1,
+    },
+    "body_filter_by_lua": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "body_filter_by_lua_block": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "body_filter_by_lua_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "content_by_lua": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "content_by_lua_block": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "content_by_lua_file": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "exit_worker_by_lua_block": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "exit_worker_by_lua_file": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "header_filter_by_lua": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "header_filter_by_lua_block": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "header_filter_by_lua_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "init_by_lua": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "init_by_lua_block": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "init_by_lua_file": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "init_worker_by_lua": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "init_worker_by_lua_block": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "init_worker_by_lua_file": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "log_by_lua": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "log_by_lua_block": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "log_by_lua_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "lua_capture_error_log": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "lua_check_client_abort": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "lua_code_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "lua_http10_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "lua_load_resty_core": {
+        ngxHTTPMainConf | ngxConfFlag,
+    },
+    "lua_malloc_trim": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "lua_max_pending_timers": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "lua_max_running_timers": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "lua_need_request_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "lua_package_cpath": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "lua_package_path": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "lua_regex_cache_max_entries": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "lua_regex_match_limit": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "lua_sa_restart": {
+        ngxHTTPMainConf | ngxConfFlag,
+    },
+    "lua_shared_dict": {
+        ngxHTTPMainConf | ngxConfTake2,
+    },
+    "lua_socket_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "lua_socket_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "lua_socket_keepalive_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "lua_socket_log_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "lua_socket_pool_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "lua_socket_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "lua_socket_send_lowat": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "lua_socket_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "lua_ssl_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "lua_ssl_certificate_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "lua_ssl_ciphers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "lua_ssl_conf_command": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "lua_ssl_crl": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "lua_ssl_protocols": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "lua_ssl_trusted_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "lua_ssl_verify_depth": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "lua_thread_cache_max_entries": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "lua_transform_underscores_in_response_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "lua_use_default_type": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "lua_worker_thread_vm_pool_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "rewrite_by_lua": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "rewrite_by_lua_block": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "rewrite_by_lua_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "rewrite_by_lua_no_postpone": {
+        ngxHTTPMainConf | ngxConfFlag,
+    },
+    "server_rewrite_by_lua_block": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "server_rewrite_by_lua_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "set_by_lua": {
+        ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf2More,
+    },
+    "set_by_lua_block": {
+        ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake2,
+    },
+    "set_by_lua_file": {
+        ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf2More,
+    },
+    "ssl_certificate_by_lua_block": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_certificate_by_lua_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_client_hello_by_lua_block": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_client_hello_by_lua_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_session_fetch_by_lua_block": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "ssl_session_fetch_by_lua_file": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "ssl_session_store_by_lua_block": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "ssl_session_store_by_lua_file": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+}
+
+// MatchLuaLatest is a MatchFunc for latest version of Lua.
+func MatchLuaLatest(directive string) ([]uint, bool) {
+    m, ok := luaDirectives[directive]
+    return m, ok
+}
diff --git a/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_lua_directives.go b/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_lua_directives.go
deleted file mode 100644
index 5008baaf4c..0000000000
--- a/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_lua_directives.go
+++ /dev/null
@@ -1,261 +0,0 @@
-/**
- * Copyright (c) F5, Inc.
- *
- * This source code is licensed under the Apache License, Version 2.0 license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-// All the definitions are extracted from the source code
-// Each bit mask describes these behaviors:
-//   - how many arguments the directive can take
-//   - whether or not it is a block directive
-//   - whether this is a flag (takes one argument that's either "on" or "off")
-//   - which contexts it's allowed to be in
-
-package crossplane
-
-//nolint:gochecknoglobals
-var moduleLuaDirectives = map[string][]uint{
-	"access_by_lua": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"access_by_lua_block": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"access_by_lua_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"access_by_lua_no_postpone": {
-		ngxHTTPMainConf | ngxConfFlag,
-	},
-	"balancer_by_lua_block": {
-		ngxHTTPUpsConf | ngxConfTake1,
-	},
-	"balancer_by_lua_file": {
-		ngxHTTPUpsConf | ngxConfTake1,
-	},
-	"body_filter_by_lua": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"body_filter_by_lua_block": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"body_filter_by_lua_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"content_by_lua": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"content_by_lua_block": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"content_by_lua_file": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"exit_worker_by_lua_block": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"exit_worker_by_lua_file": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"header_filter_by_lua": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"header_filter_by_lua_block": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"header_filter_by_lua_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"init_by_lua": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"init_by_lua_block": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"init_by_lua_file": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"init_worker_by_lua": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"init_worker_by_lua_block": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"init_worker_by_lua_file": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"log_by_lua": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"log_by_lua_block": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"log_by_lua_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"lua_capture_error_log": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"lua_check_client_abort": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"lua_code_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"lua_fake_shm": {
-		ngxHTTPMainConf | ngxConfTake2,
-	},
-	"lua_http10_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"lua_load_resty_core": {
-		ngxHTTPMainConf | ngxConfFlag,
-	},
-	"lua_malloc_trim": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"lua_max_pending_timers": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"lua_max_running_timers": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"lua_need_request_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"lua_package_cpath": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"lua_package_path": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"lua_regex_cache_max_entries": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"lua_regex_match_limit": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"lua_sa_restart": {
-		ngxHTTPMainConf | ngxConfFlag,
-	},
-	"lua_shared_dict": {
-		ngxHTTPMainConf | ngxConfTake2,
-	},
-	"lua_socket_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"lua_socket_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"lua_socket_keepalive_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"lua_socket_log_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"lua_socket_pool_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"lua_socket_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"lua_socket_send_lowat": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"lua_socket_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"lua_ssl_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"lua_ssl_certificate_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"lua_ssl_ciphers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"lua_ssl_conf_command": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"lua_ssl_crl": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"lua_ssl_protocols": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"lua_ssl_trusted_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"lua_ssl_verify_depth": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"lua_thread_cache_max_entries": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"lua_transform_underscores_in_response_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"lua_use_default_type": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"lua_worker_thread_vm_pool_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"rewrite_by_lua": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"rewrite_by_lua_block": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"rewrite_by_lua_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"rewrite_by_lua_no_postpone": {
-		ngxHTTPMainConf | ngxConfFlag,
-	},
-	"server_rewrite_by_lua_block": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"server_rewrite_by_lua_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"set_by_lua": {
-		ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf2More,
-	},
-	"set_by_lua_block": {
-		ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake2,
-	},
-	"set_by_lua_file": {
-		ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf2More,
-	},
-	"ssl_certificate_by_lua_block": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_certificate_by_lua_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_client_hello_by_lua_block": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_client_hello_by_lua_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_session_fetch_by_lua_block": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"ssl_session_fetch_by_lua_file": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"ssl_session_store_by_lua_block": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"ssl_session_store_by_lua_file": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-}
-
-func LuaDirectivesMatchFn(directive string) ([]uint, bool) {
-	masks, matched := moduleLuaDirectives[directive]
-	return masks, matched
-}
diff --git a/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_map.go b/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_map.go
index 731f3640f2..e0570e4721 100644
--- a/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_map.go
+++ b/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_map.go
@@ -39,6 +39,7 @@ var mapBodies = map[string]mapParameterMasks{
 		defaultMasks: ngxConfTake1,
 	},
 	"geoip2": {
+		specialParameterMasks: map[string]uint{"auto_reload": ngxConfTake1},
 		defaultMasks: ngxConf1More,
 	},
 	"otel_exporter": {
diff --git a/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_njs_directives.gen.go b/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_njs_directives.gen.go
new file mode 100644
index 0000000000..3e0f9e047a
--- /dev/null
+++ b/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_njs_directives.gen.go
@@ -0,0 +1,103 @@
+/**
+ * Copyright (c) F5, Inc.
+ *
+ * This source code is licensed under the Apache License, Version 2.0 license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+// Code generated by generator; DO NOT EDIT.
+// All the definitions are extracted from the source code
+// Each bit mask describes these behaviors:
+//   - how many arguments the directive can take
+//   - whether or not it is a block directive
+//   - whether this is a flag (takes one argument that's either "on" or "off")
+//   - which contexts it's allowed to be in
+
+package crossplane
+
+var njsDirectives = map[string][]uint{
+    "js_access": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "js_body_filter": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConfTake12,
+    },
+    "js_content": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConfTake1,
+    },
+    "js_fetch_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "js_fetch_ciphers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "js_fetch_max_response_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "js_fetch_protocols": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "js_fetch_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "js_fetch_trusted_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "js_fetch_verify": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "js_fetch_verify_depth": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "js_filter": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "js_header_filter": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConfTake1,
+    },
+    "js_import": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake13,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake13,
+    },
+    "js_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "js_periodic": {
+        ngxHTTPLocConf | ngxConfAny,
+        ngxStreamSrvConf | ngxConfAny,
+    },
+    "js_preload_object": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake13,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake13,
+    },
+    "js_preread": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "js_set": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
+    },
+    "js_shared_dict_zone": {
+        ngxHTTPMainConf | ngxConf1More,
+        ngxStreamMainConf | ngxConf1More,
+    },
+    "js_var": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12,
+    },
+}
+
+// MatchNjsLatest is a MatchFunc for the latest version of njs.
+func MatchNjsLatest(directive string) ([]uint, bool) {
+    m, ok := njsDirectives[directive]
+    return m, ok
+}
diff --git a/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_njs_directives.go b/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_njs_directives.go
deleted file mode 100644
index 414aee1cb0..0000000000
--- a/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_njs_directives.go
+++ /dev/null
@@ -1,102 +0,0 @@
-/**
- * Copyright (c) F5, Inc.
- *
- * This source code is licensed under the Apache License, Version 2.0 license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-// All the definitions are extracted from the source code
-// Each bit mask describes these behaviors:
-//   - how many arguments the directive can take
-//   - whether or not it is a block directive
-//   - whether this is a flag (takes one argument that's either "on" or "off")
-//   - which contexts it's allowed to be in
-
-package crossplane
-
-//nolint:gochecknoglobals
-var moduleNjsDirectives = map[string][]uint{
-	"js_access": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"js_body_filter": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConfTake12,
-	},
-	"js_content": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConfTake1,
-	},
-	"js_fetch_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"js_fetch_ciphers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"js_fetch_max_response_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"js_fetch_protocols": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"js_fetch_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"js_fetch_trusted_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"js_fetch_verify": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"js_fetch_verify_depth": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"js_filter": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"js_header_filter": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConfTake1,
-	},
-	"js_import": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake13,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake13,
-	},
-	"js_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"js_periodic": {
-		ngxHTTPLocConf | ngxConfAny,
-		ngxStreamSrvConf | ngxConfAny,
-	},
-	"js_preload_object": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake13,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake13,
-	},
-	"js_preread": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"js_set": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
-	},
-	"js_shared_dict_zone": {
-		ngxHTTPMainConf | ngxConf1More,
-		ngxStreamMainConf | ngxConf1More,
-	},
-	"js_var": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12,
-	},
-}
-
-func NjsDirectivesMatchFn(directive string) ([]uint, bool) {
-	masks, matched := moduleNjsDirectives[directive]
-	return masks, matched
-}
diff --git a/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_nplus_R30_directives.go b/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_nplus_R30_directives.go
index 8ed60cd4f3..e06a42a9e1 100644
--- a/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_nplus_R30_directives.go
+++ b/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_nplus_R30_directives.go
@@ -15,7 +15,7 @@
 package crossplane
 
 //nolint:gochecknoglobals
-var ngxPlusR30Directives = map[string][]uint{
+var nginxPlusR30Directives = map[string][]uint{
 	"absolute_redirect": {
 		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
 	},
@@ -2106,7 +2106,7 @@ var ngxPlusR30Directives = map[string][]uint{
 	},
 }
 
-func NgxPlusR30DirectivesMatchFn(directive string) ([]uint, bool) {
-	masks, matched := ngxPlusR30Directives[directive]
+func MatchNginxPlusR30(directive string) ([]uint, bool) {
+	masks, matched := nginxPlusR30Directives[directive]
 	return masks, matched
 }
diff --git a/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_nplus_R31_directives.go b/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_nplus_R31_directives.go
index 1fa3960e03..13d31ef47e 100644
--- a/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_nplus_R31_directives.go
+++ b/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_nplus_R31_directives.go
@@ -15,7 +15,7 @@
 package crossplane
 
 //nolint:gochecknoglobals
-var ngxPlusR31Directives = map[string][]uint{
+var nginxPlusR31Directives = map[string][]uint{
 	"absolute_redirect": {
 		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
 	},
@@ -2144,7 +2144,7 @@ var ngxPlusR31Directives = map[string][]uint{
 	},
 }
 
-func NgxPlusR31DirectivesMatchFn(directive string) ([]uint, bool) {
-	masks, matched := ngxPlusR31Directives[directive]
+func MatchNginxPlusR31(directive string) ([]uint, bool) {
+	masks, matched := nginxPlusR31Directives[directive]
 	return masks, matched
 }
diff --git a/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_nplus_latest_directives.go b/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_nplus_latest_directives.go
index 66cec3bc0b..7434823698 100644
--- a/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_nplus_latest_directives.go
+++ b/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_nplus_latest_directives.go
@@ -15,7 +15,7 @@
 package crossplane
 
 //nolint:gochecknoglobals
-var ngxPlusLatestDirectives = map[string][]uint{
+var nginxPlusLatestDirectives = map[string][]uint{
 	"absolute_redirect": {
 		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
 	},
@@ -2151,7 +2151,7 @@ var ngxPlusLatestDirectives = map[string][]uint{
 	},
 }
 
-func NgxPlusLatestDirectivesMatchFn(directive string) ([]uint, bool) {
-	masks, matched := ngxPlusLatestDirectives[directive]
+func MatchNginxPlusLatest(directive string) ([]uint, bool) {
+	masks, matched := nginxPlusLatestDirectives[directive]
 	return masks, matched
 }
diff --git a/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_124_directives.gen.go b/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_124_directives.gen.go
new file mode 100644
index 0000000000..2e2b8da4dd
--- /dev/null
+++ b/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_124_directives.gen.go
@@ -0,0 +1,1874 @@
+/**
+ * Copyright (c) F5, Inc.
+ *
+ * This source code is licensed under the Apache License, Version 2.0 license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+// Code generated by generator; DO NOT EDIT.
+// All the definitions are extracted from the source code
+// Each bit mask describes these behaviors:
+//   - how many arguments the directive can take
+//   - whether or not it is a block directive
+//   - whether this is a flag (takes one argument that's either "on" or "off")
+//   - which contexts it's allowed to be in
+
+package crossplane
+
+var oss124Directives = map[string][]uint{
+    "absolute_redirect": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "accept_mutex": {
+        ngxEventConf | ngxConfFlag,
+    },
+    "accept_mutex_delay": {
+        ngxEventConf | ngxConfTake1,
+    },
+    "access_log": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "add_after_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "add_before_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "add_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23,
+    },
+    "add_trailer": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23,
+    },
+    "addition_types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "aio": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "aio_write": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "alias": {
+        ngxHTTPLocConf | ngxConfTake1,
+    },
+    "allow": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ancient_browser": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "ancient_browser_value": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "auth_basic": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
+    },
+    "auth_basic_user_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
+    },
+    "auth_delay": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "auth_http": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "auth_http_header": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake2,
+    },
+    "auth_http_pass_client_cert": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+    },
+    "auth_http_timeout": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "auth_request": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "auth_request_set": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "autoindex": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "autoindex_exact_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "autoindex_format": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "autoindex_localtime": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "break": {
+        ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfNoArgs,
+    },
+    "charset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "charset_map": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfTake2,
+    },
+    "charset_types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "chunked_transfer_encoding": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "client_body_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "client_body_in_file_only": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "client_body_in_single_buffer": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "client_body_temp_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+    },
+    "client_body_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "client_header_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "client_header_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "client_max_body_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "connection_pool_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "create_full_put_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "daemon": {
+        ngxMainConf | ngxDirectConf | ngxConfFlag,
+    },
+    "dav_access": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "dav_methods": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "debug_connection": {
+        ngxEventConf | ngxConfTake1,
+    },
+    "debug_points": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "default_type": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "deny": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "directio": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "directio_alignment": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "disable_symlinks": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "empty_gif": {
+        ngxHTTPLocConf | ngxConfNoArgs,
+    },
+    "env": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "error_log": {
+        ngxMainConf | ngxConf1More,
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "error_page": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf2More,
+    },
+    "etag": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "events": {
+        ngxMainConf | ngxConfBlock | ngxConfNoArgs,
+    },
+    "expires": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake12,
+    },
+    "fastcgi_bind": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "fastcgi_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "fastcgi_busy_buffers_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache_background_update": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_cache_bypass": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_cache_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache_lock": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_cache_lock_age": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache_lock_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache_max_range_offset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache_methods": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_cache_min_uses": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache_path": {
+        ngxHTTPMainConf | ngxConf2More,
+    },
+    "fastcgi_cache_revalidate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_cache_use_stale": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_cache_valid": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_catch_stderr": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_force_ranges": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_hide_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_ignore_client_abort": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_ignore_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_index": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_intercept_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_keep_conn": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_limit_rate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_max_temp_file_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_next_upstream": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_next_upstream_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_next_upstream_tries": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_no_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_param": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23,
+    },
+    "fastcgi_pass": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "fastcgi_pass_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_pass_request_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_pass_request_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_request_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_send_lowat": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_socket_keepalive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_split_path_info": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_store": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_store_access": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "fastcgi_temp_file_write_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_temp_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+    },
+    "flv": {
+        ngxHTTPLocConf | ngxConfNoArgs,
+    },
+    "geo": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfTake12,
+        ngxStreamMainConf | ngxConfBlock | ngxConfTake12,
+    },
+    "geoip_city": {
+        ngxHTTPMainConf | ngxConfTake12,
+        ngxStreamMainConf | ngxConfTake12,
+    },
+    "geoip_country": {
+        ngxHTTPMainConf | ngxConfTake12,
+        ngxStreamMainConf | ngxConfTake12,
+    },
+    "geoip_org": {
+        ngxHTTPMainConf | ngxConfTake12,
+        ngxStreamMainConf | ngxConfTake12,
+    },
+    "geoip_proxy": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "geoip_proxy_recursive": {
+        ngxHTTPMainConf | ngxConfFlag,
+    },
+    "google_perftools_profiles": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "grpc_bind": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "grpc_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_hide_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ignore_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "grpc_intercept_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "grpc_next_upstream": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "grpc_next_upstream_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_next_upstream_tries": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_pass": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "grpc_pass_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_set_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "grpc_socket_keepalive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "grpc_ssl_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_certificate_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_ciphers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_conf_command": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "grpc_ssl_crl": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_password_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_protocols": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "grpc_ssl_server_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "grpc_ssl_session_reuse": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "grpc_ssl_trusted_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_verify": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "grpc_ssl_verify_depth": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "gunzip": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "gunzip_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "gzip": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "gzip_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "gzip_comp_level": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "gzip_disable": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "gzip_http_version": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "gzip_min_length": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "gzip_proxied": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "gzip_static": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "gzip_types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "gzip_vary": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "hash": {
+        ngxHTTPUpsConf | ngxConfTake12,
+        ngxStreamUpsConf | ngxConfTake12,
+    },
+    "http": {
+        ngxMainConf | ngxConfBlock | ngxConfNoArgs,
+    },
+    "http2_body_preread_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_chunk_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "http2_idle_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_max_concurrent_pushes": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_max_concurrent_streams": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_max_field_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_max_header_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_max_requests": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_push": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "http2_push_preload": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "http2_recv_buffer_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "http2_recv_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "if": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfExpr | ngxConf1More,
+    },
+    "if_modified_since": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "ignore_invalid_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "image_filter": {
+        ngxHTTPLocConf | ngxConfTake123,
+    },
+    "image_filter_buffer": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "image_filter_interlace": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "image_filter_jpeg_quality": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "image_filter_sharpen": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "image_filter_transparency": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "image_filter_webp_quality": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "imap_auth": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+    },
+    "imap_capabilities": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+    },
+    "imap_client_buffer": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "include": {
+        ngxAnyConf | ngxConfTake1,
+    },
+    "index": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "internal": {
+        ngxHTTPLocConf | ngxConfNoArgs,
+    },
+    "ip_hash": {
+        ngxHTTPUpsConf | ngxConfNoArgs,
+    },
+    "keepalive": {
+        ngxHTTPUpsConf | ngxConfTake1,
+    },
+    "keepalive_disable": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "keepalive_requests": {
+        ngxHTTPUpsConf | ngxConfTake1,
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "keepalive_time": {
+        ngxHTTPUpsConf | ngxConfTake1,
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "keepalive_timeout": {
+        ngxHTTPUpsConf | ngxConfTake1,
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "large_client_header_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake2,
+    },
+    "least_conn": {
+        ngxHTTPUpsConf | ngxConfNoArgs,
+        ngxStreamUpsConf | ngxConfNoArgs,
+    },
+    "limit_conn": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
+    },
+    "limit_conn_dry_run": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "limit_conn_log_level": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "limit_conn_status": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "limit_conn_zone": {
+        ngxHTTPMainConf | ngxConfTake2,
+        ngxStreamMainConf | ngxConfTake2,
+    },
+    "limit_except": {
+        ngxHTTPLocConf | ngxConfBlock | ngxConf1More,
+    },
+    "limit_rate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "limit_rate_after": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "limit_req": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "limit_req_dry_run": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "limit_req_log_level": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "limit_req_status": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "limit_req_zone": {
+        ngxHTTPMainConf | ngxConfTake3,
+    },
+    "lingering_close": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "lingering_time": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "lingering_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "listen": {
+        ngxHTTPSrvConf | ngxConf1More,
+        ngxMailSrvConf | ngxConf1More,
+        ngxStreamSrvConf | ngxConf1More,
+    },
+    "load_module": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "location": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfTake12,
+    },
+    "lock_file": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "log_format": {
+        ngxHTTPMainConf | ngxConf2More,
+        ngxStreamMainConf | ngxConf2More,
+    },
+    "log_not_found": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "log_subrequest": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "mail": {
+        ngxMainConf | ngxConfBlock | ngxConfNoArgs,
+    },
+    "map": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfTake2,
+        ngxStreamMainConf | ngxConfBlock | ngxConfTake2,
+    },
+    "map_hash_bucket_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+        ngxStreamMainConf | ngxConfTake1,
+    },
+    "map_hash_max_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+        ngxStreamMainConf | ngxConfTake1,
+    },
+    "master_process": {
+        ngxMainConf | ngxDirectConf | ngxConfFlag,
+    },
+    "max_errors": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "max_ranges": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_bind": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "memcached_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_gzip_flag": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_next_upstream": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "memcached_next_upstream_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_next_upstream_tries": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_pass": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "memcached_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_socket_keepalive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "merge_slashes": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "min_delete_depth": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "mirror": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "mirror_request_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "modern_browser": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "modern_browser_value": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "mp4": {
+        ngxHTTPLocConf | ngxConfNoArgs,
+    },
+    "mp4_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "mp4_max_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "mp4_start_key_frame": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "msie_padding": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "msie_refresh": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "multi_accept": {
+        ngxEventConf | ngxConfFlag,
+    },
+    "open_file_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "open_file_cache_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "open_file_cache_min_uses": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "open_file_cache_valid": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "open_log_file_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1234,
+    },
+    "output_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "override_charset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "pcre_jit": {
+        ngxMainConf | ngxDirectConf | ngxConfFlag,
+    },
+    "perl": {
+        ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
+    },
+    "perl_modules": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "perl_require": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "perl_set": {
+        ngxHTTPMainConf | ngxConfTake2,
+    },
+    "pid": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "pop3_auth": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+    },
+    "pop3_capabilities": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+    },
+    "port_in_redirect": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "postpone_output": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "preread_buffer_size": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "preread_timeout": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "protocol": {
+        ngxMailSrvConf | ngxConfTake1,
+    },
+    "proxy_bind": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12,
+    },
+    "proxy_buffer": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "proxy_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "proxy_busy_buffers_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache_background_update": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_cache_bypass": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "proxy_cache_convert_head": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_cache_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache_lock": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_cache_lock_age": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache_lock_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache_max_range_offset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache_methods": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "proxy_cache_min_uses": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache_path": {
+        ngxHTTPMainConf | ngxConf2More,
+    },
+    "proxy_cache_revalidate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_cache_use_stale": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "proxy_cache_valid": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "proxy_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_cookie_domain": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "proxy_cookie_flags": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+    },
+    "proxy_cookie_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "proxy_download_rate": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_force_ranges": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_half_close": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_headers_hash_bucket_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_headers_hash_max_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_hide_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_http_version": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_ignore_client_abort": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_ignore_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "proxy_intercept_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_limit_rate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_max_temp_file_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_method": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_next_upstream": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_next_upstream_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_next_upstream_tries": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_no_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "proxy_pass": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConfTake1,
+        ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_pass_error_message": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+    },
+    "proxy_pass_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_pass_request_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_pass_request_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_protocol": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_protocol_timeout": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_redirect": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "proxy_request_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_requests": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_responses": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_send_lowat": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_set_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_set_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "proxy_smtp_auth": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+    },
+    "proxy_socket_keepalive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_ssl": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_ssl_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_certificate_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_ciphers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_conf_command": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
+    },
+    "proxy_ssl_crl": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_password_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_protocols": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "proxy_ssl_server_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_ssl_session_reuse": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_ssl_trusted_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_verify": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_ssl_verify_depth": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_store": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_store_access": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "proxy_temp_file_write_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_temp_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+    },
+    "proxy_timeout": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_upload_rate": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "random": {
+        ngxHTTPUpsConf | ngxConfNoArgs | ngxConfTake12,
+        ngxStreamUpsConf | ngxConfNoArgs | ngxConfTake12,
+    },
+    "random_index": {
+        ngxHTTPLocConf | ngxConfFlag,
+    },
+    "read_ahead": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "real_ip_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "real_ip_recursive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "recursive_error_pages": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "referer_hash_bucket_size": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "referer_hash_max_size": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "request_pool_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "reset_timedout_connection": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "resolver": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "resolver_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "return": {
+        ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake12,
+        ngxStreamSrvConf | ngxConfTake1,
+    },
+    "rewrite": {
+        ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23,
+    },
+    "rewrite_log": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "root": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "satisfy": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_bind": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "scgi_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "scgi_busy_buffers_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache_background_update": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_cache_bypass": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_cache_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache_lock": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_cache_lock_age": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache_lock_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache_max_range_offset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache_methods": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_cache_min_uses": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache_path": {
+        ngxHTTPMainConf | ngxConf2More,
+    },
+    "scgi_cache_revalidate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_cache_use_stale": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_cache_valid": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_force_ranges": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_hide_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_ignore_client_abort": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_ignore_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_intercept_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_limit_rate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_max_temp_file_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_next_upstream": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_next_upstream_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_next_upstream_tries": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_no_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_param": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23,
+    },
+    "scgi_pass": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "scgi_pass_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_pass_request_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_pass_request_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_request_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_socket_keepalive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_store": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_store_access": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "scgi_temp_file_write_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_temp_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+    },
+    "secure_link": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "secure_link_md5": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "secure_link_secret": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "send_lowat": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "sendfile": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "sendfile_max_chunk": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "server": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfNoArgs,
+        ngxHTTPUpsConf | ngxConf1More,
+        ngxMailMainConf | ngxConfBlock | ngxConfNoArgs,
+        ngxStreamMainConf | ngxConfBlock | ngxConfNoArgs,
+        ngxStreamUpsConf | ngxConf1More,
+    },
+    "server_name": {
+        ngxHTTPSrvConf | ngxConf1More,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "server_name_in_redirect": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "server_names_hash_bucket_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "server_names_hash_max_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "server_tokens": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "set": {
+        ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake2,
+        ngxStreamSrvConf | ngxConfTake2,
+    },
+    "set_real_ip_from": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "slice": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "smtp_auth": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+    },
+    "smtp_capabilities": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+    },
+    "smtp_client_buffer": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "smtp_greeting_delay": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "source_charset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "split_clients": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfTake2,
+        ngxStreamMainConf | ngxConfBlock | ngxConfTake2,
+    },
+    "ssi": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "ssi_last_modified": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "ssi_min_file_chunk": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "ssi_silent_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "ssi_types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "ssi_value_length": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "ssl": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+    },
+    "ssl_alpn": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "ssl_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_certificate_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_ciphers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_client_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_conf_command": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake2,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake2,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
+    },
+    "ssl_crl": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_dhparam": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_early_data": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "ssl_ecdh_curve": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_engine": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "ssl_handshake_timeout": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_ocsp": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "ssl_ocsp_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_ocsp_responder": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_password_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_prefer_server_ciphers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "ssl_preread": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "ssl_protocols": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConf1More,
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "ssl_reject_handshake": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "ssl_session_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake12,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake12,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12,
+    },
+    "ssl_session_ticket_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_session_tickets": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "ssl_session_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_stapling": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "ssl_stapling_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_stapling_responder": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_stapling_verify": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "ssl_trusted_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_verify_client": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_verify_depth": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "starttls": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "stream": {
+        ngxMainConf | ngxConfBlock | ngxConfNoArgs,
+    },
+    "stub_status": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfNoArgs | ngxConfTake1,
+    },
+    "sub_filter": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "sub_filter_last_modified": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "sub_filter_once": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "sub_filter_types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "subrequest_output_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "tcp_nodelay": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "tcp_nopush": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "thread_pool": {
+        ngxMainConf | ngxDirectConf | ngxConfTake23,
+    },
+    "timeout": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "timer_resolution": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "try_files": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf2More,
+    },
+    "types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfNoArgs,
+    },
+    "types_hash_bucket_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "types_hash_max_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "underscores_in_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "uninitialized_variable_warn": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "upstream": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfTake1,
+        ngxStreamMainConf | ngxConfBlock | ngxConfTake1,
+    },
+    "use": {
+        ngxEventConf | ngxConfTake1,
+    },
+    "user": {
+        ngxMainConf | ngxDirectConf | ngxConfTake12,
+    },
+    "userid": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_domain": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_expires": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_flags": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "userid_mark": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_p3p": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_service": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_bind": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "uwsgi_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "uwsgi_busy_buffers_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_background_update": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_bypass": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_cache_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_lock": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_cache_lock_age": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_lock_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_max_range_offset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_methods": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_cache_min_uses": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_path": {
+        ngxHTTPMainConf | ngxConf2More,
+    },
+    "uwsgi_cache_revalidate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_cache_use_stale": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_cache_valid": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_force_ranges": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_hide_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ignore_client_abort": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_ignore_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_intercept_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_limit_rate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_max_temp_file_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_modifier1": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_modifier2": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_next_upstream": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_next_upstream_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_next_upstream_tries": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_no_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_param": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23,
+    },
+    "uwsgi_pass": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "uwsgi_pass_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_pass_request_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_pass_request_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_request_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_socket_keepalive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_ssl_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_certificate_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_ciphers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_conf_command": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "uwsgi_ssl_crl": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_password_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_protocols": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_ssl_server_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_ssl_session_reuse": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_ssl_trusted_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_verify": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_ssl_verify_depth": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_store": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_store_access": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "uwsgi_temp_file_write_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_temp_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+    },
+    "valid_referers": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "variables_hash_bucket_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+        ngxStreamMainConf | ngxConfTake1,
+    },
+    "variables_hash_max_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+        ngxStreamMainConf | ngxConfTake1,
+    },
+    "worker_aio_requests": {
+        ngxEventConf | ngxConfTake1,
+    },
+    "worker_connections": {
+        ngxEventConf | ngxConfTake1,
+    },
+    "worker_cpu_affinity": {
+        ngxMainConf | ngxDirectConf | ngxConf1More,
+    },
+    "worker_priority": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "worker_processes": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "worker_rlimit_core": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "worker_rlimit_nofile": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "worker_shutdown_timeout": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "working_directory": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "xclient": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+    },
+    "xml_entities": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "xslt_last_modified": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "xslt_param": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "xslt_string_param": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "xslt_stylesheet": {
+        ngxHTTPLocConf | ngxConf1More,
+    },
+    "xslt_types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "zone": {
+        ngxHTTPUpsConf | ngxConfTake12,
+        ngxStreamUpsConf | ngxConfTake12,
+    },
+}
+
+// MatchOss124 contains directives in OSS 1.2.4 source code(including GEOIP, Perl, and XSLT)
+func MatchOss124(directive string) ([]uint, bool) {
+    m, ok := oss124Directives[directive]
+    return m, ok
+}
diff --git a/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_124_directives.go b/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_124_directives.go
deleted file mode 100644
index 10808c90b4..0000000000
--- a/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_124_directives.go
+++ /dev/null
@@ -1,1873 +0,0 @@
-/**
- * Copyright (c) F5, Inc.
- *
- * This source code is licensed under the Apache License, Version 2.0 license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-// All the definitions are extracted from the source code
-// Each bit mask describes these behaviors:
-//   - how many arguments the directive can take
-//   - whether or not it is a block directive
-//   - whether this is a flag (takes one argument that's either "on" or "off")
-//   - which contexts it's allowed to be in
-
-package crossplane
-
-//nolint:gochecknoglobals
-var ngxOss124Directives = map[string][]uint{
-	"absolute_redirect": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"accept_mutex": {
-		ngxEventConf | ngxConfFlag,
-	},
-	"accept_mutex_delay": {
-		ngxEventConf | ngxConfTake1,
-	},
-	"access_log": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"add_after_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"add_before_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"add_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23,
-	},
-	"add_trailer": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23,
-	},
-	"addition_types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"aio": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"aio_write": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"alias": {
-		ngxHTTPLocConf | ngxConfTake1,
-	},
-	"allow": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ancient_browser": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"ancient_browser_value": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"auth_basic": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
-	},
-	"auth_basic_user_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
-	},
-	"auth_delay": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"auth_http": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"auth_http_header": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake2,
-	},
-	"auth_http_pass_client_cert": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-	},
-	"auth_http_timeout": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"auth_request": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"auth_request_set": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"autoindex": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"autoindex_exact_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"autoindex_format": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"autoindex_localtime": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"break": {
-		ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfNoArgs,
-	},
-	"charset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"charset_map": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfTake2,
-	},
-	"charset_types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"chunked_transfer_encoding": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"client_body_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"client_body_in_file_only": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"client_body_in_single_buffer": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"client_body_temp_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-	},
-	"client_body_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"client_header_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"client_header_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"client_max_body_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"connection_pool_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"create_full_put_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"daemon": {
-		ngxMainConf | ngxDirectConf | ngxConfFlag,
-	},
-	"dav_access": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"dav_methods": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"debug_connection": {
-		ngxEventConf | ngxConfTake1,
-	},
-	"debug_points": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"default_type": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"deny": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"directio": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"directio_alignment": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"disable_symlinks": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"empty_gif": {
-		ngxHTTPLocConf | ngxConfNoArgs,
-	},
-	"env": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"error_log": {
-		ngxMainConf | ngxConf1More,
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"error_page": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf2More,
-	},
-	"etag": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"events": {
-		ngxMainConf | ngxConfBlock | ngxConfNoArgs,
-	},
-	"expires": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake12,
-	},
-	"fastcgi_bind": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"fastcgi_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"fastcgi_busy_buffers_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache_background_update": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_cache_bypass": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_cache_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache_lock": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_cache_lock_age": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache_lock_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache_max_range_offset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache_methods": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_cache_min_uses": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache_path": {
-		ngxHTTPMainConf | ngxConf2More,
-	},
-	"fastcgi_cache_revalidate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_cache_use_stale": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_cache_valid": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_catch_stderr": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_force_ranges": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_hide_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_ignore_client_abort": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_ignore_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_index": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_intercept_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_keep_conn": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_limit_rate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_max_temp_file_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_next_upstream": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_next_upstream_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_next_upstream_tries": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_no_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_param": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23,
-	},
-	"fastcgi_pass": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"fastcgi_pass_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_pass_request_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_pass_request_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_request_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_send_lowat": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_socket_keepalive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_split_path_info": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_store": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_store_access": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"fastcgi_temp_file_write_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_temp_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-	},
-	"flv": {
-		ngxHTTPLocConf | ngxConfNoArgs,
-	},
-	"geo": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfTake12,
-		ngxStreamMainConf | ngxConfBlock | ngxConfTake12,
-	},
-	"geoip_city": {
-		ngxHTTPMainConf | ngxConfTake12,
-		ngxStreamMainConf | ngxConfTake12,
-	},
-	"geoip_country": {
-		ngxHTTPMainConf | ngxConfTake12,
-		ngxStreamMainConf | ngxConfTake12,
-	},
-	"geoip_org": {
-		ngxHTTPMainConf | ngxConfTake12,
-		ngxStreamMainConf | ngxConfTake12,
-	},
-	"geoip_proxy": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"geoip_proxy_recursive": {
-		ngxHTTPMainConf | ngxConfFlag,
-	},
-	"google_perftools_profiles": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"grpc_bind": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"grpc_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_hide_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ignore_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"grpc_intercept_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"grpc_next_upstream": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"grpc_next_upstream_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_next_upstream_tries": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_pass": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"grpc_pass_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_set_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"grpc_socket_keepalive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"grpc_ssl_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_certificate_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_ciphers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_conf_command": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"grpc_ssl_crl": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_password_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_protocols": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"grpc_ssl_server_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"grpc_ssl_session_reuse": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"grpc_ssl_trusted_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_verify": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"grpc_ssl_verify_depth": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"gunzip": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"gunzip_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"gzip": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"gzip_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"gzip_comp_level": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"gzip_disable": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"gzip_http_version": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"gzip_min_length": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"gzip_proxied": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"gzip_static": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"gzip_types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"gzip_vary": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"hash": {
-		ngxHTTPUpsConf | ngxConfTake12,
-		ngxStreamUpsConf | ngxConfTake12,
-	},
-	"http": {
-		ngxMainConf | ngxConfBlock | ngxConfNoArgs,
-	},
-	"http2_body_preread_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_chunk_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"http2_idle_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_max_concurrent_pushes": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_max_concurrent_streams": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_max_field_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_max_header_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_max_requests": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_push": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"http2_push_preload": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"http2_recv_buffer_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"http2_recv_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"if": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfExpr | ngxConf1More,
-	},
-	"if_modified_since": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"ignore_invalid_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"image_filter": {
-		ngxHTTPLocConf | ngxConfTake123,
-	},
-	"image_filter_buffer": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"image_filter_interlace": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"image_filter_jpeg_quality": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"image_filter_sharpen": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"image_filter_transparency": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"image_filter_webp_quality": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"imap_auth": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-	},
-	"imap_capabilities": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-	},
-	"imap_client_buffer": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"include": {
-		ngxAnyConf | ngxConfTake1,
-	},
-	"index": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"internal": {
-		ngxHTTPLocConf | ngxConfNoArgs,
-	},
-	"ip_hash": {
-		ngxHTTPUpsConf | ngxConfNoArgs,
-	},
-	"keepalive": {
-		ngxHTTPUpsConf | ngxConfTake1,
-	},
-	"keepalive_disable": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"keepalive_requests": {
-		ngxHTTPUpsConf | ngxConfTake1,
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"keepalive_time": {
-		ngxHTTPUpsConf | ngxConfTake1,
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"keepalive_timeout": {
-		ngxHTTPUpsConf | ngxConfTake1,
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"large_client_header_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake2,
-	},
-	"least_conn": {
-		ngxHTTPUpsConf | ngxConfNoArgs,
-		ngxStreamUpsConf | ngxConfNoArgs,
-	},
-	"limit_conn": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
-	},
-	"limit_conn_dry_run": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"limit_conn_log_level": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"limit_conn_status": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"limit_conn_zone": {
-		ngxHTTPMainConf | ngxConfTake2,
-		ngxStreamMainConf | ngxConfTake2,
-	},
-	"limit_except": {
-		ngxHTTPLocConf | ngxConfBlock | ngxConf1More,
-	},
-	"limit_rate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"limit_rate_after": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"limit_req": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"limit_req_dry_run": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"limit_req_log_level": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"limit_req_status": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"limit_req_zone": {
-		ngxHTTPMainConf | ngxConfTake3,
-	},
-	"lingering_close": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"lingering_time": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"lingering_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"listen": {
-		ngxHTTPSrvConf | ngxConf1More,
-		ngxMailSrvConf | ngxConf1More,
-		ngxStreamSrvConf | ngxConf1More,
-	},
-	"load_module": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"location": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfTake12,
-	},
-	"lock_file": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"log_format": {
-		ngxHTTPMainConf | ngxConf2More,
-		ngxStreamMainConf | ngxConf2More,
-	},
-	"log_not_found": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"log_subrequest": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"mail": {
-		ngxMainConf | ngxConfBlock | ngxConfNoArgs,
-	},
-	"map": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfTake2,
-		ngxStreamMainConf | ngxConfBlock | ngxConfTake2,
-	},
-	"map_hash_bucket_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-		ngxStreamMainConf | ngxConfTake1,
-	},
-	"map_hash_max_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-		ngxStreamMainConf | ngxConfTake1,
-	},
-	"master_process": {
-		ngxMainConf | ngxDirectConf | ngxConfFlag,
-	},
-	"max_errors": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"max_ranges": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_bind": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"memcached_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_gzip_flag": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_next_upstream": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"memcached_next_upstream_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_next_upstream_tries": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_pass": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"memcached_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_socket_keepalive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"merge_slashes": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"min_delete_depth": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"mirror": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"mirror_request_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"modern_browser": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"modern_browser_value": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"mp4": {
-		ngxHTTPLocConf | ngxConfNoArgs,
-	},
-	"mp4_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"mp4_max_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"mp4_start_key_frame": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"msie_padding": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"msie_refresh": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"multi_accept": {
-		ngxEventConf | ngxConfFlag,
-	},
-	"open_file_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"open_file_cache_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"open_file_cache_min_uses": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"open_file_cache_valid": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"open_log_file_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1234,
-	},
-	"output_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"override_charset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"pcre_jit": {
-		ngxMainConf | ngxDirectConf | ngxConfFlag,
-	},
-	"perl": {
-		ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
-	},
-	"perl_modules": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"perl_require": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"perl_set": {
-		ngxHTTPMainConf | ngxConfTake2,
-	},
-	"pid": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"pop3_auth": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-	},
-	"pop3_capabilities": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-	},
-	"port_in_redirect": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"postpone_output": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"preread_buffer_size": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"preread_timeout": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"protocol": {
-		ngxMailSrvConf | ngxConfTake1,
-	},
-	"proxy_bind": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12,
-	},
-	"proxy_buffer": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"proxy_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"proxy_busy_buffers_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache_background_update": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_cache_bypass": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"proxy_cache_convert_head": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_cache_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache_lock": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_cache_lock_age": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache_lock_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache_max_range_offset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache_methods": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"proxy_cache_min_uses": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache_path": {
-		ngxHTTPMainConf | ngxConf2More,
-	},
-	"proxy_cache_revalidate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_cache_use_stale": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"proxy_cache_valid": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"proxy_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_cookie_domain": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"proxy_cookie_flags": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-	},
-	"proxy_cookie_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"proxy_download_rate": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_force_ranges": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_half_close": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_headers_hash_bucket_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_headers_hash_max_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_hide_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_http_version": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_ignore_client_abort": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_ignore_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"proxy_intercept_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_limit_rate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_max_temp_file_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_method": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_next_upstream": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_next_upstream_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_next_upstream_tries": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_no_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"proxy_pass": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConfTake1,
-		ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_pass_error_message": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-	},
-	"proxy_pass_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_pass_request_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_pass_request_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_protocol": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_protocol_timeout": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_redirect": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"proxy_request_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_requests": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_responses": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_send_lowat": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_set_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_set_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"proxy_smtp_auth": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-	},
-	"proxy_socket_keepalive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_ssl": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_ssl_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_certificate_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_ciphers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_conf_command": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
-	},
-	"proxy_ssl_crl": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_password_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_protocols": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"proxy_ssl_server_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_ssl_session_reuse": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_ssl_trusted_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_verify": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_ssl_verify_depth": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_store": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_store_access": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"proxy_temp_file_write_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_temp_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-	},
-	"proxy_timeout": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_upload_rate": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"random": {
-		ngxHTTPUpsConf | ngxConfNoArgs | ngxConfTake12,
-		ngxStreamUpsConf | ngxConfNoArgs | ngxConfTake12,
-	},
-	"random_index": {
-		ngxHTTPLocConf | ngxConfFlag,
-	},
-	"read_ahead": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"real_ip_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"real_ip_recursive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"recursive_error_pages": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"referer_hash_bucket_size": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"referer_hash_max_size": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"request_pool_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"reset_timedout_connection": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"resolver": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"resolver_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"return": {
-		ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake12,
-		ngxStreamSrvConf | ngxConfTake1,
-	},
-	"rewrite": {
-		ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23,
-	},
-	"rewrite_log": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"root": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"satisfy": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_bind": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"scgi_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"scgi_busy_buffers_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache_background_update": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_cache_bypass": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_cache_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache_lock": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_cache_lock_age": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache_lock_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache_max_range_offset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache_methods": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_cache_min_uses": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache_path": {
-		ngxHTTPMainConf | ngxConf2More,
-	},
-	"scgi_cache_revalidate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_cache_use_stale": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_cache_valid": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_force_ranges": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_hide_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_ignore_client_abort": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_ignore_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_intercept_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_limit_rate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_max_temp_file_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_next_upstream": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_next_upstream_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_next_upstream_tries": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_no_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_param": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23,
-	},
-	"scgi_pass": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"scgi_pass_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_pass_request_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_pass_request_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_request_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_socket_keepalive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_store": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_store_access": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"scgi_temp_file_write_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_temp_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-	},
-	"secure_link": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"secure_link_md5": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"secure_link_secret": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"send_lowat": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"sendfile": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"sendfile_max_chunk": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"server": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfNoArgs,
-		ngxHTTPUpsConf | ngxConf1More,
-		ngxMailMainConf | ngxConfBlock | ngxConfNoArgs,
-		ngxStreamMainConf | ngxConfBlock | ngxConfNoArgs,
-		ngxStreamUpsConf | ngxConf1More,
-	},
-	"server_name": {
-		ngxHTTPSrvConf | ngxConf1More,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"server_name_in_redirect": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"server_names_hash_bucket_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"server_names_hash_max_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"server_tokens": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"set": {
-		ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake2,
-		ngxStreamSrvConf | ngxConfTake2,
-	},
-	"set_real_ip_from": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"slice": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"smtp_auth": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-	},
-	"smtp_capabilities": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-	},
-	"smtp_client_buffer": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"smtp_greeting_delay": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"source_charset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"split_clients": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfTake2,
-		ngxStreamMainConf | ngxConfBlock | ngxConfTake2,
-	},
-	"ssi": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"ssi_last_modified": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"ssi_min_file_chunk": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"ssi_silent_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"ssi_types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"ssi_value_length": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"ssl": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-	},
-	"ssl_alpn": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"ssl_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_certificate_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_ciphers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_client_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_conf_command": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake2,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake2,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
-	},
-	"ssl_crl": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_dhparam": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_early_data": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"ssl_ecdh_curve": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_engine": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"ssl_handshake_timeout": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_ocsp": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"ssl_ocsp_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_ocsp_responder": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_password_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_prefer_server_ciphers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"ssl_preread": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"ssl_protocols": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConf1More,
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"ssl_reject_handshake": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"ssl_session_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake12,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake12,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12,
-	},
-	"ssl_session_ticket_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_session_tickets": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"ssl_session_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_stapling": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"ssl_stapling_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_stapling_responder": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_stapling_verify": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"ssl_trusted_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_verify_client": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_verify_depth": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"starttls": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"stream": {
-		ngxMainConf | ngxConfBlock | ngxConfNoArgs,
-	},
-	"stub_status": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfNoArgs | ngxConfTake1,
-	},
-	"sub_filter": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"sub_filter_last_modified": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"sub_filter_once": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"sub_filter_types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"subrequest_output_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"tcp_nodelay": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"tcp_nopush": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"thread_pool": {
-		ngxMainConf | ngxDirectConf | ngxConfTake23,
-	},
-	"timeout": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"timer_resolution": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"try_files": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf2More,
-	},
-	"types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfNoArgs,
-	},
-	"types_hash_bucket_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"types_hash_max_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"underscores_in_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"uninitialized_variable_warn": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"upstream": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfTake1,
-		ngxStreamMainConf | ngxConfBlock | ngxConfTake1,
-	},
-	"use": {
-		ngxEventConf | ngxConfTake1,
-	},
-	"user": {
-		ngxMainConf | ngxDirectConf | ngxConfTake12,
-	},
-	"userid": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_domain": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_expires": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_flags": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"userid_mark": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_p3p": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_service": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_bind": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"uwsgi_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"uwsgi_busy_buffers_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_background_update": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_bypass": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_cache_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_lock": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_cache_lock_age": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_lock_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_max_range_offset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_methods": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_cache_min_uses": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_path": {
-		ngxHTTPMainConf | ngxConf2More,
-	},
-	"uwsgi_cache_revalidate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_cache_use_stale": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_cache_valid": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_force_ranges": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_hide_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ignore_client_abort": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_ignore_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_intercept_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_limit_rate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_max_temp_file_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_modifier1": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_modifier2": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_next_upstream": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_next_upstream_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_next_upstream_tries": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_no_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_param": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23,
-	},
-	"uwsgi_pass": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"uwsgi_pass_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_pass_request_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_pass_request_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_request_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_socket_keepalive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_ssl_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_certificate_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_ciphers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_conf_command": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"uwsgi_ssl_crl": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_password_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_protocols": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_ssl_server_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_ssl_session_reuse": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_ssl_trusted_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_verify": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_ssl_verify_depth": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_store": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_store_access": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"uwsgi_temp_file_write_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_temp_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-	},
-	"valid_referers": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"variables_hash_bucket_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-		ngxStreamMainConf | ngxConfTake1,
-	},
-	"variables_hash_max_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-		ngxStreamMainConf | ngxConfTake1,
-	},
-	"worker_aio_requests": {
-		ngxEventConf | ngxConfTake1,
-	},
-	"worker_connections": {
-		ngxEventConf | ngxConfTake1,
-	},
-	"worker_cpu_affinity": {
-		ngxMainConf | ngxDirectConf | ngxConf1More,
-	},
-	"worker_priority": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"worker_processes": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"worker_rlimit_core": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"worker_rlimit_nofile": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"worker_shutdown_timeout": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"working_directory": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"xclient": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-	},
-	"xml_entities": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"xslt_last_modified": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"xslt_param": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"xslt_string_param": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"xslt_stylesheet": {
-		ngxHTTPLocConf | ngxConf1More,
-	},
-	"xslt_types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"zone": {
-		ngxHTTPUpsConf | ngxConfTake12,
-		ngxStreamUpsConf | ngxConfTake12,
-	},
-}
-
-func Oss124DirectivesMatchFn(directive string) ([]uint, bool) {
-	masks, matched := ngxOss124Directives[directive]
-	return masks, matched
-}
diff --git a/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_126_directives.gen.go b/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_126_directives.gen.go
new file mode 100644
index 0000000000..1fb0ee8cf1
--- /dev/null
+++ b/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_126_directives.gen.go
@@ -0,0 +1,1907 @@
+/**
+ * Copyright (c) F5, Inc.
+ *
+ * This source code is licensed under the Apache License, Version 2.0 license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+// Code generated by generator; DO NOT EDIT.
+// All the definitions are extracted from the source code
+// Each bit mask describes these behaviors:
+//   - how many arguments the directive can take
+//   - whether or not it is a block directive
+//   - whether this is a flag (takes one argument that's either "on" or "off")
+//   - which contexts it's allowed to be in
+
+package crossplane
+
+var oss126Directives = map[string][]uint{
+    "absolute_redirect": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "accept_mutex": {
+        ngxEventConf | ngxConfFlag,
+    },
+    "accept_mutex_delay": {
+        ngxEventConf | ngxConfTake1,
+    },
+    "access_log": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "add_after_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "add_before_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "add_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23,
+    },
+    "add_trailer": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23,
+    },
+    "addition_types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "aio": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "aio_write": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "alias": {
+        ngxHTTPLocConf | ngxConfTake1,
+    },
+    "allow": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ancient_browser": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "ancient_browser_value": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "auth_basic": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
+    },
+    "auth_basic_user_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
+    },
+    "auth_delay": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "auth_http": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "auth_http_header": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake2,
+    },
+    "auth_http_pass_client_cert": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+    },
+    "auth_http_timeout": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "auth_request": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "auth_request_set": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "autoindex": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "autoindex_exact_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "autoindex_format": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "autoindex_localtime": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "break": {
+        ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfNoArgs,
+    },
+    "charset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "charset_map": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfTake2,
+    },
+    "charset_types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "chunked_transfer_encoding": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "client_body_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "client_body_in_file_only": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "client_body_in_single_buffer": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "client_body_temp_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+    },
+    "client_body_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "client_header_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "client_header_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "client_max_body_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "connection_pool_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "create_full_put_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "daemon": {
+        ngxMainConf | ngxDirectConf | ngxConfFlag,
+    },
+    "dav_access": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "dav_methods": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "debug_connection": {
+        ngxEventConf | ngxConfTake1,
+    },
+    "debug_points": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "default_type": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "deny": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "directio": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "directio_alignment": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "disable_symlinks": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "empty_gif": {
+        ngxHTTPLocConf | ngxConfNoArgs,
+    },
+    "env": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "error_log": {
+        ngxMainConf | ngxConf1More,
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "error_page": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf2More,
+    },
+    "etag": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "events": {
+        ngxMainConf | ngxConfBlock | ngxConfNoArgs,
+    },
+    "expires": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake12,
+    },
+    "fastcgi_bind": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "fastcgi_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "fastcgi_busy_buffers_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache_background_update": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_cache_bypass": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_cache_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache_lock": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_cache_lock_age": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache_lock_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache_max_range_offset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache_methods": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_cache_min_uses": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache_path": {
+        ngxHTTPMainConf | ngxConf2More,
+    },
+    "fastcgi_cache_revalidate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_cache_use_stale": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_cache_valid": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_catch_stderr": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_force_ranges": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_hide_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_ignore_client_abort": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_ignore_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_index": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_intercept_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_keep_conn": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_limit_rate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_max_temp_file_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_next_upstream": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_next_upstream_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_next_upstream_tries": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_no_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_param": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23,
+    },
+    "fastcgi_pass": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "fastcgi_pass_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_pass_request_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_pass_request_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_request_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_send_lowat": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_socket_keepalive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_split_path_info": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_store": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_store_access": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "fastcgi_temp_file_write_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_temp_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+    },
+    "flv": {
+        ngxHTTPLocConf | ngxConfNoArgs,
+    },
+    "geo": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfTake12,
+        ngxStreamMainConf | ngxConfBlock | ngxConfTake12,
+    },
+    "geoip_city": {
+        ngxHTTPMainConf | ngxConfTake12,
+        ngxStreamMainConf | ngxConfTake12,
+    },
+    "geoip_country": {
+        ngxHTTPMainConf | ngxConfTake12,
+        ngxStreamMainConf | ngxConfTake12,
+    },
+    "geoip_org": {
+        ngxHTTPMainConf | ngxConfTake12,
+        ngxStreamMainConf | ngxConfTake12,
+    },
+    "geoip_proxy": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "geoip_proxy_recursive": {
+        ngxHTTPMainConf | ngxConfFlag,
+    },
+    "google_perftools_profiles": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "grpc_bind": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "grpc_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_hide_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ignore_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "grpc_intercept_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "grpc_next_upstream": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "grpc_next_upstream_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_next_upstream_tries": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_pass": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "grpc_pass_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_set_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "grpc_socket_keepalive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "grpc_ssl_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_certificate_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_ciphers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_conf_command": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "grpc_ssl_crl": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_password_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_protocols": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "grpc_ssl_server_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "grpc_ssl_session_reuse": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "grpc_ssl_trusted_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_verify": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "grpc_ssl_verify_depth": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "gunzip": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "gunzip_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "gzip": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "gzip_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "gzip_comp_level": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "gzip_disable": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "gzip_http_version": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "gzip_min_length": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "gzip_proxied": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "gzip_static": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "gzip_types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "gzip_vary": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "hash": {
+        ngxHTTPUpsConf | ngxConfTake12,
+        ngxStreamUpsConf | ngxConfTake12,
+    },
+    "http": {
+        ngxMainConf | ngxConfBlock | ngxConfNoArgs,
+    },
+    "http2": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "http2_body_preread_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_chunk_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "http2_idle_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_max_concurrent_pushes": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_max_concurrent_streams": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_max_field_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_max_header_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_max_requests": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_push": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "http2_push_preload": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "http2_recv_buffer_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "http2_recv_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http3": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "http3_hq": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "http3_max_concurrent_streams": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http3_stream_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "if": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfExpr | ngxConf1More,
+    },
+    "if_modified_since": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "ignore_invalid_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "image_filter": {
+        ngxHTTPLocConf | ngxConfTake123,
+    },
+    "image_filter_buffer": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "image_filter_interlace": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "image_filter_jpeg_quality": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "image_filter_sharpen": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "image_filter_transparency": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "image_filter_webp_quality": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "imap_auth": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+    },
+    "imap_capabilities": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+    },
+    "imap_client_buffer": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "include": {
+        ngxAnyConf | ngxConfTake1,
+    },
+    "index": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "internal": {
+        ngxHTTPLocConf | ngxConfNoArgs,
+    },
+    "ip_hash": {
+        ngxHTTPUpsConf | ngxConfNoArgs,
+    },
+    "keepalive": {
+        ngxHTTPUpsConf | ngxConfTake1,
+    },
+    "keepalive_disable": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "keepalive_requests": {
+        ngxHTTPUpsConf | ngxConfTake1,
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "keepalive_time": {
+        ngxHTTPUpsConf | ngxConfTake1,
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "keepalive_timeout": {
+        ngxHTTPUpsConf | ngxConfTake1,
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "large_client_header_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake2,
+    },
+    "least_conn": {
+        ngxHTTPUpsConf | ngxConfNoArgs,
+        ngxStreamUpsConf | ngxConfNoArgs,
+    },
+    "limit_conn": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
+    },
+    "limit_conn_dry_run": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "limit_conn_log_level": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "limit_conn_status": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "limit_conn_zone": {
+        ngxHTTPMainConf | ngxConfTake2,
+        ngxStreamMainConf | ngxConfTake2,
+    },
+    "limit_except": {
+        ngxHTTPLocConf | ngxConfBlock | ngxConf1More,
+    },
+    "limit_rate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "limit_rate_after": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "limit_req": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "limit_req_dry_run": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "limit_req_log_level": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "limit_req_status": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "limit_req_zone": {
+        ngxHTTPMainConf | ngxConfTake3,
+    },
+    "lingering_close": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "lingering_time": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "lingering_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "listen": {
+        ngxHTTPSrvConf | ngxConf1More,
+        ngxMailSrvConf | ngxConf1More,
+        ngxStreamSrvConf | ngxConf1More,
+    },
+    "load_module": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "location": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfTake12,
+    },
+    "lock_file": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "log_format": {
+        ngxHTTPMainConf | ngxConf2More,
+        ngxStreamMainConf | ngxConf2More,
+    },
+    "log_not_found": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "log_subrequest": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "mail": {
+        ngxMainConf | ngxConfBlock | ngxConfNoArgs,
+    },
+    "map": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfTake2,
+        ngxStreamMainConf | ngxConfBlock | ngxConfTake2,
+    },
+    "map_hash_bucket_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+        ngxStreamMainConf | ngxConfTake1,
+    },
+    "map_hash_max_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+        ngxStreamMainConf | ngxConfTake1,
+    },
+    "master_process": {
+        ngxMainConf | ngxDirectConf | ngxConfFlag,
+    },
+    "max_errors": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "max_ranges": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_bind": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "memcached_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_gzip_flag": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_next_upstream": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "memcached_next_upstream_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_next_upstream_tries": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_pass": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "memcached_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_socket_keepalive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "merge_slashes": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "min_delete_depth": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "mirror": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "mirror_request_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "modern_browser": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "modern_browser_value": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "mp4": {
+        ngxHTTPLocConf | ngxConfNoArgs,
+    },
+    "mp4_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "mp4_max_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "mp4_start_key_frame": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "msie_padding": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "msie_refresh": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "multi_accept": {
+        ngxEventConf | ngxConfFlag,
+    },
+    "open_file_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "open_file_cache_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "open_file_cache_min_uses": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "open_file_cache_valid": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "open_log_file_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1234,
+    },
+    "output_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "override_charset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "pass": {
+        ngxStreamSrvConf | ngxConfTake1,
+    },
+    "pcre_jit": {
+        ngxMainConf | ngxDirectConf | ngxConfFlag,
+    },
+    "perl": {
+        ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
+    },
+    "perl_modules": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "perl_require": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "perl_set": {
+        ngxHTTPMainConf | ngxConfTake2,
+    },
+    "pid": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "pop3_auth": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+    },
+    "pop3_capabilities": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+    },
+    "port_in_redirect": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "postpone_output": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "preread_buffer_size": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "preread_timeout": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "protocol": {
+        ngxMailSrvConf | ngxConfTake1,
+    },
+    "proxy_bind": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12,
+    },
+    "proxy_buffer": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "proxy_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "proxy_busy_buffers_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache_background_update": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_cache_bypass": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "proxy_cache_convert_head": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_cache_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache_lock": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_cache_lock_age": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache_lock_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache_max_range_offset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache_methods": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "proxy_cache_min_uses": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache_path": {
+        ngxHTTPMainConf | ngxConf2More,
+    },
+    "proxy_cache_revalidate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_cache_use_stale": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "proxy_cache_valid": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "proxy_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_cookie_domain": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "proxy_cookie_flags": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+    },
+    "proxy_cookie_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "proxy_download_rate": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_force_ranges": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_half_close": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_headers_hash_bucket_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_headers_hash_max_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_hide_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_http_version": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_ignore_client_abort": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_ignore_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "proxy_intercept_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_limit_rate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_max_temp_file_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_method": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_next_upstream": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_next_upstream_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_next_upstream_tries": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_no_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "proxy_pass": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConfTake1,
+        ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_pass_error_message": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+    },
+    "proxy_pass_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_pass_request_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_pass_request_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_protocol": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_protocol_timeout": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_redirect": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "proxy_request_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_requests": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_responses": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_send_lowat": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_set_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_set_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "proxy_smtp_auth": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+    },
+    "proxy_socket_keepalive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_ssl": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_ssl_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_certificate_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_ciphers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_conf_command": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
+    },
+    "proxy_ssl_crl": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_password_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_protocols": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "proxy_ssl_server_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_ssl_session_reuse": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_ssl_trusted_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_verify": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_ssl_verify_depth": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_store": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_store_access": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "proxy_temp_file_write_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_temp_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+    },
+    "proxy_timeout": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_upload_rate": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "quic_active_connection_id_limit": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "quic_bpf": {
+        ngxMainConf | ngxDirectConf | ngxConfFlag,
+    },
+    "quic_gso": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "quic_host_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "quic_retry": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "random": {
+        ngxHTTPUpsConf | ngxConfNoArgs | ngxConfTake12,
+        ngxStreamUpsConf | ngxConfNoArgs | ngxConfTake12,
+    },
+    "random_index": {
+        ngxHTTPLocConf | ngxConfFlag,
+    },
+    "read_ahead": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "real_ip_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "real_ip_recursive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "recursive_error_pages": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "referer_hash_bucket_size": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "referer_hash_max_size": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "request_pool_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "reset_timedout_connection": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "resolver": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "resolver_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "return": {
+        ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake12,
+        ngxStreamSrvConf | ngxConfTake1,
+    },
+    "rewrite": {
+        ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23,
+    },
+    "rewrite_log": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "root": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "satisfy": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_bind": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "scgi_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "scgi_busy_buffers_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache_background_update": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_cache_bypass": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_cache_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache_lock": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_cache_lock_age": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache_lock_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache_max_range_offset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache_methods": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_cache_min_uses": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache_path": {
+        ngxHTTPMainConf | ngxConf2More,
+    },
+    "scgi_cache_revalidate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_cache_use_stale": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_cache_valid": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_force_ranges": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_hide_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_ignore_client_abort": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_ignore_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_intercept_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_limit_rate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_max_temp_file_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_next_upstream": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_next_upstream_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_next_upstream_tries": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_no_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_param": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23,
+    },
+    "scgi_pass": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "scgi_pass_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_pass_request_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_pass_request_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_request_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_socket_keepalive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_store": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_store_access": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "scgi_temp_file_write_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_temp_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+    },
+    "secure_link": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "secure_link_md5": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "secure_link_secret": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "send_lowat": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "sendfile": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "sendfile_max_chunk": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "server": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfNoArgs,
+        ngxHTTPUpsConf | ngxConf1More,
+        ngxMailMainConf | ngxConfBlock | ngxConfNoArgs,
+        ngxStreamMainConf | ngxConfBlock | ngxConfNoArgs,
+        ngxStreamUpsConf | ngxConf1More,
+    },
+    "server_name": {
+        ngxHTTPSrvConf | ngxConf1More,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamSrvConf | ngxConf1More,
+    },
+    "server_name_in_redirect": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "server_names_hash_bucket_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+        ngxStreamMainConf | ngxConfTake1,
+    },
+    "server_names_hash_max_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+        ngxStreamMainConf | ngxConfTake1,
+    },
+    "server_tokens": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "set": {
+        ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake2,
+        ngxStreamSrvConf | ngxConfTake2,
+    },
+    "set_real_ip_from": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "slice": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "smtp_auth": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+    },
+    "smtp_capabilities": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+    },
+    "smtp_client_buffer": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "smtp_greeting_delay": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "source_charset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "split_clients": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfTake2,
+        ngxStreamMainConf | ngxConfBlock | ngxConfTake2,
+    },
+    "ssi": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "ssi_last_modified": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "ssi_min_file_chunk": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "ssi_silent_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "ssi_types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "ssi_value_length": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "ssl_alpn": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "ssl_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_certificate_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_ciphers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_client_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_conf_command": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake2,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake2,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
+    },
+    "ssl_crl": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_dhparam": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_early_data": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "ssl_ecdh_curve": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_engine": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "ssl_handshake_timeout": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_ocsp": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "ssl_ocsp_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_ocsp_responder": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_password_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_prefer_server_ciphers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "ssl_preread": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "ssl_protocols": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConf1More,
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "ssl_reject_handshake": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "ssl_session_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake12,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake12,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12,
+    },
+    "ssl_session_ticket_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_session_tickets": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "ssl_session_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_stapling": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "ssl_stapling_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_stapling_responder": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_stapling_verify": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "ssl_trusted_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_verify_client": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_verify_depth": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "starttls": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "stream": {
+        ngxMainConf | ngxConfBlock | ngxConfNoArgs,
+    },
+    "stub_status": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfNoArgs | ngxConfTake1,
+    },
+    "sub_filter": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "sub_filter_last_modified": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "sub_filter_once": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "sub_filter_types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "subrequest_output_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "tcp_nodelay": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "tcp_nopush": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "thread_pool": {
+        ngxMainConf | ngxDirectConf | ngxConfTake23,
+    },
+    "timeout": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "timer_resolution": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "try_files": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf2More,
+    },
+    "types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfNoArgs,
+    },
+    "types_hash_bucket_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "types_hash_max_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "underscores_in_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "uninitialized_variable_warn": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "upstream": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfTake1,
+        ngxStreamMainConf | ngxConfBlock | ngxConfTake1,
+    },
+    "use": {
+        ngxEventConf | ngxConfTake1,
+    },
+    "user": {
+        ngxMainConf | ngxDirectConf | ngxConfTake12,
+    },
+    "userid": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_domain": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_expires": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_flags": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "userid_mark": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_p3p": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_service": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_bind": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "uwsgi_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "uwsgi_busy_buffers_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_background_update": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_bypass": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_cache_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_lock": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_cache_lock_age": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_lock_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_max_range_offset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_methods": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_cache_min_uses": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_path": {
+        ngxHTTPMainConf | ngxConf2More,
+    },
+    "uwsgi_cache_revalidate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_cache_use_stale": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_cache_valid": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_force_ranges": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_hide_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ignore_client_abort": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_ignore_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_intercept_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_limit_rate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_max_temp_file_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_modifier1": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_modifier2": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_next_upstream": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_next_upstream_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_next_upstream_tries": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_no_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_param": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23,
+    },
+    "uwsgi_pass": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "uwsgi_pass_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_pass_request_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_pass_request_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_request_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_socket_keepalive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_ssl_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_certificate_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_ciphers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_conf_command": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "uwsgi_ssl_crl": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_password_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_protocols": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_ssl_server_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_ssl_session_reuse": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_ssl_trusted_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_verify": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_ssl_verify_depth": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_store": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_store_access": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "uwsgi_temp_file_write_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_temp_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+    },
+    "valid_referers": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "variables_hash_bucket_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+        ngxStreamMainConf | ngxConfTake1,
+    },
+    "variables_hash_max_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+        ngxStreamMainConf | ngxConfTake1,
+    },
+    "worker_aio_requests": {
+        ngxEventConf | ngxConfTake1,
+    },
+    "worker_connections": {
+        ngxEventConf | ngxConfTake1,
+    },
+    "worker_cpu_affinity": {
+        ngxMainConf | ngxDirectConf | ngxConf1More,
+    },
+    "worker_priority": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "worker_processes": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "worker_rlimit_core": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "worker_rlimit_nofile": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "worker_shutdown_timeout": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "working_directory": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "xclient": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+    },
+    "xml_entities": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "xslt_last_modified": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "xslt_param": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "xslt_string_param": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "xslt_stylesheet": {
+        ngxHTTPLocConf | ngxConf1More,
+    },
+    "xslt_types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "zone": {
+        ngxHTTPUpsConf | ngxConfTake12,
+        ngxStreamUpsConf | ngxConfTake12,
+    },
+}
+
+// MatchOss126 contains directives in OSS 1.2.6 source code(including GEOIP, Perl, and XSLT)
+func MatchOss126(directive string) ([]uint, bool) {
+    m, ok := oss126Directives[directive]
+    return m, ok
+}
diff --git a/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_126_directives.go b/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_126_directives.go
deleted file mode 100644
index 6a35295eed..0000000000
--- a/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_126_directives.go
+++ /dev/null
@@ -1,1906 +0,0 @@
-/**
- * Copyright (c) F5, Inc.
- *
- * This source code is licensed under the Apache License, Version 2.0 license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-// All the definitions are extracted from the source code
-// Each bit mask describes these behaviors:
-//   - how many arguments the directive can take
-//   - whether or not it is a block directive
-//   - whether this is a flag (takes one argument that's either "on" or "off")
-//   - which contexts it's allowed to be in
-
-package crossplane
-
-//nolint:gochecknoglobals
-var ngxOss126Directives = map[string][]uint{
-	"absolute_redirect": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"accept_mutex": {
-		ngxEventConf | ngxConfFlag,
-	},
-	"accept_mutex_delay": {
-		ngxEventConf | ngxConfTake1,
-	},
-	"access_log": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"add_after_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"add_before_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"add_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23,
-	},
-	"add_trailer": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23,
-	},
-	"addition_types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"aio": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"aio_write": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"alias": {
-		ngxHTTPLocConf | ngxConfTake1,
-	},
-	"allow": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ancient_browser": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"ancient_browser_value": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"auth_basic": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
-	},
-	"auth_basic_user_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
-	},
-	"auth_delay": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"auth_http": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"auth_http_header": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake2,
-	},
-	"auth_http_pass_client_cert": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-	},
-	"auth_http_timeout": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"auth_request": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"auth_request_set": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"autoindex": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"autoindex_exact_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"autoindex_format": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"autoindex_localtime": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"break": {
-		ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfNoArgs,
-	},
-	"charset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"charset_map": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfTake2,
-	},
-	"charset_types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"chunked_transfer_encoding": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"client_body_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"client_body_in_file_only": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"client_body_in_single_buffer": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"client_body_temp_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-	},
-	"client_body_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"client_header_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"client_header_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"client_max_body_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"connection_pool_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"create_full_put_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"daemon": {
-		ngxMainConf | ngxDirectConf | ngxConfFlag,
-	},
-	"dav_access": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"dav_methods": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"debug_connection": {
-		ngxEventConf | ngxConfTake1,
-	},
-	"debug_points": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"default_type": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"deny": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"directio": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"directio_alignment": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"disable_symlinks": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"empty_gif": {
-		ngxHTTPLocConf | ngxConfNoArgs,
-	},
-	"env": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"error_log": {
-		ngxMainConf | ngxConf1More,
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"error_page": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf2More,
-	},
-	"etag": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"events": {
-		ngxMainConf | ngxConfBlock | ngxConfNoArgs,
-	},
-	"expires": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake12,
-	},
-	"fastcgi_bind": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"fastcgi_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"fastcgi_busy_buffers_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache_background_update": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_cache_bypass": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_cache_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache_lock": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_cache_lock_age": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache_lock_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache_max_range_offset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache_methods": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_cache_min_uses": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache_path": {
-		ngxHTTPMainConf | ngxConf2More,
-	},
-	"fastcgi_cache_revalidate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_cache_use_stale": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_cache_valid": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_catch_stderr": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_force_ranges": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_hide_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_ignore_client_abort": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_ignore_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_index": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_intercept_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_keep_conn": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_limit_rate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_max_temp_file_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_next_upstream": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_next_upstream_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_next_upstream_tries": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_no_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_param": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23,
-	},
-	"fastcgi_pass": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"fastcgi_pass_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_pass_request_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_pass_request_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_request_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_send_lowat": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_socket_keepalive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_split_path_info": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_store": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_store_access": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"fastcgi_temp_file_write_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_temp_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-	},
-	"flv": {
-		ngxHTTPLocConf | ngxConfNoArgs,
-	},
-	"geo": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfTake12,
-		ngxStreamMainConf | ngxConfBlock | ngxConfTake12,
-	},
-	"geoip_city": {
-		ngxHTTPMainConf | ngxConfTake12,
-		ngxStreamMainConf | ngxConfTake12,
-	},
-	"geoip_country": {
-		ngxHTTPMainConf | ngxConfTake12,
-		ngxStreamMainConf | ngxConfTake12,
-	},
-	"geoip_org": {
-		ngxHTTPMainConf | ngxConfTake12,
-		ngxStreamMainConf | ngxConfTake12,
-	},
-	"geoip_proxy": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"geoip_proxy_recursive": {
-		ngxHTTPMainConf | ngxConfFlag,
-	},
-	"google_perftools_profiles": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"grpc_bind": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"grpc_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_hide_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ignore_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"grpc_intercept_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"grpc_next_upstream": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"grpc_next_upstream_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_next_upstream_tries": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_pass": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"grpc_pass_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_set_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"grpc_socket_keepalive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"grpc_ssl_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_certificate_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_ciphers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_conf_command": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"grpc_ssl_crl": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_password_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_protocols": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"grpc_ssl_server_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"grpc_ssl_session_reuse": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"grpc_ssl_trusted_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_verify": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"grpc_ssl_verify_depth": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"gunzip": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"gunzip_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"gzip": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"gzip_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"gzip_comp_level": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"gzip_disable": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"gzip_http_version": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"gzip_min_length": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"gzip_proxied": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"gzip_static": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"gzip_types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"gzip_vary": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"hash": {
-		ngxHTTPUpsConf | ngxConfTake12,
-		ngxStreamUpsConf | ngxConfTake12,
-	},
-	"http": {
-		ngxMainConf | ngxConfBlock | ngxConfNoArgs,
-	},
-	"http2": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"http2_body_preread_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_chunk_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"http2_idle_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_max_concurrent_pushes": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_max_concurrent_streams": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_max_field_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_max_header_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_max_requests": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_push": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"http2_push_preload": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"http2_recv_buffer_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"http2_recv_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http3": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"http3_hq": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"http3_max_concurrent_streams": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http3_stream_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"if": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfExpr | ngxConf1More,
-	},
-	"if_modified_since": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"ignore_invalid_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"image_filter": {
-		ngxHTTPLocConf | ngxConfTake123,
-	},
-	"image_filter_buffer": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"image_filter_interlace": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"image_filter_jpeg_quality": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"image_filter_sharpen": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"image_filter_transparency": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"image_filter_webp_quality": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"imap_auth": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-	},
-	"imap_capabilities": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-	},
-	"imap_client_buffer": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"include": {
-		ngxAnyConf | ngxConfTake1,
-	},
-	"index": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"internal": {
-		ngxHTTPLocConf | ngxConfNoArgs,
-	},
-	"ip_hash": {
-		ngxHTTPUpsConf | ngxConfNoArgs,
-	},
-	"keepalive": {
-		ngxHTTPUpsConf | ngxConfTake1,
-	},
-	"keepalive_disable": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"keepalive_requests": {
-		ngxHTTPUpsConf | ngxConfTake1,
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"keepalive_time": {
-		ngxHTTPUpsConf | ngxConfTake1,
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"keepalive_timeout": {
-		ngxHTTPUpsConf | ngxConfTake1,
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"large_client_header_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake2,
-	},
-	"least_conn": {
-		ngxHTTPUpsConf | ngxConfNoArgs,
-		ngxStreamUpsConf | ngxConfNoArgs,
-	},
-	"limit_conn": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
-	},
-	"limit_conn_dry_run": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"limit_conn_log_level": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"limit_conn_status": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"limit_conn_zone": {
-		ngxHTTPMainConf | ngxConfTake2,
-		ngxStreamMainConf | ngxConfTake2,
-	},
-	"limit_except": {
-		ngxHTTPLocConf | ngxConfBlock | ngxConf1More,
-	},
-	"limit_rate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"limit_rate_after": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"limit_req": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"limit_req_dry_run": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"limit_req_log_level": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"limit_req_status": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"limit_req_zone": {
-		ngxHTTPMainConf | ngxConfTake3,
-	},
-	"lingering_close": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"lingering_time": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"lingering_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"listen": {
-		ngxHTTPSrvConf | ngxConf1More,
-		ngxMailSrvConf | ngxConf1More,
-		ngxStreamSrvConf | ngxConf1More,
-	},
-	"load_module": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"location": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfTake12,
-	},
-	"lock_file": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"log_format": {
-		ngxHTTPMainConf | ngxConf2More,
-		ngxStreamMainConf | ngxConf2More,
-	},
-	"log_not_found": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"log_subrequest": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"mail": {
-		ngxMainConf | ngxConfBlock | ngxConfNoArgs,
-	},
-	"map": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfTake2,
-		ngxStreamMainConf | ngxConfBlock | ngxConfTake2,
-	},
-	"map_hash_bucket_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-		ngxStreamMainConf | ngxConfTake1,
-	},
-	"map_hash_max_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-		ngxStreamMainConf | ngxConfTake1,
-	},
-	"master_process": {
-		ngxMainConf | ngxDirectConf | ngxConfFlag,
-	},
-	"max_errors": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"max_ranges": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_bind": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"memcached_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_gzip_flag": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_next_upstream": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"memcached_next_upstream_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_next_upstream_tries": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_pass": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"memcached_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_socket_keepalive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"merge_slashes": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"min_delete_depth": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"mirror": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"mirror_request_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"modern_browser": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"modern_browser_value": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"mp4": {
-		ngxHTTPLocConf | ngxConfNoArgs,
-	},
-	"mp4_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"mp4_max_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"mp4_start_key_frame": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"msie_padding": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"msie_refresh": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"multi_accept": {
-		ngxEventConf | ngxConfFlag,
-	},
-	"open_file_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"open_file_cache_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"open_file_cache_min_uses": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"open_file_cache_valid": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"open_log_file_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1234,
-	},
-	"output_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"override_charset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"pass": {
-		ngxStreamSrvConf | ngxConfTake1,
-	},
-	"pcre_jit": {
-		ngxMainConf | ngxDirectConf | ngxConfFlag,
-	},
-	"perl": {
-		ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
-	},
-	"perl_modules": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"perl_require": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"perl_set": {
-		ngxHTTPMainConf | ngxConfTake2,
-	},
-	"pid": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"pop3_auth": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-	},
-	"pop3_capabilities": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-	},
-	"port_in_redirect": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"postpone_output": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"preread_buffer_size": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"preread_timeout": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"protocol": {
-		ngxMailSrvConf | ngxConfTake1,
-	},
-	"proxy_bind": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12,
-	},
-	"proxy_buffer": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"proxy_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"proxy_busy_buffers_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache_background_update": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_cache_bypass": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"proxy_cache_convert_head": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_cache_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache_lock": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_cache_lock_age": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache_lock_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache_max_range_offset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache_methods": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"proxy_cache_min_uses": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache_path": {
-		ngxHTTPMainConf | ngxConf2More,
-	},
-	"proxy_cache_revalidate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_cache_use_stale": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"proxy_cache_valid": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"proxy_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_cookie_domain": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"proxy_cookie_flags": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-	},
-	"proxy_cookie_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"proxy_download_rate": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_force_ranges": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_half_close": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_headers_hash_bucket_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_headers_hash_max_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_hide_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_http_version": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_ignore_client_abort": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_ignore_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"proxy_intercept_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_limit_rate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_max_temp_file_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_method": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_next_upstream": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_next_upstream_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_next_upstream_tries": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_no_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"proxy_pass": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConfTake1,
-		ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_pass_error_message": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-	},
-	"proxy_pass_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_pass_request_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_pass_request_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_protocol": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_protocol_timeout": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_redirect": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"proxy_request_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_requests": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_responses": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_send_lowat": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_set_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_set_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"proxy_smtp_auth": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-	},
-	"proxy_socket_keepalive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_ssl": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_ssl_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_certificate_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_ciphers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_conf_command": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
-	},
-	"proxy_ssl_crl": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_password_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_protocols": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"proxy_ssl_server_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_ssl_session_reuse": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_ssl_trusted_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_verify": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_ssl_verify_depth": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_store": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_store_access": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"proxy_temp_file_write_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_temp_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-	},
-	"proxy_timeout": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_upload_rate": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"quic_active_connection_id_limit": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"quic_bpf": {
-		ngxMainConf | ngxDirectConf | ngxConfFlag,
-	},
-	"quic_gso": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"quic_host_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"quic_retry": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"random": {
-		ngxHTTPUpsConf | ngxConfNoArgs | ngxConfTake12,
-		ngxStreamUpsConf | ngxConfNoArgs | ngxConfTake12,
-	},
-	"random_index": {
-		ngxHTTPLocConf | ngxConfFlag,
-	},
-	"read_ahead": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"real_ip_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"real_ip_recursive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"recursive_error_pages": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"referer_hash_bucket_size": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"referer_hash_max_size": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"request_pool_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"reset_timedout_connection": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"resolver": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"resolver_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"return": {
-		ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake12,
-		ngxStreamSrvConf | ngxConfTake1,
-	},
-	"rewrite": {
-		ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23,
-	},
-	"rewrite_log": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"root": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"satisfy": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_bind": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"scgi_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"scgi_busy_buffers_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache_background_update": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_cache_bypass": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_cache_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache_lock": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_cache_lock_age": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache_lock_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache_max_range_offset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache_methods": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_cache_min_uses": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache_path": {
-		ngxHTTPMainConf | ngxConf2More,
-	},
-	"scgi_cache_revalidate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_cache_use_stale": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_cache_valid": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_force_ranges": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_hide_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_ignore_client_abort": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_ignore_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_intercept_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_limit_rate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_max_temp_file_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_next_upstream": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_next_upstream_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_next_upstream_tries": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_no_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_param": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23,
-	},
-	"scgi_pass": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"scgi_pass_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_pass_request_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_pass_request_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_request_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_socket_keepalive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_store": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_store_access": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"scgi_temp_file_write_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_temp_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-	},
-	"secure_link": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"secure_link_md5": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"secure_link_secret": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"send_lowat": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"sendfile": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"sendfile_max_chunk": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"server": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfNoArgs,
-		ngxHTTPUpsConf | ngxConf1More,
-		ngxMailMainConf | ngxConfBlock | ngxConfNoArgs,
-		ngxStreamMainConf | ngxConfBlock | ngxConfNoArgs,
-		ngxStreamUpsConf | ngxConf1More,
-	},
-	"server_name": {
-		ngxHTTPSrvConf | ngxConf1More,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamSrvConf | ngxConf1More,
-	},
-	"server_name_in_redirect": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"server_names_hash_bucket_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-		ngxStreamMainConf | ngxConfTake1,
-	},
-	"server_names_hash_max_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-		ngxStreamMainConf | ngxConfTake1,
-	},
-	"server_tokens": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"set": {
-		ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake2,
-		ngxStreamSrvConf | ngxConfTake2,
-	},
-	"set_real_ip_from": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"slice": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"smtp_auth": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-	},
-	"smtp_capabilities": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-	},
-	"smtp_client_buffer": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"smtp_greeting_delay": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"source_charset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"split_clients": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfTake2,
-		ngxStreamMainConf | ngxConfBlock | ngxConfTake2,
-	},
-	"ssi": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"ssi_last_modified": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"ssi_min_file_chunk": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"ssi_silent_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"ssi_types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"ssi_value_length": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"ssl_alpn": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"ssl_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_certificate_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_ciphers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_client_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_conf_command": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake2,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake2,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
-	},
-	"ssl_crl": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_dhparam": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_early_data": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"ssl_ecdh_curve": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_engine": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"ssl_handshake_timeout": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_ocsp": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"ssl_ocsp_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_ocsp_responder": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_password_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_prefer_server_ciphers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"ssl_preread": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"ssl_protocols": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConf1More,
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"ssl_reject_handshake": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"ssl_session_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake12,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake12,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12,
-	},
-	"ssl_session_ticket_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_session_tickets": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"ssl_session_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_stapling": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"ssl_stapling_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_stapling_responder": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_stapling_verify": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"ssl_trusted_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_verify_client": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_verify_depth": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"starttls": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"stream": {
-		ngxMainConf | ngxConfBlock | ngxConfNoArgs,
-	},
-	"stub_status": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfNoArgs | ngxConfTake1,
-	},
-	"sub_filter": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"sub_filter_last_modified": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"sub_filter_once": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"sub_filter_types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"subrequest_output_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"tcp_nodelay": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"tcp_nopush": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"thread_pool": {
-		ngxMainConf | ngxDirectConf | ngxConfTake23,
-	},
-	"timeout": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"timer_resolution": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"try_files": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf2More,
-	},
-	"types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfNoArgs,
-	},
-	"types_hash_bucket_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"types_hash_max_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"underscores_in_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"uninitialized_variable_warn": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"upstream": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfTake1,
-		ngxStreamMainConf | ngxConfBlock | ngxConfTake1,
-	},
-	"use": {
-		ngxEventConf | ngxConfTake1,
-	},
-	"user": {
-		ngxMainConf | ngxDirectConf | ngxConfTake12,
-	},
-	"userid": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_domain": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_expires": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_flags": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"userid_mark": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_p3p": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_service": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_bind": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"uwsgi_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"uwsgi_busy_buffers_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_background_update": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_bypass": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_cache_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_lock": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_cache_lock_age": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_lock_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_max_range_offset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_methods": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_cache_min_uses": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_path": {
-		ngxHTTPMainConf | ngxConf2More,
-	},
-	"uwsgi_cache_revalidate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_cache_use_stale": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_cache_valid": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_force_ranges": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_hide_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ignore_client_abort": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_ignore_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_intercept_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_limit_rate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_max_temp_file_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_modifier1": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_modifier2": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_next_upstream": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_next_upstream_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_next_upstream_tries": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_no_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_param": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23,
-	},
-	"uwsgi_pass": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"uwsgi_pass_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_pass_request_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_pass_request_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_request_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_socket_keepalive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_ssl_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_certificate_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_ciphers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_conf_command": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"uwsgi_ssl_crl": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_password_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_protocols": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_ssl_server_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_ssl_session_reuse": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_ssl_trusted_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_verify": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_ssl_verify_depth": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_store": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_store_access": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"uwsgi_temp_file_write_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_temp_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-	},
-	"valid_referers": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"variables_hash_bucket_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-		ngxStreamMainConf | ngxConfTake1,
-	},
-	"variables_hash_max_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-		ngxStreamMainConf | ngxConfTake1,
-	},
-	"worker_aio_requests": {
-		ngxEventConf | ngxConfTake1,
-	},
-	"worker_connections": {
-		ngxEventConf | ngxConfTake1,
-	},
-	"worker_cpu_affinity": {
-		ngxMainConf | ngxDirectConf | ngxConf1More,
-	},
-	"worker_priority": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"worker_processes": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"worker_rlimit_core": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"worker_rlimit_nofile": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"worker_shutdown_timeout": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"working_directory": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"xclient": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-	},
-	"xml_entities": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"xslt_last_modified": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"xslt_param": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"xslt_string_param": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"xslt_stylesheet": {
-		ngxHTTPLocConf | ngxConf1More,
-	},
-	"xslt_types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"zone": {
-		ngxHTTPUpsConf | ngxConfTake12,
-		ngxStreamUpsConf | ngxConfTake12,
-	},
-}
-
-func Oss126DirectivesMatchFn(directive string) ([]uint, bool) {
-	masks, matched := ngxOss126Directives[directive]
-	return masks, matched
-}
diff --git a/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_latest_directives.gen.go b/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_latest_directives.gen.go
new file mode 100644
index 0000000000..5ef3eac02a
--- /dev/null
+++ b/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_latest_directives.gen.go
@@ -0,0 +1,1907 @@
+/**
+ * Copyright (c) F5, Inc.
+ *
+ * This source code is licensed under the Apache License, Version 2.0 license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+// Code generated by generator; DO NOT EDIT.
+// All the definitions are extracted from the source code
+// Each bit mask describes these behaviors:
+//   - how many arguments the directive can take
+//   - whether or not it is a block directive
+//   - whether this is a flag (takes one argument that's either "on" or "off")
+//   - which contexts it's allowed to be in
+
+package crossplane
+
+var ossLatestDirectives = map[string][]uint{
+    "absolute_redirect": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "accept_mutex": {
+        ngxEventConf | ngxConfFlag,
+    },
+    "accept_mutex_delay": {
+        ngxEventConf | ngxConfTake1,
+    },
+    "access_log": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "add_after_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "add_before_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "add_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23,
+    },
+    "add_trailer": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23,
+    },
+    "addition_types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "aio": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "aio_write": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "alias": {
+        ngxHTTPLocConf | ngxConfTake1,
+    },
+    "allow": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ancient_browser": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "ancient_browser_value": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "auth_basic": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
+    },
+    "auth_basic_user_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
+    },
+    "auth_delay": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "auth_http": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "auth_http_header": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake2,
+    },
+    "auth_http_pass_client_cert": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+    },
+    "auth_http_timeout": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "auth_request": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "auth_request_set": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "autoindex": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "autoindex_exact_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "autoindex_format": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "autoindex_localtime": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "break": {
+        ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfNoArgs,
+    },
+    "charset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "charset_map": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfTake2,
+    },
+    "charset_types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "chunked_transfer_encoding": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "client_body_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "client_body_in_file_only": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "client_body_in_single_buffer": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "client_body_temp_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+    },
+    "client_body_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "client_header_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "client_header_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "client_max_body_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "connection_pool_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "create_full_put_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "daemon": {
+        ngxMainConf | ngxDirectConf | ngxConfFlag,
+    },
+    "dav_access": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "dav_methods": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "debug_connection": {
+        ngxEventConf | ngxConfTake1,
+    },
+    "debug_points": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "default_type": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "deny": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "directio": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "directio_alignment": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "disable_symlinks": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "empty_gif": {
+        ngxHTTPLocConf | ngxConfNoArgs,
+    },
+    "env": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "error_log": {
+        ngxMainConf | ngxConf1More,
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "error_page": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf2More,
+    },
+    "etag": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "events": {
+        ngxMainConf | ngxConfBlock | ngxConfNoArgs,
+    },
+    "expires": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake12,
+    },
+    "fastcgi_bind": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "fastcgi_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "fastcgi_busy_buffers_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache_background_update": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_cache_bypass": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_cache_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache_lock": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_cache_lock_age": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache_lock_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache_max_range_offset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache_methods": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_cache_min_uses": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache_path": {
+        ngxHTTPMainConf | ngxConf2More,
+    },
+    "fastcgi_cache_revalidate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_cache_use_stale": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_cache_valid": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_catch_stderr": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_force_ranges": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_hide_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_ignore_client_abort": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_ignore_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_index": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_intercept_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_keep_conn": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_limit_rate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_max_temp_file_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_next_upstream": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_next_upstream_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_next_upstream_tries": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_no_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_param": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23,
+    },
+    "fastcgi_pass": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "fastcgi_pass_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_pass_request_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_pass_request_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_request_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_send_lowat": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_socket_keepalive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_split_path_info": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_store": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_store_access": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "fastcgi_temp_file_write_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_temp_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+    },
+    "flv": {
+        ngxHTTPLocConf | ngxConfNoArgs,
+    },
+    "geo": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfTake12,
+        ngxStreamMainConf | ngxConfBlock | ngxConfTake12,
+    },
+    "geoip_city": {
+        ngxHTTPMainConf | ngxConfTake12,
+        ngxStreamMainConf | ngxConfTake12,
+    },
+    "geoip_country": {
+        ngxHTTPMainConf | ngxConfTake12,
+        ngxStreamMainConf | ngxConfTake12,
+    },
+    "geoip_org": {
+        ngxHTTPMainConf | ngxConfTake12,
+        ngxStreamMainConf | ngxConfTake12,
+    },
+    "geoip_proxy": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "geoip_proxy_recursive": {
+        ngxHTTPMainConf | ngxConfFlag,
+    },
+    "google_perftools_profiles": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "grpc_bind": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "grpc_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_hide_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ignore_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "grpc_intercept_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "grpc_next_upstream": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "grpc_next_upstream_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_next_upstream_tries": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_pass": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "grpc_pass_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_set_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "grpc_socket_keepalive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "grpc_ssl_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_certificate_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_ciphers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_conf_command": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "grpc_ssl_crl": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_password_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_protocols": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "grpc_ssl_server_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "grpc_ssl_session_reuse": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "grpc_ssl_trusted_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_verify": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "grpc_ssl_verify_depth": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "gunzip": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "gunzip_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "gzip": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "gzip_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "gzip_comp_level": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "gzip_disable": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "gzip_http_version": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "gzip_min_length": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "gzip_proxied": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "gzip_static": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "gzip_types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "gzip_vary": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "hash": {
+        ngxHTTPUpsConf | ngxConfTake12,
+        ngxStreamUpsConf | ngxConfTake12,
+    },
+    "http": {
+        ngxMainConf | ngxConfBlock | ngxConfNoArgs,
+    },
+    "http2": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "http2_body_preread_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_chunk_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "http2_idle_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_max_concurrent_pushes": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_max_concurrent_streams": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_max_field_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_max_header_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_max_requests": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_push": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "http2_push_preload": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "http2_recv_buffer_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "http2_recv_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http3": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "http3_hq": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "http3_max_concurrent_streams": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http3_stream_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "if": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfExpr | ngxConf1More,
+    },
+    "if_modified_since": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "ignore_invalid_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "image_filter": {
+        ngxHTTPLocConf | ngxConfTake123,
+    },
+    "image_filter_buffer": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "image_filter_interlace": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "image_filter_jpeg_quality": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "image_filter_sharpen": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "image_filter_transparency": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "image_filter_webp_quality": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "imap_auth": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+    },
+    "imap_capabilities": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+    },
+    "imap_client_buffer": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "include": {
+        ngxAnyConf | ngxConfTake1,
+    },
+    "index": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "internal": {
+        ngxHTTPLocConf | ngxConfNoArgs,
+    },
+    "ip_hash": {
+        ngxHTTPUpsConf | ngxConfNoArgs,
+    },
+    "keepalive": {
+        ngxHTTPUpsConf | ngxConfTake1,
+    },
+    "keepalive_disable": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "keepalive_requests": {
+        ngxHTTPUpsConf | ngxConfTake1,
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "keepalive_time": {
+        ngxHTTPUpsConf | ngxConfTake1,
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "keepalive_timeout": {
+        ngxHTTPUpsConf | ngxConfTake1,
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "large_client_header_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake2,
+    },
+    "least_conn": {
+        ngxHTTPUpsConf | ngxConfNoArgs,
+        ngxStreamUpsConf | ngxConfNoArgs,
+    },
+    "limit_conn": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
+    },
+    "limit_conn_dry_run": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "limit_conn_log_level": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "limit_conn_status": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "limit_conn_zone": {
+        ngxHTTPMainConf | ngxConfTake2,
+        ngxStreamMainConf | ngxConfTake2,
+    },
+    "limit_except": {
+        ngxHTTPLocConf | ngxConfBlock | ngxConf1More,
+    },
+    "limit_rate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "limit_rate_after": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "limit_req": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "limit_req_dry_run": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "limit_req_log_level": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "limit_req_status": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "limit_req_zone": {
+        ngxHTTPMainConf | ngxConfTake3,
+    },
+    "lingering_close": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "lingering_time": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "lingering_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "listen": {
+        ngxHTTPSrvConf | ngxConf1More,
+        ngxMailSrvConf | ngxConf1More,
+        ngxStreamSrvConf | ngxConf1More,
+    },
+    "load_module": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "location": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfTake12,
+    },
+    "lock_file": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "log_format": {
+        ngxHTTPMainConf | ngxConf2More,
+        ngxStreamMainConf | ngxConf2More,
+    },
+    "log_not_found": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "log_subrequest": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "mail": {
+        ngxMainConf | ngxConfBlock | ngxConfNoArgs,
+    },
+    "map": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfTake2,
+        ngxStreamMainConf | ngxConfBlock | ngxConfTake2,
+    },
+    "map_hash_bucket_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+        ngxStreamMainConf | ngxConfTake1,
+    },
+    "map_hash_max_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+        ngxStreamMainConf | ngxConfTake1,
+    },
+    "master_process": {
+        ngxMainConf | ngxDirectConf | ngxConfFlag,
+    },
+    "max_errors": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "max_ranges": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_bind": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "memcached_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_gzip_flag": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_next_upstream": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "memcached_next_upstream_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_next_upstream_tries": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_pass": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "memcached_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_socket_keepalive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "merge_slashes": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "min_delete_depth": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "mirror": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "mirror_request_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "modern_browser": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "modern_browser_value": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "mp4": {
+        ngxHTTPLocConf | ngxConfNoArgs,
+    },
+    "mp4_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "mp4_max_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "mp4_start_key_frame": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "msie_padding": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "msie_refresh": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "multi_accept": {
+        ngxEventConf | ngxConfFlag,
+    },
+    "open_file_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "open_file_cache_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "open_file_cache_min_uses": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "open_file_cache_valid": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "open_log_file_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1234,
+    },
+    "output_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "override_charset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "pass": {
+        ngxStreamSrvConf | ngxConfTake1,
+    },
+    "pcre_jit": {
+        ngxMainConf | ngxDirectConf | ngxConfFlag,
+    },
+    "perl": {
+        ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
+    },
+    "perl_modules": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "perl_require": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "perl_set": {
+        ngxHTTPMainConf | ngxConfTake2,
+    },
+    "pid": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "pop3_auth": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+    },
+    "pop3_capabilities": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+    },
+    "port_in_redirect": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "postpone_output": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "preread_buffer_size": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "preread_timeout": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "protocol": {
+        ngxMailSrvConf | ngxConfTake1,
+    },
+    "proxy_bind": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12,
+    },
+    "proxy_buffer": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "proxy_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "proxy_busy_buffers_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache_background_update": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_cache_bypass": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "proxy_cache_convert_head": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_cache_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache_lock": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_cache_lock_age": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache_lock_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache_max_range_offset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache_methods": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "proxy_cache_min_uses": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache_path": {
+        ngxHTTPMainConf | ngxConf2More,
+    },
+    "proxy_cache_revalidate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_cache_use_stale": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "proxy_cache_valid": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "proxy_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_cookie_domain": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "proxy_cookie_flags": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+    },
+    "proxy_cookie_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "proxy_download_rate": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_force_ranges": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_half_close": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_headers_hash_bucket_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_headers_hash_max_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_hide_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_http_version": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_ignore_client_abort": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_ignore_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "proxy_intercept_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_limit_rate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_max_temp_file_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_method": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_next_upstream": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_next_upstream_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_next_upstream_tries": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_no_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "proxy_pass": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConfTake1,
+        ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_pass_error_message": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+    },
+    "proxy_pass_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_pass_request_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_pass_request_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_protocol": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_protocol_timeout": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_redirect": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "proxy_request_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_requests": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_responses": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_send_lowat": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_set_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_set_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "proxy_smtp_auth": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+    },
+    "proxy_socket_keepalive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_ssl": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_ssl_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_certificate_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_ciphers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_conf_command": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
+    },
+    "proxy_ssl_crl": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_password_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_protocols": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "proxy_ssl_server_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_ssl_session_reuse": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_ssl_trusted_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_verify": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_ssl_verify_depth": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_store": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_store_access": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "proxy_temp_file_write_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_temp_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+    },
+    "proxy_timeout": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_upload_rate": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "quic_active_connection_id_limit": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "quic_bpf": {
+        ngxMainConf | ngxDirectConf | ngxConfFlag,
+    },
+    "quic_gso": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "quic_host_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "quic_retry": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "random": {
+        ngxHTTPUpsConf | ngxConfNoArgs | ngxConfTake12,
+        ngxStreamUpsConf | ngxConfNoArgs | ngxConfTake12,
+    },
+    "random_index": {
+        ngxHTTPLocConf | ngxConfFlag,
+    },
+    "read_ahead": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "real_ip_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "real_ip_recursive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "recursive_error_pages": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "referer_hash_bucket_size": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "referer_hash_max_size": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "request_pool_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "reset_timedout_connection": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "resolver": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "resolver_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "return": {
+        ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake12,
+        ngxStreamSrvConf | ngxConfTake1,
+    },
+    "rewrite": {
+        ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23,
+    },
+    "rewrite_log": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "root": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "satisfy": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_bind": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "scgi_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "scgi_busy_buffers_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache_background_update": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_cache_bypass": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_cache_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache_lock": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_cache_lock_age": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache_lock_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache_max_range_offset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache_methods": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_cache_min_uses": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache_path": {
+        ngxHTTPMainConf | ngxConf2More,
+    },
+    "scgi_cache_revalidate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_cache_use_stale": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_cache_valid": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_force_ranges": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_hide_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_ignore_client_abort": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_ignore_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_intercept_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_limit_rate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_max_temp_file_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_next_upstream": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_next_upstream_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_next_upstream_tries": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_no_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_param": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23,
+    },
+    "scgi_pass": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "scgi_pass_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_pass_request_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_pass_request_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_request_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_socket_keepalive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_store": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_store_access": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "scgi_temp_file_write_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_temp_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+    },
+    "secure_link": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "secure_link_md5": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "secure_link_secret": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "send_lowat": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "sendfile": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "sendfile_max_chunk": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "server": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfNoArgs,
+        ngxHTTPUpsConf | ngxConf1More,
+        ngxMailMainConf | ngxConfBlock | ngxConfNoArgs,
+        ngxStreamMainConf | ngxConfBlock | ngxConfNoArgs,
+        ngxStreamUpsConf | ngxConf1More,
+    },
+    "server_name": {
+        ngxHTTPSrvConf | ngxConf1More,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamSrvConf | ngxConf1More,
+    },
+    "server_name_in_redirect": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "server_names_hash_bucket_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+        ngxStreamMainConf | ngxConfTake1,
+    },
+    "server_names_hash_max_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+        ngxStreamMainConf | ngxConfTake1,
+    },
+    "server_tokens": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "set": {
+        ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake2,
+        ngxStreamSrvConf | ngxConfTake2,
+    },
+    "set_real_ip_from": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "slice": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "smtp_auth": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+    },
+    "smtp_capabilities": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+    },
+    "smtp_client_buffer": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "smtp_greeting_delay": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "source_charset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "split_clients": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfTake2,
+        ngxStreamMainConf | ngxConfBlock | ngxConfTake2,
+    },
+    "ssi": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "ssi_last_modified": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "ssi_min_file_chunk": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "ssi_silent_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "ssi_types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "ssi_value_length": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "ssl_alpn": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "ssl_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_certificate_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_ciphers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_client_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_conf_command": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake2,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake2,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
+    },
+    "ssl_crl": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_dhparam": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_early_data": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "ssl_ecdh_curve": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_engine": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "ssl_handshake_timeout": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_ocsp": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "ssl_ocsp_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_ocsp_responder": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_password_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_prefer_server_ciphers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "ssl_preread": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "ssl_protocols": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConf1More,
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "ssl_reject_handshake": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "ssl_session_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake12,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake12,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12,
+    },
+    "ssl_session_ticket_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_session_tickets": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "ssl_session_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_stapling": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "ssl_stapling_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_stapling_responder": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_stapling_verify": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "ssl_trusted_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_verify_client": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_verify_depth": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "starttls": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "stream": {
+        ngxMainConf | ngxConfBlock | ngxConfNoArgs,
+    },
+    "stub_status": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfNoArgs | ngxConfTake1,
+    },
+    "sub_filter": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "sub_filter_last_modified": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "sub_filter_once": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "sub_filter_types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "subrequest_output_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "tcp_nodelay": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "tcp_nopush": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "thread_pool": {
+        ngxMainConf | ngxDirectConf | ngxConfTake23,
+    },
+    "timeout": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "timer_resolution": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "try_files": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf2More,
+    },
+    "types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfNoArgs,
+    },
+    "types_hash_bucket_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "types_hash_max_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "underscores_in_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "uninitialized_variable_warn": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "upstream": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfTake1,
+        ngxStreamMainConf | ngxConfBlock | ngxConfTake1,
+    },
+    "use": {
+        ngxEventConf | ngxConfTake1,
+    },
+    "user": {
+        ngxMainConf | ngxDirectConf | ngxConfTake12,
+    },
+    "userid": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_domain": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_expires": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_flags": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "userid_mark": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_p3p": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_service": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_bind": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "uwsgi_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "uwsgi_busy_buffers_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_background_update": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_bypass": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_cache_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_lock": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_cache_lock_age": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_lock_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_max_range_offset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_methods": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_cache_min_uses": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_path": {
+        ngxHTTPMainConf | ngxConf2More,
+    },
+    "uwsgi_cache_revalidate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_cache_use_stale": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_cache_valid": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_force_ranges": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_hide_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ignore_client_abort": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_ignore_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_intercept_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_limit_rate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_max_temp_file_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_modifier1": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_modifier2": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_next_upstream": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_next_upstream_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_next_upstream_tries": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_no_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_param": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23,
+    },
+    "uwsgi_pass": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "uwsgi_pass_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_pass_request_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_pass_request_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_request_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_socket_keepalive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_ssl_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_certificate_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_ciphers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_conf_command": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "uwsgi_ssl_crl": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_password_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_protocols": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_ssl_server_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_ssl_session_reuse": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_ssl_trusted_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_verify": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_ssl_verify_depth": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_store": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_store_access": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "uwsgi_temp_file_write_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_temp_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+    },
+    "valid_referers": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "variables_hash_bucket_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+        ngxStreamMainConf | ngxConfTake1,
+    },
+    "variables_hash_max_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+        ngxStreamMainConf | ngxConfTake1,
+    },
+    "worker_aio_requests": {
+        ngxEventConf | ngxConfTake1,
+    },
+    "worker_connections": {
+        ngxEventConf | ngxConfTake1,
+    },
+    "worker_cpu_affinity": {
+        ngxMainConf | ngxDirectConf | ngxConf1More,
+    },
+    "worker_priority": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "worker_processes": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "worker_rlimit_core": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "worker_rlimit_nofile": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "worker_shutdown_timeout": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "working_directory": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "xclient": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+    },
+    "xml_entities": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "xslt_last_modified": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "xslt_param": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "xslt_string_param": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "xslt_stylesheet": {
+        ngxHTTPLocConf | ngxConf1More,
+    },
+    "xslt_types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "zone": {
+        ngxHTTPUpsConf | ngxConfTake12,
+        ngxStreamUpsConf | ngxConfTake12,
+    },
+}
+
+// MatchOssLatest contains directives in latest version of OSS source code(including GEOIP, Perl, and XSLT)
+func MatchOssLatest(directive string) ([]uint, bool) {
+    m, ok := ossLatestDirectives[directive]
+    return m, ok
+}
diff --git a/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_latest_directives.go b/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_latest_directives.go
deleted file mode 100644
index c74abb00c4..0000000000
--- a/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_latest_directives.go
+++ /dev/null
@@ -1,1906 +0,0 @@
-/**
- * Copyright (c) F5, Inc.
- *
- * This source code is licensed under the Apache License, Version 2.0 license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-// All the definitions are extracted from the source code
-// Each bit mask describes these behaviors:
-//   - how many arguments the directive can take
-//   - whether or not it is a block directive
-//   - whether this is a flag (takes one argument that's either "on" or "off")
-//   - which contexts it's allowed to be in
-
-package crossplane
-
-//nolint:gochecknoglobals
-var ngxOssLatestDirectives = map[string][]uint{
-	"absolute_redirect": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"accept_mutex": {
-		ngxEventConf | ngxConfFlag,
-	},
-	"accept_mutex_delay": {
-		ngxEventConf | ngxConfTake1,
-	},
-	"access_log": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"add_after_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"add_before_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"add_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23,
-	},
-	"add_trailer": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23,
-	},
-	"addition_types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"aio": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"aio_write": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"alias": {
-		ngxHTTPLocConf | ngxConfTake1,
-	},
-	"allow": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ancient_browser": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"ancient_browser_value": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"auth_basic": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
-	},
-	"auth_basic_user_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
-	},
-	"auth_delay": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"auth_http": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"auth_http_header": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake2,
-	},
-	"auth_http_pass_client_cert": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-	},
-	"auth_http_timeout": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"auth_request": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"auth_request_set": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"autoindex": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"autoindex_exact_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"autoindex_format": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"autoindex_localtime": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"break": {
-		ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfNoArgs,
-	},
-	"charset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"charset_map": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfTake2,
-	},
-	"charset_types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"chunked_transfer_encoding": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"client_body_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"client_body_in_file_only": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"client_body_in_single_buffer": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"client_body_temp_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-	},
-	"client_body_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"client_header_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"client_header_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"client_max_body_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"connection_pool_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"create_full_put_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"daemon": {
-		ngxMainConf | ngxDirectConf | ngxConfFlag,
-	},
-	"dav_access": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"dav_methods": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"debug_connection": {
-		ngxEventConf | ngxConfTake1,
-	},
-	"debug_points": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"default_type": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"deny": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"directio": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"directio_alignment": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"disable_symlinks": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"empty_gif": {
-		ngxHTTPLocConf | ngxConfNoArgs,
-	},
-	"env": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"error_log": {
-		ngxMainConf | ngxConf1More,
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"error_page": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf2More,
-	},
-	"etag": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"events": {
-		ngxMainConf | ngxConfBlock | ngxConfNoArgs,
-	},
-	"expires": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake12,
-	},
-	"fastcgi_bind": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"fastcgi_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"fastcgi_busy_buffers_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache_background_update": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_cache_bypass": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_cache_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache_lock": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_cache_lock_age": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache_lock_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache_max_range_offset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache_methods": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_cache_min_uses": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache_path": {
-		ngxHTTPMainConf | ngxConf2More,
-	},
-	"fastcgi_cache_revalidate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_cache_use_stale": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_cache_valid": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_catch_stderr": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_force_ranges": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_hide_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_ignore_client_abort": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_ignore_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_index": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_intercept_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_keep_conn": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_limit_rate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_max_temp_file_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_next_upstream": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_next_upstream_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_next_upstream_tries": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_no_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_param": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23,
-	},
-	"fastcgi_pass": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"fastcgi_pass_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_pass_request_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_pass_request_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_request_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_send_lowat": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_socket_keepalive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_split_path_info": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_store": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_store_access": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"fastcgi_temp_file_write_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_temp_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-	},
-	"flv": {
-		ngxHTTPLocConf | ngxConfNoArgs,
-	},
-	"geo": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfTake12,
-		ngxStreamMainConf | ngxConfBlock | ngxConfTake12,
-	},
-	"geoip_city": {
-		ngxHTTPMainConf | ngxConfTake12,
-		ngxStreamMainConf | ngxConfTake12,
-	},
-	"geoip_country": {
-		ngxHTTPMainConf | ngxConfTake12,
-		ngxStreamMainConf | ngxConfTake12,
-	},
-	"geoip_org": {
-		ngxHTTPMainConf | ngxConfTake12,
-		ngxStreamMainConf | ngxConfTake12,
-	},
-	"geoip_proxy": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"geoip_proxy_recursive": {
-		ngxHTTPMainConf | ngxConfFlag,
-	},
-	"google_perftools_profiles": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"grpc_bind": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"grpc_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_hide_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ignore_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"grpc_intercept_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"grpc_next_upstream": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"grpc_next_upstream_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_next_upstream_tries": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_pass": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"grpc_pass_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_set_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"grpc_socket_keepalive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"grpc_ssl_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_certificate_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_ciphers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_conf_command": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"grpc_ssl_crl": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_password_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_protocols": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"grpc_ssl_server_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"grpc_ssl_session_reuse": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"grpc_ssl_trusted_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_verify": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"grpc_ssl_verify_depth": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"gunzip": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"gunzip_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"gzip": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"gzip_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"gzip_comp_level": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"gzip_disable": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"gzip_http_version": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"gzip_min_length": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"gzip_proxied": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"gzip_static": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"gzip_types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"gzip_vary": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"hash": {
-		ngxHTTPUpsConf | ngxConfTake12,
-		ngxStreamUpsConf | ngxConfTake12,
-	},
-	"http": {
-		ngxMainConf | ngxConfBlock | ngxConfNoArgs,
-	},
-	"http2": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"http2_body_preread_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_chunk_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"http2_idle_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_max_concurrent_pushes": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_max_concurrent_streams": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_max_field_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_max_header_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_max_requests": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_push": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"http2_push_preload": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"http2_recv_buffer_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"http2_recv_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http3": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"http3_hq": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"http3_max_concurrent_streams": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http3_stream_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"if": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfExpr | ngxConf1More,
-	},
-	"if_modified_since": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"ignore_invalid_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"image_filter": {
-		ngxHTTPLocConf | ngxConfTake123,
-	},
-	"image_filter_buffer": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"image_filter_interlace": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"image_filter_jpeg_quality": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"image_filter_sharpen": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"image_filter_transparency": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"image_filter_webp_quality": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"imap_auth": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-	},
-	"imap_capabilities": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-	},
-	"imap_client_buffer": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"include": {
-		ngxAnyConf | ngxConfTake1,
-	},
-	"index": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"internal": {
-		ngxHTTPLocConf | ngxConfNoArgs,
-	},
-	"ip_hash": {
-		ngxHTTPUpsConf | ngxConfNoArgs,
-	},
-	"keepalive": {
-		ngxHTTPUpsConf | ngxConfTake1,
-	},
-	"keepalive_disable": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"keepalive_requests": {
-		ngxHTTPUpsConf | ngxConfTake1,
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"keepalive_time": {
-		ngxHTTPUpsConf | ngxConfTake1,
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"keepalive_timeout": {
-		ngxHTTPUpsConf | ngxConfTake1,
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"large_client_header_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake2,
-	},
-	"least_conn": {
-		ngxHTTPUpsConf | ngxConfNoArgs,
-		ngxStreamUpsConf | ngxConfNoArgs,
-	},
-	"limit_conn": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
-	},
-	"limit_conn_dry_run": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"limit_conn_log_level": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"limit_conn_status": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"limit_conn_zone": {
-		ngxHTTPMainConf | ngxConfTake2,
-		ngxStreamMainConf | ngxConfTake2,
-	},
-	"limit_except": {
-		ngxHTTPLocConf | ngxConfBlock | ngxConf1More,
-	},
-	"limit_rate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"limit_rate_after": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"limit_req": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"limit_req_dry_run": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"limit_req_log_level": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"limit_req_status": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"limit_req_zone": {
-		ngxHTTPMainConf | ngxConfTake3,
-	},
-	"lingering_close": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"lingering_time": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"lingering_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"listen": {
-		ngxHTTPSrvConf | ngxConf1More,
-		ngxMailSrvConf | ngxConf1More,
-		ngxStreamSrvConf | ngxConf1More,
-	},
-	"load_module": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"location": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfTake12,
-	},
-	"lock_file": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"log_format": {
-		ngxHTTPMainConf | ngxConf2More,
-		ngxStreamMainConf | ngxConf2More,
-	},
-	"log_not_found": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"log_subrequest": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"mail": {
-		ngxMainConf | ngxConfBlock | ngxConfNoArgs,
-	},
-	"map": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfTake2,
-		ngxStreamMainConf | ngxConfBlock | ngxConfTake2,
-	},
-	"map_hash_bucket_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-		ngxStreamMainConf | ngxConfTake1,
-	},
-	"map_hash_max_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-		ngxStreamMainConf | ngxConfTake1,
-	},
-	"master_process": {
-		ngxMainConf | ngxDirectConf | ngxConfFlag,
-	},
-	"max_errors": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"max_ranges": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_bind": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"memcached_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_gzip_flag": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_next_upstream": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"memcached_next_upstream_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_next_upstream_tries": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_pass": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"memcached_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_socket_keepalive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"merge_slashes": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"min_delete_depth": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"mirror": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"mirror_request_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"modern_browser": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"modern_browser_value": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"mp4": {
-		ngxHTTPLocConf | ngxConfNoArgs,
-	},
-	"mp4_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"mp4_max_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"mp4_start_key_frame": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"msie_padding": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"msie_refresh": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"multi_accept": {
-		ngxEventConf | ngxConfFlag,
-	},
-	"open_file_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"open_file_cache_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"open_file_cache_min_uses": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"open_file_cache_valid": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"open_log_file_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1234,
-	},
-	"output_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"override_charset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"pass": {
-		ngxStreamSrvConf | ngxConfTake1,
-	},
-	"pcre_jit": {
-		ngxMainConf | ngxDirectConf | ngxConfFlag,
-	},
-	"perl": {
-		ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
-	},
-	"perl_modules": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"perl_require": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"perl_set": {
-		ngxHTTPMainConf | ngxConfTake2,
-	},
-	"pid": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"pop3_auth": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-	},
-	"pop3_capabilities": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-	},
-	"port_in_redirect": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"postpone_output": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"preread_buffer_size": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"preread_timeout": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"protocol": {
-		ngxMailSrvConf | ngxConfTake1,
-	},
-	"proxy_bind": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12,
-	},
-	"proxy_buffer": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"proxy_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"proxy_busy_buffers_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache_background_update": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_cache_bypass": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"proxy_cache_convert_head": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_cache_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache_lock": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_cache_lock_age": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache_lock_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache_max_range_offset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache_methods": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"proxy_cache_min_uses": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache_path": {
-		ngxHTTPMainConf | ngxConf2More,
-	},
-	"proxy_cache_revalidate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_cache_use_stale": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"proxy_cache_valid": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"proxy_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_cookie_domain": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"proxy_cookie_flags": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-	},
-	"proxy_cookie_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"proxy_download_rate": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_force_ranges": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_half_close": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_headers_hash_bucket_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_headers_hash_max_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_hide_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_http_version": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_ignore_client_abort": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_ignore_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"proxy_intercept_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_limit_rate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_max_temp_file_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_method": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_next_upstream": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_next_upstream_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_next_upstream_tries": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_no_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"proxy_pass": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConfTake1,
-		ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_pass_error_message": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-	},
-	"proxy_pass_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_pass_request_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_pass_request_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_protocol": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_protocol_timeout": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_redirect": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"proxy_request_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_requests": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_responses": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_send_lowat": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_set_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_set_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"proxy_smtp_auth": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-	},
-	"proxy_socket_keepalive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_ssl": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_ssl_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_certificate_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_ciphers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_conf_command": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
-	},
-	"proxy_ssl_crl": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_password_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_protocols": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"proxy_ssl_server_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_ssl_session_reuse": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_ssl_trusted_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_verify": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_ssl_verify_depth": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_store": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_store_access": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"proxy_temp_file_write_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_temp_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-	},
-	"proxy_timeout": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_upload_rate": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"quic_active_connection_id_limit": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"quic_bpf": {
-		ngxMainConf | ngxDirectConf | ngxConfFlag,
-	},
-	"quic_gso": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"quic_host_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"quic_retry": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"random": {
-		ngxHTTPUpsConf | ngxConfNoArgs | ngxConfTake12,
-		ngxStreamUpsConf | ngxConfNoArgs | ngxConfTake12,
-	},
-	"random_index": {
-		ngxHTTPLocConf | ngxConfFlag,
-	},
-	"read_ahead": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"real_ip_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"real_ip_recursive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"recursive_error_pages": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"referer_hash_bucket_size": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"referer_hash_max_size": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"request_pool_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"reset_timedout_connection": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"resolver": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"resolver_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"return": {
-		ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake12,
-		ngxStreamSrvConf | ngxConfTake1,
-	},
-	"rewrite": {
-		ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23,
-	},
-	"rewrite_log": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"root": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"satisfy": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_bind": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"scgi_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"scgi_busy_buffers_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache_background_update": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_cache_bypass": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_cache_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache_lock": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_cache_lock_age": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache_lock_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache_max_range_offset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache_methods": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_cache_min_uses": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache_path": {
-		ngxHTTPMainConf | ngxConf2More,
-	},
-	"scgi_cache_revalidate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_cache_use_stale": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_cache_valid": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_force_ranges": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_hide_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_ignore_client_abort": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_ignore_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_intercept_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_limit_rate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_max_temp_file_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_next_upstream": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_next_upstream_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_next_upstream_tries": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_no_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_param": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23,
-	},
-	"scgi_pass": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"scgi_pass_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_pass_request_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_pass_request_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_request_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_socket_keepalive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_store": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_store_access": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"scgi_temp_file_write_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_temp_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-	},
-	"secure_link": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"secure_link_md5": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"secure_link_secret": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"send_lowat": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"sendfile": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"sendfile_max_chunk": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"server": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfNoArgs,
-		ngxHTTPUpsConf | ngxConf1More,
-		ngxMailMainConf | ngxConfBlock | ngxConfNoArgs,
-		ngxStreamMainConf | ngxConfBlock | ngxConfNoArgs,
-		ngxStreamUpsConf | ngxConf1More,
-	},
-	"server_name": {
-		ngxHTTPSrvConf | ngxConf1More,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamSrvConf | ngxConf1More,
-	},
-	"server_name_in_redirect": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"server_names_hash_bucket_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-		ngxStreamMainConf | ngxConfTake1,
-	},
-	"server_names_hash_max_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-		ngxStreamMainConf | ngxConfTake1,
-	},
-	"server_tokens": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"set": {
-		ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake2,
-		ngxStreamSrvConf | ngxConfTake2,
-	},
-	"set_real_ip_from": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"slice": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"smtp_auth": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-	},
-	"smtp_capabilities": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-	},
-	"smtp_client_buffer": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"smtp_greeting_delay": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"source_charset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"split_clients": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfTake2,
-		ngxStreamMainConf | ngxConfBlock | ngxConfTake2,
-	},
-	"ssi": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"ssi_last_modified": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"ssi_min_file_chunk": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"ssi_silent_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"ssi_types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"ssi_value_length": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"ssl_alpn": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"ssl_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_certificate_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_ciphers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_client_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_conf_command": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake2,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake2,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
-	},
-	"ssl_crl": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_dhparam": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_early_data": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"ssl_ecdh_curve": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_engine": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"ssl_handshake_timeout": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_ocsp": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"ssl_ocsp_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_ocsp_responder": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_password_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_prefer_server_ciphers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"ssl_preread": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"ssl_protocols": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConf1More,
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"ssl_reject_handshake": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"ssl_session_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake12,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake12,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12,
-	},
-	"ssl_session_ticket_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_session_tickets": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"ssl_session_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_stapling": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"ssl_stapling_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_stapling_responder": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_stapling_verify": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"ssl_trusted_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_verify_client": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_verify_depth": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"starttls": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"stream": {
-		ngxMainConf | ngxConfBlock | ngxConfNoArgs,
-	},
-	"stub_status": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfNoArgs | ngxConfTake1,
-	},
-	"sub_filter": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"sub_filter_last_modified": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"sub_filter_once": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"sub_filter_types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"subrequest_output_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"tcp_nodelay": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"tcp_nopush": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"thread_pool": {
-		ngxMainConf | ngxDirectConf | ngxConfTake23,
-	},
-	"timeout": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"timer_resolution": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"try_files": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf2More,
-	},
-	"types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfNoArgs,
-	},
-	"types_hash_bucket_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"types_hash_max_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"underscores_in_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"uninitialized_variable_warn": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"upstream": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfTake1,
-		ngxStreamMainConf | ngxConfBlock | ngxConfTake1,
-	},
-	"use": {
-		ngxEventConf | ngxConfTake1,
-	},
-	"user": {
-		ngxMainConf | ngxDirectConf | ngxConfTake12,
-	},
-	"userid": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_domain": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_expires": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_flags": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"userid_mark": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_p3p": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_service": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_bind": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"uwsgi_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"uwsgi_busy_buffers_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_background_update": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_bypass": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_cache_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_lock": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_cache_lock_age": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_lock_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_max_range_offset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_methods": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_cache_min_uses": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_path": {
-		ngxHTTPMainConf | ngxConf2More,
-	},
-	"uwsgi_cache_revalidate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_cache_use_stale": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_cache_valid": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_force_ranges": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_hide_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ignore_client_abort": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_ignore_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_intercept_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_limit_rate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_max_temp_file_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_modifier1": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_modifier2": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_next_upstream": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_next_upstream_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_next_upstream_tries": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_no_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_param": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23,
-	},
-	"uwsgi_pass": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"uwsgi_pass_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_pass_request_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_pass_request_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_request_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_socket_keepalive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_ssl_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_certificate_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_ciphers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_conf_command": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"uwsgi_ssl_crl": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_password_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_protocols": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_ssl_server_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_ssl_session_reuse": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_ssl_trusted_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_verify": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_ssl_verify_depth": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_store": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_store_access": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"uwsgi_temp_file_write_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_temp_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-	},
-	"valid_referers": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"variables_hash_bucket_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-		ngxStreamMainConf | ngxConfTake1,
-	},
-	"variables_hash_max_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-		ngxStreamMainConf | ngxConfTake1,
-	},
-	"worker_aio_requests": {
-		ngxEventConf | ngxConfTake1,
-	},
-	"worker_connections": {
-		ngxEventConf | ngxConfTake1,
-	},
-	"worker_cpu_affinity": {
-		ngxMainConf | ngxDirectConf | ngxConf1More,
-	},
-	"worker_priority": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"worker_processes": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"worker_rlimit_core": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"worker_rlimit_nofile": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"worker_shutdown_timeout": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"working_directory": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"xclient": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-	},
-	"xml_entities": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"xslt_last_modified": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"xslt_param": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"xslt_string_param": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"xslt_stylesheet": {
-		ngxHTTPLocConf | ngxConf1More,
-	},
-	"xslt_types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"zone": {
-		ngxHTTPUpsConf | ngxConfTake12,
-		ngxStreamUpsConf | ngxConfTake12,
-	},
-}
-
-func OssLatestDirectivesMatchFn(directive string) ([]uint, bool) {
-	masks, matched := ngxOssLatestDirectives[directive]
-	return masks, matched
-}
diff --git a/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_otel_directives.gen.go b/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_otel_directives.gen.go
new file mode 100644
index 0000000000..5047bf39f2
--- /dev/null
+++ b/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_otel_directives.gen.go
@@ -0,0 +1,43 @@
+/**
+ * Copyright (c) F5, Inc.
+ *
+ * This source code is licensed under the Apache License, Version 2.0 license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+// Code generated by generator; DO NOT EDIT.
+// All the definitions are extracted from the source code
+// Each bit mask describes these behaviors:
+//   - how many arguments the directive can take
+//   - whether or not it is a block directive
+//   - whether this is a flag (takes one argument that's either "on" or "off")
+//   - which contexts it's allowed to be in
+
+package crossplane
+
+var otelDirectives = map[string][]uint{
+    "otel_exporter": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfNoArgs,
+    },
+    "otel_service_name": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "otel_span_attr": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "otel_span_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "otel_trace": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "otel_trace_context": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+}
+
+// MatchOtelLatest is a MatchFunc for latest version of otel.
+func MatchOtelLatest(directive string) ([]uint, bool) {
+    m, ok := otelDirectives[directive]
+    return m, ok
+}
diff --git a/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_otel_directives.go b/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_otel_directives.go
deleted file mode 100644
index b597179ff2..0000000000
--- a/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_otel_directives.go
+++ /dev/null
@@ -1,54 +0,0 @@
-/**
- * Copyright (c) F5, Inc.
- *
- * This source code is licensed under the Apache License, Version 2.0 license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-// All the definitions are extracted from the source code
-// Each bit mask describes these behaviors:
-//   - how many arguments the directive can take
-//   - whether or not it is a block directive
-//   - whether this is a flag (takes one argument that's either "on" or "off")
-//   - which contexts it's allowed to be in
-
-package crossplane
-
-//nolint:gochecknoglobals
-var moduleOtelDirectives = map[string][]uint{
-	"batch_count": {
-		ngxConfTake1,
-	},
-	"batch_size": {
-		ngxConfTake1,
-	},
-	"endpoint": {
-		ngxConfTake1,
-	},
-	"interval": {
-		ngxConfTake1,
-	},
-	"otel_exporter": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfNoArgs,
-	},
-	"otel_service_name": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"otel_span_attr": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"otel_span_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"otel_trace": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"otel_trace_context": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-}
-
-func OtelDirectivesMatchFn(directive string) ([]uint, bool) {
-	masks, matched := moduleOtelDirectives[directive]
-	return masks, matched
-}
diff --git a/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/buffer.go b/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/buffer.go
index f43186fcaa..0da6dcac32 100644
--- a/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/buffer.go
+++ b/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/buffer.go
@@ -14,7 +14,7 @@ import (
 
 // Creator abstracts file creation (to write configs to something other than files).
 type Creator interface {
-	Create(string) (io.WriteCloser, error)
+	Create(path string) (io.WriteCloser, error)
 	Reset()
 }
 
diff --git a/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/parse.go b/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/parse.go
index 4d44904709..2f3126f7d5 100644
--- a/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/parse.go
+++ b/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/parse.go
@@ -385,7 +385,6 @@ func (p *parser) parse(parsing *Config, tokens <-chan NgxToken, ctx blockCtx, co
 				// if the file pattern was explicit, nginx will check
 				// that the included file can be opened and read
 				if f, err := p.openFile(pattern); err != nil {
-					defer f.Close()
 					perr := &ParseError{
 						What:      err.Error(),
 						File:      &parsing.File,
@@ -399,6 +398,7 @@ func (p *parser) parse(parsing *Config, tokens <-chan NgxToken, ctx blockCtx, co
 						return nil, perr
 					}
 				} else {
+					defer f.Close()
 					fnames = []string{pattern}
 				}
 			}
diff --git a/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/tools.go b/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/tools.go
index 2114566b8f..ece0bb62e4 100644
--- a/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/tools.go
+++ b/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/tools.go
@@ -4,10 +4,10 @@
 // This file just exists to ensure we download the tools we need for building
 // See https://github.com/golang/go/wiki/Modules#how-can-i-track-tool-dependencies-for-a-module
 
-package tools
+package crossplane
 
 import (
-	_ "github.com/jstemmer/go-junit-report"
-	_ "github.com/maxbrunsfeld/counterfeiter/v6"
-	_ "golang.org/x/tools/cmd/goimports"
+	_ "github.com/jstemmer/go-junit-report/parser"
+	_ "github.com/maxbrunsfeld/counterfeiter/v6/generator"
+	_ "golang.org/x/tools/imports"
 )
diff --git a/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/util.go b/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/util.go
index d2e84adeb9..b7af673bf8 100644
--- a/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/util.go
+++ b/test/integration/vendor/github.com/nginxinc/nginx-go-crossplane/util.go
@@ -64,7 +64,7 @@ func validExpr(d *Directive) bool {
 		strings.HasSuffix(d.Args[e], ")") &&
 		((l == 1 && len(d.Args[b]) > 2) || // empty expression single arg '()'
 			(l == 2 && (len(d.Args[b]) > 1 || len(d.Args[e]) > 1)) || // empty expression two args '(', ')'
-			(l > 2))
+			(l > 2)) //nolint: mnd
 }
 
 // prepareIfArgs removes parentheses from an `if` directive's arguments.
diff --git a/test/integration/vendor/github.com/stretchr/testify/assert/assertion_compare.go b/test/integration/vendor/github.com/stretchr/testify/assert/assertion_compare.go
index 4d4b4aad6f..7e19eba090 100644
--- a/test/integration/vendor/github.com/stretchr/testify/assert/assertion_compare.go
+++ b/test/integration/vendor/github.com/stretchr/testify/assert/assertion_compare.go
@@ -7,10 +7,13 @@ import (
 	"time"
 )
 
-type CompareType int
+// Deprecated: CompareType has only ever been for internal use and has accidentally been published since v1.6.0. Do not use it.
+type CompareType = compareResult
+
+type compareResult int
 
 const (
-	compareLess CompareType = iota - 1
+	compareLess compareResult = iota - 1
 	compareEqual
 	compareGreater
 )
@@ -39,7 +42,7 @@ var (
 	bytesType = reflect.TypeOf([]byte{})
 )
 
-func compare(obj1, obj2 interface{}, kind reflect.Kind) (CompareType, bool) {
+func compare(obj1, obj2 interface{}, kind reflect.Kind) (compareResult, bool) {
 	obj1Value := reflect.ValueOf(obj1)
 	obj2Value := reflect.ValueOf(obj2)
 
@@ -325,7 +328,13 @@ func compare(obj1, obj2 interface{}, kind reflect.Kind) (CompareType, bool) {
 				timeObj2 = obj2Value.Convert(timeType).Interface().(time.Time)
 			}
 
-			return compare(timeObj1.UnixNano(), timeObj2.UnixNano(), reflect.Int64)
+			if timeObj1.Before(timeObj2) {
+				return compareLess, true
+			}
+			if timeObj1.Equal(timeObj2) {
+				return compareEqual, true
+			}
+			return compareGreater, true
 		}
 	case reflect.Slice:
 		{
@@ -345,7 +354,7 @@ func compare(obj1, obj2 interface{}, kind reflect.Kind) (CompareType, bool) {
 				bytesObj2 = obj2Value.Convert(bytesType).Interface().([]byte)
 			}
 
-			return CompareType(bytes.Compare(bytesObj1, bytesObj2)), true
+			return compareResult(bytes.Compare(bytesObj1, bytesObj2)), true
 		}
 	case reflect.Uintptr:
 		{
@@ -381,7 +390,7 @@ func Greater(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
 	}
-	return compareTwoValues(t, e1, e2, []CompareType{compareGreater}, "\"%v\" is not greater than \"%v\"", msgAndArgs...)
+	return compareTwoValues(t, e1, e2, []compareResult{compareGreater}, "\"%v\" is not greater than \"%v\"", msgAndArgs...)
 }
 
 // GreaterOrEqual asserts that the first element is greater than or equal to the second
@@ -394,7 +403,7 @@ func GreaterOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...in
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
 	}
-	return compareTwoValues(t, e1, e2, []CompareType{compareGreater, compareEqual}, "\"%v\" is not greater than or equal to \"%v\"", msgAndArgs...)
+	return compareTwoValues(t, e1, e2, []compareResult{compareGreater, compareEqual}, "\"%v\" is not greater than or equal to \"%v\"", msgAndArgs...)
 }
 
 // Less asserts that the first element is less than the second
@@ -406,7 +415,7 @@ func Less(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{})
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
 	}
-	return compareTwoValues(t, e1, e2, []CompareType{compareLess}, "\"%v\" is not less than \"%v\"", msgAndArgs...)
+	return compareTwoValues(t, e1, e2, []compareResult{compareLess}, "\"%v\" is not less than \"%v\"", msgAndArgs...)
 }
 
 // LessOrEqual asserts that the first element is less than or equal to the second
@@ -419,7 +428,7 @@ func LessOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...inter
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
 	}
-	return compareTwoValues(t, e1, e2, []CompareType{compareLess, compareEqual}, "\"%v\" is not less than or equal to \"%v\"", msgAndArgs...)
+	return compareTwoValues(t, e1, e2, []compareResult{compareLess, compareEqual}, "\"%v\" is not less than or equal to \"%v\"", msgAndArgs...)
 }
 
 // Positive asserts that the specified element is positive
@@ -431,7 +440,7 @@ func Positive(t TestingT, e interface{}, msgAndArgs ...interface{}) bool {
 		h.Helper()
 	}
 	zero := reflect.Zero(reflect.TypeOf(e))
-	return compareTwoValues(t, e, zero.Interface(), []CompareType{compareGreater}, "\"%v\" is not positive", msgAndArgs...)
+	return compareTwoValues(t, e, zero.Interface(), []compareResult{compareGreater}, "\"%v\" is not positive", msgAndArgs...)
 }
 
 // Negative asserts that the specified element is negative
@@ -443,10 +452,10 @@ func Negative(t TestingT, e interface{}, msgAndArgs ...interface{}) bool {
 		h.Helper()
 	}
 	zero := reflect.Zero(reflect.TypeOf(e))
-	return compareTwoValues(t, e, zero.Interface(), []CompareType{compareLess}, "\"%v\" is not negative", msgAndArgs...)
+	return compareTwoValues(t, e, zero.Interface(), []compareResult{compareLess}, "\"%v\" is not negative", msgAndArgs...)
 }
 
-func compareTwoValues(t TestingT, e1 interface{}, e2 interface{}, allowedComparesResults []CompareType, failMessage string, msgAndArgs ...interface{}) bool {
+func compareTwoValues(t TestingT, e1 interface{}, e2 interface{}, allowedComparesResults []compareResult, failMessage string, msgAndArgs ...interface{}) bool {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
 	}
@@ -469,7 +478,7 @@ func compareTwoValues(t TestingT, e1 interface{}, e2 interface{}, allowedCompare
 	return true
 }
 
-func containsValue(values []CompareType, value CompareType) bool {
+func containsValue(values []compareResult, value compareResult) bool {
 	for _, v := range values {
 		if v == value {
 			return true
diff --git a/test/integration/vendor/github.com/stretchr/testify/assert/assertion_format.go b/test/integration/vendor/github.com/stretchr/testify/assert/assertion_format.go
index 3ddab109ad..1906341657 100644
--- a/test/integration/vendor/github.com/stretchr/testify/assert/assertion_format.go
+++ b/test/integration/vendor/github.com/stretchr/testify/assert/assertion_format.go
@@ -104,8 +104,8 @@ func EqualExportedValuesf(t TestingT, expected interface{}, actual interface{},
 	return EqualExportedValues(t, expected, actual, append([]interface{}{msg}, args...)...)
 }
 
-// EqualValuesf asserts that two objects are equal or convertible to the same types
-// and equal.
+// EqualValuesf asserts that two objects are equal or convertible to the larger
+// type and equal.
 //
 //	assert.EqualValuesf(t, uint32(123), int32(123), "error message %s", "formatted")
 func EqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool {
@@ -186,7 +186,7 @@ func Eventuallyf(t TestingT, condition func() bool, waitFor time.Duration, tick
 //	assert.EventuallyWithTf(t, func(c *assert.CollectT, "error message %s", "formatted") {
 //		// add assertions as needed; any assertion failure will fail the current tick
 //		assert.True(c, externalValue, "expected 'externalValue' to be true")
-//	}, 1*time.Second, 10*time.Second, "external state has not changed to 'true'; still false")
+//	}, 10*time.Second, 1*time.Second, "external state has not changed to 'true'; still false")
 func EventuallyWithTf(t TestingT, condition func(collect *CollectT), waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) bool {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -568,6 +568,23 @@ func NotContainsf(t TestingT, s interface{}, contains interface{}, msg string, a
 	return NotContains(t, s, contains, append([]interface{}{msg}, args...)...)
 }
 
+// NotElementsMatchf asserts that the specified listA(array, slice...) is NOT equal to specified
+// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements,
+// the number of appearances of each of them in both lists should not match.
+// This is an inverse of ElementsMatch.
+//
+// assert.NotElementsMatchf(t, [1, 1, 2, 3], [1, 1, 2, 3], "error message %s", "formatted") -> false
+//
+// assert.NotElementsMatchf(t, [1, 1, 2, 3], [1, 2, 3], "error message %s", "formatted") -> true
+//
+// assert.NotElementsMatchf(t, [1, 2, 3], [1, 2, 4], "error message %s", "formatted") -> true
+func NotElementsMatchf(t TestingT, listA interface{}, listB interface{}, msg string, args ...interface{}) bool {
+	if h, ok := t.(tHelper); ok {
+		h.Helper()
+	}
+	return NotElementsMatch(t, listA, listB, append([]interface{}{msg}, args...)...)
+}
+
 // NotEmptyf asserts that the specified object is NOT empty.  I.e. not nil, "", false, 0 or either
 // a slice or a channel with len == 0.
 //
@@ -604,7 +621,16 @@ func NotEqualValuesf(t TestingT, expected interface{}, actual interface{}, msg s
 	return NotEqualValues(t, expected, actual, append([]interface{}{msg}, args...)...)
 }
 
-// NotErrorIsf asserts that at none of the errors in err's chain matches target.
+// NotErrorAsf asserts that none of the errors in err's chain matches target,
+// but if so, sets target to that error value.
+func NotErrorAsf(t TestingT, err error, target interface{}, msg string, args ...interface{}) bool {
+	if h, ok := t.(tHelper); ok {
+		h.Helper()
+	}
+	return NotErrorAs(t, err, target, append([]interface{}{msg}, args...)...)
+}
+
+// NotErrorIsf asserts that none of the errors in err's chain matches target.
 // This is a wrapper for errors.Is.
 func NotErrorIsf(t TestingT, err error, target error, msg string, args ...interface{}) bool {
 	if h, ok := t.(tHelper); ok {
diff --git a/test/integration/vendor/github.com/stretchr/testify/assert/assertion_forward.go b/test/integration/vendor/github.com/stretchr/testify/assert/assertion_forward.go
index a84e09bd40..21629087ba 100644
--- a/test/integration/vendor/github.com/stretchr/testify/assert/assertion_forward.go
+++ b/test/integration/vendor/github.com/stretchr/testify/assert/assertion_forward.go
@@ -186,8 +186,8 @@ func (a *Assertions) EqualExportedValuesf(expected interface{}, actual interface
 	return EqualExportedValuesf(a.t, expected, actual, msg, args...)
 }
 
-// EqualValues asserts that two objects are equal or convertible to the same types
-// and equal.
+// EqualValues asserts that two objects are equal or convertible to the larger
+// type and equal.
 //
 //	a.EqualValues(uint32(123), int32(123))
 func (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool {
@@ -197,8 +197,8 @@ func (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAn
 	return EqualValues(a.t, expected, actual, msgAndArgs...)
 }
 
-// EqualValuesf asserts that two objects are equal or convertible to the same types
-// and equal.
+// EqualValuesf asserts that two objects are equal or convertible to the larger
+// type and equal.
 //
 //	a.EqualValuesf(uint32(123), int32(123), "error message %s", "formatted")
 func (a *Assertions) EqualValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool {
@@ -336,7 +336,7 @@ func (a *Assertions) Eventually(condition func() bool, waitFor time.Duration, ti
 //	a.EventuallyWithT(func(c *assert.CollectT) {
 //		// add assertions as needed; any assertion failure will fail the current tick
 //		assert.True(c, externalValue, "expected 'externalValue' to be true")
-//	}, 1*time.Second, 10*time.Second, "external state has not changed to 'true'; still false")
+//	}, 10*time.Second, 1*time.Second, "external state has not changed to 'true'; still false")
 func (a *Assertions) EventuallyWithT(condition func(collect *CollectT), waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) bool {
 	if h, ok := a.t.(tHelper); ok {
 		h.Helper()
@@ -361,7 +361,7 @@ func (a *Assertions) EventuallyWithT(condition func(collect *CollectT), waitFor
 //	a.EventuallyWithTf(func(c *assert.CollectT, "error message %s", "formatted") {
 //		// add assertions as needed; any assertion failure will fail the current tick
 //		assert.True(c, externalValue, "expected 'externalValue' to be true")
-//	}, 1*time.Second, 10*time.Second, "external state has not changed to 'true'; still false")
+//	}, 10*time.Second, 1*time.Second, "external state has not changed to 'true'; still false")
 func (a *Assertions) EventuallyWithTf(condition func(collect *CollectT), waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) bool {
 	if h, ok := a.t.(tHelper); ok {
 		h.Helper()
@@ -1128,6 +1128,40 @@ func (a *Assertions) NotContainsf(s interface{}, contains interface{}, msg strin
 	return NotContainsf(a.t, s, contains, msg, args...)
 }
 
+// NotElementsMatch asserts that the specified listA(array, slice...) is NOT equal to specified
+// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements,
+// the number of appearances of each of them in both lists should not match.
+// This is an inverse of ElementsMatch.
+//
+// a.NotElementsMatch([1, 1, 2, 3], [1, 1, 2, 3]) -> false
+//
+// a.NotElementsMatch([1, 1, 2, 3], [1, 2, 3]) -> true
+//
+// a.NotElementsMatch([1, 2, 3], [1, 2, 4]) -> true
+func (a *Assertions) NotElementsMatch(listA interface{}, listB interface{}, msgAndArgs ...interface{}) bool {
+	if h, ok := a.t.(tHelper); ok {
+		h.Helper()
+	}
+	return NotElementsMatch(a.t, listA, listB, msgAndArgs...)
+}
+
+// NotElementsMatchf asserts that the specified listA(array, slice...) is NOT equal to specified
+// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements,
+// the number of appearances of each of them in both lists should not match.
+// This is an inverse of ElementsMatch.
+//
+// a.NotElementsMatchf([1, 1, 2, 3], [1, 1, 2, 3], "error message %s", "formatted") -> false
+//
+// a.NotElementsMatchf([1, 1, 2, 3], [1, 2, 3], "error message %s", "formatted") -> true
+//
+// a.NotElementsMatchf([1, 2, 3], [1, 2, 4], "error message %s", "formatted") -> true
+func (a *Assertions) NotElementsMatchf(listA interface{}, listB interface{}, msg string, args ...interface{}) bool {
+	if h, ok := a.t.(tHelper); ok {
+		h.Helper()
+	}
+	return NotElementsMatchf(a.t, listA, listB, msg, args...)
+}
+
 // NotEmpty asserts that the specified object is NOT empty.  I.e. not nil, "", false, 0 or either
 // a slice or a channel with len == 0.
 //
@@ -1200,7 +1234,25 @@ func (a *Assertions) NotEqualf(expected interface{}, actual interface{}, msg str
 	return NotEqualf(a.t, expected, actual, msg, args...)
 }
 
-// NotErrorIs asserts that at none of the errors in err's chain matches target.
+// NotErrorAs asserts that none of the errors in err's chain matches target,
+// but if so, sets target to that error value.
+func (a *Assertions) NotErrorAs(err error, target interface{}, msgAndArgs ...interface{}) bool {
+	if h, ok := a.t.(tHelper); ok {
+		h.Helper()
+	}
+	return NotErrorAs(a.t, err, target, msgAndArgs...)
+}
+
+// NotErrorAsf asserts that none of the errors in err's chain matches target,
+// but if so, sets target to that error value.
+func (a *Assertions) NotErrorAsf(err error, target interface{}, msg string, args ...interface{}) bool {
+	if h, ok := a.t.(tHelper); ok {
+		h.Helper()
+	}
+	return NotErrorAsf(a.t, err, target, msg, args...)
+}
+
+// NotErrorIs asserts that none of the errors in err's chain matches target.
 // This is a wrapper for errors.Is.
 func (a *Assertions) NotErrorIs(err error, target error, msgAndArgs ...interface{}) bool {
 	if h, ok := a.t.(tHelper); ok {
@@ -1209,7 +1261,7 @@ func (a *Assertions) NotErrorIs(err error, target error, msgAndArgs ...interface
 	return NotErrorIs(a.t, err, target, msgAndArgs...)
 }
 
-// NotErrorIsf asserts that at none of the errors in err's chain matches target.
+// NotErrorIsf asserts that none of the errors in err's chain matches target.
 // This is a wrapper for errors.Is.
 func (a *Assertions) NotErrorIsf(err error, target error, msg string, args ...interface{}) bool {
 	if h, ok := a.t.(tHelper); ok {
diff --git a/test/integration/vendor/github.com/stretchr/testify/assert/assertion_order.go b/test/integration/vendor/github.com/stretchr/testify/assert/assertion_order.go
index 00df62a059..1d2f71824a 100644
--- a/test/integration/vendor/github.com/stretchr/testify/assert/assertion_order.go
+++ b/test/integration/vendor/github.com/stretchr/testify/assert/assertion_order.go
@@ -6,7 +6,7 @@ import (
 )
 
 // isOrdered checks that collection contains orderable elements.
-func isOrdered(t TestingT, object interface{}, allowedComparesResults []CompareType, failMessage string, msgAndArgs ...interface{}) bool {
+func isOrdered(t TestingT, object interface{}, allowedComparesResults []compareResult, failMessage string, msgAndArgs ...interface{}) bool {
 	objKind := reflect.TypeOf(object).Kind()
 	if objKind != reflect.Slice && objKind != reflect.Array {
 		return false
@@ -50,7 +50,7 @@ func isOrdered(t TestingT, object interface{}, allowedComparesResults []CompareT
 //	assert.IsIncreasing(t, []float{1, 2})
 //	assert.IsIncreasing(t, []string{"a", "b"})
 func IsIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
-	return isOrdered(t, object, []CompareType{compareLess}, "\"%v\" is not less than \"%v\"", msgAndArgs...)
+	return isOrdered(t, object, []compareResult{compareLess}, "\"%v\" is not less than \"%v\"", msgAndArgs...)
 }
 
 // IsNonIncreasing asserts that the collection is not increasing
@@ -59,7 +59,7 @@ func IsIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) boo
 //	assert.IsNonIncreasing(t, []float{2, 1})
 //	assert.IsNonIncreasing(t, []string{"b", "a"})
 func IsNonIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
-	return isOrdered(t, object, []CompareType{compareEqual, compareGreater}, "\"%v\" is not greater than or equal to \"%v\"", msgAndArgs...)
+	return isOrdered(t, object, []compareResult{compareEqual, compareGreater}, "\"%v\" is not greater than or equal to \"%v\"", msgAndArgs...)
 }
 
 // IsDecreasing asserts that the collection is decreasing
@@ -68,7 +68,7 @@ func IsNonIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{})
 //	assert.IsDecreasing(t, []float{2, 1})
 //	assert.IsDecreasing(t, []string{"b", "a"})
 func IsDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
-	return isOrdered(t, object, []CompareType{compareGreater}, "\"%v\" is not greater than \"%v\"", msgAndArgs...)
+	return isOrdered(t, object, []compareResult{compareGreater}, "\"%v\" is not greater than \"%v\"", msgAndArgs...)
 }
 
 // IsNonDecreasing asserts that the collection is not decreasing
@@ -77,5 +77,5 @@ func IsDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) boo
 //	assert.IsNonDecreasing(t, []float{1, 2})
 //	assert.IsNonDecreasing(t, []string{"a", "b"})
 func IsNonDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
-	return isOrdered(t, object, []CompareType{compareLess, compareEqual}, "\"%v\" is not less than or equal to \"%v\"", msgAndArgs...)
+	return isOrdered(t, object, []compareResult{compareLess, compareEqual}, "\"%v\" is not less than or equal to \"%v\"", msgAndArgs...)
 }
diff --git a/test/integration/vendor/github.com/stretchr/testify/assert/assertions.go b/test/integration/vendor/github.com/stretchr/testify/assert/assertions.go
index 0b7570f21c..4e91332bb5 100644
--- a/test/integration/vendor/github.com/stretchr/testify/assert/assertions.go
+++ b/test/integration/vendor/github.com/stretchr/testify/assert/assertions.go
@@ -19,7 +19,9 @@ import (
 
 	"github.com/davecgh/go-spew/spew"
 	"github.com/pmezard/go-difflib/difflib"
-	"gopkg.in/yaml.v3"
+
+	// Wrapper around gopkg.in/yaml.v3
+	"github.com/stretchr/testify/assert/yaml"
 )
 
 //go:generate sh -c "cd ../_codegen && go build && cd - && ../_codegen/_codegen -output-package=assert -template=assertion_format.go.tmpl"
@@ -45,6 +47,10 @@ type BoolAssertionFunc func(TestingT, bool, ...interface{}) bool
 // for table driven tests.
 type ErrorAssertionFunc func(TestingT, error, ...interface{}) bool
 
+// PanicAssertionFunc is a common function prototype when validating a panic value.  Can be useful
+// for table driven tests.
+type PanicAssertionFunc = func(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool
+
 // Comparison is a custom function that returns true on success and false on failure
 type Comparison func() (success bool)
 
@@ -496,7 +502,13 @@ func Same(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) b
 		h.Helper()
 	}
 
-	if !samePointers(expected, actual) {
+	same, ok := samePointers(expected, actual)
+	if !ok {
+		return Fail(t, "Both arguments must be pointers", msgAndArgs...)
+	}
+
+	if !same {
+		// both are pointers but not the same type & pointing to the same address
 		return Fail(t, fmt.Sprintf("Not same: \n"+
 			"expected: %p %#v\n"+
 			"actual  : %p %#v", expected, expected, actual, actual), msgAndArgs...)
@@ -516,7 +528,13 @@ func NotSame(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}
 		h.Helper()
 	}
 
-	if samePointers(expected, actual) {
+	same, ok := samePointers(expected, actual)
+	if !ok {
+		//fails when the arguments are not pointers
+		return !(Fail(t, "Both arguments must be pointers", msgAndArgs...))
+	}
+
+	if same {
 		return Fail(t, fmt.Sprintf(
 			"Expected and actual point to the same object: %p %#v",
 			expected, expected), msgAndArgs...)
@@ -524,21 +542,23 @@ func NotSame(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}
 	return true
 }
 
-// samePointers compares two generic interface objects and returns whether
-// they point to the same object
-func samePointers(first, second interface{}) bool {
+// samePointers checks if two generic interface objects are pointers of the same
+// type pointing to the same object. It returns two values: same indicating if
+// they are the same type and point to the same object, and ok indicating that
+// both inputs are pointers.
+func samePointers(first, second interface{}) (same bool, ok bool) {
 	firstPtr, secondPtr := reflect.ValueOf(first), reflect.ValueOf(second)
 	if firstPtr.Kind() != reflect.Ptr || secondPtr.Kind() != reflect.Ptr {
-		return false
+		return false, false //not both are pointers
 	}
 
 	firstType, secondType := reflect.TypeOf(first), reflect.TypeOf(second)
 	if firstType != secondType {
-		return false
+		return false, true // both are pointers, but of different types
 	}
 
 	// compare pointer addresses
-	return first == second
+	return first == second, true
 }
 
 // formatUnequalValues takes two values of arbitrary types and returns string
@@ -572,8 +592,8 @@ func truncatingFormat(data interface{}) string {
 	return value
 }
 
-// EqualValues asserts that two objects are equal or convertible to the same types
-// and equal.
+// EqualValues asserts that two objects are equal or convertible to the larger
+// type and equal.
 //
 //	assert.EqualValues(t, uint32(123), int32(123))
 func EqualValues(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool {
@@ -615,21 +635,6 @@ func EqualExportedValues(t TestingT, expected, actual interface{}, msgAndArgs ..
 		return Fail(t, fmt.Sprintf("Types expected to match exactly\n\t%v != %v", aType, bType), msgAndArgs...)
 	}
 
-	if aType.Kind() == reflect.Ptr {
-		aType = aType.Elem()
-	}
-	if bType.Kind() == reflect.Ptr {
-		bType = bType.Elem()
-	}
-
-	if aType.Kind() != reflect.Struct {
-		return Fail(t, fmt.Sprintf("Types expected to both be struct or pointer to struct \n\t%v != %v", aType.Kind(), reflect.Struct), msgAndArgs...)
-	}
-
-	if bType.Kind() != reflect.Struct {
-		return Fail(t, fmt.Sprintf("Types expected to both be struct or pointer to struct \n\t%v != %v", bType.Kind(), reflect.Struct), msgAndArgs...)
-	}
-
 	expected = copyExportedFields(expected)
 	actual = copyExportedFields(actual)
 
@@ -1170,6 +1175,39 @@ func formatListDiff(listA, listB interface{}, extraA, extraB []interface{}) stri
 	return msg.String()
 }
 
+// NotElementsMatch asserts that the specified listA(array, slice...) is NOT equal to specified
+// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements,
+// the number of appearances of each of them in both lists should not match.
+// This is an inverse of ElementsMatch.
+//
+// assert.NotElementsMatch(t, [1, 1, 2, 3], [1, 1, 2, 3]) -> false
+//
+// assert.NotElementsMatch(t, [1, 1, 2, 3], [1, 2, 3]) -> true
+//
+// assert.NotElementsMatch(t, [1, 2, 3], [1, 2, 4]) -> true
+func NotElementsMatch(t TestingT, listA, listB interface{}, msgAndArgs ...interface{}) (ok bool) {
+	if h, ok := t.(tHelper); ok {
+		h.Helper()
+	}
+	if isEmpty(listA) && isEmpty(listB) {
+		return Fail(t, "listA and listB contain the same elements", msgAndArgs)
+	}
+
+	if !isList(t, listA, msgAndArgs...) {
+		return Fail(t, "listA is not a list type", msgAndArgs...)
+	}
+	if !isList(t, listB, msgAndArgs...) {
+		return Fail(t, "listB is not a list type", msgAndArgs...)
+	}
+
+	extraA, extraB := diffLists(listA, listB)
+	if len(extraA) == 0 && len(extraB) == 0 {
+		return Fail(t, "listA and listB contain the same elements", msgAndArgs)
+	}
+
+	return true
+}
+
 // Condition uses a Comparison to assert a complex condition.
 func Condition(t TestingT, comp Comparison, msgAndArgs ...interface{}) bool {
 	if h, ok := t.(tHelper); ok {
@@ -1488,6 +1526,9 @@ func InEpsilon(t TestingT, expected, actual interface{}, epsilon float64, msgAnd
 	if err != nil {
 		return Fail(t, err.Error(), msgAndArgs...)
 	}
+	if math.IsNaN(actualEpsilon) {
+		return Fail(t, "relative error is NaN", msgAndArgs...)
+	}
 	if actualEpsilon > epsilon {
 		return Fail(t, fmt.Sprintf("Relative error is too high: %#v (expected)\n"+
 			"        < %#v (actual)", epsilon, actualEpsilon), msgAndArgs...)
@@ -1611,7 +1652,6 @@ func ErrorContains(t TestingT, theError error, contains string, msgAndArgs ...in
 
 // matchRegexp return true if a specified regexp matches a string.
 func matchRegexp(rx interface{}, str interface{}) bool {
-
 	var r *regexp.Regexp
 	if rr, ok := rx.(*regexp.Regexp); ok {
 		r = rr
@@ -1619,7 +1659,14 @@ func matchRegexp(rx interface{}, str interface{}) bool {
 		r = regexp.MustCompile(fmt.Sprint(rx))
 	}
 
-	return (r.FindStringIndex(fmt.Sprint(str)) != nil)
+	switch v := str.(type) {
+	case []byte:
+		return r.Match(v)
+	case string:
+		return r.MatchString(v)
+	default:
+		return r.MatchString(fmt.Sprint(v))
+	}
 
 }
 
@@ -1872,7 +1919,7 @@ var spewConfigStringerEnabled = spew.ConfigState{
 	MaxDepth:                10,
 }
 
-type tHelper interface {
+type tHelper = interface {
 	Helper()
 }
 
@@ -1911,6 +1958,9 @@ func Eventually(t TestingT, condition func() bool, waitFor time.Duration, tick t
 
 // CollectT implements the TestingT interface and collects all errors.
 type CollectT struct {
+	// A slice of errors. Non-nil slice denotes a failure.
+	// If it's non-nil but len(c.errors) == 0, this is also a failure
+	// obtained by direct c.FailNow() call.
 	errors []error
 }
 
@@ -1919,9 +1969,10 @@ func (c *CollectT) Errorf(format string, args ...interface{}) {
 	c.errors = append(c.errors, fmt.Errorf(format, args...))
 }
 
-// FailNow panics.
-func (*CollectT) FailNow() {
-	panic("Assertion failed")
+// FailNow stops execution by calling runtime.Goexit.
+func (c *CollectT) FailNow() {
+	c.fail()
+	runtime.Goexit()
 }
 
 // Deprecated: That was a method for internal usage that should not have been published. Now just panics.
@@ -1934,6 +1985,16 @@ func (*CollectT) Copy(TestingT) {
 	panic("Copy() is deprecated")
 }
 
+func (c *CollectT) fail() {
+	if !c.failed() {
+		c.errors = []error{} // Make it non-nil to mark a failure.
+	}
+}
+
+func (c *CollectT) failed() bool {
+	return c.errors != nil
+}
+
 // EventuallyWithT asserts that given condition will be met in waitFor time,
 // periodically checking target function each tick. In contrast to Eventually,
 // it supplies a CollectT to the condition function, so that the condition
@@ -1951,14 +2012,14 @@ func (*CollectT) Copy(TestingT) {
 //	assert.EventuallyWithT(t, func(c *assert.CollectT) {
 //		// add assertions as needed; any assertion failure will fail the current tick
 //		assert.True(c, externalValue, "expected 'externalValue' to be true")
-//	}, 1*time.Second, 10*time.Second, "external state has not changed to 'true'; still false")
+//	}, 10*time.Second, 1*time.Second, "external state has not changed to 'true'; still false")
 func EventuallyWithT(t TestingT, condition func(collect *CollectT), waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) bool {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
 	}
 
 	var lastFinishedTickErrs []error
-	ch := make(chan []error, 1)
+	ch := make(chan *CollectT, 1)
 
 	timer := time.NewTimer(waitFor)
 	defer timer.Stop()
@@ -1978,16 +2039,16 @@ func EventuallyWithT(t TestingT, condition func(collect *CollectT), waitFor time
 			go func() {
 				collect := new(CollectT)
 				defer func() {
-					ch <- collect.errors
+					ch <- collect
 				}()
 				condition(collect)
 			}()
-		case errs := <-ch:
-			if len(errs) == 0 {
+		case collect := <-ch:
+			if !collect.failed() {
 				return true
 			}
 			// Keep the errors from the last ended condition, so that they can be copied to t if timeout is reached.
-			lastFinishedTickErrs = errs
+			lastFinishedTickErrs = collect.errors
 			tick = ticker.C
 		}
 	}
@@ -2049,7 +2110,7 @@ func ErrorIs(t TestingT, err, target error, msgAndArgs ...interface{}) bool {
 	), msgAndArgs...)
 }
 
-// NotErrorIs asserts that at none of the errors in err's chain matches target.
+// NotErrorIs asserts that none of the errors in err's chain matches target.
 // This is a wrapper for errors.Is.
 func NotErrorIs(t TestingT, err, target error, msgAndArgs ...interface{}) bool {
 	if h, ok := t.(tHelper); ok {
@@ -2090,6 +2151,24 @@ func ErrorAs(t TestingT, err error, target interface{}, msgAndArgs ...interface{
 	), msgAndArgs...)
 }
 
+// NotErrorAs asserts that none of the errors in err's chain matches target,
+// but if so, sets target to that error value.
+func NotErrorAs(t TestingT, err error, target interface{}, msgAndArgs ...interface{}) bool {
+	if h, ok := t.(tHelper); ok {
+		h.Helper()
+	}
+	if !errors.As(err, target) {
+		return true
+	}
+
+	chain := buildErrorChainString(err)
+
+	return Fail(t, fmt.Sprintf("Target error should not be in err chain:\n"+
+		"found: %q\n"+
+		"in chain: %s", target, chain,
+	), msgAndArgs...)
+}
+
 func buildErrorChainString(err error) string {
 	if err == nil {
 		return ""
diff --git a/test/integration/vendor/github.com/stretchr/testify/assert/yaml/yaml_custom.go b/test/integration/vendor/github.com/stretchr/testify/assert/yaml/yaml_custom.go
new file mode 100644
index 0000000000..baa0cc7d7f
--- /dev/null
+++ b/test/integration/vendor/github.com/stretchr/testify/assert/yaml/yaml_custom.go
@@ -0,0 +1,25 @@
+//go:build testify_yaml_custom && !testify_yaml_fail && !testify_yaml_default
+// +build testify_yaml_custom,!testify_yaml_fail,!testify_yaml_default
+
+// Package yaml is an implementation of YAML functions that calls a pluggable implementation.
+//
+// This implementation is selected with the testify_yaml_custom build tag.
+//
+//	go test -tags testify_yaml_custom
+//
+// This implementation can be used at build time to replace the default implementation
+// to avoid linking with [gopkg.in/yaml.v3].
+//
+// In your test package:
+//
+//		import assertYaml "github.com/stretchr/testify/assert/yaml"
+//
+//		func init() {
+//			assertYaml.Unmarshal = func (in []byte, out interface{}) error {
+//				// ...
+//	     			return nil
+//			}
+//		}
+package yaml
+
+var Unmarshal func(in []byte, out interface{}) error
diff --git a/test/integration/vendor/github.com/stretchr/testify/assert/yaml/yaml_default.go b/test/integration/vendor/github.com/stretchr/testify/assert/yaml/yaml_default.go
new file mode 100644
index 0000000000..b83c6cf64c
--- /dev/null
+++ b/test/integration/vendor/github.com/stretchr/testify/assert/yaml/yaml_default.go
@@ -0,0 +1,37 @@
+//go:build !testify_yaml_fail && !testify_yaml_custom
+// +build !testify_yaml_fail,!testify_yaml_custom
+
+// Package yaml is just an indirection to handle YAML deserialization.
+//
+// This package is just an indirection that allows the builder to override the
+// indirection with an alternative implementation of this package that uses
+// another implementation of YAML deserialization. This allows to not either not
+// use YAML deserialization at all, or to use another implementation than
+// [gopkg.in/yaml.v3] (for example for license compatibility reasons, see [PR #1120]).
+//
+// Alternative implementations are selected using build tags:
+//
+//   - testify_yaml_fail: [Unmarshal] always fails with an error
+//   - testify_yaml_custom: [Unmarshal] is a variable. Caller must initialize it
+//     before calling any of [github.com/stretchr/testify/assert.YAMLEq] or
+//     [github.com/stretchr/testify/assert.YAMLEqf].
+//
+// Usage:
+//
+//	go test -tags testify_yaml_fail
+//
+// You can check with "go list" which implementation is linked:
+//
+//	go list -f '{{.Imports}}' github.com/stretchr/testify/assert/yaml
+//	go list -tags testify_yaml_fail -f '{{.Imports}}' github.com/stretchr/testify/assert/yaml
+//	go list -tags testify_yaml_custom -f '{{.Imports}}' github.com/stretchr/testify/assert/yaml
+//
+// [PR #1120]: https://github.com/stretchr/testify/pull/1120
+package yaml
+
+import goyaml "gopkg.in/yaml.v3"
+
+// Unmarshal is just a wrapper of [gopkg.in/yaml.v3.Unmarshal].
+func Unmarshal(in []byte, out interface{}) error {
+	return goyaml.Unmarshal(in, out)
+}
diff --git a/test/integration/vendor/github.com/stretchr/testify/assert/yaml/yaml_fail.go b/test/integration/vendor/github.com/stretchr/testify/assert/yaml/yaml_fail.go
new file mode 100644
index 0000000000..e78f7dfe69
--- /dev/null
+++ b/test/integration/vendor/github.com/stretchr/testify/assert/yaml/yaml_fail.go
@@ -0,0 +1,18 @@
+//go:build testify_yaml_fail && !testify_yaml_custom && !testify_yaml_default
+// +build testify_yaml_fail,!testify_yaml_custom,!testify_yaml_default
+
+// Package yaml is an implementation of YAML functions that always fail.
+//
+// This implementation can be used at build time to replace the default implementation
+// to avoid linking with [gopkg.in/yaml.v3]:
+//
+//	go test -tags testify_yaml_fail
+package yaml
+
+import "errors"
+
+var errNotImplemented = errors.New("YAML functions are not available (see https://pkg.go.dev/github.com/stretchr/testify/assert/yaml)")
+
+func Unmarshal([]byte, interface{}) error {
+	return errNotImplemented
+}
diff --git a/test/integration/vendor/github.com/stretchr/testify/mock/mock.go b/test/integration/vendor/github.com/stretchr/testify/mock/mock.go
index 213bde2ea6..eb5682df97 100644
--- a/test/integration/vendor/github.com/stretchr/testify/mock/mock.go
+++ b/test/integration/vendor/github.com/stretchr/testify/mock/mock.go
@@ -80,12 +80,12 @@ type Call struct {
 	requires []*Call
 }
 
-func newCall(parent *Mock, methodName string, callerInfo []string, methodArguments ...interface{}) *Call {
+func newCall(parent *Mock, methodName string, callerInfo []string, methodArguments Arguments, returnArguments Arguments) *Call {
 	return &Call{
 		Parent:          parent,
 		Method:          methodName,
 		Arguments:       methodArguments,
-		ReturnArguments: make([]interface{}, 0),
+		ReturnArguments: returnArguments,
 		callerInfo:      callerInfo,
 		Repeatability:   0,
 		WaitFor:         nil,
@@ -256,7 +256,7 @@ func (c *Call) Unset() *Call {
 // calls have been called as expected. The referenced calls may be from the
 // same mock instance and/or other mock instances.
 //
-//	Mock.On("Do").Return(nil).Notbefore(
+//	Mock.On("Do").Return(nil).NotBefore(
 //	    Mock.On("Init").Return(nil)
 //	)
 func (c *Call) NotBefore(calls ...*Call) *Call {
@@ -273,6 +273,20 @@ func (c *Call) NotBefore(calls ...*Call) *Call {
 	return c
 }
 
+// InOrder defines the order in which the calls should be made
+//
+//	For example:
+//
+//	InOrder(
+//		Mock.On("init").Return(nil),
+//		Mock.On("Do").Return(nil),
+//	)
+func InOrder(calls ...*Call) {
+	for i := 1; i < len(calls); i++ {
+		calls[i].NotBefore(calls[i-1])
+	}
+}
+
 // Mock is the workhorse used to track activity on another object.
 // For an example of its usage, refer to the "Example Usage" section at the top
 // of this document.
@@ -351,7 +365,8 @@ func (m *Mock) On(methodName string, arguments ...interface{}) *Call {
 
 	m.mutex.Lock()
 	defer m.mutex.Unlock()
-	c := newCall(m, methodName, assert.CallerInfo(), arguments...)
+
+	c := newCall(m, methodName, assert.CallerInfo(), arguments, make([]interface{}, 0))
 	m.ExpectedCalls = append(m.ExpectedCalls, c)
 	return c
 }
@@ -491,11 +506,12 @@ func (m *Mock) MethodCalled(methodName string, arguments ...interface{}) Argumen
 		m.mutex.Unlock()
 
 		if closestCall != nil {
-			m.fail("\n\nmock: Unexpected Method Call\n-----------------------------\n\n%s\n\nThe closest call I have is: \n\n%s\n\n%s\nDiff: %s",
+			m.fail("\n\nmock: Unexpected Method Call\n-----------------------------\n\n%s\n\nThe closest call I have is: \n\n%s\n\n%s\nDiff: %s\nat: %s\n",
 				callString(methodName, arguments, true),
 				callString(methodName, closestCall.Arguments, true),
 				diffArguments(closestCall.Arguments, arguments),
 				strings.TrimSpace(mismatch),
+				assert.CallerInfo(),
 			)
 		} else {
 			m.fail("\nassert: mock: I don't know what to return because the method call was unexpected.\n\tEither do Mock.On(\"%s\").Return(...) first, or remove the %s() call.\n\tThis method was unexpected:\n\t\t%s\n\tat: %s", methodName, methodName, callString(methodName, arguments, true), assert.CallerInfo())
@@ -529,7 +545,7 @@ func (m *Mock) MethodCalled(methodName string, arguments ...interface{}) Argumen
 	call.totalCalls++
 
 	// add the call
-	m.Calls = append(m.Calls, *newCall(m, methodName, assert.CallerInfo(), arguments...))
+	m.Calls = append(m.Calls, *newCall(m, methodName, assert.CallerInfo(), arguments, call.ReturnArguments))
 	m.mutex.Unlock()
 
 	// block if specified
@@ -764,9 +780,17 @@ const (
 )
 
 // AnythingOfTypeArgument contains the type of an argument
-// for use when type checking.  Used in Diff and Assert.
+// for use when type checking.  Used in [Arguments.Diff] and [Arguments.Assert].
 //
-// Deprecated: this is an implementation detail that must not be used. Use [AnythingOfType] instead.
+// Deprecated: this is an implementation detail that must not be used. Use the [AnythingOfType] constructor instead, example:
+//
+//	m.On("Do", mock.AnythingOfType("string"))
+//
+// All explicit type declarations can be replaced with interface{} as is expected by [Mock.On], example:
+//
+//	func anyString interface{} {
+//		return mock.AnythingOfType("string")
+//	}
 type AnythingOfTypeArgument = anythingOfTypeArgument
 
 // anythingOfTypeArgument is a string that contains the type of an argument
@@ -780,53 +804,54 @@ type anythingOfTypeArgument string
 //
 // For example:
 //
-//	Assert(t, AnythingOfType("string"), AnythingOfType("int"))
+//	args.Assert(t, AnythingOfType("string"), AnythingOfType("int"))
 func AnythingOfType(t string) AnythingOfTypeArgument {
 	return anythingOfTypeArgument(t)
 }
 
 // IsTypeArgument is a struct that contains the type of an argument
-// for use when type checking.  This is an alternative to AnythingOfType.
-// Used in Diff and Assert.
+// for use when type checking.  This is an alternative to [AnythingOfType].
+// Used in [Arguments.Diff] and [Arguments.Assert].
 type IsTypeArgument struct {
 	t reflect.Type
 }
 
 // IsType returns an IsTypeArgument object containing the type to check for.
 // You can provide a zero-value of the type to check.  This is an
-// alternative to AnythingOfType.  Used in Diff and Assert.
+// alternative to [AnythingOfType].  Used in [Arguments.Diff] and [Arguments.Assert].
 //
 // For example:
-// Assert(t, IsType(""), IsType(0))
+//
+//	args.Assert(t, IsType(""), IsType(0))
 func IsType(t interface{}) *IsTypeArgument {
 	return &IsTypeArgument{t: reflect.TypeOf(t)}
 }
 
-// FunctionalOptionsArgument is a struct that contains the type and value of an functional option argument
-// for use when type checking.
+// FunctionalOptionsArgument contains a list of functional options arguments
+// expected for use when matching a list of arguments.
 type FunctionalOptionsArgument struct {
-	value interface{}
+	values []interface{}
 }
 
 // String returns the string representation of FunctionalOptionsArgument
 func (f *FunctionalOptionsArgument) String() string {
 	var name string
-	tValue := reflect.ValueOf(f.value)
-	if tValue.Len() > 0 {
-		name = "[]" + reflect.TypeOf(tValue.Index(0).Interface()).String()
+	if len(f.values) > 0 {
+		name = "[]" + reflect.TypeOf(f.values[0]).String()
 	}
 
-	return strings.Replace(fmt.Sprintf("%#v", f.value), "[]interface {}", name, 1)
+	return strings.Replace(fmt.Sprintf("%#v", f.values), "[]interface {}", name, 1)
 }
 
-// FunctionalOptions returns an FunctionalOptionsArgument object containing the functional option type
-// and the values to check of
+// FunctionalOptions returns an [FunctionalOptionsArgument] object containing
+// the expected functional-options to check for.
 //
 // For example:
-// Assert(t, FunctionalOptions("[]foo.FunctionalOption", foo.Opt1(), foo.Opt2()))
-func FunctionalOptions(value ...interface{}) *FunctionalOptionsArgument {
+//
+//	args.Assert(t, FunctionalOptions(foo.Opt1("strValue"), foo.Opt2(613)))
+func FunctionalOptions(values ...interface{}) *FunctionalOptionsArgument {
 	return &FunctionalOptionsArgument{
-		value: value,
+		values: values,
 	}
 }
 
@@ -873,10 +898,11 @@ func (f argumentMatcher) String() string {
 // and false otherwise.
 //
 // Example:
-// m.On("Do", MatchedBy(func(req *http.Request) bool { return req.Host == "example.com" }))
 //
-// |fn|, must be a function accepting a single argument (of the expected type)
-// which returns a bool. If |fn| doesn't match the required signature,
+//	m.On("Do", MatchedBy(func(req *http.Request) bool { return req.Host == "example.com" }))
+//
+// fn must be a function accepting a single argument (of the expected type)
+// which returns a bool. If fn doesn't match the required signature,
 // MatchedBy() panics.
 func MatchedBy(fn interface{}) argumentMatcher {
 	fnType := reflect.TypeOf(fn)
@@ -979,20 +1005,17 @@ func (args Arguments) Diff(objects []interface{}) (string, int) {
 					output = fmt.Sprintf("%s\t%d: FAIL:  type %s != type %s - %s\n", output, i, expected.t.Name(), actualT.Name(), actualFmt)
 				}
 			case *FunctionalOptionsArgument:
-				t := expected.value
-
 				var name string
-				tValue := reflect.ValueOf(t)
-				if tValue.Len() > 0 {
-					name = "[]" + reflect.TypeOf(tValue.Index(0).Interface()).String()
+				if len(expected.values) > 0 {
+					name = "[]" + reflect.TypeOf(expected.values[0]).String()
 				}
 
-				tName := reflect.TypeOf(t).Name()
-				if name != reflect.TypeOf(actual).String() && tValue.Len() != 0 {
+				const tName = "[]interface{}"
+				if name != reflect.TypeOf(actual).String() && len(expected.values) != 0 {
 					differences++
 					output = fmt.Sprintf("%s\t%d: FAIL:  type %s != type %s - %s\n", output, i, tName, reflect.TypeOf(actual).Name(), actualFmt)
 				} else {
-					if ef, af := assertOpts(t, actual); ef == "" && af == "" {
+					if ef, af := assertOpts(expected.values, actual); ef == "" && af == "" {
 						// match
 						output = fmt.Sprintf("%s\t%d: PASS:  %s == %s\n", output, i, tName, tName)
 					} else {
@@ -1092,7 +1115,7 @@ func (args Arguments) Error(index int) error {
 		return nil
 	}
 	if s, ok = obj.(error); !ok {
-		panic(fmt.Sprintf("assert: arguments: Error(%d) failed because object wasn't correct type: %v", index, args.Get(index)))
+		panic(fmt.Sprintf("assert: arguments: Error(%d) failed because object wasn't correct type: %v", index, obj))
 	}
 	return s
 }
@@ -1181,32 +1204,38 @@ type tHelper interface {
 func assertOpts(expected, actual interface{}) (expectedFmt, actualFmt string) {
 	expectedOpts := reflect.ValueOf(expected)
 	actualOpts := reflect.ValueOf(actual)
+
+	var expectedFuncs []*runtime.Func
 	var expectedNames []string
 	for i := 0; i < expectedOpts.Len(); i++ {
-		expectedNames = append(expectedNames, funcName(expectedOpts.Index(i).Interface()))
+		f := runtimeFunc(expectedOpts.Index(i).Interface())
+		expectedFuncs = append(expectedFuncs, f)
+		expectedNames = append(expectedNames, funcName(f))
 	}
+	var actualFuncs []*runtime.Func
 	var actualNames []string
 	for i := 0; i < actualOpts.Len(); i++ {
-		actualNames = append(actualNames, funcName(actualOpts.Index(i).Interface()))
+		f := runtimeFunc(actualOpts.Index(i).Interface())
+		actualFuncs = append(actualFuncs, f)
+		actualNames = append(actualNames, funcName(f))
 	}
-	if !assert.ObjectsAreEqual(expectedNames, actualNames) {
+
+	if expectedOpts.Len() != actualOpts.Len() {
 		expectedFmt = fmt.Sprintf("%v", expectedNames)
 		actualFmt = fmt.Sprintf("%v", actualNames)
 		return
 	}
 
 	for i := 0; i < expectedOpts.Len(); i++ {
-		expectedOpt := expectedOpts.Index(i).Interface()
-		actualOpt := actualOpts.Index(i).Interface()
-
-		expectedFunc := expectedNames[i]
-		actualFunc := actualNames[i]
-		if expectedFunc != actualFunc {
-			expectedFmt = expectedFunc
-			actualFmt = actualFunc
+		if !isFuncSame(expectedFuncs[i], actualFuncs[i]) {
+			expectedFmt = expectedNames[i]
+			actualFmt = actualNames[i]
 			return
 		}
 
+		expectedOpt := expectedOpts.Index(i).Interface()
+		actualOpt := actualOpts.Index(i).Interface()
+
 		ot := reflect.TypeOf(expectedOpt)
 		var expectedValues []reflect.Value
 		var actualValues []reflect.Value
@@ -1224,9 +1253,9 @@ func assertOpts(expected, actual interface{}) (expectedFmt, actualFmt string) {
 		reflect.ValueOf(actualOpt).Call(actualValues)
 
 		for i := 0; i < ot.NumIn(); i++ {
-			if !assert.ObjectsAreEqual(expectedValues[i].Interface(), actualValues[i].Interface()) {
-				expectedFmt = fmt.Sprintf("%s %+v", expectedNames[i], expectedValues[i].Interface())
-				actualFmt = fmt.Sprintf("%s %+v", expectedNames[i], actualValues[i].Interface())
+			if expectedArg, actualArg := expectedValues[i].Interface(), actualValues[i].Interface(); !assert.ObjectsAreEqual(expectedArg, actualArg) {
+				expectedFmt = fmt.Sprintf("%s(%T) -> %#v", expectedNames[i], expectedArg, expectedArg)
+				actualFmt = fmt.Sprintf("%s(%T) -> %#v", expectedNames[i], actualArg, actualArg)
 				return
 			}
 		}
@@ -1235,7 +1264,25 @@ func assertOpts(expected, actual interface{}) (expectedFmt, actualFmt string) {
 	return "", ""
 }
 
-func funcName(opt interface{}) string {
-	n := runtime.FuncForPC(reflect.ValueOf(opt).Pointer()).Name()
-	return strings.TrimSuffix(path.Base(n), path.Ext(n))
+func runtimeFunc(opt interface{}) *runtime.Func {
+	return runtime.FuncForPC(reflect.ValueOf(opt).Pointer())
+}
+
+func funcName(f *runtime.Func) string {
+	name := f.Name()
+	trimmed := strings.TrimSuffix(path.Base(name), path.Ext(name))
+	splitted := strings.Split(trimmed, ".")
+
+	if len(splitted) == 0 {
+		return trimmed
+	}
+
+	return splitted[len(splitted)-1]
+}
+
+func isFuncSame(f1, f2 *runtime.Func) bool {
+	f1File, f1Loc := f1.FileLine(f1.Entry())
+	f2File, f2Loc := f2.FileLine(f2.Entry())
+
+	return f1File == f2File && f1Loc == f2Loc
 }
diff --git a/test/integration/vendor/github.com/stretchr/testify/require/require.go b/test/integration/vendor/github.com/stretchr/testify/require/require.go
index 506a82f807..d8921950d7 100644
--- a/test/integration/vendor/github.com/stretchr/testify/require/require.go
+++ b/test/integration/vendor/github.com/stretchr/testify/require/require.go
@@ -34,9 +34,9 @@ func Conditionf(t TestingT, comp assert.Comparison, msg string, args ...interfac
 // Contains asserts that the specified string, list(array, slice...) or map contains the
 // specified substring or element.
 //
-//	assert.Contains(t, "Hello World", "World")
-//	assert.Contains(t, ["Hello", "World"], "World")
-//	assert.Contains(t, {"Hello": "World"}, "Hello")
+//	require.Contains(t, "Hello World", "World")
+//	require.Contains(t, ["Hello", "World"], "World")
+//	require.Contains(t, {"Hello": "World"}, "Hello")
 func Contains(t TestingT, s interface{}, contains interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -50,9 +50,9 @@ func Contains(t TestingT, s interface{}, contains interface{}, msgAndArgs ...int
 // Containsf asserts that the specified string, list(array, slice...) or map contains the
 // specified substring or element.
 //
-//	assert.Containsf(t, "Hello World", "World", "error message %s", "formatted")
-//	assert.Containsf(t, ["Hello", "World"], "World", "error message %s", "formatted")
-//	assert.Containsf(t, {"Hello": "World"}, "Hello", "error message %s", "formatted")
+//	require.Containsf(t, "Hello World", "World", "error message %s", "formatted")
+//	require.Containsf(t, ["Hello", "World"], "World", "error message %s", "formatted")
+//	require.Containsf(t, {"Hello": "World"}, "Hello", "error message %s", "formatted")
 func Containsf(t TestingT, s interface{}, contains interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -91,7 +91,7 @@ func DirExistsf(t TestingT, path string, msg string, args ...interface{}) {
 // listB(array, slice...) ignoring the order of the elements. If there are duplicate elements,
 // the number of appearances of each of them in both lists should match.
 //
-// assert.ElementsMatch(t, [1, 3, 2, 3], [1, 3, 3, 2])
+// require.ElementsMatch(t, [1, 3, 2, 3], [1, 3, 3, 2])
 func ElementsMatch(t TestingT, listA interface{}, listB interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -106,7 +106,7 @@ func ElementsMatch(t TestingT, listA interface{}, listB interface{}, msgAndArgs
 // listB(array, slice...) ignoring the order of the elements. If there are duplicate elements,
 // the number of appearances of each of them in both lists should match.
 //
-// assert.ElementsMatchf(t, [1, 3, 2, 3], [1, 3, 3, 2], "error message %s", "formatted")
+// require.ElementsMatchf(t, [1, 3, 2, 3], [1, 3, 3, 2], "error message %s", "formatted")
 func ElementsMatchf(t TestingT, listA interface{}, listB interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -120,7 +120,7 @@ func ElementsMatchf(t TestingT, listA interface{}, listB interface{}, msg string
 // Empty asserts that the specified object is empty.  I.e. nil, "", false, 0 or either
 // a slice or a channel with len == 0.
 //
-//	assert.Empty(t, obj)
+//	require.Empty(t, obj)
 func Empty(t TestingT, object interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -134,7 +134,7 @@ func Empty(t TestingT, object interface{}, msgAndArgs ...interface{}) {
 // Emptyf asserts that the specified object is empty.  I.e. nil, "", false, 0 or either
 // a slice or a channel with len == 0.
 //
-//	assert.Emptyf(t, obj, "error message %s", "formatted")
+//	require.Emptyf(t, obj, "error message %s", "formatted")
 func Emptyf(t TestingT, object interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -147,7 +147,7 @@ func Emptyf(t TestingT, object interface{}, msg string, args ...interface{}) {
 
 // Equal asserts that two objects are equal.
 //
-//	assert.Equal(t, 123, 123)
+//	require.Equal(t, 123, 123)
 //
 // Pointer variable equality is determined based on the equality of the
 // referenced values (as opposed to the memory addresses). Function equality
@@ -166,7 +166,7 @@ func Equal(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...i
 // and that it is equal to the provided error.
 //
 //	actualObj, err := SomeFunction()
-//	assert.EqualError(t, err,  expectedErrorString)
+//	require.EqualError(t, err,  expectedErrorString)
 func EqualError(t TestingT, theError error, errString string, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -181,7 +181,7 @@ func EqualError(t TestingT, theError error, errString string, msgAndArgs ...inte
 // and that it is equal to the provided error.
 //
 //	actualObj, err := SomeFunction()
-//	assert.EqualErrorf(t, err,  expectedErrorString, "error message %s", "formatted")
+//	require.EqualErrorf(t, err,  expectedErrorString, "error message %s", "formatted")
 func EqualErrorf(t TestingT, theError error, errString string, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -200,8 +200,8 @@ func EqualErrorf(t TestingT, theError error, errString string, msg string, args
 //		Exported     	int
 //		notExported   	int
 //	 }
-//	 assert.EqualExportedValues(t, S{1, 2}, S{1, 3}) => true
-//	 assert.EqualExportedValues(t, S{1, 2}, S{2, 3}) => false
+//	 require.EqualExportedValues(t, S{1, 2}, S{1, 3}) => true
+//	 require.EqualExportedValues(t, S{1, 2}, S{2, 3}) => false
 func EqualExportedValues(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -220,8 +220,8 @@ func EqualExportedValues(t TestingT, expected interface{}, actual interface{}, m
 //		Exported     	int
 //		notExported   	int
 //	 }
-//	 assert.EqualExportedValuesf(t, S{1, 2}, S{1, 3}, "error message %s", "formatted") => true
-//	 assert.EqualExportedValuesf(t, S{1, 2}, S{2, 3}, "error message %s", "formatted") => false
+//	 require.EqualExportedValuesf(t, S{1, 2}, S{1, 3}, "error message %s", "formatted") => true
+//	 require.EqualExportedValuesf(t, S{1, 2}, S{2, 3}, "error message %s", "formatted") => false
 func EqualExportedValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -232,10 +232,10 @@ func EqualExportedValuesf(t TestingT, expected interface{}, actual interface{},
 	t.FailNow()
 }
 
-// EqualValues asserts that two objects are equal or convertible to the same types
-// and equal.
+// EqualValues asserts that two objects are equal or convertible to the larger
+// type and equal.
 //
-//	assert.EqualValues(t, uint32(123), int32(123))
+//	require.EqualValues(t, uint32(123), int32(123))
 func EqualValues(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -246,10 +246,10 @@ func EqualValues(t TestingT, expected interface{}, actual interface{}, msgAndArg
 	t.FailNow()
 }
 
-// EqualValuesf asserts that two objects are equal or convertible to the same types
-// and equal.
+// EqualValuesf asserts that two objects are equal or convertible to the larger
+// type and equal.
 //
-//	assert.EqualValuesf(t, uint32(123), int32(123), "error message %s", "formatted")
+//	require.EqualValuesf(t, uint32(123), int32(123), "error message %s", "formatted")
 func EqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -262,7 +262,7 @@ func EqualValuesf(t TestingT, expected interface{}, actual interface{}, msg stri
 
 // Equalf asserts that two objects are equal.
 //
-//	assert.Equalf(t, 123, 123, "error message %s", "formatted")
+//	require.Equalf(t, 123, 123, "error message %s", "formatted")
 //
 // Pointer variable equality is determined based on the equality of the
 // referenced values (as opposed to the memory addresses). Function equality
@@ -280,8 +280,8 @@ func Equalf(t TestingT, expected interface{}, actual interface{}, msg string, ar
 // Error asserts that a function returned an error (i.e. not `nil`).
 //
 //	  actualObj, err := SomeFunction()
-//	  if assert.Error(t, err) {
-//		   assert.Equal(t, expectedError, err)
+//	  if require.Error(t, err) {
+//		   require.Equal(t, expectedError, err)
 //	  }
 func Error(t TestingT, err error, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
@@ -321,7 +321,7 @@ func ErrorAsf(t TestingT, err error, target interface{}, msg string, args ...int
 // and that the error contains the specified substring.
 //
 //	actualObj, err := SomeFunction()
-//	assert.ErrorContains(t, err,  expectedErrorSubString)
+//	require.ErrorContains(t, err,  expectedErrorSubString)
 func ErrorContains(t TestingT, theError error, contains string, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -336,7 +336,7 @@ func ErrorContains(t TestingT, theError error, contains string, msgAndArgs ...in
 // and that the error contains the specified substring.
 //
 //	actualObj, err := SomeFunction()
-//	assert.ErrorContainsf(t, err,  expectedErrorSubString, "error message %s", "formatted")
+//	require.ErrorContainsf(t, err,  expectedErrorSubString, "error message %s", "formatted")
 func ErrorContainsf(t TestingT, theError error, contains string, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -374,8 +374,8 @@ func ErrorIsf(t TestingT, err error, target error, msg string, args ...interface
 // Errorf asserts that a function returned an error (i.e. not `nil`).
 //
 //	  actualObj, err := SomeFunction()
-//	  if assert.Errorf(t, err, "error message %s", "formatted") {
-//		   assert.Equal(t, expectedErrorf, err)
+//	  if require.Errorf(t, err, "error message %s", "formatted") {
+//		   require.Equal(t, expectedErrorf, err)
 //	  }
 func Errorf(t TestingT, err error, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
@@ -390,7 +390,7 @@ func Errorf(t TestingT, err error, msg string, args ...interface{}) {
 // Eventually asserts that given condition will be met in waitFor time,
 // periodically checking target function each tick.
 //
-//	assert.Eventually(t, func() bool { return true; }, time.Second, 10*time.Millisecond)
+//	require.Eventually(t, func() bool { return true; }, time.Second, 10*time.Millisecond)
 func Eventually(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -415,10 +415,10 @@ func Eventually(t TestingT, condition func() bool, waitFor time.Duration, tick t
 //		time.Sleep(8*time.Second)
 //		externalValue = true
 //	}()
-//	assert.EventuallyWithT(t, func(c *assert.CollectT) {
+//	require.EventuallyWithT(t, func(c *require.CollectT) {
 //		// add assertions as needed; any assertion failure will fail the current tick
-//		assert.True(c, externalValue, "expected 'externalValue' to be true")
-//	}, 1*time.Second, 10*time.Second, "external state has not changed to 'true'; still false")
+//		require.True(c, externalValue, "expected 'externalValue' to be true")
+//	}, 10*time.Second, 1*time.Second, "external state has not changed to 'true'; still false")
 func EventuallyWithT(t TestingT, condition func(collect *assert.CollectT), waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -443,10 +443,10 @@ func EventuallyWithT(t TestingT, condition func(collect *assert.CollectT), waitF
 //		time.Sleep(8*time.Second)
 //		externalValue = true
 //	}()
-//	assert.EventuallyWithTf(t, func(c *assert.CollectT, "error message %s", "formatted") {
+//	require.EventuallyWithTf(t, func(c *require.CollectT, "error message %s", "formatted") {
 //		// add assertions as needed; any assertion failure will fail the current tick
-//		assert.True(c, externalValue, "expected 'externalValue' to be true")
-//	}, 1*time.Second, 10*time.Second, "external state has not changed to 'true'; still false")
+//		require.True(c, externalValue, "expected 'externalValue' to be true")
+//	}, 10*time.Second, 1*time.Second, "external state has not changed to 'true'; still false")
 func EventuallyWithTf(t TestingT, condition func(collect *assert.CollectT), waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -460,7 +460,7 @@ func EventuallyWithTf(t TestingT, condition func(collect *assert.CollectT), wait
 // Eventuallyf asserts that given condition will be met in waitFor time,
 // periodically checking target function each tick.
 //
-//	assert.Eventuallyf(t, func() bool { return true; }, time.Second, 10*time.Millisecond, "error message %s", "formatted")
+//	require.Eventuallyf(t, func() bool { return true; }, time.Second, 10*time.Millisecond, "error message %s", "formatted")
 func Eventuallyf(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -473,7 +473,7 @@ func Eventuallyf(t TestingT, condition func() bool, waitFor time.Duration, tick
 
 // Exactly asserts that two objects are equal in value and type.
 //
-//	assert.Exactly(t, int32(123), int64(123))
+//	require.Exactly(t, int32(123), int64(123))
 func Exactly(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -486,7 +486,7 @@ func Exactly(t TestingT, expected interface{}, actual interface{}, msgAndArgs ..
 
 // Exactlyf asserts that two objects are equal in value and type.
 //
-//	assert.Exactlyf(t, int32(123), int64(123), "error message %s", "formatted")
+//	require.Exactlyf(t, int32(123), int64(123), "error message %s", "formatted")
 func Exactlyf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -543,7 +543,7 @@ func Failf(t TestingT, failureMessage string, msg string, args ...interface{}) {
 
 // False asserts that the specified value is false.
 //
-//	assert.False(t, myBool)
+//	require.False(t, myBool)
 func False(t TestingT, value bool, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -556,7 +556,7 @@ func False(t TestingT, value bool, msgAndArgs ...interface{}) {
 
 // Falsef asserts that the specified value is false.
 //
-//	assert.Falsef(t, myBool, "error message %s", "formatted")
+//	require.Falsef(t, myBool, "error message %s", "formatted")
 func Falsef(t TestingT, value bool, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -593,9 +593,9 @@ func FileExistsf(t TestingT, path string, msg string, args ...interface{}) {
 
 // Greater asserts that the first element is greater than the second
 //
-//	assert.Greater(t, 2, 1)
-//	assert.Greater(t, float64(2), float64(1))
-//	assert.Greater(t, "b", "a")
+//	require.Greater(t, 2, 1)
+//	require.Greater(t, float64(2), float64(1))
+//	require.Greater(t, "b", "a")
 func Greater(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -608,10 +608,10 @@ func Greater(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface
 
 // GreaterOrEqual asserts that the first element is greater than or equal to the second
 //
-//	assert.GreaterOrEqual(t, 2, 1)
-//	assert.GreaterOrEqual(t, 2, 2)
-//	assert.GreaterOrEqual(t, "b", "a")
-//	assert.GreaterOrEqual(t, "b", "b")
+//	require.GreaterOrEqual(t, 2, 1)
+//	require.GreaterOrEqual(t, 2, 2)
+//	require.GreaterOrEqual(t, "b", "a")
+//	require.GreaterOrEqual(t, "b", "b")
 func GreaterOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -624,10 +624,10 @@ func GreaterOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...in
 
 // GreaterOrEqualf asserts that the first element is greater than or equal to the second
 //
-//	assert.GreaterOrEqualf(t, 2, 1, "error message %s", "formatted")
-//	assert.GreaterOrEqualf(t, 2, 2, "error message %s", "formatted")
-//	assert.GreaterOrEqualf(t, "b", "a", "error message %s", "formatted")
-//	assert.GreaterOrEqualf(t, "b", "b", "error message %s", "formatted")
+//	require.GreaterOrEqualf(t, 2, 1, "error message %s", "formatted")
+//	require.GreaterOrEqualf(t, 2, 2, "error message %s", "formatted")
+//	require.GreaterOrEqualf(t, "b", "a", "error message %s", "formatted")
+//	require.GreaterOrEqualf(t, "b", "b", "error message %s", "formatted")
 func GreaterOrEqualf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -640,9 +640,9 @@ func GreaterOrEqualf(t TestingT, e1 interface{}, e2 interface{}, msg string, arg
 
 // Greaterf asserts that the first element is greater than the second
 //
-//	assert.Greaterf(t, 2, 1, "error message %s", "formatted")
-//	assert.Greaterf(t, float64(2), float64(1), "error message %s", "formatted")
-//	assert.Greaterf(t, "b", "a", "error message %s", "formatted")
+//	require.Greaterf(t, 2, 1, "error message %s", "formatted")
+//	require.Greaterf(t, float64(2), float64(1), "error message %s", "formatted")
+//	require.Greaterf(t, "b", "a", "error message %s", "formatted")
 func Greaterf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -656,7 +656,7 @@ func Greaterf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...in
 // HTTPBodyContains asserts that a specified handler returns a
 // body that contains a string.
 //
-//	assert.HTTPBodyContains(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky")
+//	require.HTTPBodyContains(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky")
 //
 // Returns whether the assertion was successful (true) or not (false).
 func HTTPBodyContains(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) {
@@ -672,7 +672,7 @@ func HTTPBodyContains(t TestingT, handler http.HandlerFunc, method string, url s
 // HTTPBodyContainsf asserts that a specified handler returns a
 // body that contains a string.
 //
-//	assert.HTTPBodyContainsf(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted")
+//	require.HTTPBodyContainsf(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted")
 //
 // Returns whether the assertion was successful (true) or not (false).
 func HTTPBodyContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) {
@@ -688,7 +688,7 @@ func HTTPBodyContainsf(t TestingT, handler http.HandlerFunc, method string, url
 // HTTPBodyNotContains asserts that a specified handler returns a
 // body that does not contain a string.
 //
-//	assert.HTTPBodyNotContains(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky")
+//	require.HTTPBodyNotContains(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky")
 //
 // Returns whether the assertion was successful (true) or not (false).
 func HTTPBodyNotContains(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) {
@@ -704,7 +704,7 @@ func HTTPBodyNotContains(t TestingT, handler http.HandlerFunc, method string, ur
 // HTTPBodyNotContainsf asserts that a specified handler returns a
 // body that does not contain a string.
 //
-//	assert.HTTPBodyNotContainsf(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted")
+//	require.HTTPBodyNotContainsf(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted")
 //
 // Returns whether the assertion was successful (true) or not (false).
 func HTTPBodyNotContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) {
@@ -719,7 +719,7 @@ func HTTPBodyNotContainsf(t TestingT, handler http.HandlerFunc, method string, u
 
 // HTTPError asserts that a specified handler returns an error status code.
 //
-//	assert.HTTPError(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}}
+//	require.HTTPError(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}}
 //
 // Returns whether the assertion was successful (true) or not (false).
 func HTTPError(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) {
@@ -734,7 +734,7 @@ func HTTPError(t TestingT, handler http.HandlerFunc, method string, url string,
 
 // HTTPErrorf asserts that a specified handler returns an error status code.
 //
-//	assert.HTTPErrorf(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}}
+//	require.HTTPErrorf(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}}
 //
 // Returns whether the assertion was successful (true) or not (false).
 func HTTPErrorf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) {
@@ -749,7 +749,7 @@ func HTTPErrorf(t TestingT, handler http.HandlerFunc, method string, url string,
 
 // HTTPRedirect asserts that a specified handler returns a redirect status code.
 //
-//	assert.HTTPRedirect(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}}
+//	require.HTTPRedirect(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}}
 //
 // Returns whether the assertion was successful (true) or not (false).
 func HTTPRedirect(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) {
@@ -764,7 +764,7 @@ func HTTPRedirect(t TestingT, handler http.HandlerFunc, method string, url strin
 
 // HTTPRedirectf asserts that a specified handler returns a redirect status code.
 //
-//	assert.HTTPRedirectf(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}}
+//	require.HTTPRedirectf(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}}
 //
 // Returns whether the assertion was successful (true) or not (false).
 func HTTPRedirectf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) {
@@ -779,7 +779,7 @@ func HTTPRedirectf(t TestingT, handler http.HandlerFunc, method string, url stri
 
 // HTTPStatusCode asserts that a specified handler returns a specified status code.
 //
-//	assert.HTTPStatusCode(t, myHandler, "GET", "/notImplemented", nil, 501)
+//	require.HTTPStatusCode(t, myHandler, "GET", "/notImplemented", nil, 501)
 //
 // Returns whether the assertion was successful (true) or not (false).
 func HTTPStatusCode(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, statuscode int, msgAndArgs ...interface{}) {
@@ -794,7 +794,7 @@ func HTTPStatusCode(t TestingT, handler http.HandlerFunc, method string, url str
 
 // HTTPStatusCodef asserts that a specified handler returns a specified status code.
 //
-//	assert.HTTPStatusCodef(t, myHandler, "GET", "/notImplemented", nil, 501, "error message %s", "formatted")
+//	require.HTTPStatusCodef(t, myHandler, "GET", "/notImplemented", nil, 501, "error message %s", "formatted")
 //
 // Returns whether the assertion was successful (true) or not (false).
 func HTTPStatusCodef(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, statuscode int, msg string, args ...interface{}) {
@@ -809,7 +809,7 @@ func HTTPStatusCodef(t TestingT, handler http.HandlerFunc, method string, url st
 
 // HTTPSuccess asserts that a specified handler returns a success status code.
 //
-//	assert.HTTPSuccess(t, myHandler, "POST", "http://www.google.com", nil)
+//	require.HTTPSuccess(t, myHandler, "POST", "http://www.google.com", nil)
 //
 // Returns whether the assertion was successful (true) or not (false).
 func HTTPSuccess(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) {
@@ -824,7 +824,7 @@ func HTTPSuccess(t TestingT, handler http.HandlerFunc, method string, url string
 
 // HTTPSuccessf asserts that a specified handler returns a success status code.
 //
-//	assert.HTTPSuccessf(t, myHandler, "POST", "http://www.google.com", nil, "error message %s", "formatted")
+//	require.HTTPSuccessf(t, myHandler, "POST", "http://www.google.com", nil, "error message %s", "formatted")
 //
 // Returns whether the assertion was successful (true) or not (false).
 func HTTPSuccessf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) {
@@ -839,7 +839,7 @@ func HTTPSuccessf(t TestingT, handler http.HandlerFunc, method string, url strin
 
 // Implements asserts that an object is implemented by the specified interface.
 //
-//	assert.Implements(t, (*MyInterface)(nil), new(MyObject))
+//	require.Implements(t, (*MyInterface)(nil), new(MyObject))
 func Implements(t TestingT, interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -852,7 +852,7 @@ func Implements(t TestingT, interfaceObject interface{}, object interface{}, msg
 
 // Implementsf asserts that an object is implemented by the specified interface.
 //
-//	assert.Implementsf(t, (*MyInterface)(nil), new(MyObject), "error message %s", "formatted")
+//	require.Implementsf(t, (*MyInterface)(nil), new(MyObject), "error message %s", "formatted")
 func Implementsf(t TestingT, interfaceObject interface{}, object interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -865,7 +865,7 @@ func Implementsf(t TestingT, interfaceObject interface{}, object interface{}, ms
 
 // InDelta asserts that the two numerals are within delta of each other.
 //
-//	assert.InDelta(t, math.Pi, 22/7.0, 0.01)
+//	require.InDelta(t, math.Pi, 22/7.0, 0.01)
 func InDelta(t TestingT, expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -922,7 +922,7 @@ func InDeltaSlicef(t TestingT, expected interface{}, actual interface{}, delta f
 
 // InDeltaf asserts that the two numerals are within delta of each other.
 //
-//	assert.InDeltaf(t, math.Pi, 22/7.0, 0.01, "error message %s", "formatted")
+//	require.InDeltaf(t, math.Pi, 22/7.0, 0.01, "error message %s", "formatted")
 func InDeltaf(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -979,9 +979,9 @@ func InEpsilonf(t TestingT, expected interface{}, actual interface{}, epsilon fl
 
 // IsDecreasing asserts that the collection is decreasing
 //
-//	assert.IsDecreasing(t, []int{2, 1, 0})
-//	assert.IsDecreasing(t, []float{2, 1})
-//	assert.IsDecreasing(t, []string{"b", "a"})
+//	require.IsDecreasing(t, []int{2, 1, 0})
+//	require.IsDecreasing(t, []float{2, 1})
+//	require.IsDecreasing(t, []string{"b", "a"})
 func IsDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -994,9 +994,9 @@ func IsDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) {
 
 // IsDecreasingf asserts that the collection is decreasing
 //
-//	assert.IsDecreasingf(t, []int{2, 1, 0}, "error message %s", "formatted")
-//	assert.IsDecreasingf(t, []float{2, 1}, "error message %s", "formatted")
-//	assert.IsDecreasingf(t, []string{"b", "a"}, "error message %s", "formatted")
+//	require.IsDecreasingf(t, []int{2, 1, 0}, "error message %s", "formatted")
+//	require.IsDecreasingf(t, []float{2, 1}, "error message %s", "formatted")
+//	require.IsDecreasingf(t, []string{"b", "a"}, "error message %s", "formatted")
 func IsDecreasingf(t TestingT, object interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1009,9 +1009,9 @@ func IsDecreasingf(t TestingT, object interface{}, msg string, args ...interface
 
 // IsIncreasing asserts that the collection is increasing
 //
-//	assert.IsIncreasing(t, []int{1, 2, 3})
-//	assert.IsIncreasing(t, []float{1, 2})
-//	assert.IsIncreasing(t, []string{"a", "b"})
+//	require.IsIncreasing(t, []int{1, 2, 3})
+//	require.IsIncreasing(t, []float{1, 2})
+//	require.IsIncreasing(t, []string{"a", "b"})
 func IsIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1024,9 +1024,9 @@ func IsIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) {
 
 // IsIncreasingf asserts that the collection is increasing
 //
-//	assert.IsIncreasingf(t, []int{1, 2, 3}, "error message %s", "formatted")
-//	assert.IsIncreasingf(t, []float{1, 2}, "error message %s", "formatted")
-//	assert.IsIncreasingf(t, []string{"a", "b"}, "error message %s", "formatted")
+//	require.IsIncreasingf(t, []int{1, 2, 3}, "error message %s", "formatted")
+//	require.IsIncreasingf(t, []float{1, 2}, "error message %s", "formatted")
+//	require.IsIncreasingf(t, []string{"a", "b"}, "error message %s", "formatted")
 func IsIncreasingf(t TestingT, object interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1039,9 +1039,9 @@ func IsIncreasingf(t TestingT, object interface{}, msg string, args ...interface
 
 // IsNonDecreasing asserts that the collection is not decreasing
 //
-//	assert.IsNonDecreasing(t, []int{1, 1, 2})
-//	assert.IsNonDecreasing(t, []float{1, 2})
-//	assert.IsNonDecreasing(t, []string{"a", "b"})
+//	require.IsNonDecreasing(t, []int{1, 1, 2})
+//	require.IsNonDecreasing(t, []float{1, 2})
+//	require.IsNonDecreasing(t, []string{"a", "b"})
 func IsNonDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1054,9 +1054,9 @@ func IsNonDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{})
 
 // IsNonDecreasingf asserts that the collection is not decreasing
 //
-//	assert.IsNonDecreasingf(t, []int{1, 1, 2}, "error message %s", "formatted")
-//	assert.IsNonDecreasingf(t, []float{1, 2}, "error message %s", "formatted")
-//	assert.IsNonDecreasingf(t, []string{"a", "b"}, "error message %s", "formatted")
+//	require.IsNonDecreasingf(t, []int{1, 1, 2}, "error message %s", "formatted")
+//	require.IsNonDecreasingf(t, []float{1, 2}, "error message %s", "formatted")
+//	require.IsNonDecreasingf(t, []string{"a", "b"}, "error message %s", "formatted")
 func IsNonDecreasingf(t TestingT, object interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1069,9 +1069,9 @@ func IsNonDecreasingf(t TestingT, object interface{}, msg string, args ...interf
 
 // IsNonIncreasing asserts that the collection is not increasing
 //
-//	assert.IsNonIncreasing(t, []int{2, 1, 1})
-//	assert.IsNonIncreasing(t, []float{2, 1})
-//	assert.IsNonIncreasing(t, []string{"b", "a"})
+//	require.IsNonIncreasing(t, []int{2, 1, 1})
+//	require.IsNonIncreasing(t, []float{2, 1})
+//	require.IsNonIncreasing(t, []string{"b", "a"})
 func IsNonIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1084,9 +1084,9 @@ func IsNonIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{})
 
 // IsNonIncreasingf asserts that the collection is not increasing
 //
-//	assert.IsNonIncreasingf(t, []int{2, 1, 1}, "error message %s", "formatted")
-//	assert.IsNonIncreasingf(t, []float{2, 1}, "error message %s", "formatted")
-//	assert.IsNonIncreasingf(t, []string{"b", "a"}, "error message %s", "formatted")
+//	require.IsNonIncreasingf(t, []int{2, 1, 1}, "error message %s", "formatted")
+//	require.IsNonIncreasingf(t, []float{2, 1}, "error message %s", "formatted")
+//	require.IsNonIncreasingf(t, []string{"b", "a"}, "error message %s", "formatted")
 func IsNonIncreasingf(t TestingT, object interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1121,7 +1121,7 @@ func IsTypef(t TestingT, expectedType interface{}, object interface{}, msg strin
 
 // JSONEq asserts that two JSON strings are equivalent.
 //
-//	assert.JSONEq(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`)
+//	require.JSONEq(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`)
 func JSONEq(t TestingT, expected string, actual string, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1134,7 +1134,7 @@ func JSONEq(t TestingT, expected string, actual string, msgAndArgs ...interface{
 
 // JSONEqf asserts that two JSON strings are equivalent.
 //
-//	assert.JSONEqf(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`, "error message %s", "formatted")
+//	require.JSONEqf(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`, "error message %s", "formatted")
 func JSONEqf(t TestingT, expected string, actual string, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1148,7 +1148,7 @@ func JSONEqf(t TestingT, expected string, actual string, msg string, args ...int
 // Len asserts that the specified object has specific length.
 // Len also fails if the object has a type that len() not accept.
 //
-//	assert.Len(t, mySlice, 3)
+//	require.Len(t, mySlice, 3)
 func Len(t TestingT, object interface{}, length int, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1162,7 +1162,7 @@ func Len(t TestingT, object interface{}, length int, msgAndArgs ...interface{})
 // Lenf asserts that the specified object has specific length.
 // Lenf also fails if the object has a type that len() not accept.
 //
-//	assert.Lenf(t, mySlice, 3, "error message %s", "formatted")
+//	require.Lenf(t, mySlice, 3, "error message %s", "formatted")
 func Lenf(t TestingT, object interface{}, length int, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1175,9 +1175,9 @@ func Lenf(t TestingT, object interface{}, length int, msg string, args ...interf
 
 // Less asserts that the first element is less than the second
 //
-//	assert.Less(t, 1, 2)
-//	assert.Less(t, float64(1), float64(2))
-//	assert.Less(t, "a", "b")
+//	require.Less(t, 1, 2)
+//	require.Less(t, float64(1), float64(2))
+//	require.Less(t, "a", "b")
 func Less(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1190,10 +1190,10 @@ func Less(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{})
 
 // LessOrEqual asserts that the first element is less than or equal to the second
 //
-//	assert.LessOrEqual(t, 1, 2)
-//	assert.LessOrEqual(t, 2, 2)
-//	assert.LessOrEqual(t, "a", "b")
-//	assert.LessOrEqual(t, "b", "b")
+//	require.LessOrEqual(t, 1, 2)
+//	require.LessOrEqual(t, 2, 2)
+//	require.LessOrEqual(t, "a", "b")
+//	require.LessOrEqual(t, "b", "b")
 func LessOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1206,10 +1206,10 @@ func LessOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...inter
 
 // LessOrEqualf asserts that the first element is less than or equal to the second
 //
-//	assert.LessOrEqualf(t, 1, 2, "error message %s", "formatted")
-//	assert.LessOrEqualf(t, 2, 2, "error message %s", "formatted")
-//	assert.LessOrEqualf(t, "a", "b", "error message %s", "formatted")
-//	assert.LessOrEqualf(t, "b", "b", "error message %s", "formatted")
+//	require.LessOrEqualf(t, 1, 2, "error message %s", "formatted")
+//	require.LessOrEqualf(t, 2, 2, "error message %s", "formatted")
+//	require.LessOrEqualf(t, "a", "b", "error message %s", "formatted")
+//	require.LessOrEqualf(t, "b", "b", "error message %s", "formatted")
 func LessOrEqualf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1222,9 +1222,9 @@ func LessOrEqualf(t TestingT, e1 interface{}, e2 interface{}, msg string, args .
 
 // Lessf asserts that the first element is less than the second
 //
-//	assert.Lessf(t, 1, 2, "error message %s", "formatted")
-//	assert.Lessf(t, float64(1), float64(2), "error message %s", "formatted")
-//	assert.Lessf(t, "a", "b", "error message %s", "formatted")
+//	require.Lessf(t, 1, 2, "error message %s", "formatted")
+//	require.Lessf(t, float64(1), float64(2), "error message %s", "formatted")
+//	require.Lessf(t, "a", "b", "error message %s", "formatted")
 func Lessf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1237,8 +1237,8 @@ func Lessf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...inter
 
 // Negative asserts that the specified element is negative
 //
-//	assert.Negative(t, -1)
-//	assert.Negative(t, -1.23)
+//	require.Negative(t, -1)
+//	require.Negative(t, -1.23)
 func Negative(t TestingT, e interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1251,8 +1251,8 @@ func Negative(t TestingT, e interface{}, msgAndArgs ...interface{}) {
 
 // Negativef asserts that the specified element is negative
 //
-//	assert.Negativef(t, -1, "error message %s", "formatted")
-//	assert.Negativef(t, -1.23, "error message %s", "formatted")
+//	require.Negativef(t, -1, "error message %s", "formatted")
+//	require.Negativef(t, -1.23, "error message %s", "formatted")
 func Negativef(t TestingT, e interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1266,7 +1266,7 @@ func Negativef(t TestingT, e interface{}, msg string, args ...interface{}) {
 // Never asserts that the given condition doesn't satisfy in waitFor time,
 // periodically checking the target function each tick.
 //
-//	assert.Never(t, func() bool { return false; }, time.Second, 10*time.Millisecond)
+//	require.Never(t, func() bool { return false; }, time.Second, 10*time.Millisecond)
 func Never(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1280,7 +1280,7 @@ func Never(t TestingT, condition func() bool, waitFor time.Duration, tick time.D
 // Neverf asserts that the given condition doesn't satisfy in waitFor time,
 // periodically checking the target function each tick.
 //
-//	assert.Neverf(t, func() bool { return false; }, time.Second, 10*time.Millisecond, "error message %s", "formatted")
+//	require.Neverf(t, func() bool { return false; }, time.Second, 10*time.Millisecond, "error message %s", "formatted")
 func Neverf(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1293,7 +1293,7 @@ func Neverf(t TestingT, condition func() bool, waitFor time.Duration, tick time.
 
 // Nil asserts that the specified object is nil.
 //
-//	assert.Nil(t, err)
+//	require.Nil(t, err)
 func Nil(t TestingT, object interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1306,7 +1306,7 @@ func Nil(t TestingT, object interface{}, msgAndArgs ...interface{}) {
 
 // Nilf asserts that the specified object is nil.
 //
-//	assert.Nilf(t, err, "error message %s", "formatted")
+//	require.Nilf(t, err, "error message %s", "formatted")
 func Nilf(t TestingT, object interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1344,8 +1344,8 @@ func NoDirExistsf(t TestingT, path string, msg string, args ...interface{}) {
 // NoError asserts that a function returned no error (i.e. `nil`).
 //
 //	  actualObj, err := SomeFunction()
-//	  if assert.NoError(t, err) {
-//		   assert.Equal(t, expectedObj, actualObj)
+//	  if require.NoError(t, err) {
+//		   require.Equal(t, expectedObj, actualObj)
 //	  }
 func NoError(t TestingT, err error, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
@@ -1360,8 +1360,8 @@ func NoError(t TestingT, err error, msgAndArgs ...interface{}) {
 // NoErrorf asserts that a function returned no error (i.e. `nil`).
 //
 //	  actualObj, err := SomeFunction()
-//	  if assert.NoErrorf(t, err, "error message %s", "formatted") {
-//		   assert.Equal(t, expectedObj, actualObj)
+//	  if require.NoErrorf(t, err, "error message %s", "formatted") {
+//		   require.Equal(t, expectedObj, actualObj)
 //	  }
 func NoErrorf(t TestingT, err error, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
@@ -1400,9 +1400,9 @@ func NoFileExistsf(t TestingT, path string, msg string, args ...interface{}) {
 // NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the
 // specified substring or element.
 //
-//	assert.NotContains(t, "Hello World", "Earth")
-//	assert.NotContains(t, ["Hello", "World"], "Earth")
-//	assert.NotContains(t, {"Hello": "World"}, "Earth")
+//	require.NotContains(t, "Hello World", "Earth")
+//	require.NotContains(t, ["Hello", "World"], "Earth")
+//	require.NotContains(t, {"Hello": "World"}, "Earth")
 func NotContains(t TestingT, s interface{}, contains interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1416,9 +1416,9 @@ func NotContains(t TestingT, s interface{}, contains interface{}, msgAndArgs ...
 // NotContainsf asserts that the specified string, list(array, slice...) or map does NOT contain the
 // specified substring or element.
 //
-//	assert.NotContainsf(t, "Hello World", "Earth", "error message %s", "formatted")
-//	assert.NotContainsf(t, ["Hello", "World"], "Earth", "error message %s", "formatted")
-//	assert.NotContainsf(t, {"Hello": "World"}, "Earth", "error message %s", "formatted")
+//	require.NotContainsf(t, "Hello World", "Earth", "error message %s", "formatted")
+//	require.NotContainsf(t, ["Hello", "World"], "Earth", "error message %s", "formatted")
+//	require.NotContainsf(t, {"Hello": "World"}, "Earth", "error message %s", "formatted")
 func NotContainsf(t TestingT, s interface{}, contains interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1429,11 +1429,51 @@ func NotContainsf(t TestingT, s interface{}, contains interface{}, msg string, a
 	t.FailNow()
 }
 
+// NotElementsMatch asserts that the specified listA(array, slice...) is NOT equal to specified
+// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements,
+// the number of appearances of each of them in both lists should not match.
+// This is an inverse of ElementsMatch.
+//
+// require.NotElementsMatch(t, [1, 1, 2, 3], [1, 1, 2, 3]) -> false
+//
+// require.NotElementsMatch(t, [1, 1, 2, 3], [1, 2, 3]) -> true
+//
+// require.NotElementsMatch(t, [1, 2, 3], [1, 2, 4]) -> true
+func NotElementsMatch(t TestingT, listA interface{}, listB interface{}, msgAndArgs ...interface{}) {
+	if h, ok := t.(tHelper); ok {
+		h.Helper()
+	}
+	if assert.NotElementsMatch(t, listA, listB, msgAndArgs...) {
+		return
+	}
+	t.FailNow()
+}
+
+// NotElementsMatchf asserts that the specified listA(array, slice...) is NOT equal to specified
+// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements,
+// the number of appearances of each of them in both lists should not match.
+// This is an inverse of ElementsMatch.
+//
+// require.NotElementsMatchf(t, [1, 1, 2, 3], [1, 1, 2, 3], "error message %s", "formatted") -> false
+//
+// require.NotElementsMatchf(t, [1, 1, 2, 3], [1, 2, 3], "error message %s", "formatted") -> true
+//
+// require.NotElementsMatchf(t, [1, 2, 3], [1, 2, 4], "error message %s", "formatted") -> true
+func NotElementsMatchf(t TestingT, listA interface{}, listB interface{}, msg string, args ...interface{}) {
+	if h, ok := t.(tHelper); ok {
+		h.Helper()
+	}
+	if assert.NotElementsMatchf(t, listA, listB, msg, args...) {
+		return
+	}
+	t.FailNow()
+}
+
 // NotEmpty asserts that the specified object is NOT empty.  I.e. not nil, "", false, 0 or either
 // a slice or a channel with len == 0.
 //
-//	if assert.NotEmpty(t, obj) {
-//	  assert.Equal(t, "two", obj[1])
+//	if require.NotEmpty(t, obj) {
+//	  require.Equal(t, "two", obj[1])
 //	}
 func NotEmpty(t TestingT, object interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
@@ -1448,8 +1488,8 @@ func NotEmpty(t TestingT, object interface{}, msgAndArgs ...interface{}) {
 // NotEmptyf asserts that the specified object is NOT empty.  I.e. not nil, "", false, 0 or either
 // a slice or a channel with len == 0.
 //
-//	if assert.NotEmptyf(t, obj, "error message %s", "formatted") {
-//	  assert.Equal(t, "two", obj[1])
+//	if require.NotEmptyf(t, obj, "error message %s", "formatted") {
+//	  require.Equal(t, "two", obj[1])
 //	}
 func NotEmptyf(t TestingT, object interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
@@ -1463,7 +1503,7 @@ func NotEmptyf(t TestingT, object interface{}, msg string, args ...interface{})
 
 // NotEqual asserts that the specified values are NOT equal.
 //
-//	assert.NotEqual(t, obj1, obj2)
+//	require.NotEqual(t, obj1, obj2)
 //
 // Pointer variable equality is determined based on the equality of the
 // referenced values (as opposed to the memory addresses).
@@ -1479,7 +1519,7 @@ func NotEqual(t TestingT, expected interface{}, actual interface{}, msgAndArgs .
 
 // NotEqualValues asserts that two objects are not equal even when converted to the same type
 //
-//	assert.NotEqualValues(t, obj1, obj2)
+//	require.NotEqualValues(t, obj1, obj2)
 func NotEqualValues(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1492,7 +1532,7 @@ func NotEqualValues(t TestingT, expected interface{}, actual interface{}, msgAnd
 
 // NotEqualValuesf asserts that two objects are not equal even when converted to the same type
 //
-//	assert.NotEqualValuesf(t, obj1, obj2, "error message %s", "formatted")
+//	require.NotEqualValuesf(t, obj1, obj2, "error message %s", "formatted")
 func NotEqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1505,7 +1545,7 @@ func NotEqualValuesf(t TestingT, expected interface{}, actual interface{}, msg s
 
 // NotEqualf asserts that the specified values are NOT equal.
 //
-//	assert.NotEqualf(t, obj1, obj2, "error message %s", "formatted")
+//	require.NotEqualf(t, obj1, obj2, "error message %s", "formatted")
 //
 // Pointer variable equality is determined based on the equality of the
 // referenced values (as opposed to the memory addresses).
@@ -1519,7 +1559,31 @@ func NotEqualf(t TestingT, expected interface{}, actual interface{}, msg string,
 	t.FailNow()
 }
 
-// NotErrorIs asserts that at none of the errors in err's chain matches target.
+// NotErrorAs asserts that none of the errors in err's chain matches target,
+// but if so, sets target to that error value.
+func NotErrorAs(t TestingT, err error, target interface{}, msgAndArgs ...interface{}) {
+	if h, ok := t.(tHelper); ok {
+		h.Helper()
+	}
+	if assert.NotErrorAs(t, err, target, msgAndArgs...) {
+		return
+	}
+	t.FailNow()
+}
+
+// NotErrorAsf asserts that none of the errors in err's chain matches target,
+// but if so, sets target to that error value.
+func NotErrorAsf(t TestingT, err error, target interface{}, msg string, args ...interface{}) {
+	if h, ok := t.(tHelper); ok {
+		h.Helper()
+	}
+	if assert.NotErrorAsf(t, err, target, msg, args...) {
+		return
+	}
+	t.FailNow()
+}
+
+// NotErrorIs asserts that none of the errors in err's chain matches target.
 // This is a wrapper for errors.Is.
 func NotErrorIs(t TestingT, err error, target error, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
@@ -1531,7 +1595,7 @@ func NotErrorIs(t TestingT, err error, target error, msgAndArgs ...interface{})
 	t.FailNow()
 }
 
-// NotErrorIsf asserts that at none of the errors in err's chain matches target.
+// NotErrorIsf asserts that none of the errors in err's chain matches target.
 // This is a wrapper for errors.Is.
 func NotErrorIsf(t TestingT, err error, target error, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
@@ -1545,7 +1609,7 @@ func NotErrorIsf(t TestingT, err error, target error, msg string, args ...interf
 
 // NotImplements asserts that an object does not implement the specified interface.
 //
-//	assert.NotImplements(t, (*MyInterface)(nil), new(MyObject))
+//	require.NotImplements(t, (*MyInterface)(nil), new(MyObject))
 func NotImplements(t TestingT, interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1558,7 +1622,7 @@ func NotImplements(t TestingT, interfaceObject interface{}, object interface{},
 
 // NotImplementsf asserts that an object does not implement the specified interface.
 //
-//	assert.NotImplementsf(t, (*MyInterface)(nil), new(MyObject), "error message %s", "formatted")
+//	require.NotImplementsf(t, (*MyInterface)(nil), new(MyObject), "error message %s", "formatted")
 func NotImplementsf(t TestingT, interfaceObject interface{}, object interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1571,7 +1635,7 @@ func NotImplementsf(t TestingT, interfaceObject interface{}, object interface{},
 
 // NotNil asserts that the specified object is not nil.
 //
-//	assert.NotNil(t, err)
+//	require.NotNil(t, err)
 func NotNil(t TestingT, object interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1584,7 +1648,7 @@ func NotNil(t TestingT, object interface{}, msgAndArgs ...interface{}) {
 
 // NotNilf asserts that the specified object is not nil.
 //
-//	assert.NotNilf(t, err, "error message %s", "formatted")
+//	require.NotNilf(t, err, "error message %s", "formatted")
 func NotNilf(t TestingT, object interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1597,7 +1661,7 @@ func NotNilf(t TestingT, object interface{}, msg string, args ...interface{}) {
 
 // NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic.
 //
-//	assert.NotPanics(t, func(){ RemainCalm() })
+//	require.NotPanics(t, func(){ RemainCalm() })
 func NotPanics(t TestingT, f assert.PanicTestFunc, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1610,7 +1674,7 @@ func NotPanics(t TestingT, f assert.PanicTestFunc, msgAndArgs ...interface{}) {
 
 // NotPanicsf asserts that the code inside the specified PanicTestFunc does NOT panic.
 //
-//	assert.NotPanicsf(t, func(){ RemainCalm() }, "error message %s", "formatted")
+//	require.NotPanicsf(t, func(){ RemainCalm() }, "error message %s", "formatted")
 func NotPanicsf(t TestingT, f assert.PanicTestFunc, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1623,8 +1687,8 @@ func NotPanicsf(t TestingT, f assert.PanicTestFunc, msg string, args ...interfac
 
 // NotRegexp asserts that a specified regexp does not match a string.
 //
-//	assert.NotRegexp(t, regexp.MustCompile("starts"), "it's starting")
-//	assert.NotRegexp(t, "^start", "it's not starting")
+//	require.NotRegexp(t, regexp.MustCompile("starts"), "it's starting")
+//	require.NotRegexp(t, "^start", "it's not starting")
 func NotRegexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1637,8 +1701,8 @@ func NotRegexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interf
 
 // NotRegexpf asserts that a specified regexp does not match a string.
 //
-//	assert.NotRegexpf(t, regexp.MustCompile("starts"), "it's starting", "error message %s", "formatted")
-//	assert.NotRegexpf(t, "^start", "it's not starting", "error message %s", "formatted")
+//	require.NotRegexpf(t, regexp.MustCompile("starts"), "it's starting", "error message %s", "formatted")
+//	require.NotRegexpf(t, "^start", "it's not starting", "error message %s", "formatted")
 func NotRegexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1651,7 +1715,7 @@ func NotRegexpf(t TestingT, rx interface{}, str interface{}, msg string, args ..
 
 // NotSame asserts that two pointers do not reference the same object.
 //
-//	assert.NotSame(t, ptr1, ptr2)
+//	require.NotSame(t, ptr1, ptr2)
 //
 // Both arguments must be pointer variables. Pointer variable sameness is
 // determined based on the equality of both type and value.
@@ -1667,7 +1731,7 @@ func NotSame(t TestingT, expected interface{}, actual interface{}, msgAndArgs ..
 
 // NotSamef asserts that two pointers do not reference the same object.
 //
-//	assert.NotSamef(t, ptr1, ptr2, "error message %s", "formatted")
+//	require.NotSamef(t, ptr1, ptr2, "error message %s", "formatted")
 //
 // Both arguments must be pointer variables. Pointer variable sameness is
 // determined based on the equality of both type and value.
@@ -1685,8 +1749,8 @@ func NotSamef(t TestingT, expected interface{}, actual interface{}, msg string,
 // contain all elements given in the specified subset list(array, slice...) or
 // map.
 //
-//	assert.NotSubset(t, [1, 3, 4], [1, 2])
-//	assert.NotSubset(t, {"x": 1, "y": 2}, {"z": 3})
+//	require.NotSubset(t, [1, 3, 4], [1, 2])
+//	require.NotSubset(t, {"x": 1, "y": 2}, {"z": 3})
 func NotSubset(t TestingT, list interface{}, subset interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1701,8 +1765,8 @@ func NotSubset(t TestingT, list interface{}, subset interface{}, msgAndArgs ...i
 // contain all elements given in the specified subset list(array, slice...) or
 // map.
 //
-//	assert.NotSubsetf(t, [1, 3, 4], [1, 2], "error message %s", "formatted")
-//	assert.NotSubsetf(t, {"x": 1, "y": 2}, {"z": 3}, "error message %s", "formatted")
+//	require.NotSubsetf(t, [1, 3, 4], [1, 2], "error message %s", "formatted")
+//	require.NotSubsetf(t, {"x": 1, "y": 2}, {"z": 3}, "error message %s", "formatted")
 func NotSubsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1737,7 +1801,7 @@ func NotZerof(t TestingT, i interface{}, msg string, args ...interface{}) {
 
 // Panics asserts that the code inside the specified PanicTestFunc panics.
 //
-//	assert.Panics(t, func(){ GoCrazy() })
+//	require.Panics(t, func(){ GoCrazy() })
 func Panics(t TestingT, f assert.PanicTestFunc, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1752,7 +1816,7 @@ func Panics(t TestingT, f assert.PanicTestFunc, msgAndArgs ...interface{}) {
 // panics, and that the recovered panic value is an error that satisfies the
 // EqualError comparison.
 //
-//	assert.PanicsWithError(t, "crazy error", func(){ GoCrazy() })
+//	require.PanicsWithError(t, "crazy error", func(){ GoCrazy() })
 func PanicsWithError(t TestingT, errString string, f assert.PanicTestFunc, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1767,7 +1831,7 @@ func PanicsWithError(t TestingT, errString string, f assert.PanicTestFunc, msgAn
 // panics, and that the recovered panic value is an error that satisfies the
 // EqualError comparison.
 //
-//	assert.PanicsWithErrorf(t, "crazy error", func(){ GoCrazy() }, "error message %s", "formatted")
+//	require.PanicsWithErrorf(t, "crazy error", func(){ GoCrazy() }, "error message %s", "formatted")
 func PanicsWithErrorf(t TestingT, errString string, f assert.PanicTestFunc, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1781,7 +1845,7 @@ func PanicsWithErrorf(t TestingT, errString string, f assert.PanicTestFunc, msg
 // PanicsWithValue asserts that the code inside the specified PanicTestFunc panics, and that
 // the recovered panic value equals the expected panic value.
 //
-//	assert.PanicsWithValue(t, "crazy error", func(){ GoCrazy() })
+//	require.PanicsWithValue(t, "crazy error", func(){ GoCrazy() })
 func PanicsWithValue(t TestingT, expected interface{}, f assert.PanicTestFunc, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1795,7 +1859,7 @@ func PanicsWithValue(t TestingT, expected interface{}, f assert.PanicTestFunc, m
 // PanicsWithValuef asserts that the code inside the specified PanicTestFunc panics, and that
 // the recovered panic value equals the expected panic value.
 //
-//	assert.PanicsWithValuef(t, "crazy error", func(){ GoCrazy() }, "error message %s", "formatted")
+//	require.PanicsWithValuef(t, "crazy error", func(){ GoCrazy() }, "error message %s", "formatted")
 func PanicsWithValuef(t TestingT, expected interface{}, f assert.PanicTestFunc, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1808,7 +1872,7 @@ func PanicsWithValuef(t TestingT, expected interface{}, f assert.PanicTestFunc,
 
 // Panicsf asserts that the code inside the specified PanicTestFunc panics.
 //
-//	assert.Panicsf(t, func(){ GoCrazy() }, "error message %s", "formatted")
+//	require.Panicsf(t, func(){ GoCrazy() }, "error message %s", "formatted")
 func Panicsf(t TestingT, f assert.PanicTestFunc, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1821,8 +1885,8 @@ func Panicsf(t TestingT, f assert.PanicTestFunc, msg string, args ...interface{}
 
 // Positive asserts that the specified element is positive
 //
-//	assert.Positive(t, 1)
-//	assert.Positive(t, 1.23)
+//	require.Positive(t, 1)
+//	require.Positive(t, 1.23)
 func Positive(t TestingT, e interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1835,8 +1899,8 @@ func Positive(t TestingT, e interface{}, msgAndArgs ...interface{}) {
 
 // Positivef asserts that the specified element is positive
 //
-//	assert.Positivef(t, 1, "error message %s", "formatted")
-//	assert.Positivef(t, 1.23, "error message %s", "formatted")
+//	require.Positivef(t, 1, "error message %s", "formatted")
+//	require.Positivef(t, 1.23, "error message %s", "formatted")
 func Positivef(t TestingT, e interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1849,8 +1913,8 @@ func Positivef(t TestingT, e interface{}, msg string, args ...interface{}) {
 
 // Regexp asserts that a specified regexp matches a string.
 //
-//	assert.Regexp(t, regexp.MustCompile("start"), "it's starting")
-//	assert.Regexp(t, "start...$", "it's not starting")
+//	require.Regexp(t, regexp.MustCompile("start"), "it's starting")
+//	require.Regexp(t, "start...$", "it's not starting")
 func Regexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1863,8 +1927,8 @@ func Regexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface
 
 // Regexpf asserts that a specified regexp matches a string.
 //
-//	assert.Regexpf(t, regexp.MustCompile("start"), "it's starting", "error message %s", "formatted")
-//	assert.Regexpf(t, "start...$", "it's not starting", "error message %s", "formatted")
+//	require.Regexpf(t, regexp.MustCompile("start"), "it's starting", "error message %s", "formatted")
+//	require.Regexpf(t, "start...$", "it's not starting", "error message %s", "formatted")
 func Regexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1877,7 +1941,7 @@ func Regexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...in
 
 // Same asserts that two pointers reference the same object.
 //
-//	assert.Same(t, ptr1, ptr2)
+//	require.Same(t, ptr1, ptr2)
 //
 // Both arguments must be pointer variables. Pointer variable sameness is
 // determined based on the equality of both type and value.
@@ -1893,7 +1957,7 @@ func Same(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...in
 
 // Samef asserts that two pointers reference the same object.
 //
-//	assert.Samef(t, ptr1, ptr2, "error message %s", "formatted")
+//	require.Samef(t, ptr1, ptr2, "error message %s", "formatted")
 //
 // Both arguments must be pointer variables. Pointer variable sameness is
 // determined based on the equality of both type and value.
@@ -1910,8 +1974,8 @@ func Samef(t TestingT, expected interface{}, actual interface{}, msg string, arg
 // Subset asserts that the specified list(array, slice...) or map contains all
 // elements given in the specified subset list(array, slice...) or map.
 //
-//	assert.Subset(t, [1, 2, 3], [1, 2])
-//	assert.Subset(t, {"x": 1, "y": 2}, {"x": 1})
+//	require.Subset(t, [1, 2, 3], [1, 2])
+//	require.Subset(t, {"x": 1, "y": 2}, {"x": 1})
 func Subset(t TestingT, list interface{}, subset interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1925,8 +1989,8 @@ func Subset(t TestingT, list interface{}, subset interface{}, msgAndArgs ...inte
 // Subsetf asserts that the specified list(array, slice...) or map contains all
 // elements given in the specified subset list(array, slice...) or map.
 //
-//	assert.Subsetf(t, [1, 2, 3], [1, 2], "error message %s", "formatted")
-//	assert.Subsetf(t, {"x": 1, "y": 2}, {"x": 1}, "error message %s", "formatted")
+//	require.Subsetf(t, [1, 2, 3], [1, 2], "error message %s", "formatted")
+//	require.Subsetf(t, {"x": 1, "y": 2}, {"x": 1}, "error message %s", "formatted")
 func Subsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1939,7 +2003,7 @@ func Subsetf(t TestingT, list interface{}, subset interface{}, msg string, args
 
 // True asserts that the specified value is true.
 //
-//	assert.True(t, myBool)
+//	require.True(t, myBool)
 func True(t TestingT, value bool, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1952,7 +2016,7 @@ func True(t TestingT, value bool, msgAndArgs ...interface{}) {
 
 // Truef asserts that the specified value is true.
 //
-//	assert.Truef(t, myBool, "error message %s", "formatted")
+//	require.Truef(t, myBool, "error message %s", "formatted")
 func Truef(t TestingT, value bool, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1965,7 +2029,7 @@ func Truef(t TestingT, value bool, msg string, args ...interface{}) {
 
 // WithinDuration asserts that the two times are within duration delta of each other.
 //
-//	assert.WithinDuration(t, time.Now(), time.Now(), 10*time.Second)
+//	require.WithinDuration(t, time.Now(), time.Now(), 10*time.Second)
 func WithinDuration(t TestingT, expected time.Time, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1978,7 +2042,7 @@ func WithinDuration(t TestingT, expected time.Time, actual time.Time, delta time
 
 // WithinDurationf asserts that the two times are within duration delta of each other.
 //
-//	assert.WithinDurationf(t, time.Now(), time.Now(), 10*time.Second, "error message %s", "formatted")
+//	require.WithinDurationf(t, time.Now(), time.Now(), 10*time.Second, "error message %s", "formatted")
 func WithinDurationf(t TestingT, expected time.Time, actual time.Time, delta time.Duration, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1991,7 +2055,7 @@ func WithinDurationf(t TestingT, expected time.Time, actual time.Time, delta tim
 
 // WithinRange asserts that a time is within a time range (inclusive).
 //
-//	assert.WithinRange(t, time.Now(), time.Now().Add(-time.Second), time.Now().Add(time.Second))
+//	require.WithinRange(t, time.Now(), time.Now().Add(-time.Second), time.Now().Add(time.Second))
 func WithinRange(t TestingT, actual time.Time, start time.Time, end time.Time, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -2004,7 +2068,7 @@ func WithinRange(t TestingT, actual time.Time, start time.Time, end time.Time, m
 
 // WithinRangef asserts that a time is within a time range (inclusive).
 //
-//	assert.WithinRangef(t, time.Now(), time.Now().Add(-time.Second), time.Now().Add(time.Second), "error message %s", "formatted")
+//	require.WithinRangef(t, time.Now(), time.Now().Add(-time.Second), time.Now().Add(time.Second), "error message %s", "formatted")
 func WithinRangef(t TestingT, actual time.Time, start time.Time, end time.Time, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
diff --git a/test/integration/vendor/github.com/stretchr/testify/require/require.go.tmpl b/test/integration/vendor/github.com/stretchr/testify/require/require.go.tmpl
index 55e42ddebd..8b32836850 100644
--- a/test/integration/vendor/github.com/stretchr/testify/require/require.go.tmpl
+++ b/test/integration/vendor/github.com/stretchr/testify/require/require.go.tmpl
@@ -1,4 +1,4 @@
-{{.Comment}}
+{{ replace .Comment "assert." "require."}}
 func {{.DocInfo.Name}}(t TestingT, {{.Params}}) {
 	if h, ok := t.(tHelper); ok { h.Helper() }
 	if assert.{{.DocInfo.Name}}(t, {{.ForwardedParams}}) { return }
diff --git a/test/integration/vendor/github.com/stretchr/testify/require/require_forward.go b/test/integration/vendor/github.com/stretchr/testify/require/require_forward.go
index eee8310a5f..1bd87304f4 100644
--- a/test/integration/vendor/github.com/stretchr/testify/require/require_forward.go
+++ b/test/integration/vendor/github.com/stretchr/testify/require/require_forward.go
@@ -187,8 +187,8 @@ func (a *Assertions) EqualExportedValuesf(expected interface{}, actual interface
 	EqualExportedValuesf(a.t, expected, actual, msg, args...)
 }
 
-// EqualValues asserts that two objects are equal or convertible to the same types
-// and equal.
+// EqualValues asserts that two objects are equal or convertible to the larger
+// type and equal.
 //
 //	a.EqualValues(uint32(123), int32(123))
 func (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) {
@@ -198,8 +198,8 @@ func (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAn
 	EqualValues(a.t, expected, actual, msgAndArgs...)
 }
 
-// EqualValuesf asserts that two objects are equal or convertible to the same types
-// and equal.
+// EqualValuesf asserts that two objects are equal or convertible to the larger
+// type and equal.
 //
 //	a.EqualValuesf(uint32(123), int32(123), "error message %s", "formatted")
 func (a *Assertions) EqualValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) {
@@ -337,7 +337,7 @@ func (a *Assertions) Eventually(condition func() bool, waitFor time.Duration, ti
 //	a.EventuallyWithT(func(c *assert.CollectT) {
 //		// add assertions as needed; any assertion failure will fail the current tick
 //		assert.True(c, externalValue, "expected 'externalValue' to be true")
-//	}, 1*time.Second, 10*time.Second, "external state has not changed to 'true'; still false")
+//	}, 10*time.Second, 1*time.Second, "external state has not changed to 'true'; still false")
 func (a *Assertions) EventuallyWithT(condition func(collect *assert.CollectT), waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) {
 	if h, ok := a.t.(tHelper); ok {
 		h.Helper()
@@ -362,7 +362,7 @@ func (a *Assertions) EventuallyWithT(condition func(collect *assert.CollectT), w
 //	a.EventuallyWithTf(func(c *assert.CollectT, "error message %s", "formatted") {
 //		// add assertions as needed; any assertion failure will fail the current tick
 //		assert.True(c, externalValue, "expected 'externalValue' to be true")
-//	}, 1*time.Second, 10*time.Second, "external state has not changed to 'true'; still false")
+//	}, 10*time.Second, 1*time.Second, "external state has not changed to 'true'; still false")
 func (a *Assertions) EventuallyWithTf(condition func(collect *assert.CollectT), waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) {
 	if h, ok := a.t.(tHelper); ok {
 		h.Helper()
@@ -1129,6 +1129,40 @@ func (a *Assertions) NotContainsf(s interface{}, contains interface{}, msg strin
 	NotContainsf(a.t, s, contains, msg, args...)
 }
 
+// NotElementsMatch asserts that the specified listA(array, slice...) is NOT equal to specified
+// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements,
+// the number of appearances of each of them in both lists should not match.
+// This is an inverse of ElementsMatch.
+//
+// a.NotElementsMatch([1, 1, 2, 3], [1, 1, 2, 3]) -> false
+//
+// a.NotElementsMatch([1, 1, 2, 3], [1, 2, 3]) -> true
+//
+// a.NotElementsMatch([1, 2, 3], [1, 2, 4]) -> true
+func (a *Assertions) NotElementsMatch(listA interface{}, listB interface{}, msgAndArgs ...interface{}) {
+	if h, ok := a.t.(tHelper); ok {
+		h.Helper()
+	}
+	NotElementsMatch(a.t, listA, listB, msgAndArgs...)
+}
+
+// NotElementsMatchf asserts that the specified listA(array, slice...) is NOT equal to specified
+// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements,
+// the number of appearances of each of them in both lists should not match.
+// This is an inverse of ElementsMatch.
+//
+// a.NotElementsMatchf([1, 1, 2, 3], [1, 1, 2, 3], "error message %s", "formatted") -> false
+//
+// a.NotElementsMatchf([1, 1, 2, 3], [1, 2, 3], "error message %s", "formatted") -> true
+//
+// a.NotElementsMatchf([1, 2, 3], [1, 2, 4], "error message %s", "formatted") -> true
+func (a *Assertions) NotElementsMatchf(listA interface{}, listB interface{}, msg string, args ...interface{}) {
+	if h, ok := a.t.(tHelper); ok {
+		h.Helper()
+	}
+	NotElementsMatchf(a.t, listA, listB, msg, args...)
+}
+
 // NotEmpty asserts that the specified object is NOT empty.  I.e. not nil, "", false, 0 or either
 // a slice or a channel with len == 0.
 //
@@ -1201,7 +1235,25 @@ func (a *Assertions) NotEqualf(expected interface{}, actual interface{}, msg str
 	NotEqualf(a.t, expected, actual, msg, args...)
 }
 
-// NotErrorIs asserts that at none of the errors in err's chain matches target.
+// NotErrorAs asserts that none of the errors in err's chain matches target,
+// but if so, sets target to that error value.
+func (a *Assertions) NotErrorAs(err error, target interface{}, msgAndArgs ...interface{}) {
+	if h, ok := a.t.(tHelper); ok {
+		h.Helper()
+	}
+	NotErrorAs(a.t, err, target, msgAndArgs...)
+}
+
+// NotErrorAsf asserts that none of the errors in err's chain matches target,
+// but if so, sets target to that error value.
+func (a *Assertions) NotErrorAsf(err error, target interface{}, msg string, args ...interface{}) {
+	if h, ok := a.t.(tHelper); ok {
+		h.Helper()
+	}
+	NotErrorAsf(a.t, err, target, msg, args...)
+}
+
+// NotErrorIs asserts that none of the errors in err's chain matches target.
 // This is a wrapper for errors.Is.
 func (a *Assertions) NotErrorIs(err error, target error, msgAndArgs ...interface{}) {
 	if h, ok := a.t.(tHelper); ok {
@@ -1210,7 +1262,7 @@ func (a *Assertions) NotErrorIs(err error, target error, msgAndArgs ...interface
 	NotErrorIs(a.t, err, target, msgAndArgs...)
 }
 
-// NotErrorIsf asserts that at none of the errors in err's chain matches target.
+// NotErrorIsf asserts that none of the errors in err's chain matches target.
 // This is a wrapper for errors.Is.
 func (a *Assertions) NotErrorIsf(err error, target error, msg string, args ...interface{}) {
 	if h, ok := a.t.(tHelper); ok {
diff --git a/test/integration/vendor/github.com/stretchr/testify/require/requirements.go b/test/integration/vendor/github.com/stretchr/testify/require/requirements.go
index 91772dfeb9..6b7ce929eb 100644
--- a/test/integration/vendor/github.com/stretchr/testify/require/requirements.go
+++ b/test/integration/vendor/github.com/stretchr/testify/require/requirements.go
@@ -6,7 +6,7 @@ type TestingT interface {
 	FailNow()
 }
 
-type tHelper interface {
+type tHelper = interface {
 	Helper()
 }
 
diff --git a/test/integration/vendor/golang.org/x/net/http2/config.go b/test/integration/vendor/golang.org/x/net/http2/config.go
index de58dfb8dc..ca645d9a1a 100644
--- a/test/integration/vendor/golang.org/x/net/http2/config.go
+++ b/test/integration/vendor/golang.org/x/net/http2/config.go
@@ -60,7 +60,7 @@ func configFromServer(h1 *http.Server, h2 *Server) http2Config {
 	return conf
 }
 
-// configFromServer merges configuration settings from h2 and h2.t1.HTTP2
+// configFromTransport merges configuration settings from h2 and h2.t1.HTTP2
 // (the net/http Transport).
 func configFromTransport(h2 *Transport) http2Config {
 	conf := http2Config{
diff --git a/test/integration/vendor/golang.org/x/net/http2/config_go124.go b/test/integration/vendor/golang.org/x/net/http2/config_go124.go
index e3784123c8..5b516c55ff 100644
--- a/test/integration/vendor/golang.org/x/net/http2/config_go124.go
+++ b/test/integration/vendor/golang.org/x/net/http2/config_go124.go
@@ -13,7 +13,7 @@ func fillNetHTTPServerConfig(conf *http2Config, srv *http.Server) {
 	fillNetHTTPConfig(conf, srv.HTTP2)
 }
 
-// fillNetHTTPServerConfig sets fields in conf from tr.HTTP2.
+// fillNetHTTPTransportConfig sets fields in conf from tr.HTTP2.
 func fillNetHTTPTransportConfig(conf *http2Config, tr *http.Transport) {
 	fillNetHTTPConfig(conf, tr.HTTP2)
 }
diff --git a/test/integration/vendor/golang.org/x/net/http2/transport.go b/test/integration/vendor/golang.org/x/net/http2/transport.go
index 090d0e1bdb..b2e2ed3373 100644
--- a/test/integration/vendor/golang.org/x/net/http2/transport.go
+++ b/test/integration/vendor/golang.org/x/net/http2/transport.go
@@ -375,6 +375,7 @@ type ClientConn struct {
 	doNotReuse       bool       // whether conn is marked to not be reused for any future requests
 	closing          bool
 	closed           bool
+	closedOnIdle     bool                     // true if conn was closed for idleness
 	seenSettings     bool                     // true if we've seen a settings frame, false otherwise
 	seenSettingsChan chan struct{}            // closed when seenSettings is true or frame reading fails
 	wantSettingsAck  bool                     // we sent a SETTINGS frame and haven't heard back
@@ -1089,10 +1090,12 @@ func (cc *ClientConn) idleStateLocked() (st clientConnIdleState) {
 
 	// If this connection has never been used for a request and is closed,
 	// then let it take a request (which will fail).
+	// If the conn was closed for idleness, we're racing the idle timer;
+	// don't try to use the conn. (Issue #70515.)
 	//
 	// This avoids a situation where an error early in a connection's lifetime
 	// goes unreported.
-	if cc.nextStreamID == 1 && cc.streamsReserved == 0 && cc.closed {
+	if cc.nextStreamID == 1 && cc.streamsReserved == 0 && cc.closed && !cc.closedOnIdle {
 		st.canTakeNewRequest = true
 	}
 
@@ -1155,6 +1158,7 @@ func (cc *ClientConn) closeIfIdle() {
 		return
 	}
 	cc.closed = true
+	cc.closedOnIdle = true
 	nextID := cc.nextStreamID
 	// TODO: do clients send GOAWAY too? maybe? Just Close:
 	cc.mu.Unlock()
@@ -2434,9 +2438,12 @@ func (rl *clientConnReadLoop) cleanup() {
 	// This avoids a situation where new connections are constantly created,
 	// added to the pool, fail, and are removed from the pool, without any error
 	// being surfaced to the user.
-	const unusedWaitTime = 5 * time.Second
+	unusedWaitTime := 5 * time.Second
+	if cc.idleTimeout > 0 && unusedWaitTime > cc.idleTimeout {
+		unusedWaitTime = cc.idleTimeout
+	}
 	idleTime := cc.t.now().Sub(cc.lastActive)
-	if atomic.LoadUint32(&cc.atomicReused) == 0 && idleTime < unusedWaitTime {
+	if atomic.LoadUint32(&cc.atomicReused) == 0 && idleTime < unusedWaitTime && !cc.closedOnIdle {
 		cc.idleTimer = cc.t.afterFunc(unusedWaitTime-idleTime, func() {
 			cc.t.connPool().MarkDead(cc)
 		})
diff --git a/test/integration/vendor/golang.org/x/sys/unix/syscall_dragonfly.go b/test/integration/vendor/golang.org/x/sys/unix/syscall_dragonfly.go
index 97cb916f2c..be8c002070 100644
--- a/test/integration/vendor/golang.org/x/sys/unix/syscall_dragonfly.go
+++ b/test/integration/vendor/golang.org/x/sys/unix/syscall_dragonfly.go
@@ -246,6 +246,18 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e
 	return sendfile(outfd, infd, offset, count)
 }
 
+func Dup3(oldfd, newfd, flags int) error {
+	if oldfd == newfd || flags&^O_CLOEXEC != 0 {
+		return EINVAL
+	}
+	how := F_DUP2FD
+	if flags&O_CLOEXEC != 0 {
+		how = F_DUP2FD_CLOEXEC
+	}
+	_, err := fcntl(oldfd, how, newfd)
+	return err
+}
+
 /*
  * Exposed directly
  */
diff --git a/test/integration/vendor/golang.org/x/sys/windows/dll_windows.go b/test/integration/vendor/golang.org/x/sys/windows/dll_windows.go
index 4e613cf633..3ca814f54d 100644
--- a/test/integration/vendor/golang.org/x/sys/windows/dll_windows.go
+++ b/test/integration/vendor/golang.org/x/sys/windows/dll_windows.go
@@ -43,8 +43,8 @@ type DLL struct {
 // LoadDLL loads DLL file into memory.
 //
 // Warning: using LoadDLL without an absolute path name is subject to
-// DLL preloading attacks. To safely load a system DLL, use LazyDLL
-// with System set to true, or use LoadLibraryEx directly.
+// DLL preloading attacks. To safely load a system DLL, use [NewLazySystemDLL],
+// or use [LoadLibraryEx] directly.
 func LoadDLL(name string) (dll *DLL, err error) {
 	namep, err := UTF16PtrFromString(name)
 	if err != nil {
@@ -271,6 +271,9 @@ func (d *LazyDLL) NewProc(name string) *LazyProc {
 }
 
 // NewLazyDLL creates new LazyDLL associated with DLL file.
+//
+// Warning: using NewLazyDLL without an absolute path name is subject to
+// DLL preloading attacks. To safely load a system DLL, use [NewLazySystemDLL].
 func NewLazyDLL(name string) *LazyDLL {
 	return &LazyDLL{Name: name}
 }
@@ -410,7 +413,3 @@ func loadLibraryEx(name string, system bool) (*DLL, error) {
 	}
 	return &DLL{Name: name, Handle: h}, nil
 }
-
-type errString string
-
-func (s errString) Error() string { return string(s) }
diff --git a/test/integration/vendor/golang.org/x/tools/cmd/goimports/doc.go b/test/integration/vendor/golang.org/x/tools/cmd/goimports/doc.go
deleted file mode 100644
index 18a3ad448e..0000000000
--- a/test/integration/vendor/golang.org/x/tools/cmd/goimports/doc.go
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2013 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.
-
-/*
-Command goimports updates your Go import lines,
-adding missing ones and removing unreferenced ones.
-
-	$ go install golang.org/x/tools/cmd/goimports@latest
-
-In addition to fixing imports, goimports also formats
-your code in the same style as gofmt so it can be used
-as a replacement for your editor's gofmt-on-save hook.
-
-For emacs, make sure you have the latest go-mode.el:
-
-	https://github.com/dominikh/go-mode.el
-
-Then in your .emacs file:
-
-	(setq gofmt-command "goimports")
-	(add-hook 'before-save-hook 'gofmt-before-save)
-
-For vim, set "gofmt_command" to "goimports":
-
-	https://golang.org/change/39c724dd7f252
-	https://golang.org/wiki/IDEsAndTextEditorPlugins
-	etc
-
-For GoSublime, follow the steps described here:
-
-	http://michaelwhatcott.com/gosublime-goimports/
-
-For other editors, you probably know what to do.
-
-To exclude directories in your $GOPATH from being scanned for Go
-files, goimports respects a configuration file at
-$GOPATH/src/.goimportsignore which may contain blank lines, comment
-lines (beginning with '#'), or lines naming a directory relative to
-the configuration file to ignore when scanning. No globbing or regex
-patterns are allowed. Use the "-v" verbose flag to verify it's
-working and see what goimports is doing.
-
-File bugs or feature requests at:
-
-	https://golang.org/issues/new?title=x/tools/cmd/goimports:+
-
-Happy hacking!
-*/
-package main // import "golang.org/x/tools/cmd/goimports"
diff --git a/test/integration/vendor/golang.org/x/tools/cmd/goimports/goimports.go b/test/integration/vendor/golang.org/x/tools/cmd/goimports/goimports.go
deleted file mode 100644
index dcb5023a2e..0000000000
--- a/test/integration/vendor/golang.org/x/tools/cmd/goimports/goimports.go
+++ /dev/null
@@ -1,379 +0,0 @@
-// Copyright 2013 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 (
-	"bufio"
-	"bytes"
-	"errors"
-	"flag"
-	"fmt"
-	"go/scanner"
-	"io"
-	"log"
-	"os"
-	"os/exec"
-	"path/filepath"
-	"runtime"
-	"runtime/pprof"
-	"strings"
-
-	"golang.org/x/tools/internal/gocommand"
-	"golang.org/x/tools/internal/imports"
-)
-
-var (
-	// main operation modes
-	list   = flag.Bool("l", false, "list files whose formatting differs from goimport's")
-	write  = flag.Bool("w", false, "write result to (source) file instead of stdout")
-	doDiff = flag.Bool("d", false, "display diffs instead of rewriting files")
-	srcdir = flag.String("srcdir", "", "choose imports as if source code is from `dir`. When operating on a single file, dir may instead be the complete file name.")
-
-	verbose bool // verbose logging
-
-	cpuProfile     = flag.String("cpuprofile", "", "CPU profile output")
-	memProfile     = flag.String("memprofile", "", "memory profile output")
-	memProfileRate = flag.Int("memrate", 0, "if > 0, sets runtime.MemProfileRate")
-
-	options = &imports.Options{
-		TabWidth:  8,
-		TabIndent: true,
-		Comments:  true,
-		Fragment:  true,
-		Env: &imports.ProcessEnv{
-			GocmdRunner: &gocommand.Runner{},
-		},
-	}
-	exitCode = 0
-)
-
-func init() {
-	flag.BoolVar(&options.AllErrors, "e", false, "report all errors (not just the first 10 on different lines)")
-	flag.StringVar(&options.LocalPrefix, "local", "", "put imports beginning with this string after 3rd-party packages; comma-separated list")
-	flag.BoolVar(&options.FormatOnly, "format-only", false, "if true, don't fix imports and only format. In this mode, goimports is effectively gofmt, with the addition that imports are grouped into sections.")
-}
-
-func report(err error) {
-	scanner.PrintError(os.Stderr, err)
-	exitCode = 2
-}
-
-func usage() {
-	fmt.Fprintf(os.Stderr, "usage: goimports [flags] [path ...]\n")
-	flag.PrintDefaults()
-	os.Exit(2)
-}
-
-func isGoFile(f os.FileInfo) bool {
-	// ignore non-Go files
-	name := f.Name()
-	return !f.IsDir() && !strings.HasPrefix(name, ".") && strings.HasSuffix(name, ".go")
-}
-
-// argumentType is which mode goimports was invoked as.
-type argumentType int
-
-const (
-	// fromStdin means the user is piping their source into goimports.
-	fromStdin argumentType = iota
-
-	// singleArg is the common case from editors, when goimports is run on
-	// a single file.
-	singleArg
-
-	// multipleArg is when the user ran "goimports file1.go file2.go"
-	// or ran goimports on a directory tree.
-	multipleArg
-)
-
-func processFile(filename string, in io.Reader, out io.Writer, argType argumentType) error {
-	opt := options
-	if argType == fromStdin {
-		nopt := *options
-		nopt.Fragment = true
-		opt = &nopt
-	}
-
-	if in == nil {
-		f, err := os.Open(filename)
-		if err != nil {
-			return err
-		}
-		defer f.Close()
-		in = f
-	}
-
-	src, err := io.ReadAll(in)
-	if err != nil {
-		return err
-	}
-
-	target := filename
-	if *srcdir != "" {
-		// Determine whether the provided -srcdirc is a directory or file
-		// and then use it to override the target.
-		//
-		// See https://github.com/dominikh/go-mode.el/issues/146
-		if isFile(*srcdir) {
-			if argType == multipleArg {
-				return errors.New("-srcdir value can't be a file when passing multiple arguments or when walking directories")
-			}
-			target = *srcdir
-		} else if argType == singleArg && strings.HasSuffix(*srcdir, ".go") && !isDir(*srcdir) {
-			// For a file which doesn't exist on disk yet, but might shortly.
-			// e.g. user in editor opens $DIR/newfile.go and newfile.go doesn't yet exist on disk.
-			// The goimports on-save hook writes the buffer to a temp file
-			// first and runs goimports before the actual save to newfile.go.
-			// The editor's buffer is named "newfile.go" so that is passed to goimports as:
-			//      goimports -srcdir=/gopath/src/pkg/newfile.go /tmp/gofmtXXXXXXXX.go
-			// and then the editor reloads the result from the tmp file and writes
-			// it to newfile.go.
-			target = *srcdir
-		} else {
-			// Pretend that file is from *srcdir in order to decide
-			// visible imports correctly.
-			target = filepath.Join(*srcdir, filepath.Base(filename))
-		}
-	}
-
-	res, err := imports.Process(target, src, opt)
-	if err != nil {
-		return err
-	}
-
-	if !bytes.Equal(src, res) {
-		// formatting has changed
-		if *list {
-			fmt.Fprintln(out, filename)
-		}
-		if *write {
-			if argType == fromStdin {
-				// filename is ""
-				return errors.New("can't use -w on stdin")
-			}
-			// On Windows, we need to re-set the permissions from the file. See golang/go#38225.
-			var perms os.FileMode
-			if fi, err := os.Stat(filename); err == nil {
-				perms = fi.Mode() & os.ModePerm
-			}
-			err = os.WriteFile(filename, res, perms)
-			if err != nil {
-				return err
-			}
-		}
-		if *doDiff {
-			if argType == fromStdin {
-				filename = "stdin.go" // because .orig looks silly
-			}
-			data, err := diff(src, res, filename)
-			if err != nil {
-				return fmt.Errorf("computing diff: %s", err)
-			}
-			fmt.Printf("diff -u %s %s\n", filepath.ToSlash(filename+".orig"), filepath.ToSlash(filename))
-			out.Write(data)
-		}
-	}
-
-	if !*list && !*write && !*doDiff {
-		_, err = out.Write(res)
-	}
-
-	return err
-}
-
-func visitFile(path string, f os.FileInfo, err error) error {
-	if err == nil && isGoFile(f) {
-		err = processFile(path, nil, os.Stdout, multipleArg)
-	}
-	if err != nil {
-		report(err)
-	}
-	return nil
-}
-
-func walkDir(path string) {
-	filepath.Walk(path, visitFile)
-}
-
-func main() {
-	runtime.GOMAXPROCS(runtime.NumCPU())
-
-	// call gofmtMain in a separate function
-	// so that it can use defer and have them
-	// run before the exit.
-	gofmtMain()
-	os.Exit(exitCode)
-}
-
-// parseFlags parses command line flags and returns the paths to process.
-// It's a var so that custom implementations can replace it in other files.
-var parseFlags = func() []string {
-	flag.BoolVar(&verbose, "v", false, "verbose logging")
-
-	flag.Parse()
-	return flag.Args()
-}
-
-func bufferedFileWriter(dest string) (w io.Writer, close func()) {
-	f, err := os.Create(dest)
-	if err != nil {
-		log.Fatal(err)
-	}
-	bw := bufio.NewWriter(f)
-	return bw, func() {
-		if err := bw.Flush(); err != nil {
-			log.Fatalf("error flushing %v: %v", dest, err)
-		}
-		if err := f.Close(); err != nil {
-			log.Fatal(err)
-		}
-	}
-}
-
-func gofmtMain() {
-	flag.Usage = usage
-	paths := parseFlags()
-
-	if *cpuProfile != "" {
-		bw, flush := bufferedFileWriter(*cpuProfile)
-		pprof.StartCPUProfile(bw)
-		defer flush()
-		defer pprof.StopCPUProfile()
-	}
-	// doTrace is a conditionally compiled wrapper around runtime/trace. It is
-	// used to allow goimports to compile under gccgo, which does not support
-	// runtime/trace. See https://golang.org/issue/15544.
-	defer doTrace()()
-	if *memProfileRate > 0 {
-		runtime.MemProfileRate = *memProfileRate
-		bw, flush := bufferedFileWriter(*memProfile)
-		defer func() {
-			runtime.GC() // materialize all statistics
-			if err := pprof.WriteHeapProfile(bw); err != nil {
-				log.Fatal(err)
-			}
-			flush()
-		}()
-	}
-
-	if verbose {
-		log.SetFlags(log.LstdFlags | log.Lmicroseconds)
-		options.Env.Logf = log.Printf
-	}
-	if options.TabWidth < 0 {
-		fmt.Fprintf(os.Stderr, "negative tabwidth %d\n", options.TabWidth)
-		exitCode = 2
-		return
-	}
-
-	if len(paths) == 0 {
-		if err := processFile("", os.Stdin, os.Stdout, fromStdin); err != nil {
-			report(err)
-		}
-		return
-	}
-
-	argType := singleArg
-	if len(paths) > 1 {
-		argType = multipleArg
-	}
-
-	for _, path := range paths {
-		switch dir, err := os.Stat(path); {
-		case err != nil:
-			report(err)
-		case dir.IsDir():
-			walkDir(path)
-		default:
-			if err := processFile(path, nil, os.Stdout, argType); err != nil {
-				report(err)
-			}
-		}
-	}
-}
-
-func writeTempFile(dir, prefix string, data []byte) (string, error) {
-	file, err := os.CreateTemp(dir, prefix)
-	if err != nil {
-		return "", err
-	}
-	_, err = file.Write(data)
-	if err1 := file.Close(); err == nil {
-		err = err1
-	}
-	if err != nil {
-		os.Remove(file.Name())
-		return "", err
-	}
-	return file.Name(), nil
-}
-
-func diff(b1, b2 []byte, filename string) (data []byte, err error) {
-	f1, err := writeTempFile("", "gofmt", b1)
-	if err != nil {
-		return
-	}
-	defer os.Remove(f1)
-
-	f2, err := writeTempFile("", "gofmt", b2)
-	if err != nil {
-		return
-	}
-	defer os.Remove(f2)
-
-	cmd := "diff"
-	if runtime.GOOS == "plan9" {
-		cmd = "/bin/ape/diff"
-	}
-
-	data, err = exec.Command(cmd, "-u", f1, f2).CombinedOutput()
-	if len(data) > 0 {
-		// diff exits with a non-zero status when the files don't match.
-		// Ignore that failure as long as we get output.
-		return replaceTempFilename(data, filename)
-	}
-	return
-}
-
-// replaceTempFilename replaces temporary filenames in diff with actual one.
-//
-// --- /tmp/gofmt316145376	2017-02-03 19:13:00.280468375 -0500
-// +++ /tmp/gofmt617882815	2017-02-03 19:13:00.280468375 -0500
-// ...
-// ->
-// --- path/to/file.go.orig	2017-02-03 19:13:00.280468375 -0500
-// +++ path/to/file.go	2017-02-03 19:13:00.280468375 -0500
-// ...
-func replaceTempFilename(diff []byte, filename string) ([]byte, error) {
-	bs := bytes.SplitN(diff, []byte{'\n'}, 3)
-	if len(bs) < 3 {
-		return nil, fmt.Errorf("got unexpected diff for %s", filename)
-	}
-	// Preserve timestamps.
-	var t0, t1 []byte
-	if i := bytes.LastIndexByte(bs[0], '\t'); i != -1 {
-		t0 = bs[0][i:]
-	}
-	if i := bytes.LastIndexByte(bs[1], '\t'); i != -1 {
-		t1 = bs[1][i:]
-	}
-	// Always print filepath with slash separator.
-	f := filepath.ToSlash(filename)
-	bs[0] = []byte(fmt.Sprintf("--- %s%s", f+".orig", t0))
-	bs[1] = []byte(fmt.Sprintf("+++ %s%s", f, t1))
-	return bytes.Join(bs, []byte{'\n'}), nil
-}
-
-// isFile reports whether name is a file.
-func isFile(name string) bool {
-	fi, err := os.Stat(name)
-	return err == nil && fi.Mode().IsRegular()
-}
-
-// isDir reports whether name is a directory.
-func isDir(name string) bool {
-	fi, err := os.Stat(name)
-	return err == nil && fi.IsDir()
-}
diff --git a/test/integration/vendor/golang.org/x/tools/cmd/goimports/goimports_gc.go b/test/integration/vendor/golang.org/x/tools/cmd/goimports/goimports_gc.go
deleted file mode 100644
index 3326646d03..0000000000
--- a/test/integration/vendor/golang.org/x/tools/cmd/goimports/goimports_gc.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2016 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 gc
-// +build gc
-
-package main
-
-import (
-	"flag"
-	"runtime/trace"
-)
-
-var traceProfile = flag.String("trace", "", "trace profile output")
-
-func doTrace() func() {
-	if *traceProfile != "" {
-		bw, flush := bufferedFileWriter(*traceProfile)
-		trace.Start(bw)
-		return func() {
-			trace.Stop()
-			flush()
-		}
-	}
-	return func() {}
-}
diff --git a/test/integration/vendor/golang.org/x/tools/cmd/goimports/goimports_not_gc.go b/test/integration/vendor/golang.org/x/tools/cmd/goimports/goimports_not_gc.go
deleted file mode 100644
index 344fe7576b..0000000000
--- a/test/integration/vendor/golang.org/x/tools/cmd/goimports/goimports_not_gc.go
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2016 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 !gc
-// +build !gc
-
-package main
-
-func doTrace() func() {
-	return func() {}
-}
diff --git a/test/integration/vendor/golang.org/x/tools/cmd/stringer/gotypesalias.go b/test/integration/vendor/golang.org/x/tools/cmd/stringer/gotypesalias.go
new file mode 100644
index 0000000000..288c10c2d0
--- /dev/null
+++ b/test/integration/vendor/golang.org/x/tools/cmd/stringer/gotypesalias.go
@@ -0,0 +1,12 @@
+// Copyright 2024 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 go1.23
+
+//go:debug gotypesalias=1
+
+package main
+
+// Materialize aliases whenever the go toolchain version is after 1.23 (#69772).
+// Remove this file after go.mod >= 1.23 (which implies gotypesalias=1).
diff --git a/test/integration/vendor/golang.org/x/tools/cmd/stringer/stringer.go b/test/integration/vendor/golang.org/x/tools/cmd/stringer/stringer.go
index 2b19c93e8e..09be11ca58 100644
--- a/test/integration/vendor/golang.org/x/tools/cmd/stringer/stringer.go
+++ b/test/integration/vendor/golang.org/x/tools/cmd/stringer/stringer.go
@@ -58,6 +58,11 @@
 // where t is the lower-cased name of the first type listed. It can be overridden
 // with the -output flag.
 //
+// Types can also be declared in tests, in which case type declarations in the
+// non-test package or its test variant are preferred over types defined in the
+// package with suffix "_test".
+// The default output file for type declarations in tests is t_string_test.go with t picked as above.
+//
 // The -linecomment flag tells stringer to generate the text of any line comment, trimmed
 // of leading spaces, instead of the constant name. For instance, if the constants above had a
 // Pill prefix, one could write
@@ -128,10 +133,6 @@ func main() {
 
 	// Parse the package once.
 	var dir string
-	g := Generator{
-		trimPrefix:  *trimprefix,
-		lineComment: *linecomment,
-	}
 	// TODO(suzmue): accept other patterns for packages (directories, list of files, import paths, etc).
 	if len(args) == 1 && isDirectory(args[0]) {
 		dir = args[0]
@@ -142,33 +143,90 @@ func main() {
 		dir = filepath.Dir(args[0])
 	}
 
-	g.parsePackage(args, tags)
+	// For each type, generate code in the first package where the type is declared.
+	// The order of packages is as follows:
+	// package x
+	// package x compiled for tests
+	// package x_test
+	//
+	// Each package pass could result in a separate generated file.
+	// These files must have the same package and test/not-test nature as the types
+	// from which they were generated.
+	//
+	// Types will be excluded when generated, to avoid repetitions.
+	pkgs := loadPackages(args, tags, *trimprefix, *linecomment, nil /* logf */)
+	sort.Slice(pkgs, func(i, j int) bool {
+		// Put x_test packages last.
+		iTest := strings.HasSuffix(pkgs[i].name, "_test")
+		jTest := strings.HasSuffix(pkgs[j].name, "_test")
+		if iTest != jTest {
+			return !iTest
+		}
 
-	// Print the header and package clause.
-	g.Printf("// Code generated by \"stringer %s\"; DO NOT EDIT.\n", strings.Join(os.Args[1:], " "))
-	g.Printf("\n")
-	g.Printf("package %s", g.pkg.name)
-	g.Printf("\n")
-	g.Printf("import \"strconv\"\n") // Used by all methods.
+		return len(pkgs[i].files) < len(pkgs[j].files)
+	})
+	for _, pkg := range pkgs {
+		g := Generator{
+			pkg: pkg,
+		}
 
-	// Run generate for each type.
-	for _, typeName := range types {
-		g.generate(typeName)
+		// Print the header and package clause.
+		g.Printf("// Code generated by \"stringer %s\"; DO NOT EDIT.\n", strings.Join(os.Args[1:], " "))
+		g.Printf("\n")
+		g.Printf("package %s", g.pkg.name)
+		g.Printf("\n")
+		g.Printf("import \"strconv\"\n") // Used by all methods.
+
+		// Run generate for types that can be found. Keep the rest for the remainingTypes iteration.
+		var foundTypes, remainingTypes []string
+		for _, typeName := range types {
+			values := findValues(typeName, pkg)
+			if len(values) > 0 {
+				g.generate(typeName, values)
+				foundTypes = append(foundTypes, typeName)
+			} else {
+				remainingTypes = append(remainingTypes, typeName)
+			}
+		}
+		if len(foundTypes) == 0 {
+			// This package didn't have any of the relevant types, skip writing a file.
+			continue
+		}
+		if len(remainingTypes) > 0 && output != nil && *output != "" {
+			log.Fatalf("cannot write to single file (-output=%q) when matching types are found in multiple packages", *output)
+		}
+		types = remainingTypes
+
+		// Format the output.
+		src := g.format()
+
+		// Write to file.
+		outputName := *output
+		if outputName == "" {
+			// Type names will be unique across packages since only the first
+			// match is picked.
+			// So there won't be collisions between a package compiled for tests
+			// and the separate package of tests (package foo_test).
+			outputName = filepath.Join(dir, baseName(pkg, foundTypes[0]))
+		}
+		err := os.WriteFile(outputName, src, 0644)
+		if err != nil {
+			log.Fatalf("writing output: %s", err)
+		}
 	}
 
-	// Format the output.
-	src := g.format()
-
-	// Write to file.
-	outputName := *output
-	if outputName == "" {
-		baseName := fmt.Sprintf("%s_string.go", types[0])
-		outputName = filepath.Join(dir, strings.ToLower(baseName))
+	if len(types) > 0 {
+		log.Fatalf("no values defined for types: %s", strings.Join(types, ","))
 	}
-	err := os.WriteFile(outputName, src, 0644)
-	if err != nil {
-		log.Fatalf("writing output: %s", err)
+}
+
+// baseName that will put the generated code together with pkg.
+func baseName(pkg *Package, typename string) string {
+	suffix := "string.go"
+	if pkg.hasTestFiles {
+		suffix = "string_test.go"
 	}
+	return fmt.Sprintf("%s_%s", strings.ToLower(typename), suffix)
 }
 
 // isDirectory reports whether the named file is a directory.
@@ -186,9 +244,6 @@ type Generator struct {
 	buf bytes.Buffer // Accumulated output.
 	pkg *Package     // Package we are scanning.
 
-	trimPrefix  string
-	lineComment bool
-
 	logf func(format string, args ...interface{}) // test logging hook; nil when not testing
 }
 
@@ -209,54 +264,74 @@ type File struct {
 }
 
 type Package struct {
-	name  string
-	defs  map[*ast.Ident]types.Object
-	files []*File
+	name         string
+	defs         map[*ast.Ident]types.Object
+	files        []*File
+	hasTestFiles bool
 }
 
-// parsePackage analyzes the single package constructed from the patterns and tags.
-// parsePackage exits if there is an error.
-func (g *Generator) parsePackage(patterns []string, tags []string) {
+// loadPackages analyzes the single package constructed from the patterns and tags.
+// loadPackages exits if there is an error.
+//
+// Returns all variants (such as tests) of the package.
+//
+// logf is a test logging hook. It can be nil when not testing.
+func loadPackages(
+	patterns, tags []string,
+	trimPrefix string, lineComment bool,
+	logf func(format string, args ...interface{}),
+) []*Package {
 	cfg := &packages.Config{
-		Mode: packages.NeedName | packages.NeedTypes | packages.NeedTypesInfo | packages.NeedSyntax,
-		// TODO: Need to think about constants in test files. Maybe write type_string_test.go
-		// in a separate pass? For later.
-		Tests:      false,
+		Mode: packages.NeedName | packages.NeedTypes | packages.NeedTypesInfo | packages.NeedSyntax | packages.NeedFiles,
+		// Tests are included, let the caller decide how to fold them in.
+		Tests:      true,
 		BuildFlags: []string{fmt.Sprintf("-tags=%s", strings.Join(tags, " "))},
-		Logf:       g.logf,
+		Logf:       logf,
 	}
 	pkgs, err := packages.Load(cfg, patterns...)
 	if err != nil {
 		log.Fatal(err)
 	}
-	if len(pkgs) != 1 {
-		log.Fatalf("error: %d packages matching %v", len(pkgs), strings.Join(patterns, " "))
+	if len(pkgs) == 0 {
+		log.Fatalf("error: no packages matching %v", strings.Join(patterns, " "))
 	}
-	g.addPackage(pkgs[0])
-}
 
-// addPackage adds a type checked Package and its syntax files to the generator.
-func (g *Generator) addPackage(pkg *packages.Package) {
-	g.pkg = &Package{
-		name:  pkg.Name,
-		defs:  pkg.TypesInfo.Defs,
-		files: make([]*File, len(pkg.Syntax)),
-	}
+	out := make([]*Package, len(pkgs))
+	for i, pkg := range pkgs {
+		p := &Package{
+			name:  pkg.Name,
+			defs:  pkg.TypesInfo.Defs,
+			files: make([]*File, len(pkg.Syntax)),
+		}
+
+		for j, file := range pkg.Syntax {
+			p.files[j] = &File{
+				file: file,
+				pkg:  p,
 
-	for i, file := range pkg.Syntax {
-		g.pkg.files[i] = &File{
-			file:        file,
-			pkg:         g.pkg,
-			trimPrefix:  g.trimPrefix,
-			lineComment: g.lineComment,
+				trimPrefix:  trimPrefix,
+				lineComment: lineComment,
+			}
 		}
+
+		// Keep track of test files, since we might want to generated
+		// code that ends up in that kind of package.
+		// Can be replaced once https://go.dev/issue/38445 lands.
+		for _, f := range pkg.GoFiles {
+			if strings.HasSuffix(f, "_test.go") {
+				p.hasTestFiles = true
+				break
+			}
+		}
+
+		out[i] = p
 	}
+	return out
 }
 
-// generate produces the String method for the named type.
-func (g *Generator) generate(typeName string) {
+func findValues(typeName string, pkg *Package) []Value {
 	values := make([]Value, 0, 100)
-	for _, file := range g.pkg.files {
+	for _, file := range pkg.files {
 		// Set the state for this run of the walker.
 		file.typeName = typeName
 		file.values = nil
@@ -265,10 +340,11 @@ func (g *Generator) generate(typeName string) {
 			values = append(values, file.values...)
 		}
 	}
+	return values
+}
 
-	if len(values) == 0 {
-		log.Fatalf("no values defined for type %s", typeName)
-	}
+// generate produces the String method for the named type.
+func (g *Generator) generate(typeName string, values []Value) {
 	// Generate code that will fail if the constants change value.
 	g.Printf("func _() {\n")
 	g.Printf("\t// An \"invalid array index\" compiler error signifies that the constant values have changed.\n")
diff --git a/test/integration/vendor/golang.org/x/tools/go/ast/astutil/imports.go b/test/integration/vendor/golang.org/x/tools/go/ast/astutil/imports.go
index 18d1adb05d..a6b5ed0a89 100644
--- a/test/integration/vendor/golang.org/x/tools/go/ast/astutil/imports.go
+++ b/test/integration/vendor/golang.org/x/tools/go/ast/astutil/imports.go
@@ -344,7 +344,12 @@ func RewriteImport(fset *token.FileSet, f *ast.File, oldPath, newPath string) (r
 }
 
 // UsesImport reports whether a given import is used.
+// The provided File must have been parsed with syntactic object resolution
+// (not using go/parser.SkipObjectResolution).
 func UsesImport(f *ast.File, path string) (used bool) {
+	if f.Scope == nil {
+		panic("file f was not parsed with syntactic object resolution")
+	}
 	spec := importSpec(f, path)
 	if spec == nil {
 		return
diff --git a/test/integration/vendor/golang.org/x/tools/go/ast/astutil/util.go b/test/integration/vendor/golang.org/x/tools/go/ast/astutil/util.go
index 6bdcf70ac2..ca71e3e105 100644
--- a/test/integration/vendor/golang.org/x/tools/go/ast/astutil/util.go
+++ b/test/integration/vendor/golang.org/x/tools/go/ast/astutil/util.go
@@ -7,13 +7,5 @@ package astutil
 import "go/ast"
 
 // Unparen returns e with any enclosing parentheses stripped.
-// TODO(adonovan): use go1.22's ast.Unparen.
-func Unparen(e ast.Expr) ast.Expr {
-	for {
-		p, ok := e.(*ast.ParenExpr)
-		if !ok {
-			return e
-		}
-		e = p.X
-	}
-}
+// Deprecated: use [ast.Unparen].
+func Unparen(e ast.Expr) ast.Expr { return ast.Unparen(e) }
diff --git a/test/integration/vendor/golang.org/x/tools/go/gcexportdata/gcexportdata.go b/test/integration/vendor/golang.org/x/tools/go/gcexportdata/gcexportdata.go
index 137cc8df1d..65fe2628e9 100644
--- a/test/integration/vendor/golang.org/x/tools/go/gcexportdata/gcexportdata.go
+++ b/test/integration/vendor/golang.org/x/tools/go/gcexportdata/gcexportdata.go
@@ -2,22 +2,64 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// Package gcexportdata provides functions for locating, reading, and
-// writing export data files containing type information produced by the
-// gc compiler.  This package supports go1.7 export data format and all
-// later versions.
-//
-// Although it might seem convenient for this package to live alongside
-// go/types in the standard library, this would cause version skew
-// problems for developer tools that use it, since they must be able to
-// consume the outputs of the gc compiler both before and after a Go
-// update such as from Go 1.7 to Go 1.8.  Because this package lives in
-// golang.org/x/tools, sites can update their version of this repo some
-// time before the Go 1.8 release and rebuild and redeploy their
-// developer tools, which will then be able to consume both Go 1.7 and
-// Go 1.8 export data files, so they will work before and after the
-// Go update. (See discussion at https://golang.org/issue/15651.)
-package gcexportdata // import "golang.org/x/tools/go/gcexportdata"
+// Package gcexportdata provides functions for reading and writing
+// export data, which is a serialized description of the API of a Go
+// package including the names, kinds, types, and locations of all
+// exported declarations.
+//
+// The standard Go compiler (cmd/compile) writes an export data file
+// for each package it compiles, which it later reads when compiling
+// packages that import the earlier one. The compiler must thus
+// contain logic to both write and read export data.
+// (See the "Export" section in the cmd/compile/README file.)
+//
+// The [Read] function in this package can read files produced by the
+// compiler, producing [go/types] data structures. As a matter of
+// policy, Read supports export data files produced by only the last
+// two Go releases plus tip; see https://go.dev/issue/68898. The
+// export data files produced by the compiler contain additional
+// details related to generics, inlining, and other optimizations that
+// cannot be decoded by the [Read] function.
+//
+// In files written by the compiler, the export data is not at the
+// start of the file. Before calling Read, use [NewReader] to locate
+// the desired portion of the file.
+//
+// The [Write] function in this package encodes the exported API of a
+// Go package ([types.Package]) as a file. Such files can be later
+// decoded by Read, but cannot be consumed by the compiler.
+//
+// # Future changes
+//
+// Although Read supports the formats written by both Write and the
+// compiler, the two are quite different, and there is an open
+// proposal (https://go.dev/issue/69491) to separate these APIs.
+//
+// Under that proposal, this package would ultimately provide only the
+// Read operation for compiler export data, which must be defined in
+// this module (golang.org/x/tools), not in the standard library, to
+// avoid version skew for developer tools that need to read compiler
+// export data both before and after a Go release, such as from Go
+// 1.23 to Go 1.24. Because this package lives in the tools module,
+// clients can update their version of the module some time before the
+// Go 1.24 release and rebuild and redeploy their tools, which will
+// then be able to consume both Go 1.23 and Go 1.24 export data files,
+// so they will work before and after the Go update. (See discussion
+// at https://go.dev/issue/15651.)
+//
+// The operations to import and export [go/types] data structures
+// would be defined in the go/types package as Import and Export.
+// [Write] would (eventually) delegate to Export,
+// and [Read], when it detects a file produced by Export,
+// would delegate to Import.
+//
+// # Deprecations
+//
+// The [NewImporter] and [Find] functions are deprecated and should
+// not be used in new code. The [WriteBundle] and [ReadBundle]
+// functions are experimental, and there is an open proposal to
+// deprecate them (https://go.dev/issue/69573).
+package gcexportdata
 
 import (
 	"bufio"
@@ -64,24 +106,18 @@ func Find(importPath, srcDir string) (filename, path string) {
 // additional trailing data beyond the end of the export data.
 func NewReader(r io.Reader) (io.Reader, error) {
 	buf := bufio.NewReader(r)
-	_, size, err := gcimporter.FindExportData(buf)
+	size, err := gcimporter.FindExportData(buf)
 	if err != nil {
 		return nil, err
 	}
 
-	if size >= 0 {
-		// We were given an archive and found the __.PKGDEF in it.
-		// This tells us the size of the export data, and we don't
-		// need to return the entire file.
-		return &io.LimitedReader{
-			R: buf,
-			N: size,
-		}, nil
-	} else {
-		// We were given an object file. As such, we don't know how large
-		// the export data is and must return the entire file.
-		return buf, nil
-	}
+	// We were given an archive and found the __.PKGDEF in it.
+	// This tells us the size of the export data, and we don't
+	// need to return the entire file.
+	return &io.LimitedReader{
+		R: buf,
+		N: size,
+	}, nil
 }
 
 // readAll works the same way as io.ReadAll, but avoids allocations and copies
@@ -100,6 +136,11 @@ func readAll(r io.Reader) ([]byte, error) {
 // Read reads export data from in, decodes it, and returns type
 // information for the package.
 //
+// Read is capable of reading export data produced by [Write] at the
+// same source code version, or by the last two Go releases (plus tip)
+// of the standard Go compiler. Reading files from older compilers may
+// produce an error.
+//
 // The package path (effectively its linker symbol prefix) is
 // specified by path, since unlike the package name, this information
 // may not be recorded in the export data.
@@ -128,14 +169,26 @@ func Read(in io.Reader, fset *token.FileSet, imports map[string]*types.Package,
 	// (from "version"). Select appropriate importer.
 	if len(data) > 0 {
 		switch data[0] {
-		case 'v', 'c', 'd': // binary, till go1.10
+		case 'v', 'c', 'd':
+			// binary, produced by cmd/compile till go1.10
 			return nil, fmt.Errorf("binary (%c) import format is no longer supported", data[0])
 
-		case 'i': // indexed, till go1.19
+		case 'i':
+			// indexed, produced by cmd/compile till go1.19,
+			// and also by [Write].
+			//
+			// If proposal #69491 is accepted, go/types
+			// serialization will be implemented by
+			// types.Export, to which Write would eventually
+			// delegate (explicitly dropping any pretence at
+			// inter-version Write-Read compatibility).
+			// This [Read] function would delegate to types.Import
+			// when it detects that the file was produced by Export.
 			_, pkg, err := gcimporter.IImportData(fset, imports, data[1:], path)
 			return pkg, err
 
-		case 'u': // unified, from go1.20
+		case 'u':
+			// unified, produced by cmd/compile since go1.20
 			_, pkg, err := gcimporter.UImportData(fset, imports, data[1:], path)
 			return pkg, err
 
diff --git a/test/integration/vendor/golang.org/x/tools/go/packages/doc.go b/test/integration/vendor/golang.org/x/tools/go/packages/doc.go
index 3531ac8f5f..f1931d10ee 100644
--- a/test/integration/vendor/golang.org/x/tools/go/packages/doc.go
+++ b/test/integration/vendor/golang.org/x/tools/go/packages/doc.go
@@ -64,7 +64,7 @@ graph using the Imports fields.
 
 The Load function can be configured by passing a pointer to a Config as
 the first argument. A nil Config is equivalent to the zero Config, which
-causes Load to run in LoadFiles mode, collecting minimal information.
+causes Load to run in [LoadFiles] mode, collecting minimal information.
 See the documentation for type Config for details.
 
 As noted earlier, the Config.Mode controls the amount of detail
@@ -72,14 +72,14 @@ reported about the loaded packages. See the documentation for type LoadMode
 for details.
 
 Most tools should pass their command-line arguments (after any flags)
-uninterpreted to [Load], so that it can interpret them
+uninterpreted to Load, so that it can interpret them
 according to the conventions of the underlying build system.
 
 See the Example function for typical usage.
 
 # The driver protocol
 
-[Load] may be used to load Go packages even in Go projects that use
+Load may be used to load Go packages even in Go projects that use
 alternative build systems, by installing an appropriate "driver"
 program for the build system and specifying its location in the
 GOPACKAGESDRIVER environment variable.
@@ -97,6 +97,15 @@ JSON-encoded [DriverRequest] message providing additional information
 is written to the driver's standard input. The driver must write a
 JSON-encoded [DriverResponse] message to its standard output. (This
 message differs from the JSON schema produced by 'go list'.)
+
+The value of the PWD environment variable seen by the driver process
+is the preferred name of its working directory. (The working directory
+may have other aliases due to symbolic links; see the comment on the
+Dir field of [exec.Cmd] for related information.)
+When the driver process emits in its response the name of a file
+that is a descendant of this directory, it must use an absolute path
+that has the value of PWD as a prefix, to ensure that the returned
+filenames satisfy the original query.
 */
 package packages // import "golang.org/x/tools/go/packages"
 
diff --git a/test/integration/vendor/golang.org/x/tools/go/packages/external.go b/test/integration/vendor/golang.org/x/tools/go/packages/external.go
index 8f7afcb5df..91bd62e83b 100644
--- a/test/integration/vendor/golang.org/x/tools/go/packages/external.go
+++ b/test/integration/vendor/golang.org/x/tools/go/packages/external.go
@@ -13,6 +13,7 @@ import (
 	"fmt"
 	"os"
 	"os/exec"
+	"slices"
 	"strings"
 )
 
@@ -79,7 +80,7 @@ type DriverResponse struct {
 
 // driver is the type for functions that query the build system for the
 // packages named by the patterns.
-type driver func(cfg *Config, patterns ...string) (*DriverResponse, error)
+type driver func(cfg *Config, patterns []string) (*DriverResponse, error)
 
 // findExternalDriver returns the file path of a tool that supplies
 // the build system package structure, or "" if not found.
@@ -103,7 +104,7 @@ func findExternalDriver(cfg *Config) driver {
 			return nil
 		}
 	}
-	return func(cfg *Config, words ...string) (*DriverResponse, error) {
+	return func(cfg *Config, patterns []string) (*DriverResponse, error) {
 		req, err := json.Marshal(DriverRequest{
 			Mode:       cfg.Mode,
 			Env:        cfg.Env,
@@ -117,7 +118,7 @@ func findExternalDriver(cfg *Config) driver {
 
 		buf := new(bytes.Buffer)
 		stderr := new(bytes.Buffer)
-		cmd := exec.CommandContext(cfg.Context, tool, words...)
+		cmd := exec.CommandContext(cfg.Context, tool, patterns...)
 		cmd.Dir = cfg.Dir
 		// The cwd gets resolved to the real path. On Darwin, where
 		// /tmp is a symlink, this breaks anything that expects the
@@ -131,7 +132,7 @@ func findExternalDriver(cfg *Config) driver {
 		// command.
 		//
 		// (See similar trick in Invocation.run in ../../internal/gocommand/invoke.go)
-		cmd.Env = append(slicesClip(cfg.Env), "PWD="+cfg.Dir)
+		cmd.Env = append(slices.Clip(cfg.Env), "PWD="+cfg.Dir)
 		cmd.Stdin = bytes.NewReader(req)
 		cmd.Stdout = buf
 		cmd.Stderr = stderr
@@ -150,7 +151,3 @@ func findExternalDriver(cfg *Config) driver {
 		return &response, nil
 	}
 }
-
-// slicesClip removes unused capacity from the slice, returning s[:len(s):len(s)].
-// TODO(adonovan): use go1.21 slices.Clip.
-func slicesClip[S ~[]E, E any](s S) S { return s[:len(s):len(s)] }
diff --git a/test/integration/vendor/golang.org/x/tools/go/packages/golist.go b/test/integration/vendor/golang.org/x/tools/go/packages/golist.go
index 1a3a5b44f5..0458b4f9c4 100644
--- a/test/integration/vendor/golang.org/x/tools/go/packages/golist.go
+++ b/test/integration/vendor/golang.org/x/tools/go/packages/golist.go
@@ -80,6 +80,12 @@ type golistState struct {
 	cfg *Config
 	ctx context.Context
 
+	runner *gocommand.Runner
+
+	// overlay is the JSON file that encodes the Config.Overlay
+	// mapping, used by 'go list -overlay=...'.
+	overlay string
+
 	envOnce    sync.Once
 	goEnvError error
 	goEnv      map[string]string
@@ -127,7 +133,10 @@ func (state *golistState) mustGetEnv() map[string]string {
 // goListDriver uses the go list command to interpret the patterns and produce
 // the build system package structure.
 // See driver for more details.
-func goListDriver(cfg *Config, patterns ...string) (_ *DriverResponse, err error) {
+//
+// overlay is the JSON file that encodes the cfg.Overlay
+// mapping, used by 'go list -overlay=...'
+func goListDriver(cfg *Config, runner *gocommand.Runner, overlay string, patterns []string) (_ *DriverResponse, err error) {
 	// Make sure that any asynchronous go commands are killed when we return.
 	parentCtx := cfg.Context
 	if parentCtx == nil {
@@ -142,13 +151,15 @@ func goListDriver(cfg *Config, patterns ...string) (_ *DriverResponse, err error
 		cfg:        cfg,
 		ctx:        ctx,
 		vendorDirs: map[string]bool{},
+		overlay:    overlay,
+		runner:     runner,
 	}
 
 	// Fill in response.Sizes asynchronously if necessary.
-	if cfg.Mode&NeedTypesSizes != 0 || cfg.Mode&NeedTypes != 0 {
+	if cfg.Mode&NeedTypesSizes != 0 || cfg.Mode&(NeedTypes|NeedTypesInfo) != 0 {
 		errCh := make(chan error)
 		go func() {
-			compiler, arch, err := getSizesForArgs(ctx, state.cfgInvocation(), cfg.gocmdRunner)
+			compiler, arch, err := getSizesForArgs(ctx, state.cfgInvocation(), runner)
 			response.dr.Compiler = compiler
 			response.dr.Arch = arch
 			errCh <- err
@@ -311,6 +322,7 @@ type jsonPackage struct {
 	ImportPath        string
 	Dir               string
 	Name              string
+	Target            string
 	Export            string
 	GoFiles           []string
 	CompiledGoFiles   []string
@@ -494,13 +506,15 @@ func (state *golistState) createDriverResponse(words ...string) (*DriverResponse
 		pkg := &Package{
 			Name:            p.Name,
 			ID:              p.ImportPath,
+			Dir:             p.Dir,
+			Target:          p.Target,
 			GoFiles:         absJoin(p.Dir, p.GoFiles, p.CgoFiles),
 			CompiledGoFiles: absJoin(p.Dir, p.CompiledGoFiles),
 			OtherFiles:      absJoin(p.Dir, otherFiles(p)...),
 			EmbedFiles:      absJoin(p.Dir, p.EmbedFiles),
 			EmbedPatterns:   absJoin(p.Dir, p.EmbedPatterns),
 			IgnoredFiles:    absJoin(p.Dir, p.IgnoredGoFiles, p.IgnoredOtherFiles),
-			forTest:         p.ForTest,
+			ForTest:         p.ForTest,
 			depsErrors:      p.DepsErrors,
 			Module:          p.Module,
 		}
@@ -681,7 +695,7 @@ func (state *golistState) shouldAddFilenameFromError(p *jsonPackage) bool {
 // getGoVersion returns the effective minor version of the go command.
 func (state *golistState) getGoVersion() (int, error) {
 	state.goVersionOnce.Do(func() {
-		state.goVersion, state.goVersionError = gocommand.GoVersion(state.ctx, state.cfgInvocation(), state.cfg.gocmdRunner)
+		state.goVersion, state.goVersionError = gocommand.GoVersion(state.ctx, state.cfgInvocation(), state.runner)
 	})
 	return state.goVersion, state.goVersionError
 }
@@ -751,7 +765,7 @@ func jsonFlag(cfg *Config, goVersion int) string {
 		}
 	}
 	addFields("Name", "ImportPath", "Error") // These fields are always needed
-	if cfg.Mode&NeedFiles != 0 || cfg.Mode&NeedTypes != 0 {
+	if cfg.Mode&NeedFiles != 0 || cfg.Mode&(NeedTypes|NeedTypesInfo) != 0 {
 		addFields("Dir", "GoFiles", "IgnoredGoFiles", "IgnoredOtherFiles", "CFiles",
 			"CgoFiles", "CXXFiles", "MFiles", "HFiles", "FFiles", "SFiles",
 			"SwigFiles", "SwigCXXFiles", "SysoFiles")
@@ -759,7 +773,7 @@ func jsonFlag(cfg *Config, goVersion int) string {
 			addFields("TestGoFiles", "XTestGoFiles")
 		}
 	}
-	if cfg.Mode&NeedTypes != 0 {
+	if cfg.Mode&(NeedTypes|NeedTypesInfo) != 0 {
 		// CompiledGoFiles seems to be required for the test case TestCgoNoSyntax,
 		// even when -compiled isn't passed in.
 		// TODO(#52435): Should we make the test ask for -compiled, or automatically
@@ -784,7 +798,7 @@ func jsonFlag(cfg *Config, goVersion int) string {
 		// Request Dir in the unlikely case Export is not absolute.
 		addFields("Dir", "Export")
 	}
-	if cfg.Mode&needInternalForTest != 0 {
+	if cfg.Mode&NeedForTest != 0 {
 		addFields("ForTest")
 	}
 	if cfg.Mode&needInternalDepsErrors != 0 {
@@ -799,6 +813,9 @@ func jsonFlag(cfg *Config, goVersion int) string {
 	if cfg.Mode&NeedEmbedPatterns != 0 {
 		addFields("EmbedPatterns")
 	}
+	if cfg.Mode&NeedTarget != 0 {
+		addFields("Target")
+	}
 	return "-json=" + strings.Join(fields, ",")
 }
 
@@ -840,7 +857,7 @@ func (state *golistState) cfgInvocation() gocommand.Invocation {
 		Env:        cfg.Env,
 		Logf:       cfg.Logf,
 		WorkingDir: cfg.Dir,
-		Overlay:    cfg.goListOverlayFile,
+		Overlay:    state.overlay,
 	}
 }
 
@@ -851,11 +868,8 @@ func (state *golistState) invokeGo(verb string, args ...string) (*bytes.Buffer,
 	inv := state.cfgInvocation()
 	inv.Verb = verb
 	inv.Args = args
-	gocmdRunner := cfg.gocmdRunner
-	if gocmdRunner == nil {
-		gocmdRunner = &gocommand.Runner{}
-	}
-	stdout, stderr, friendlyErr, err := gocmdRunner.RunRaw(cfg.Context, inv)
+
+	stdout, stderr, friendlyErr, err := state.runner.RunRaw(cfg.Context, inv)
 	if err != nil {
 		// Check for 'go' executable not being found.
 		if ee, ok := err.(*exec.Error); ok && ee.Err == exec.ErrNotFound {
@@ -879,6 +893,12 @@ func (state *golistState) invokeGo(verb string, args ...string) (*bytes.Buffer,
 			return nil, friendlyErr
 		}
 
+		// Return an error if 'go list' failed due to missing tools in
+		// $GOROOT/pkg/tool/$GOOS_$GOARCH (#69606).
+		if len(stderr.String()) > 0 && strings.Contains(stderr.String(), `go: no such tool`) {
+			return nil, friendlyErr
+		}
+
 		// Is there an error running the C compiler in cgo? This will be reported in the "Error" field
 		// and should be suppressed by go list -e.
 		//
diff --git a/test/integration/vendor/golang.org/x/tools/go/packages/loadmode_string.go b/test/integration/vendor/golang.org/x/tools/go/packages/loadmode_string.go
index 5c080d21b5..69eec9f44d 100644
--- a/test/integration/vendor/golang.org/x/tools/go/packages/loadmode_string.go
+++ b/test/integration/vendor/golang.org/x/tools/go/packages/loadmode_string.go
@@ -9,49 +9,48 @@ import (
 	"strings"
 )
 
-var allModes = []LoadMode{
-	NeedName,
-	NeedFiles,
-	NeedCompiledGoFiles,
-	NeedImports,
-	NeedDeps,
-	NeedExportFile,
-	NeedTypes,
-	NeedSyntax,
-	NeedTypesInfo,
-	NeedTypesSizes,
+var modes = [...]struct {
+	mode LoadMode
+	name string
+}{
+	{NeedName, "NeedName"},
+	{NeedFiles, "NeedFiles"},
+	{NeedCompiledGoFiles, "NeedCompiledGoFiles"},
+	{NeedImports, "NeedImports"},
+	{NeedDeps, "NeedDeps"},
+	{NeedExportFile, "NeedExportFile"},
+	{NeedTypes, "NeedTypes"},
+	{NeedSyntax, "NeedSyntax"},
+	{NeedTypesInfo, "NeedTypesInfo"},
+	{NeedTypesSizes, "NeedTypesSizes"},
+	{NeedForTest, "NeedForTest"},
+	{NeedModule, "NeedModule"},
+	{NeedEmbedFiles, "NeedEmbedFiles"},
+	{NeedEmbedPatterns, "NeedEmbedPatterns"},
+	{NeedTarget, "NeedTarget"},
 }
 
-var modeStrings = []string{
-	"NeedName",
-	"NeedFiles",
-	"NeedCompiledGoFiles",
-	"NeedImports",
-	"NeedDeps",
-	"NeedExportFile",
-	"NeedTypes",
-	"NeedSyntax",
-	"NeedTypesInfo",
-	"NeedTypesSizes",
-}
-
-func (mod LoadMode) String() string {
-	m := mod
-	if m == 0 {
+func (mode LoadMode) String() string {
+	if mode == 0 {
 		return "LoadMode(0)"
 	}
 	var out []string
-	for i, x := range allModes {
-		if x > m {
-			break
+	// named bits
+	for _, item := range modes {
+		if (mode & item.mode) != 0 {
+			mode ^= item.mode
+			out = append(out, item.name)
 		}
-		if (m & x) != 0 {
-			out = append(out, modeStrings[i])
-			m = m ^ x
+	}
+	// unnamed residue
+	if mode != 0 {
+		if out == nil {
+			return fmt.Sprintf("LoadMode(%#x)", int(mode))
 		}
+		out = append(out, fmt.Sprintf("%#x", int(mode)))
 	}
-	if m != 0 {
-		out = append(out, "Unknown")
+	if len(out) == 1 {
+		return out[0]
 	}
-	return fmt.Sprintf("LoadMode(%s)", strings.Join(out, "|"))
+	return "(" + strings.Join(out, "|") + ")"
 }
diff --git a/test/integration/vendor/golang.org/x/tools/go/packages/packages.go b/test/integration/vendor/golang.org/x/tools/go/packages/packages.go
index 0b6bfaff80..0147d9080a 100644
--- a/test/integration/vendor/golang.org/x/tools/go/packages/packages.go
+++ b/test/integration/vendor/golang.org/x/tools/go/packages/packages.go
@@ -16,13 +16,13 @@ import (
 	"go/scanner"
 	"go/token"
 	"go/types"
-	"io"
 	"log"
 	"os"
 	"path/filepath"
 	"runtime"
 	"strings"
 	"sync"
+	"sync/atomic"
 	"time"
 
 	"golang.org/x/sync/errgroup"
@@ -31,7 +31,6 @@ import (
 	"golang.org/x/tools/internal/gocommand"
 	"golang.org/x/tools/internal/packagesinternal"
 	"golang.org/x/tools/internal/typesinternal"
-	"golang.org/x/tools/internal/versions"
 )
 
 // A LoadMode controls the amount of detail to return when loading.
@@ -44,19 +43,33 @@ import (
 // ID and Errors (if present) will always be filled.
 // [Load] may return more information than requested.
 //
+// The Mode flag is a union of several bits named NeedName,
+// NeedFiles, and so on, each of which determines whether
+// a given field of Package (Name, Files, etc) should be
+// populated.
+//
+// For convenience, we provide named constants for the most
+// common combinations of Need flags:
+//
+//	[LoadFiles]     lists of files in each package
+//	[LoadImports]   ... plus imports
+//	[LoadTypes]     ... plus type information
+//	[LoadSyntax]    ... plus type-annotated syntax
+//	[LoadAllSyntax] ... for all dependencies
+//
 // Unfortunately there are a number of open bugs related to
 // interactions among the LoadMode bits:
-// - https://github.com/golang/go/issues/56633
-// - https://github.com/golang/go/issues/56677
-// - https://github.com/golang/go/issues/58726
-// - https://github.com/golang/go/issues/63517
+//   - https://github.com/golang/go/issues/56633
+//   - https://github.com/golang/go/issues/56677
+//   - https://github.com/golang/go/issues/58726
+//   - https://github.com/golang/go/issues/63517
 type LoadMode int
 
 const (
 	// NeedName adds Name and PkgPath.
 	NeedName LoadMode = 1 << iota
 
-	// NeedFiles adds GoFiles and OtherFiles.
+	// NeedFiles adds Dir, GoFiles, OtherFiles, and IgnoredFiles
 	NeedFiles
 
 	// NeedCompiledGoFiles adds CompiledGoFiles.
@@ -78,7 +91,7 @@ const (
 	// NeedSyntax adds Syntax and Fset.
 	NeedSyntax
 
-	// NeedTypesInfo adds TypesInfo.
+	// NeedTypesInfo adds TypesInfo and Fset.
 	NeedTypesInfo
 
 	// NeedTypesSizes adds TypesSizes.
@@ -87,9 +100,10 @@ const (
 	// needInternalDepsErrors adds the internal deps errors field for use by gopls.
 	needInternalDepsErrors
 
-	// needInternalForTest adds the internal forTest field.
+	// NeedForTest adds ForTest.
+	//
 	// Tests must also be set on the context for this field to be populated.
-	needInternalForTest
+	NeedForTest
 
 	// typecheckCgo enables full support for type checking cgo. Requires Go 1.15+.
 	// Modifies CompiledGoFiles and Types, and has no effect on its own.
@@ -103,27 +117,27 @@ const (
 
 	// NeedEmbedPatterns adds EmbedPatterns.
 	NeedEmbedPatterns
+
+	// NeedTarget adds Target.
+	NeedTarget
+
+	// Be sure to update loadmode_string.go when adding new items!
 )
 
 const (
-	// Deprecated: LoadFiles exists for historical compatibility
-	// and should not be used. Please directly specify the needed fields using the Need values.
+	// LoadFiles loads the name and file names for the initial packages.
 	LoadFiles = NeedName | NeedFiles | NeedCompiledGoFiles
 
-	// Deprecated: LoadImports exists for historical compatibility
-	// and should not be used. Please directly specify the needed fields using the Need values.
+	// LoadImports loads the name, file names, and import mapping for the initial packages.
 	LoadImports = LoadFiles | NeedImports
 
-	// Deprecated: LoadTypes exists for historical compatibility
-	// and should not be used. Please directly specify the needed fields using the Need values.
+	// LoadTypes loads exported type information for the initial packages.
 	LoadTypes = LoadImports | NeedTypes | NeedTypesSizes
 
-	// Deprecated: LoadSyntax exists for historical compatibility
-	// and should not be used. Please directly specify the needed fields using the Need values.
+	// LoadSyntax loads typed syntax for the initial packages.
 	LoadSyntax = LoadTypes | NeedSyntax | NeedTypesInfo
 
-	// Deprecated: LoadAllSyntax exists for historical compatibility
-	// and should not be used. Please directly specify the needed fields using the Need values.
+	// LoadAllSyntax loads typed syntax for the initial packages and all dependencies.
 	LoadAllSyntax = LoadSyntax | NeedDeps
 
 	// Deprecated: NeedExportsFile is a historical misspelling of NeedExportFile.
@@ -133,13 +147,7 @@ const (
 // A Config specifies details about how packages should be loaded.
 // The zero value is a valid configuration.
 //
-// Calls to Load do not modify this struct.
-//
-// TODO(adonovan): #67702: this is currently false: in fact,
-// calls to [Load] do not modify the public fields of this struct, but
-// may modify hidden fields, so concurrent calls to [Load] must not
-// use the same Config. But perhaps we should reestablish the
-// documented invariant.
+// Calls to [Load] do not modify this struct.
 type Config struct {
 	// Mode controls the level of information returned for each package.
 	Mode LoadMode
@@ -170,19 +178,10 @@ type Config struct {
 	//
 	Env []string
 
-	// gocmdRunner guards go command calls from concurrency errors.
-	gocmdRunner *gocommand.Runner
-
 	// BuildFlags is a list of command-line flags to be passed through to
 	// the build system's query tool.
 	BuildFlags []string
 
-	// modFile will be used for -modfile in go command invocations.
-	modFile string
-
-	// modFlag will be used for -modfile in go command invocations.
-	modFlag string
-
 	// Fset provides source position information for syntax trees and types.
 	// If Fset is nil, Load will use a new fileset, but preserve Fset's value.
 	Fset *token.FileSet
@@ -229,21 +228,24 @@ type Config struct {
 	// drivers may vary in their level of support for overlays.
 	Overlay map[string][]byte
 
-	// goListOverlayFile is the JSON file that encodes the Overlay
-	// mapping, used by 'go list -overlay=...'
-	goListOverlayFile string
+	// -- Hidden configuration fields only for use in x/tools --
+
+	// modFile will be used for -modfile in go command invocations.
+	modFile string
+
+	// modFlag will be used for -modfile in go command invocations.
+	modFlag string
 }
 
 // Load loads and returns the Go packages named by the given patterns.
 //
-// Config specifies loading options;
-// nil behaves the same as an empty Config.
+// The cfg parameter specifies loading options; nil behaves the same as an empty [Config].
 //
 // The [Config.Mode] field is a set of bits that determine what kinds
 // of information should be computed and returned. Modes that require
 // more information tend to be slower. See [LoadMode] for details
 // and important caveats. Its zero value is equivalent to
-// NeedName | NeedFiles | NeedCompiledGoFiles.
+// [NeedName] | [NeedFiles] | [NeedCompiledGoFiles].
 //
 // Each call to Load returns a new set of [Package] instances.
 // The Packages and their Imports form a directed acyclic graph.
@@ -260,7 +262,7 @@ type Config struct {
 // Errors associated with a particular package are recorded in the
 // corresponding Package's Errors list, and do not cause Load to
 // return an error. Clients may need to handle such errors before
-// proceeding with further analysis. The PrintErrors function is
+// proceeding with further analysis. The [PrintErrors] function is
 // provided for convenient display of all errors.
 func Load(cfg *Config, patterns ...string) ([]*Package, error) {
 	ld := newLoader(cfg)
@@ -323,21 +325,24 @@ func defaultDriver(cfg *Config, patterns ...string) (*DriverResponse, bool, erro
 		} else if !response.NotHandled {
 			return response, true, nil
 		}
-		// (fall through)
+		// not handled: fall through
 	}
 
 	// go list fallback
-	//
+
 	// Write overlays once, as there are many calls
 	// to 'go list' (one per chunk plus others too).
-	overlay, cleanupOverlay, err := gocommand.WriteOverlays(cfg.Overlay)
+	overlayFile, cleanupOverlay, err := gocommand.WriteOverlays(cfg.Overlay)
 	if err != nil {
 		return nil, false, err
 	}
 	defer cleanupOverlay()
-	cfg.goListOverlayFile = overlay
 
-	response, err := callDriverOnChunks(goListDriver, cfg, chunks)
+	var runner gocommand.Runner // (shared across many 'go list' calls)
+	driver := func(cfg *Config, patterns []string) (*DriverResponse, error) {
+		return goListDriver(cfg, &runner, overlayFile, patterns)
+	}
+	response, err := callDriverOnChunks(driver, cfg, chunks)
 	if err != nil {
 		return nil, false, err
 	}
@@ -375,16 +380,14 @@ func splitIntoChunks(patterns []string, argMax int) ([][]string, error) {
 
 func callDriverOnChunks(driver driver, cfg *Config, chunks [][]string) (*DriverResponse, error) {
 	if len(chunks) == 0 {
-		return driver(cfg)
+		return driver(cfg, nil)
 	}
 	responses := make([]*DriverResponse, len(chunks))
 	errNotHandled := errors.New("driver returned NotHandled")
 	var g errgroup.Group
 	for i, chunk := range chunks {
-		i := i
-		chunk := chunk
 		g.Go(func() (err error) {
-			responses[i], err = driver(cfg, chunk...)
+			responses[i], err = driver(cfg, chunk)
 			if responses[i] != nil && responses[i].NotHandled {
 				err = errNotHandled
 			}
@@ -434,6 +437,12 @@ type Package struct {
 	// PkgPath is the package path as used by the go/types package.
 	PkgPath string
 
+	// Dir is the directory associated with the package, if it exists.
+	//
+	// For packages listed by the go command, this is the directory containing
+	// the package files.
+	Dir string
+
 	// Errors contains any errors encountered querying the metadata
 	// of the package, or while parsing or type-checking its files.
 	Errors []Error
@@ -473,6 +482,10 @@ type Package struct {
 	// information for the package as provided by the build system.
 	ExportFile string
 
+	// Target is the absolute install path of the .a file, for libraries,
+	// and of the executable file, for binaries.
+	Target string
+
 	// Imports maps import paths appearing in the package's Go source files
 	// to corresponding loaded Packages.
 	Imports map[string]*Package
@@ -521,8 +534,8 @@ type Package struct {
 
 	// -- internal --
 
-	// forTest is the package under test, if any.
-	forTest string
+	// ForTest is the package under test, if any.
+	ForTest string
 
 	// depsErrors is the DepsErrors field from the go list response, if any.
 	depsErrors []*packagesinternal.PackageError
@@ -551,9 +564,6 @@ type ModuleError struct {
 }
 
 func init() {
-	packagesinternal.GetForTest = func(p interface{}) string {
-		return p.(*Package).forTest
-	}
 	packagesinternal.GetDepsErrors = func(p interface{}) []*packagesinternal.PackageError {
 		return p.(*Package).depsErrors
 	}
@@ -565,7 +575,6 @@ func init() {
 	}
 	packagesinternal.TypecheckCgo = int(typecheckCgo)
 	packagesinternal.DepsErrors = int(needInternalDepsErrors)
-	packagesinternal.ForTest = int(needInternalForTest)
 }
 
 // An Error describes a problem with a package's metadata, syntax, or types.
@@ -681,18 +690,19 @@ func (p *Package) String() string { return p.ID }
 // loaderPackage augments Package with state used during the loading phase
 type loaderPackage struct {
 	*Package
-	importErrors map[string]error // maps each bad import to its error
-	loadOnce     sync.Once
-	color        uint8 // for cycle detection
-	needsrc      bool  // load from source (Mode >= LoadTypes)
-	needtypes    bool  // type information is either requested or depended on
-	initial      bool  // package was matched by a pattern
-	goVersion    int   // minor version number of go command on PATH
+	importErrors    map[string]error // maps each bad import to its error
+	preds           []*loaderPackage // packages that import this one
+	unfinishedSuccs atomic.Int32     // number of direct imports not yet loaded
+	color           uint8            // for cycle detection
+	needsrc         bool             // load from source (Mode >= LoadTypes)
+	needtypes       bool             // type information is either requested or depended on
+	initial         bool             // package was matched by a pattern
+	goVersion       int              // minor version number of go command on PATH
 }
 
 // loader holds the working state of a single call to load.
 type loader struct {
-	pkgs map[string]*loaderPackage
+	pkgs map[string]*loaderPackage // keyed by Package.ID
 	Config
 	sizes        types.Sizes // non-nil if needed by mode
 	parseCache   map[string]*parseValue
@@ -738,9 +748,6 @@ func newLoader(cfg *Config) *loader {
 	if ld.Config.Env == nil {
 		ld.Config.Env = os.Environ()
 	}
-	if ld.Config.gocmdRunner == nil {
-		ld.Config.gocmdRunner = &gocommand.Runner{}
-	}
 	if ld.Context == nil {
 		ld.Context = context.Background()
 	}
@@ -754,7 +761,7 @@ func newLoader(cfg *Config) *loader {
 	ld.requestedMode = ld.Mode
 	ld.Mode = impliedLoadMode(ld.Mode)
 
-	if ld.Mode&NeedTypes != 0 || ld.Mode&NeedSyntax != 0 {
+	if ld.Mode&(NeedSyntax|NeedTypes|NeedTypesInfo) != 0 {
 		if ld.Fset == nil {
 			ld.Fset = token.NewFileSet()
 		}
@@ -763,6 +770,7 @@ func newLoader(cfg *Config) *loader {
 		// because we load source if export data is missing.
 		if ld.ParseFile == nil {
 			ld.ParseFile = func(fset *token.FileSet, filename string, src []byte) (*ast.File, error) {
+				// We implicitly promise to keep doing ast.Object resolution. :(
 				const mode = parser.AllErrors | parser.ParseComments
 				return parser.ParseFile(fset, filename, src, mode)
 			}
@@ -794,7 +802,7 @@ func (ld *loader) refine(response *DriverResponse) ([]*Package, error) {
 		exportDataInvalid := len(ld.Overlay) > 0 || pkg.ExportFile == "" && pkg.PkgPath != "unsafe"
 		// This package needs type information if the caller requested types and the package is
 		// either a root, or it's a non-root and the user requested dependencies ...
-		needtypes := (ld.Mode&NeedTypes|NeedTypesInfo != 0 && (rootIndex >= 0 || ld.Mode&NeedDeps != 0))
+		needtypes := (ld.Mode&(NeedTypes|NeedTypesInfo) != 0 && (rootIndex >= 0 || ld.Mode&NeedDeps != 0))
 		// This package needs source if the call requested source (or types info, which implies source)
 		// and the package is either a root, or itas a non- root and the user requested dependencies...
 		needsrc := ((ld.Mode&(NeedSyntax|NeedTypesInfo) != 0 && (rootIndex >= 0 || ld.Mode&NeedDeps != 0)) ||
@@ -819,9 +827,10 @@ func (ld *loader) refine(response *DriverResponse) ([]*Package, error) {
 		}
 	}
 
-	if ld.Mode&NeedImports != 0 {
-		// Materialize the import graph.
-
+	// Materialize the import graph if it is needed (NeedImports),
+	// or if we'll be using loadPackages (Need{Syntax|Types|TypesInfo}).
+	var leaves []*loaderPackage // packages with no unfinished successors
+	if ld.Mode&(NeedImports|NeedSyntax|NeedTypes|NeedTypesInfo) != 0 {
 		const (
 			white = 0 // new
 			grey  = 1 // in progress
@@ -840,63 +849,76 @@ func (ld *loader) refine(response *DriverResponse) ([]*Package, error) {
 		// dependency on a package that does. These are the only packages
 		// for which we load source code.
 		var stack []*loaderPackage
-		var visit func(lpkg *loaderPackage) bool
-		visit = func(lpkg *loaderPackage) bool {
-			switch lpkg.color {
-			case black:
-				return lpkg.needsrc
-			case grey:
+		var visit func(from, lpkg *loaderPackage) bool
+		visit = func(from, lpkg *loaderPackage) bool {
+			if lpkg.color == grey {
 				panic("internal error: grey node")
 			}
-			lpkg.color = grey
-			stack = append(stack, lpkg) // push
-			stubs := lpkg.Imports       // the structure form has only stubs with the ID in the Imports
-			lpkg.Imports = make(map[string]*Package, len(stubs))
-			for importPath, ipkg := range stubs {
-				var importErr error
-				imp := ld.pkgs[ipkg.ID]
-				if imp == nil {
-					// (includes package "C" when DisableCgo)
-					importErr = fmt.Errorf("missing package: %q", ipkg.ID)
-				} else if imp.color == grey {
-					importErr = fmt.Errorf("import cycle: %s", stack)
+			if lpkg.color == white {
+				lpkg.color = grey
+				stack = append(stack, lpkg) // push
+				stubs := lpkg.Imports       // the structure form has only stubs with the ID in the Imports
+				lpkg.Imports = make(map[string]*Package, len(stubs))
+				for importPath, ipkg := range stubs {
+					var importErr error
+					imp := ld.pkgs[ipkg.ID]
+					if imp == nil {
+						// (includes package "C" when DisableCgo)
+						importErr = fmt.Errorf("missing package: %q", ipkg.ID)
+					} else if imp.color == grey {
+						importErr = fmt.Errorf("import cycle: %s", stack)
+					}
+					if importErr != nil {
+						if lpkg.importErrors == nil {
+							lpkg.importErrors = make(map[string]error)
+						}
+						lpkg.importErrors[importPath] = importErr
+						continue
+					}
+
+					if visit(lpkg, imp) {
+						lpkg.needsrc = true
+					}
+					lpkg.Imports[importPath] = imp.Package
 				}
-				if importErr != nil {
-					if lpkg.importErrors == nil {
-						lpkg.importErrors = make(map[string]error)
+
+				// -- postorder --
+
+				// Complete type information is required for the
+				// immediate dependencies of each source package.
+				if lpkg.needsrc && ld.Mode&NeedTypes != 0 {
+					for _, ipkg := range lpkg.Imports {
+						ld.pkgs[ipkg.ID].needtypes = true
 					}
-					lpkg.importErrors[importPath] = importErr
-					continue
 				}
 
-				if visit(imp) {
-					lpkg.needsrc = true
+				// NeedTypeSizes causes TypeSizes to be set even
+				// on packages for which types aren't needed.
+				if ld.Mode&NeedTypesSizes != 0 {
+					lpkg.TypesSizes = ld.sizes
 				}
-				lpkg.Imports[importPath] = imp.Package
-			}
 
-			// Complete type information is required for the
-			// immediate dependencies of each source package.
-			if lpkg.needsrc && ld.Mode&NeedTypes != 0 {
-				for _, ipkg := range lpkg.Imports {
-					ld.pkgs[ipkg.ID].needtypes = true
+				// Add packages with no imports directly to the queue of leaves.
+				if len(lpkg.Imports) == 0 {
+					leaves = append(leaves, lpkg)
 				}
+
+				stack = stack[:len(stack)-1] // pop
+				lpkg.color = black
 			}
 
-			// NeedTypeSizes causes TypeSizes to be set even
-			// on packages for which types aren't needed.
-			if ld.Mode&NeedTypesSizes != 0 {
-				lpkg.TypesSizes = ld.sizes
+			// Add edge from predecessor.
+			if from != nil {
+				from.unfinishedSuccs.Add(+1) // incref
+				lpkg.preds = append(lpkg.preds, from)
 			}
-			stack = stack[:len(stack)-1] // pop
-			lpkg.color = black
 
 			return lpkg.needsrc
 		}
 
 		// For each initial package, create its import DAG.
 		for _, lpkg := range initial {
-			visit(lpkg)
+			visit(nil, lpkg)
 		}
 
 	} else {
@@ -909,16 +931,45 @@ func (ld *loader) refine(response *DriverResponse) ([]*Package, error) {
 
 	// Load type data and syntax if needed, starting at
 	// the initial packages (roots of the import DAG).
-	if ld.Mode&NeedTypes != 0 || ld.Mode&NeedSyntax != 0 {
-		var wg sync.WaitGroup
-		for _, lpkg := range initial {
-			wg.Add(1)
-			go func(lpkg *loaderPackage) {
-				ld.loadRecursive(lpkg)
-				wg.Done()
-			}(lpkg)
+	if ld.Mode&(NeedSyntax|NeedTypes|NeedTypesInfo) != 0 {
+
+		// We avoid using g.SetLimit to limit concurrency as
+		// it makes g.Go stop accepting work, which prevents
+		// workers from enqeuing, and thus finishing, and thus
+		// allowing the group to make progress: deadlock.
+		//
+		// Instead we use the ioLimit and cpuLimit semaphores.
+		g, _ := errgroup.WithContext(ld.Context)
+
+		// enqueues adds a package to the type-checking queue.
+		// It must have no unfinished successors.
+		var enqueue func(*loaderPackage)
+		enqueue = func(lpkg *loaderPackage) {
+			g.Go(func() error {
+				// Parse and type-check.
+				ld.loadPackage(lpkg)
+
+				// Notify each waiting predecessor,
+				// and enqueue it when it becomes a leaf.
+				for _, pred := range lpkg.preds {
+					if pred.unfinishedSuccs.Add(-1) == 0 { // decref
+						enqueue(pred)
+					}
+				}
+
+				return nil
+			})
+		}
+
+		// Load leaves first, adding new packages
+		// to the queue as they become leaves.
+		for _, leaf := range leaves {
+			enqueue(leaf)
+		}
+
+		if err := g.Wait(); err != nil {
+			return nil, err // cancelled
 		}
-		wg.Wait()
 	}
 
 	// If the context is done, return its error and
@@ -965,7 +1016,7 @@ func (ld *loader) refine(response *DriverResponse) ([]*Package, error) {
 		if ld.requestedMode&NeedSyntax == 0 {
 			ld.pkgs[i].Syntax = nil
 		}
-		if ld.requestedMode&NeedTypes == 0 && ld.requestedMode&NeedSyntax == 0 {
+		if ld.requestedMode&(NeedSyntax|NeedTypes|NeedTypesInfo) == 0 {
 			ld.pkgs[i].Fset = nil
 		}
 		if ld.requestedMode&NeedTypesInfo == 0 {
@@ -982,31 +1033,10 @@ func (ld *loader) refine(response *DriverResponse) ([]*Package, error) {
 	return result, nil
 }
 
-// loadRecursive loads the specified package and its dependencies,
-// recursively, in parallel, in topological order.
-// It is atomic and idempotent.
-// Precondition: ld.Mode&NeedTypes.
-func (ld *loader) loadRecursive(lpkg *loaderPackage) {
-	lpkg.loadOnce.Do(func() {
-		// Load the direct dependencies, in parallel.
-		var wg sync.WaitGroup
-		for _, ipkg := range lpkg.Imports {
-			imp := ld.pkgs[ipkg.ID]
-			wg.Add(1)
-			go func(imp *loaderPackage) {
-				ld.loadRecursive(imp)
-				wg.Done()
-			}(imp)
-		}
-		wg.Wait()
-		ld.loadPackage(lpkg)
-	})
-}
-
-// loadPackage loads the specified package.
+// loadPackage loads/parses/typechecks the specified package.
 // It must be called only once per Package,
 // after immediate dependencies are loaded.
-// Precondition: ld.Mode & NeedTypes.
+// Precondition: ld.Mode&(NeedSyntax|NeedTypes|NeedTypesInfo) != 0.
 func (ld *loader) loadPackage(lpkg *loaderPackage) {
 	if lpkg.PkgPath == "unsafe" {
 		// Fill in the blanks to avoid surprises.
@@ -1042,6 +1072,10 @@ func (ld *loader) loadPackage(lpkg *loaderPackage) {
 	if !lpkg.needtypes && !lpkg.needsrc {
 		return
 	}
+
+	// TODO(adonovan): this condition looks wrong:
+	// I think it should be lpkg.needtypes && !lpg.needsrc,
+	// so that NeedSyntax without NeedTypes can be satisfied by export data.
 	if !lpkg.needsrc {
 		if err := ld.loadFromExportData(lpkg); err != nil {
 			lpkg.Errors = append(lpkg.Errors, Error{
@@ -1147,7 +1181,7 @@ func (ld *loader) loadPackage(lpkg *loaderPackage) {
 	}
 
 	lpkg.Syntax = files
-	if ld.Config.Mode&NeedTypes == 0 {
+	if ld.Config.Mode&(NeedTypes|NeedTypesInfo) == 0 {
 		return
 	}
 
@@ -1158,16 +1192,20 @@ func (ld *loader) loadPackage(lpkg *loaderPackage) {
 		return
 	}
 
-	lpkg.TypesInfo = &types.Info{
-		Types:      make(map[ast.Expr]types.TypeAndValue),
-		Defs:       make(map[*ast.Ident]types.Object),
-		Uses:       make(map[*ast.Ident]types.Object),
-		Implicits:  make(map[ast.Node]types.Object),
-		Instances:  make(map[*ast.Ident]types.Instance),
-		Scopes:     make(map[ast.Node]*types.Scope),
-		Selections: make(map[*ast.SelectorExpr]*types.Selection),
+	// Populate TypesInfo only if needed, as it
+	// causes the type checker to work much harder.
+	if ld.Config.Mode&NeedTypesInfo != 0 {
+		lpkg.TypesInfo = &types.Info{
+			Types:        make(map[ast.Expr]types.TypeAndValue),
+			Defs:         make(map[*ast.Ident]types.Object),
+			Uses:         make(map[*ast.Ident]types.Object),
+			Implicits:    make(map[ast.Node]types.Object),
+			Instances:    make(map[*ast.Ident]types.Instance),
+			Scopes:       make(map[ast.Node]*types.Scope),
+			Selections:   make(map[*ast.SelectorExpr]*types.Selection),
+			FileVersions: make(map[*ast.File]string),
+		}
 	}
-	versions.InitFileVersions(lpkg.TypesInfo)
 	lpkg.TypesSizes = ld.sizes
 
 	importer := importerFunc(func(path string) (*types.Package, error) {
@@ -1220,6 +1258,10 @@ func (ld *loader) loadPackage(lpkg *loaderPackage) {
 		}
 	}
 
+	// Type-checking is CPU intensive.
+	cpuLimit <- unit{}            // acquire a token
+	defer func() { <-cpuLimit }() // release a token
+
 	typErr := types.NewChecker(tc, ld.Fset, lpkg.Types, lpkg.TypesInfo).Files(lpkg.Syntax)
 	lpkg.importErrors = nil // no longer needed
 
@@ -1284,8 +1326,11 @@ type importerFunc func(path string) (*types.Package, error)
 func (f importerFunc) Import(path string) (*types.Package, error) { return f(path) }
 
 // We use a counting semaphore to limit
-// the number of parallel I/O calls per process.
-var ioLimit = make(chan bool, 20)
+// the number of parallel I/O calls or CPU threads per process.
+var (
+	ioLimit  = make(chan unit, 20)
+	cpuLimit = make(chan unit, runtime.GOMAXPROCS(0))
+)
 
 func (ld *loader) parseFile(filename string) (*ast.File, error) {
 	ld.parseCacheMu.Lock()
@@ -1302,20 +1347,28 @@ func (ld *loader) parseFile(filename string) (*ast.File, error) {
 
 		var src []byte
 		for f, contents := range ld.Config.Overlay {
+			// TODO(adonovan): Inefficient for large overlays.
+			// Do an exact name-based map lookup
+			// (for nonexistent files) followed by a
+			// FileID-based map lookup (for existing ones).
 			if sameFile(f, filename) {
 				src = contents
+				break
 			}
 		}
 		var err error
 		if src == nil {
-			ioLimit <- true // wait
+			ioLimit <- unit{} // acquire a token
 			src, err = os.ReadFile(filename)
-			<-ioLimit // signal
+			<-ioLimit // release a token
 		}
 		if err != nil {
 			v.err = err
 		} else {
+			// Parsing is CPU intensive.
+			cpuLimit <- unit{} // acquire a token
 			v.f, v.err = ld.ParseFile(ld.Fset, filename, src)
+			<-cpuLimit // release a token
 		}
 
 		close(v.ready)
@@ -1330,18 +1383,21 @@ func (ld *loader) parseFile(filename string) (*ast.File, error) {
 // Because files are scanned in parallel, the token.Pos
 // positions of the resulting ast.Files are not ordered.
 func (ld *loader) parseFiles(filenames []string) ([]*ast.File, []error) {
-	var wg sync.WaitGroup
-	n := len(filenames)
-	parsed := make([]*ast.File, n)
-	errors := make([]error, n)
-	for i, file := range filenames {
-		wg.Add(1)
-		go func(i int, filename string) {
+	var (
+		n      = len(filenames)
+		parsed = make([]*ast.File, n)
+		errors = make([]error, n)
+	)
+	var g errgroup.Group
+	for i, filename := range filenames {
+		// This creates goroutines unnecessarily in the
+		// cache-hit case, but that case is uncommon.
+		g.Go(func() error {
 			parsed[i], errors[i] = ld.parseFile(filename)
-			wg.Done()
-		}(i, file)
+			return nil
+		})
 	}
-	wg.Wait()
+	g.Wait()
 
 	// Eliminate nils, preserving order.
 	var o int
@@ -1512,4 +1568,4 @@ func usesExportData(cfg *Config) bool {
 	return cfg.Mode&NeedExportFile != 0 || cfg.Mode&NeedTypes != 0 && cfg.Mode&NeedDeps == 0
 }
 
-var _ interface{} = io.Discard // assert build toolchain is go1.16 or later
+type unit struct{}
diff --git a/test/integration/vendor/golang.org/x/tools/go/types/objectpath/objectpath.go b/test/integration/vendor/golang.org/x/tools/go/types/objectpath/objectpath.go
index 9ada177758..16ed3c1780 100644
--- a/test/integration/vendor/golang.org/x/tools/go/types/objectpath/objectpath.go
+++ b/test/integration/vendor/golang.org/x/tools/go/types/objectpath/objectpath.go
@@ -228,7 +228,7 @@ func (enc *Encoder) For(obj types.Object) (Path, error) {
 	//    Reject obviously non-viable cases.
 	switch obj := obj.(type) {
 	case *types.TypeName:
-		if _, ok := aliases.Unalias(obj.Type()).(*types.TypeParam); !ok {
+		if _, ok := types.Unalias(obj.Type()).(*types.TypeParam); !ok {
 			// With the exception of type parameters, only package-level type names
 			// have a path.
 			return "", fmt.Errorf("no path for %v", obj)
@@ -280,26 +280,26 @@ func (enc *Encoder) For(obj types.Object) (Path, error) {
 		path = append(path, opType)
 
 		T := o.Type()
-		if alias, ok := T.(*aliases.Alias); ok {
-			if r := findTypeParam(obj, aliases.TypeParams(alias), path, opTypeParam, nil); r != nil {
+		if alias, ok := T.(*types.Alias); ok {
+			if r := findTypeParam(obj, aliases.TypeParams(alias), path, opTypeParam); r != nil {
 				return Path(r), nil
 			}
-			if r := find(obj, aliases.Rhs(alias), append(path, opRhs), nil); r != nil {
+			if r := find(obj, aliases.Rhs(alias), append(path, opRhs)); r != nil {
 				return Path(r), nil
 			}
 
 		} else if tname.IsAlias() {
 			// legacy alias
-			if r := find(obj, T, path, nil); r != nil {
+			if r := find(obj, T, path); r != nil {
 				return Path(r), nil
 			}
 
 		} else if named, ok := T.(*types.Named); ok {
 			// defined (named) type
-			if r := findTypeParam(obj, named.TypeParams(), path, opTypeParam, nil); r != nil {
+			if r := findTypeParam(obj, named.TypeParams(), path, opTypeParam); r != nil {
 				return Path(r), nil
 			}
-			if r := find(obj, named.Underlying(), append(path, opUnderlying), nil); r != nil {
+			if r := find(obj, named.Underlying(), append(path, opUnderlying)); r != nil {
 				return Path(r), nil
 			}
 		}
@@ -312,7 +312,7 @@ func (enc *Encoder) For(obj types.Object) (Path, error) {
 		if _, ok := o.(*types.TypeName); !ok {
 			if o.Exported() {
 				// exported non-type (const, var, func)
-				if r := find(obj, o.Type(), append(path, opType), nil); r != nil {
+				if r := find(obj, o.Type(), append(path, opType)); r != nil {
 					return Path(r), nil
 				}
 			}
@@ -320,7 +320,7 @@ func (enc *Encoder) For(obj types.Object) (Path, error) {
 		}
 
 		// Inspect declared methods of defined types.
-		if T, ok := aliases.Unalias(o.Type()).(*types.Named); ok {
+		if T, ok := types.Unalias(o.Type()).(*types.Named); ok {
 			path = append(path, opType)
 			// The method index here is always with respect
 			// to the underlying go/types data structures,
@@ -332,7 +332,7 @@ func (enc *Encoder) For(obj types.Object) (Path, error) {
 				if m == obj {
 					return Path(path2), nil // found declared method
 				}
-				if r := find(obj, m.Type(), append(path2, opType), nil); r != nil {
+				if r := find(obj, m.Type(), append(path2, opType)); r != nil {
 					return Path(r), nil
 				}
 			}
@@ -447,46 +447,64 @@ func (enc *Encoder) concreteMethod(meth *types.Func) (Path, bool) {
 //
 // The seen map is used to short circuit cycles through type parameters. If
 // nil, it will be allocated as necessary.
-func find(obj types.Object, T types.Type, path []byte, seen map[*types.TypeName]bool) []byte {
+//
+// The seenMethods map is used internally to short circuit cycles through
+// interface methods, such as occur in the following example:
+//
+//	type I interface { f() interface{I} }
+//
+// See golang/go#68046 for details.
+func find(obj types.Object, T types.Type, path []byte) []byte {
+	return (&finder{obj: obj}).find(T, path)
+}
+
+// finder closes over search state for a call to find.
+type finder struct {
+	obj             types.Object             // the sought object
+	seenTParamNames map[*types.TypeName]bool // for cycle breaking through type parameters
+	seenMethods     map[*types.Func]bool     // for cycle breaking through recursive interfaces
+}
+
+func (f *finder) find(T types.Type, path []byte) []byte {
 	switch T := T.(type) {
-	case *aliases.Alias:
-		return find(obj, aliases.Unalias(T), path, seen)
+	case *types.Alias:
+		return f.find(types.Unalias(T), path)
 	case *types.Basic, *types.Named:
 		// Named types belonging to pkg were handled already,
 		// so T must belong to another package. No path.
 		return nil
 	case *types.Pointer:
-		return find(obj, T.Elem(), append(path, opElem), seen)
+		return f.find(T.Elem(), append(path, opElem))
 	case *types.Slice:
-		return find(obj, T.Elem(), append(path, opElem), seen)
+		return f.find(T.Elem(), append(path, opElem))
 	case *types.Array:
-		return find(obj, T.Elem(), append(path, opElem), seen)
+		return f.find(T.Elem(), append(path, opElem))
 	case *types.Chan:
-		return find(obj, T.Elem(), append(path, opElem), seen)
+		return f.find(T.Elem(), append(path, opElem))
 	case *types.Map:
-		if r := find(obj, T.Key(), append(path, opKey), seen); r != nil {
+		if r := f.find(T.Key(), append(path, opKey)); r != nil {
 			return r
 		}
-		return find(obj, T.Elem(), append(path, opElem), seen)
+		return f.find(T.Elem(), append(path, opElem))
 	case *types.Signature:
-		if r := findTypeParam(obj, T.RecvTypeParams(), path, opRecvTypeParam, nil); r != nil {
+		if r := f.findTypeParam(T.RecvTypeParams(), path, opRecvTypeParam); r != nil {
 			return r
 		}
-		if r := findTypeParam(obj, T.TypeParams(), path, opTypeParam, seen); r != nil {
+		if r := f.findTypeParam(T.TypeParams(), path, opTypeParam); r != nil {
 			return r
 		}
-		if r := find(obj, T.Params(), append(path, opParams), seen); r != nil {
+		if r := f.find(T.Params(), append(path, opParams)); r != nil {
 			return r
 		}
-		return find(obj, T.Results(), append(path, opResults), seen)
+		return f.find(T.Results(), append(path, opResults))
 	case *types.Struct:
 		for i := 0; i < T.NumFields(); i++ {
 			fld := T.Field(i)
 			path2 := appendOpArg(path, opField, i)
-			if fld == obj {
+			if fld == f.obj {
 				return path2 // found field var
 			}
-			if r := find(obj, fld.Type(), append(path2, opType), seen); r != nil {
+			if r := f.find(fld.Type(), append(path2, opType)); r != nil {
 				return r
 			}
 		}
@@ -495,10 +513,10 @@ func find(obj types.Object, T types.Type, path []byte, seen map[*types.TypeName]
 		for i := 0; i < T.Len(); i++ {
 			v := T.At(i)
 			path2 := appendOpArg(path, opAt, i)
-			if v == obj {
+			if v == f.obj {
 				return path2 // found param/result var
 			}
-			if r := find(obj, v.Type(), append(path2, opType), seen); r != nil {
+			if r := f.find(v.Type(), append(path2, opType)); r != nil {
 				return r
 			}
 		}
@@ -506,28 +524,35 @@ func find(obj types.Object, T types.Type, path []byte, seen map[*types.TypeName]
 	case *types.Interface:
 		for i := 0; i < T.NumMethods(); i++ {
 			m := T.Method(i)
+			if f.seenMethods[m] {
+				return nil
+			}
 			path2 := appendOpArg(path, opMethod, i)
-			if m == obj {
+			if m == f.obj {
 				return path2 // found interface method
 			}
-			if r := find(obj, m.Type(), append(path2, opType), seen); r != nil {
+			if f.seenMethods == nil {
+				f.seenMethods = make(map[*types.Func]bool)
+			}
+			f.seenMethods[m] = true
+			if r := f.find(m.Type(), append(path2, opType)); r != nil {
 				return r
 			}
 		}
 		return nil
 	case *types.TypeParam:
 		name := T.Obj()
-		if name == obj {
-			return append(path, opObj)
-		}
-		if seen[name] {
+		if f.seenTParamNames[name] {
 			return nil
 		}
-		if seen == nil {
-			seen = make(map[*types.TypeName]bool)
+		if name == f.obj {
+			return append(path, opObj)
 		}
-		seen[name] = true
-		if r := find(obj, T.Constraint(), append(path, opConstraint), seen); r != nil {
+		if f.seenTParamNames == nil {
+			f.seenTParamNames = make(map[*types.TypeName]bool)
+		}
+		f.seenTParamNames[name] = true
+		if r := f.find(T.Constraint(), append(path, opConstraint)); r != nil {
 			return r
 		}
 		return nil
@@ -535,11 +560,15 @@ func find(obj types.Object, T types.Type, path []byte, seen map[*types.TypeName]
 	panic(T)
 }
 
-func findTypeParam(obj types.Object, list *types.TypeParamList, path []byte, op byte, seen map[*types.TypeName]bool) []byte {
+func findTypeParam(obj types.Object, list *types.TypeParamList, path []byte, op byte) []byte {
+	return (&finder{obj: obj}).findTypeParam(list, path, op)
+}
+
+func (f *finder) findTypeParam(list *types.TypeParamList, path []byte, op byte) []byte {
 	for i := 0; i < list.Len(); i++ {
 		tparam := list.At(i)
 		path2 := appendOpArg(path, op, i)
-		if r := find(obj, tparam, path2, seen); r != nil {
+		if r := f.find(tparam, path2); r != nil {
 			return r
 		}
 	}
@@ -626,7 +655,7 @@ func Object(pkg *types.Package, p Path) (types.Object, error) {
 
 		// Inv: t != nil, obj == nil
 
-		t = aliases.Unalias(t)
+		t = types.Unalias(t)
 		switch code {
 		case opElem:
 			hasElem, ok := t.(hasElem) // Pointer, Slice, Array, Chan, Map
@@ -664,7 +693,7 @@ func Object(pkg *types.Package, p Path) (types.Object, error) {
 			t = named.Underlying()
 
 		case opRhs:
-			if alias, ok := t.(*aliases.Alias); ok {
+			if alias, ok := t.(*types.Alias); ok {
 				t = aliases.Rhs(alias)
 			} else if false && aliases.Enabled() {
 				// The Enabled check is too expensive, so for now we
diff --git a/test/integration/vendor/golang.org/x/tools/go/types/typeutil/callee.go b/test/integration/vendor/golang.org/x/tools/go/types/typeutil/callee.go
index 90dc541adf..754380351e 100644
--- a/test/integration/vendor/golang.org/x/tools/go/types/typeutil/callee.go
+++ b/test/integration/vendor/golang.org/x/tools/go/types/typeutil/callee.go
@@ -8,7 +8,6 @@ import (
 	"go/ast"
 	"go/types"
 
-	"golang.org/x/tools/go/ast/astutil"
 	"golang.org/x/tools/internal/typeparams"
 )
 
@@ -17,7 +16,7 @@ import (
 //
 // Functions and methods may potentially have type parameters.
 func Callee(info *types.Info, call *ast.CallExpr) types.Object {
-	fun := astutil.Unparen(call.Fun)
+	fun := ast.Unparen(call.Fun)
 
 	// Look through type instantiation if necessary.
 	isInstance := false
diff --git a/test/integration/vendor/golang.org/x/tools/go/types/typeutil/map.go b/test/integration/vendor/golang.org/x/tools/go/types/typeutil/map.go
index a92f80dd2d..93b3090c68 100644
--- a/test/integration/vendor/golang.org/x/tools/go/types/typeutil/map.go
+++ b/test/integration/vendor/golang.org/x/tools/go/types/typeutil/map.go
@@ -2,31 +2,35 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// Package typeutil defines various utilities for types, such as Map,
-// a mapping from types.Type to any values.
-package typeutil // import "golang.org/x/tools/go/types/typeutil"
+// Package typeutil defines various utilities for types, such as [Map],
+// a hash table that maps [types.Type] to any value.
+package typeutil
 
 import (
 	"bytes"
 	"fmt"
 	"go/types"
-	"reflect"
+	"hash/maphash"
+	"unsafe"
 
-	"golang.org/x/tools/internal/aliases"
 	"golang.org/x/tools/internal/typeparams"
 )
 
 // Map is a hash-table-based mapping from types (types.Type) to
-// arbitrary any values.  The concrete types that implement
+// arbitrary values.  The concrete types that implement
 // the Type interface are pointers.  Since they are not canonicalized,
 // == cannot be used to check for equivalence, and thus we cannot
 // simply use a Go map.
 //
 // Just as with map[K]V, a nil *Map is a valid empty map.
 //
-// Not thread-safe.
+// Read-only map operations ([Map.At], [Map.Len], and so on) may
+// safely be called concurrently.
+//
+// TODO(adonovan): deprecate in favor of https://go.dev/issues/69420
+// and 69559, if the latter proposals for a generic hash-map type and
+// a types.Hash function are accepted.
 type Map struct {
-	hasher Hasher             // shared by many Maps
 	table  map[uint32][]entry // maps hash to bucket; entry.key==nil means unused
 	length int                // number of map entries
 }
@@ -37,35 +41,17 @@ type entry struct {
 	value any
 }
 
-// SetHasher sets the hasher used by Map.
-//
-// All Hashers are functionally equivalent but contain internal state
-// used to cache the results of hashing previously seen types.
-//
-// A single Hasher created by MakeHasher() may be shared among many
-// Maps.  This is recommended if the instances have many keys in
-// common, as it will amortize the cost of hash computation.
-//
-// A Hasher may grow without bound as new types are seen.  Even when a
-// type is deleted from the map, the Hasher never shrinks, since other
-// types in the map may reference the deleted type indirectly.
+// SetHasher has no effect.
 //
-// Hashers are not thread-safe, and read-only operations such as
-// Map.Lookup require updates to the hasher, so a full Mutex lock (not a
-// read-lock) is require around all Map operations if a shared
-// hasher is accessed from multiple threads.
-//
-// If SetHasher is not called, the Map will create a private hasher at
-// the first call to Insert.
-func (m *Map) SetHasher(hasher Hasher) {
-	m.hasher = hasher
-}
+// It is a relic of an optimization that is no longer profitable. Do
+// not use [Hasher], [MakeHasher], or [SetHasher] in new code.
+func (m *Map) SetHasher(Hasher) {}
 
 // Delete removes the entry with the given key, if any.
 // It returns true if the entry was found.
 func (m *Map) Delete(key types.Type) bool {
 	if m != nil && m.table != nil {
-		hash := m.hasher.Hash(key)
+		hash := hash(key)
 		bucket := m.table[hash]
 		for i, e := range bucket {
 			if e.key != nil && types.Identical(key, e.key) {
@@ -84,7 +70,7 @@ func (m *Map) Delete(key types.Type) bool {
 // The result is nil if the entry is not present.
 func (m *Map) At(key types.Type) any {
 	if m != nil && m.table != nil {
-		for _, e := range m.table[m.hasher.Hash(key)] {
+		for _, e := range m.table[hash(key)] {
 			if e.key != nil && types.Identical(key, e.key) {
 				return e.value
 			}
@@ -97,7 +83,7 @@ func (m *Map) At(key types.Type) any {
 // and returns the previous entry, if any.
 func (m *Map) Set(key types.Type, value any) (prev any) {
 	if m.table != nil {
-		hash := m.hasher.Hash(key)
+		hash := hash(key)
 		bucket := m.table[hash]
 		var hole *entry
 		for i, e := range bucket {
@@ -116,10 +102,7 @@ func (m *Map) Set(key types.Type, value any) (prev any) {
 			m.table[hash] = append(bucket, entry{key, value})
 		}
 	} else {
-		if m.hasher.memo == nil {
-			m.hasher = MakeHasher()
-		}
-		hash := m.hasher.Hash(key)
+		hash := hash(key)
 		m.table = map[uint32][]entry{hash: {entry{key, value}}}
 	}
 
@@ -196,53 +179,35 @@ func (m *Map) KeysString() string {
 	return m.toString(false)
 }
 
-////////////////////////////////////////////////////////////////////////
-// Hasher
-
-// A Hasher maps each type to its hash value.
-// For efficiency, a hasher uses memoization; thus its memory
-// footprint grows monotonically over time.
-// Hashers are not thread-safe.
-// Hashers have reference semantics.
-// Call MakeHasher to create a Hasher.
-type Hasher struct {
-	memo map[types.Type]uint32
-
-	// ptrMap records pointer identity.
-	ptrMap map[any]uint32
-
-	// sigTParams holds type parameters from the signature being hashed.
-	// Signatures are considered identical modulo renaming of type parameters, so
-	// within the scope of a signature type the identity of the signature's type
-	// parameters is just their index.
-	//
-	// Since the language does not currently support referring to uninstantiated
-	// generic types or functions, and instantiated signatures do not have type
-	// parameter lists, we should never encounter a second non-empty type
-	// parameter list when hashing a generic signature.
-	sigTParams *types.TypeParamList
-}
+// -- Hasher --
 
-// MakeHasher returns a new Hasher instance.
-func MakeHasher() Hasher {
-	return Hasher{
-		memo:       make(map[types.Type]uint32),
-		ptrMap:     make(map[any]uint32),
-		sigTParams: nil,
-	}
+// hash returns the hash of type t.
+// TODO(adonovan): replace by types.Hash when Go proposal #69420 is accepted.
+func hash(t types.Type) uint32 {
+	return theHasher.Hash(t)
 }
 
+// A Hasher provides a [Hasher.Hash] method to map a type to its hash value.
+// Hashers are stateless, and all are equivalent.
+type Hasher struct{}
+
+var theHasher Hasher
+
+// MakeHasher returns Hasher{}.
+// Hashers are stateless; all are equivalent.
+func MakeHasher() Hasher { return theHasher }
+
 // Hash computes a hash value for the given type t such that
 // Identical(t, t') => Hash(t) == Hash(t').
 func (h Hasher) Hash(t types.Type) uint32 {
-	hash, ok := h.memo[t]
-	if !ok {
-		hash = h.hashFor(t)
-		h.memo[t] = hash
-	}
-	return hash
+	return hasher{inGenericSig: false}.hash(t)
 }
 
+// hasher holds the state of a single Hash traversal: whether we are
+// inside the signature of a generic function; this is used to
+// optimize [hasher.hashTypeParam].
+type hasher struct{ inGenericSig bool }
+
 // hashString computes the Fowler–Noll–Vo hash of s.
 func hashString(s string) uint32 {
 	var h uint32
@@ -253,21 +218,21 @@ func hashString(s string) uint32 {
 	return h
 }
 
-// hashFor computes the hash of t.
-func (h Hasher) hashFor(t types.Type) uint32 {
+// hash computes the hash of t.
+func (h hasher) hash(t types.Type) uint32 {
 	// See Identical for rationale.
 	switch t := t.(type) {
 	case *types.Basic:
 		return uint32(t.Kind())
 
-	case *aliases.Alias:
-		return h.Hash(aliases.Unalias(t))
+	case *types.Alias:
+		return h.hash(types.Unalias(t))
 
 	case *types.Array:
-		return 9043 + 2*uint32(t.Len()) + 3*h.Hash(t.Elem())
+		return 9043 + 2*uint32(t.Len()) + 3*h.hash(t.Elem())
 
 	case *types.Slice:
-		return 9049 + 2*h.Hash(t.Elem())
+		return 9049 + 2*h.hash(t.Elem())
 
 	case *types.Struct:
 		var hash uint32 = 9059
@@ -278,12 +243,12 @@ func (h Hasher) hashFor(t types.Type) uint32 {
 			}
 			hash += hashString(t.Tag(i))
 			hash += hashString(f.Name()) // (ignore f.Pkg)
-			hash += h.Hash(f.Type())
+			hash += h.hash(f.Type())
 		}
 		return hash
 
 	case *types.Pointer:
-		return 9067 + 2*h.Hash(t.Elem())
+		return 9067 + 2*h.hash(t.Elem())
 
 	case *types.Signature:
 		var hash uint32 = 9091
@@ -291,33 +256,11 @@ func (h Hasher) hashFor(t types.Type) uint32 {
 			hash *= 8863
 		}
 
-		// Use a separate hasher for types inside of the signature, where type
-		// parameter identity is modified to be (index, constraint). We must use a
-		// new memo for this hasher as type identity may be affected by this
-		// masking. For example, in func[T any](*T), the identity of *T depends on
-		// whether we are mapping the argument in isolation, or recursively as part
-		// of hashing the signature.
-		//
-		// We should never encounter a generic signature while hashing another
-		// generic signature, but defensively set sigTParams only if h.mask is
-		// unset.
 		tparams := t.TypeParams()
-		if h.sigTParams == nil && tparams.Len() != 0 {
-			h = Hasher{
-				// There may be something more efficient than discarding the existing
-				// memo, but it would require detecting whether types are 'tainted' by
-				// references to type parameters.
-				memo: make(map[types.Type]uint32),
-				// Re-using ptrMap ensures that pointer identity is preserved in this
-				// hasher.
-				ptrMap:     h.ptrMap,
-				sigTParams: tparams,
-			}
-		}
-
-		for i := 0; i < tparams.Len(); i++ {
+		for i := range tparams.Len() {
+			h.inGenericSig = true
 			tparam := tparams.At(i)
-			hash += 7 * h.Hash(tparam.Constraint())
+			hash += 7 * h.hash(tparam.Constraint())
 		}
 
 		return hash + 3*h.hashTuple(t.Params()) + 5*h.hashTuple(t.Results())
@@ -351,17 +294,17 @@ func (h Hasher) hashFor(t types.Type) uint32 {
 		return hash
 
 	case *types.Map:
-		return 9109 + 2*h.Hash(t.Key()) + 3*h.Hash(t.Elem())
+		return 9109 + 2*h.hash(t.Key()) + 3*h.hash(t.Elem())
 
 	case *types.Chan:
-		return 9127 + 2*uint32(t.Dir()) + 3*h.Hash(t.Elem())
+		return 9127 + 2*uint32(t.Dir()) + 3*h.hash(t.Elem())
 
 	case *types.Named:
-		hash := h.hashPtr(t.Obj())
+		hash := h.hashTypeName(t.Obj())
 		targs := t.TypeArgs()
 		for i := 0; i < targs.Len(); i++ {
 			targ := targs.At(i)
-			hash += 2 * h.Hash(targ)
+			hash += 2 * h.hash(targ)
 		}
 		return hash
 
@@ -375,17 +318,17 @@ func (h Hasher) hashFor(t types.Type) uint32 {
 	panic(fmt.Sprintf("%T: %v", t, t))
 }
 
-func (h Hasher) hashTuple(tuple *types.Tuple) uint32 {
+func (h hasher) hashTuple(tuple *types.Tuple) uint32 {
 	// See go/types.identicalTypes for rationale.
 	n := tuple.Len()
 	hash := 9137 + 2*uint32(n)
-	for i := 0; i < n; i++ {
-		hash += 3 * h.Hash(tuple.At(i).Type())
+	for i := range n {
+		hash += 3 * h.hash(tuple.At(i).Type())
 	}
 	return hash
 }
 
-func (h Hasher) hashUnion(t *types.Union) uint32 {
+func (h hasher) hashUnion(t *types.Union) uint32 {
 	// Hash type restrictions.
 	terms, err := typeparams.UnionTermSet(t)
 	// if err != nil t has invalid type restrictions. Fall back on a non-zero
@@ -396,11 +339,11 @@ func (h Hasher) hashUnion(t *types.Union) uint32 {
 	return h.hashTermSet(terms)
 }
 
-func (h Hasher) hashTermSet(terms []*types.Term) uint32 {
+func (h hasher) hashTermSet(terms []*types.Term) uint32 {
 	hash := 9157 + 2*uint32(len(terms))
 	for _, term := range terms {
 		// term order is not significant.
-		termHash := h.Hash(term.Type())
+		termHash := h.hash(term.Type())
 		if term.Tilde() {
 			termHash *= 9161
 		}
@@ -409,36 +352,42 @@ func (h Hasher) hashTermSet(terms []*types.Term) uint32 {
 	return hash
 }
 
-// hashTypeParam returns a hash of the type parameter t, with a hash value
-// depending on whether t is contained in h.sigTParams.
-//
-// If h.sigTParams is set and contains t, then we are in the process of hashing
-// a signature, and the hash value of t must depend only on t's index and
-// constraint: signatures are considered identical modulo type parameter
-// renaming. To avoid infinite recursion, we only hash the type parameter
-// index, and rely on types.Identical to handle signatures where constraints
-// are not identical.
-//
-// Otherwise the hash of t depends only on t's pointer identity.
-func (h Hasher) hashTypeParam(t *types.TypeParam) uint32 {
-	if h.sigTParams != nil {
-		i := t.Index()
-		if i >= 0 && i < h.sigTParams.Len() && t == h.sigTParams.At(i) {
-			return 9173 + 3*uint32(i)
-		}
+// hashTypeParam returns the hash of a type parameter.
+func (h hasher) hashTypeParam(t *types.TypeParam) uint32 {
+	// Within the signature of a generic function, TypeParams are
+	// identical if they have the same index and constraint, so we
+	// hash them based on index.
+	//
+	// When we are outside a generic function, free TypeParams are
+	// identical iff they are the same object, so we can use a
+	// more discriminating hash consistent with object identity.
+	// This optimization saves [Map] about 4% when hashing all the
+	// types.Info.Types in the forward closure of net/http.
+	if !h.inGenericSig {
+		// Optimization: outside a generic function signature,
+		// use a more discrimating hash consistent with object identity.
+		return h.hashTypeName(t.Obj())
 	}
-	return h.hashPtr(t.Obj())
+	return 9173 + 3*uint32(t.Index())
 }
 
-// hashPtr hashes the pointer identity of ptr. It uses h.ptrMap to ensure that
-// pointers values are not dependent on the GC.
-func (h Hasher) hashPtr(ptr any) uint32 {
-	if hash, ok := h.ptrMap[ptr]; ok {
-		return hash
-	}
-	hash := uint32(reflect.ValueOf(ptr).Pointer())
-	h.ptrMap[ptr] = hash
-	return hash
+var theSeed = maphash.MakeSeed()
+
+// hashTypeName hashes the pointer of tname.
+func (hasher) hashTypeName(tname *types.TypeName) uint32 {
+	// Since types.Identical uses == to compare TypeNames,
+	// the Hash function uses maphash.Comparable.
+	// TODO(adonovan): or will, when it becomes available in go1.24.
+	// In the meantime we use the pointer's numeric value.
+	//
+	//   hash := maphash.Comparable(theSeed, tname)
+	//
+	// (Another approach would be to hash the name and package
+	// path, and whether or not it is a package-level typename. It
+	// is rare for a package to define multiple local types with
+	// the same name.)
+	hash := uintptr(unsafe.Pointer(tname))
+	return uint32(hash ^ (hash >> 32))
 }
 
 // shallowHash computes a hash of t without looking at any of its
@@ -455,14 +404,14 @@ func (h Hasher) hashPtr(ptr any) uint32 {
 // include m itself; there is no mention of the named type X that
 // might help us break the cycle.
 // (See comment in go/types.identical, case *Interface, for more.)
-func (h Hasher) shallowHash(t types.Type) uint32 {
+func (h hasher) shallowHash(t types.Type) uint32 {
 	// t is the type of an interface method (Signature),
 	// its params or results (Tuples), or their immediate
 	// elements (mostly Slice, Pointer, Basic, Named),
 	// so there's no need to optimize anything else.
 	switch t := t.(type) {
-	case *aliases.Alias:
-		return h.shallowHash(aliases.Unalias(t))
+	case *types.Alias:
+		return h.shallowHash(types.Unalias(t))
 
 	case *types.Signature:
 		var hash uint32 = 604171
@@ -476,7 +425,7 @@ func (h Hasher) shallowHash(t types.Type) uint32 {
 	case *types.Tuple:
 		n := t.Len()
 		hash := 9137 + 2*uint32(n)
-		for i := 0; i < n; i++ {
+		for i := range n {
 			hash += 53471161 * h.shallowHash(t.At(i).Type())
 		}
 		return hash
@@ -509,10 +458,10 @@ func (h Hasher) shallowHash(t types.Type) uint32 {
 		return 9127
 
 	case *types.Named:
-		return h.hashPtr(t.Obj())
+		return h.hashTypeName(t.Obj())
 
 	case *types.TypeParam:
-		return h.hashPtr(t.Obj())
+		return h.hashTypeParam(t)
 	}
 	panic(fmt.Sprintf("shallowHash: %T: %v", t, t))
 }
diff --git a/test/integration/vendor/golang.org/x/tools/go/types/typeutil/methodsetcache.go b/test/integration/vendor/golang.org/x/tools/go/types/typeutil/methodsetcache.go
index bd71aafaaa..f7666028fe 100644
--- a/test/integration/vendor/golang.org/x/tools/go/types/typeutil/methodsetcache.go
+++ b/test/integration/vendor/golang.org/x/tools/go/types/typeutil/methodsetcache.go
@@ -9,8 +9,6 @@ package typeutil
 import (
 	"go/types"
 	"sync"
-
-	"golang.org/x/tools/internal/aliases"
 )
 
 // A MethodSetCache records the method set of each type T for which
@@ -34,12 +32,12 @@ func (cache *MethodSetCache) MethodSet(T types.Type) *types.MethodSet {
 	cache.mu.Lock()
 	defer cache.mu.Unlock()
 
-	switch T := aliases.Unalias(T).(type) {
+	switch T := types.Unalias(T).(type) {
 	case *types.Named:
 		return cache.lookupNamed(T).value
 
 	case *types.Pointer:
-		if N, ok := aliases.Unalias(T.Elem()).(*types.Named); ok {
+		if N, ok := types.Unalias(T.Elem()).(*types.Named); ok {
 			return cache.lookupNamed(N).pointer
 		}
 	}
diff --git a/test/integration/vendor/golang.org/x/tools/go/types/typeutil/ui.go b/test/integration/vendor/golang.org/x/tools/go/types/typeutil/ui.go
index a0c1a60ac0..9dda6a25df 100644
--- a/test/integration/vendor/golang.org/x/tools/go/types/typeutil/ui.go
+++ b/test/integration/vendor/golang.org/x/tools/go/types/typeutil/ui.go
@@ -8,8 +8,6 @@ package typeutil
 
 import (
 	"go/types"
-
-	"golang.org/x/tools/internal/aliases"
 )
 
 // IntuitiveMethodSet returns the intuitive method set of a type T,
@@ -28,7 +26,7 @@ import (
 // The order of the result is as for types.MethodSet(T).
 func IntuitiveMethodSet(T types.Type, msets *MethodSetCache) []*types.Selection {
 	isPointerToConcrete := func(T types.Type) bool {
-		ptr, ok := aliases.Unalias(T).(*types.Pointer)
+		ptr, ok := types.Unalias(T).(*types.Pointer)
 		return ok && !types.IsInterface(ptr.Elem())
 	}
 
diff --git a/test/integration/vendor/golang.org/x/tools/internal/aliases/aliases.go b/test/integration/vendor/golang.org/x/tools/internal/aliases/aliases.go
index f7798e3354..b9425f5a20 100644
--- a/test/integration/vendor/golang.org/x/tools/internal/aliases/aliases.go
+++ b/test/integration/vendor/golang.org/x/tools/internal/aliases/aliases.go
@@ -28,7 +28,7 @@ import (
 func NewAlias(enabled bool, pos token.Pos, pkg *types.Package, name string, rhs types.Type, tparams []*types.TypeParam) *types.TypeName {
 	if enabled {
 		tname := types.NewTypeName(pos, pkg, name, nil)
-		newAlias(tname, rhs, tparams)
+		SetTypeParams(types.NewAlias(tname, rhs), tparams)
 		return tname
 	}
 	if len(tparams) > 0 {
diff --git a/test/integration/vendor/golang.org/x/tools/internal/aliases/aliases_go121.go b/test/integration/vendor/golang.org/x/tools/internal/aliases/aliases_go121.go
deleted file mode 100644
index a775fcc4be..0000000000
--- a/test/integration/vendor/golang.org/x/tools/internal/aliases/aliases_go121.go
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2024 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 !go1.22
-// +build !go1.22
-
-package aliases
-
-import (
-	"go/types"
-)
-
-// Alias is a placeholder for a go/types.Alias for <=1.21.
-// It will never be created by go/types.
-type Alias struct{}
-
-func (*Alias) String() string                                { panic("unreachable") }
-func (*Alias) Underlying() types.Type                        { panic("unreachable") }
-func (*Alias) Obj() *types.TypeName                          { panic("unreachable") }
-func Rhs(alias *Alias) types.Type                            { panic("unreachable") }
-func TypeParams(alias *Alias) *types.TypeParamList           { panic("unreachable") }
-func SetTypeParams(alias *Alias, tparams []*types.TypeParam) { panic("unreachable") }
-func TypeArgs(alias *Alias) *types.TypeList                  { panic("unreachable") }
-func Origin(alias *Alias) *Alias                             { panic("unreachable") }
-
-// Unalias returns the type t for go <=1.21.
-func Unalias(t types.Type) types.Type { return t }
-
-func newAlias(name *types.TypeName, rhs types.Type, tparams []*types.TypeParam) *Alias {
-	panic("unreachable")
-}
-
-// Enabled reports whether [NewAlias] should create [types.Alias] types.
-//
-// Before go1.22, this function always returns false.
-func Enabled() bool { return false }
diff --git a/test/integration/vendor/golang.org/x/tools/internal/aliases/aliases_go122.go b/test/integration/vendor/golang.org/x/tools/internal/aliases/aliases_go122.go
index 31c159e42e..7716a3331d 100644
--- a/test/integration/vendor/golang.org/x/tools/internal/aliases/aliases_go122.go
+++ b/test/integration/vendor/golang.org/x/tools/internal/aliases/aliases_go122.go
@@ -2,9 +2,6 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build go1.22
-// +build go1.22
-
 package aliases
 
 import (
@@ -14,22 +11,19 @@ import (
 	"go/types"
 )
 
-// Alias is an alias of types.Alias.
-type Alias = types.Alias
-
 // Rhs returns the type on the right-hand side of the alias declaration.
-func Rhs(alias *Alias) types.Type {
+func Rhs(alias *types.Alias) types.Type {
 	if alias, ok := any(alias).(interface{ Rhs() types.Type }); ok {
 		return alias.Rhs() // go1.23+
 	}
 
 	// go1.22's Alias didn't have the Rhs method,
 	// so Unalias is the best we can do.
-	return Unalias(alias)
+	return types.Unalias(alias)
 }
 
 // TypeParams returns the type parameter list of the alias.
-func TypeParams(alias *Alias) *types.TypeParamList {
+func TypeParams(alias *types.Alias) *types.TypeParamList {
 	if alias, ok := any(alias).(interface{ TypeParams() *types.TypeParamList }); ok {
 		return alias.TypeParams() // go1.23+
 	}
@@ -37,7 +31,7 @@ func TypeParams(alias *Alias) *types.TypeParamList {
 }
 
 // SetTypeParams sets the type parameters of the alias type.
-func SetTypeParams(alias *Alias, tparams []*types.TypeParam) {
+func SetTypeParams(alias *types.Alias, tparams []*types.TypeParam) {
 	if alias, ok := any(alias).(interface {
 		SetTypeParams(tparams []*types.TypeParam)
 	}); ok {
@@ -48,7 +42,7 @@ func SetTypeParams(alias *Alias, tparams []*types.TypeParam) {
 }
 
 // TypeArgs returns the type arguments used to instantiate the Alias type.
-func TypeArgs(alias *Alias) *types.TypeList {
+func TypeArgs(alias *types.Alias) *types.TypeList {
 	if alias, ok := any(alias).(interface{ TypeArgs() *types.TypeList }); ok {
 		return alias.TypeArgs() // go1.23+
 	}
@@ -57,25 +51,13 @@ func TypeArgs(alias *Alias) *types.TypeList {
 
 // Origin returns the generic Alias type of which alias is an instance.
 // If alias is not an instance of a generic alias, Origin returns alias.
-func Origin(alias *Alias) *Alias {
+func Origin(alias *types.Alias) *types.Alias {
 	if alias, ok := any(alias).(interface{ Origin() *types.Alias }); ok {
 		return alias.Origin() // go1.23+
 	}
 	return alias // not an instance of a generic alias (go1.22)
 }
 
-// Unalias is a wrapper of types.Unalias.
-func Unalias(t types.Type) types.Type { return types.Unalias(t) }
-
-// newAlias is an internal alias around types.NewAlias.
-// Direct usage is discouraged as the moment.
-// Try to use NewAlias instead.
-func newAlias(tname *types.TypeName, rhs types.Type, tparams []*types.TypeParam) *Alias {
-	a := types.NewAlias(tname, rhs)
-	SetTypeParams(a, tparams)
-	return a
-}
-
 // Enabled reports whether [NewAlias] should create [types.Alias] types.
 //
 // This function is expensive! Call it sparingly.
@@ -91,7 +73,7 @@ func Enabled() bool {
 	//     many tests. Therefore any attempt to cache the result
 	//     is just incorrect.
 	fset := token.NewFileSet()
-	f, _ := parser.ParseFile(fset, "a.go", "package p; type A = int", 0)
+	f, _ := parser.ParseFile(fset, "a.go", "package p; type A = int", parser.SkipObjectResolution)
 	pkg, _ := new(types.Config).Check("p", fset, []*ast.File{f}, nil)
 	_, enabled := pkg.Scope().Lookup("A").Type().(*types.Alias)
 	return enabled
diff --git a/test/integration/vendor/golang.org/x/tools/internal/gcimporter/bimport.go b/test/integration/vendor/golang.org/x/tools/internal/gcimporter/bimport.go
index d98b0db2a9..d79a605ed1 100644
--- a/test/integration/vendor/golang.org/x/tools/internal/gcimporter/bimport.go
+++ b/test/integration/vendor/golang.org/x/tools/internal/gcimporter/bimport.go
@@ -87,64 +87,3 @@ func chanDir(d int) types.ChanDir {
 		return 0
 	}
 }
-
-var predeclOnce sync.Once
-var predecl []types.Type // initialized lazily
-
-func predeclared() []types.Type {
-	predeclOnce.Do(func() {
-		// initialize lazily to be sure that all
-		// elements have been initialized before
-		predecl = []types.Type{ // basic types
-			types.Typ[types.Bool],
-			types.Typ[types.Int],
-			types.Typ[types.Int8],
-			types.Typ[types.Int16],
-			types.Typ[types.Int32],
-			types.Typ[types.Int64],
-			types.Typ[types.Uint],
-			types.Typ[types.Uint8],
-			types.Typ[types.Uint16],
-			types.Typ[types.Uint32],
-			types.Typ[types.Uint64],
-			types.Typ[types.Uintptr],
-			types.Typ[types.Float32],
-			types.Typ[types.Float64],
-			types.Typ[types.Complex64],
-			types.Typ[types.Complex128],
-			types.Typ[types.String],
-
-			// basic type aliases
-			types.Universe.Lookup("byte").Type(),
-			types.Universe.Lookup("rune").Type(),
-
-			// error
-			types.Universe.Lookup("error").Type(),
-
-			// untyped types
-			types.Typ[types.UntypedBool],
-			types.Typ[types.UntypedInt],
-			types.Typ[types.UntypedRune],
-			types.Typ[types.UntypedFloat],
-			types.Typ[types.UntypedComplex],
-			types.Typ[types.UntypedString],
-			types.Typ[types.UntypedNil],
-
-			// package unsafe
-			types.Typ[types.UnsafePointer],
-
-			// invalid type
-			types.Typ[types.Invalid], // only appears in packages with errors
-
-			// used internally by gc; never used by this package or in .a files
-			anyType{},
-		}
-		predecl = append(predecl, additionalPredeclared()...)
-	})
-	return predecl
-}
-
-type anyType struct{}
-
-func (t anyType) Underlying() types.Type { return t }
-func (t anyType) String() string         { return "any" }
diff --git a/test/integration/vendor/golang.org/x/tools/internal/gcimporter/exportdata.go b/test/integration/vendor/golang.org/x/tools/internal/gcimporter/exportdata.go
index f6437feb1c..5662a311da 100644
--- a/test/integration/vendor/golang.org/x/tools/internal/gcimporter/exportdata.go
+++ b/test/integration/vendor/golang.org/x/tools/internal/gcimporter/exportdata.go
@@ -2,49 +2,183 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// This file is a copy of $GOROOT/src/go/internal/gcimporter/exportdata.go.
-
-// This file implements FindExportData.
+// This file should be kept in sync with $GOROOT/src/internal/exportdata/exportdata.go.
+// This file also additionally implements FindExportData for gcexportdata.NewReader.
 
 package gcimporter
 
 import (
 	"bufio"
+	"bytes"
+	"errors"
 	"fmt"
+	"go/build"
 	"io"
-	"strconv"
+	"os"
+	"os/exec"
+	"path/filepath"
 	"strings"
+	"sync"
 )
 
-func readGopackHeader(r *bufio.Reader) (name string, size int64, err error) {
-	// See $GOROOT/include/ar.h.
-	hdr := make([]byte, 16+12+6+6+8+10+2)
-	_, err = io.ReadFull(r, hdr)
+// FindExportData positions the reader r at the beginning of the
+// export data section of an underlying cmd/compile created archive
+// file by reading from it. The reader must be positioned at the
+// start of the file before calling this function.
+// This returns the length of the export data in bytes.
+//
+// This function is needed by [gcexportdata.Read], which must
+// accept inputs produced by the last two releases of cmd/compile,
+// plus tip.
+func FindExportData(r *bufio.Reader) (size int64, err error) {
+	arsize, err := FindPackageDefinition(r)
+	if err != nil {
+		return
+	}
+	size = int64(arsize)
+
+	objapi, headers, err := ReadObjectHeaders(r)
 	if err != nil {
 		return
 	}
-	// leave for debugging
-	if false {
-		fmt.Printf("header: %s", hdr)
+	size -= int64(len(objapi))
+	for _, h := range headers {
+		size -= int64(len(h))
+	}
+
+	// Check for the binary export data section header "$$B\n".
+	// TODO(taking): Unify with ReadExportDataHeader so that it stops at the 'u' instead of reading
+	line, err := r.ReadSlice('\n')
+	if err != nil {
+		return
+	}
+	hdr := string(line)
+	if hdr != "$$B\n" {
+		err = fmt.Errorf("unknown export data header: %q", hdr)
+		return
 	}
-	s := strings.TrimSpace(string(hdr[16+12+6+6+8:][:10]))
-	length, err := strconv.Atoi(s)
-	size = int64(length)
-	if err != nil || hdr[len(hdr)-2] != '`' || hdr[len(hdr)-1] != '\n' {
-		err = fmt.Errorf("invalid archive header")
+	size -= int64(len(hdr))
+
+	// For files with a binary export data header "$$B\n",
+	// these are always terminated by an end-of-section marker "\n$$\n".
+	// So the last bytes must always be this constant.
+	//
+	// The end-of-section marker is not a part of the export data itself.
+	// Do not include these in size.
+	//
+	// It would be nice to have sanity check that the final bytes after
+	// the export data are indeed the end-of-section marker. The split
+	// of gcexportdata.NewReader and gcexportdata.Read make checking this
+	// ugly so gcimporter gives up enforcing this. The compiler and go/types
+	// importer do enforce this, which seems good enough.
+	const endofsection = "\n$$\n"
+	size -= int64(len(endofsection))
+
+	if size < 0 {
+		err = fmt.Errorf("invalid size (%d) in the archive file: %d bytes remain without section headers (recompile package)", arsize, size)
 		return
 	}
-	name = strings.TrimSpace(string(hdr[:16]))
+
 	return
 }
 
-// FindExportData positions the reader r at the beginning of the
-// export data section of an underlying GC-created object/archive
-// file by reading from it. The reader must be positioned at the
-// start of the file before calling this function. The hdr result
-// is the string before the export data, either "$$" or "$$B".
-// The size result is the length of the export data in bytes, or -1 if not known.
-func FindExportData(r *bufio.Reader) (hdr string, size int64, err error) {
+// ReadUnified reads the contents of the unified export data from a reader r
+// that contains the contents of a GC-created archive file.
+//
+// On success, the reader will be positioned after the end-of-section marker "\n$$\n".
+//
+// Supported GC-created archive files have 4 layers of nesting:
+//   - An archive file containing a package definition file.
+//   - The package definition file contains headers followed by a data section.
+//     Headers are lines (≤ 4kb) that do not start with "$$".
+//   - The data section starts with "$$B\n" followed by export data followed
+//     by an end of section marker "\n$$\n". (The section start "$$\n" is no
+//     longer supported.)
+//   - The export data starts with a format byte ('u') followed by the  in
+//     the given format. (See ReadExportDataHeader for older formats.)
+//
+// Putting this together, the bytes in a GC-created archive files are expected
+// to look like the following.
+// See cmd/internal/archive for more details on ar file headers.
+//
+// | \n             | ar file signature
+// | __.PKGDEF...size...\n | ar header for __.PKGDEF including size.
+// | go object <...>\n     | objabi header
+// | \n  | other headers such as build id
+// | $$B\n                 | binary format marker
+// | u\n             | unified export 
+// | $$\n                  | end-of-section marker
+// | [optional padding]    | padding byte (0x0A) if size is odd
+// | [ar file header]      | other ar files
+// | [ar file data]        |
+func ReadUnified(r *bufio.Reader) (data []byte, err error) {
+	// We historically guaranteed headers at the default buffer size (4096) work.
+	// This ensures we can use ReadSlice throughout.
+	const minBufferSize = 4096
+	r = bufio.NewReaderSize(r, minBufferSize)
+
+	size, err := FindPackageDefinition(r)
+	if err != nil {
+		return
+	}
+	n := size
+
+	objapi, headers, err := ReadObjectHeaders(r)
+	if err != nil {
+		return
+	}
+	n -= len(objapi)
+	for _, h := range headers {
+		n -= len(h)
+	}
+
+	hdrlen, err := ReadExportDataHeader(r)
+	if err != nil {
+		return
+	}
+	n -= hdrlen
+
+	// size also includes the end of section marker. Remove that many bytes from the end.
+	const marker = "\n$$\n"
+	n -= len(marker)
+
+	if n < 0 {
+		err = fmt.Errorf("invalid size (%d) in the archive file: %d bytes remain without section headers (recompile package)", size, n)
+		return
+	}
+
+	// Read n bytes from buf.
+	data = make([]byte, n)
+	_, err = io.ReadFull(r, data)
+	if err != nil {
+		return
+	}
+
+	// Check for marker at the end.
+	var suffix [len(marker)]byte
+	_, err = io.ReadFull(r, suffix[:])
+	if err != nil {
+		return
+	}
+	if s := string(suffix[:]); s != marker {
+		err = fmt.Errorf("read %q instead of end-of-section marker (%q)", s, marker)
+		return
+	}
+
+	return
+}
+
+// FindPackageDefinition positions the reader r at the beginning of a package
+// definition file ("__.PKGDEF") within a GC-created archive by reading
+// from it, and returns the size of the package definition file in the archive.
+//
+// The reader must be positioned at the start of the archive file before calling
+// this function, and "__.PKGDEF" is assumed to be the first file in the archive.
+//
+// See cmd/internal/archive for details on the archive format.
+func FindPackageDefinition(r *bufio.Reader) (size int, err error) {
+	// Uses ReadSlice to limit risk of malformed inputs.
+
 	// Read first line to make sure this is an object file.
 	line, err := r.ReadSlice('\n')
 	if err != nil {
@@ -52,48 +186,236 @@ func FindExportData(r *bufio.Reader) (hdr string, size int64, err error) {
 		return
 	}
 
-	if string(line) == "!\n" {
-		// Archive file. Scan to __.PKGDEF.
-		var name string
-		if name, size, err = readGopackHeader(r); err != nil {
-			return
-		}
+	// Is the first line an archive file signature?
+	if string(line) != "!\n" {
+		err = fmt.Errorf("not the start of an archive file (%q)", line)
+		return
+	}
+
+	// package export block should be first
+	size = readArchiveHeader(r, "__.PKGDEF")
+	if size <= 0 {
+		err = fmt.Errorf("not a package file")
+		return
+	}
+
+	return
+}
 
-		// First entry should be __.PKGDEF.
-		if name != "__.PKGDEF" {
-			err = fmt.Errorf("go archive is missing __.PKGDEF")
+// ReadObjectHeaders reads object headers from the reader. Object headers are
+// lines that do not start with an end-of-section marker "$$". The first header
+// is the objabi header. On success, the reader will be positioned at the beginning
+// of the end-of-section marker.
+//
+// It returns an error if any header does not fit in r.Size() bytes.
+func ReadObjectHeaders(r *bufio.Reader) (objapi string, headers []string, err error) {
+	// line is a temporary buffer for headers.
+	// Use bounded reads (ReadSlice, Peek) to limit risk of malformed inputs.
+	var line []byte
+
+	// objapi header should be the first line
+	if line, err = r.ReadSlice('\n'); err != nil {
+		err = fmt.Errorf("can't find export data (%v)", err)
+		return
+	}
+	objapi = string(line)
+
+	// objapi header begins with "go object ".
+	if !strings.HasPrefix(objapi, "go object ") {
+		err = fmt.Errorf("not a go object file: %s", objapi)
+		return
+	}
+
+	// process remaining object header lines
+	for {
+		// check for an end of section marker "$$"
+		line, err = r.Peek(2)
+		if err != nil {
 			return
 		}
+		if string(line) == "$$" {
+			return // stop
+		}
 
-		// Read first line of __.PKGDEF data, so that line
-		// is once again the first line of the input.
-		if line, err = r.ReadSlice('\n'); err != nil {
-			err = fmt.Errorf("can't find export data (%v)", err)
+		// read next header
+		line, err = r.ReadSlice('\n')
+		if err != nil {
 			return
 		}
-		size -= int64(len(line))
+		headers = append(headers, string(line))
 	}
+}
 
-	// Now at __.PKGDEF in archive or still at beginning of file.
-	// Either way, line should begin with "go object ".
-	if !strings.HasPrefix(string(line), "go object ") {
-		err = fmt.Errorf("not a Go object file")
+// ReadExportDataHeader reads the export data header and format from r.
+// It returns the number of bytes read, or an error if the format is no longer
+// supported or it failed to read.
+//
+// The only currently supported format is binary export data in the
+// unified export format.
+func ReadExportDataHeader(r *bufio.Reader) (n int, err error) {
+	// Read export data header.
+	line, err := r.ReadSlice('\n')
+	if err != nil {
 		return
 	}
 
-	// Skip over object header to export data.
-	// Begins after first line starting with $$.
-	for line[0] != '$' {
-		if line, err = r.ReadSlice('\n'); err != nil {
-			err = fmt.Errorf("can't find export data (%v)", err)
+	hdr := string(line)
+	switch hdr {
+	case "$$\n":
+		err = fmt.Errorf("old textual export format no longer supported (recompile package)")
+		return
+
+	case "$$B\n":
+		var format byte
+		format, err = r.ReadByte()
+		if err != nil {
 			return
 		}
-		size -= int64(len(line))
-	}
-	hdr = string(line)
-	if size < 0 {
-		size = -1
+		// The unified export format starts with a 'u'.
+		switch format {
+		case 'u':
+		default:
+			// Older no longer supported export formats include:
+			// indexed export format which started with an 'i'; and
+			// the older binary export format which started with a 'c',
+			// 'd', or 'v' (from "version").
+			err = fmt.Errorf("binary export format %q is no longer supported (recompile package)", format)
+			return
+		}
+
+	default:
+		err = fmt.Errorf("unknown export data header: %q", hdr)
+		return
 	}
 
+	n = len(hdr) + 1 // + 1 is for 'u'
 	return
 }
+
+// FindPkg returns the filename and unique package id for an import
+// path based on package information provided by build.Import (using
+// the build.Default build.Context). A relative srcDir is interpreted
+// relative to the current working directory.
+//
+// FindPkg is only used in tests within x/tools.
+func FindPkg(path, srcDir string) (filename, id string, err error) {
+	// TODO(taking): Move internal/exportdata.FindPkg into its own file,
+	// and then this copy into a _test package.
+	if path == "" {
+		return "", "", errors.New("path is empty")
+	}
+
+	var noext string
+	switch {
+	default:
+		// "x" -> "$GOPATH/pkg/$GOOS_$GOARCH/x.ext", "x"
+		// Don't require the source files to be present.
+		if abs, err := filepath.Abs(srcDir); err == nil { // see issue 14282
+			srcDir = abs
+		}
+		var bp *build.Package
+		bp, err = build.Import(path, srcDir, build.FindOnly|build.AllowBinary)
+		if bp.PkgObj == "" {
+			if bp.Goroot && bp.Dir != "" {
+				filename, err = lookupGorootExport(bp.Dir)
+				if err == nil {
+					_, err = os.Stat(filename)
+				}
+				if err == nil {
+					return filename, bp.ImportPath, nil
+				}
+			}
+			goto notfound
+		} else {
+			noext = strings.TrimSuffix(bp.PkgObj, ".a")
+		}
+		id = bp.ImportPath
+
+	case build.IsLocalImport(path):
+		// "./x" -> "/this/directory/x.ext", "/this/directory/x"
+		noext = filepath.Join(srcDir, path)
+		id = noext
+
+	case filepath.IsAbs(path):
+		// for completeness only - go/build.Import
+		// does not support absolute imports
+		// "/x" -> "/x.ext", "/x"
+		noext = path
+		id = path
+	}
+
+	if false { // for debugging
+		if path != id {
+			fmt.Printf("%s -> %s\n", path, id)
+		}
+	}
+
+	// try extensions
+	for _, ext := range pkgExts {
+		filename = noext + ext
+		f, statErr := os.Stat(filename)
+		if statErr == nil && !f.IsDir() {
+			return filename, id, nil
+		}
+		if err == nil {
+			err = statErr
+		}
+	}
+
+notfound:
+	if err == nil {
+		return "", path, fmt.Errorf("can't find import: %q", path)
+	}
+	return "", path, fmt.Errorf("can't find import: %q: %w", path, err)
+}
+
+var pkgExts = [...]string{".a", ".o"} // a file from the build cache will have no extension
+
+var exportMap sync.Map // package dir → func() (string, error)
+
+// lookupGorootExport returns the location of the export data
+// (normally found in the build cache, but located in GOROOT/pkg
+// in prior Go releases) for the package located in pkgDir.
+//
+// (We use the package's directory instead of its import path
+// mainly to simplify handling of the packages in src/vendor
+// and cmd/vendor.)
+//
+// lookupGorootExport is only used in tests within x/tools.
+func lookupGorootExport(pkgDir string) (string, error) {
+	f, ok := exportMap.Load(pkgDir)
+	if !ok {
+		var (
+			listOnce   sync.Once
+			exportPath string
+			err        error
+		)
+		f, _ = exportMap.LoadOrStore(pkgDir, func() (string, error) {
+			listOnce.Do(func() {
+				cmd := exec.Command(filepath.Join(build.Default.GOROOT, "bin", "go"), "list", "-export", "-f", "{{.Export}}", pkgDir)
+				cmd.Dir = build.Default.GOROOT
+				cmd.Env = append(os.Environ(), "PWD="+cmd.Dir, "GOROOT="+build.Default.GOROOT)
+				var output []byte
+				output, err = cmd.Output()
+				if err != nil {
+					if ee, ok := err.(*exec.ExitError); ok && len(ee.Stderr) > 0 {
+						err = errors.New(string(ee.Stderr))
+					}
+					return
+				}
+
+				exports := strings.Split(string(bytes.TrimSpace(output)), "\n")
+				if len(exports) != 1 {
+					err = fmt.Errorf("go list reported %d exports; expected 1", len(exports))
+					return
+				}
+
+				exportPath = exports[0]
+			})
+
+			return exportPath, err
+		})
+	}
+
+	return f.(func() (string, error))()
+}
diff --git a/test/integration/vendor/golang.org/x/tools/internal/gcimporter/gcimporter.go b/test/integration/vendor/golang.org/x/tools/internal/gcimporter/gcimporter.go
index 39df91124a..3dbd21d1b9 100644
--- a/test/integration/vendor/golang.org/x/tools/internal/gcimporter/gcimporter.go
+++ b/test/integration/vendor/golang.org/x/tools/internal/gcimporter/gcimporter.go
@@ -23,17 +23,11 @@ package gcimporter // import "golang.org/x/tools/internal/gcimporter"
 
 import (
 	"bufio"
-	"bytes"
 	"fmt"
-	"go/build"
 	"go/token"
 	"go/types"
 	"io"
 	"os"
-	"os/exec"
-	"path/filepath"
-	"strings"
-	"sync"
 )
 
 const (
@@ -45,125 +39,14 @@ const (
 	trace = false
 )
 
-var exportMap sync.Map // package dir → func() (string, bool)
-
-// lookupGorootExport returns the location of the export data
-// (normally found in the build cache, but located in GOROOT/pkg
-// in prior Go releases) for the package located in pkgDir.
-//
-// (We use the package's directory instead of its import path
-// mainly to simplify handling of the packages in src/vendor
-// and cmd/vendor.)
-func lookupGorootExport(pkgDir string) (string, bool) {
-	f, ok := exportMap.Load(pkgDir)
-	if !ok {
-		var (
-			listOnce   sync.Once
-			exportPath string
-		)
-		f, _ = exportMap.LoadOrStore(pkgDir, func() (string, bool) {
-			listOnce.Do(func() {
-				cmd := exec.Command("go", "list", "-export", "-f", "{{.Export}}", pkgDir)
-				cmd.Dir = build.Default.GOROOT
-				var output []byte
-				output, err := cmd.Output()
-				if err != nil {
-					return
-				}
-
-				exports := strings.Split(string(bytes.TrimSpace(output)), "\n")
-				if len(exports) != 1 {
-					return
-				}
-
-				exportPath = exports[0]
-			})
-
-			return exportPath, exportPath != ""
-		})
-	}
-
-	return f.(func() (string, bool))()
-}
-
-var pkgExts = [...]string{".a", ".o"}
-
-// FindPkg returns the filename and unique package id for an import
-// path based on package information provided by build.Import (using
-// the build.Default build.Context). A relative srcDir is interpreted
-// relative to the current working directory.
-// If no file was found, an empty filename is returned.
-func FindPkg(path, srcDir string) (filename, id string) {
-	if path == "" {
-		return
-	}
-
-	var noext string
-	switch {
-	default:
-		// "x" -> "$GOPATH/pkg/$GOOS_$GOARCH/x.ext", "x"
-		// Don't require the source files to be present.
-		if abs, err := filepath.Abs(srcDir); err == nil { // see issue 14282
-			srcDir = abs
-		}
-		bp, _ := build.Import(path, srcDir, build.FindOnly|build.AllowBinary)
-		if bp.PkgObj == "" {
-			var ok bool
-			if bp.Goroot && bp.Dir != "" {
-				filename, ok = lookupGorootExport(bp.Dir)
-			}
-			if !ok {
-				id = path // make sure we have an id to print in error message
-				return
-			}
-		} else {
-			noext = strings.TrimSuffix(bp.PkgObj, ".a")
-			id = bp.ImportPath
-		}
-
-	case build.IsLocalImport(path):
-		// "./x" -> "/this/directory/x.ext", "/this/directory/x"
-		noext = filepath.Join(srcDir, path)
-		id = noext
-
-	case filepath.IsAbs(path):
-		// for completeness only - go/build.Import
-		// does not support absolute imports
-		// "/x" -> "/x.ext", "/x"
-		noext = path
-		id = path
-	}
-
-	if false { // for debugging
-		if path != id {
-			fmt.Printf("%s -> %s\n", path, id)
-		}
-	}
-
-	if filename != "" {
-		if f, err := os.Stat(filename); err == nil && !f.IsDir() {
-			return
-		}
-	}
-
-	// try extensions
-	for _, ext := range pkgExts {
-		filename = noext + ext
-		if f, err := os.Stat(filename); err == nil && !f.IsDir() {
-			return
-		}
-	}
-
-	filename = "" // not found
-	return
-}
-
 // Import imports a gc-generated package given its import path and srcDir, adds
 // the corresponding package object to the packages map, and returns the object.
 // The packages map must contain all packages already imported.
-func Import(packages map[string]*types.Package, path, srcDir string, lookup func(path string) (io.ReadCloser, error)) (pkg *types.Package, err error) {
+//
+// Import is only used in tests.
+func Import(fset *token.FileSet, packages map[string]*types.Package, path, srcDir string, lookup func(path string) (io.ReadCloser, error)) (pkg *types.Package, err error) {
 	var rc io.ReadCloser
-	var filename, id string
+	var id string
 	if lookup != nil {
 		// With custom lookup specified, assume that caller has
 		// converted path to a canonical import path for use in the map.
@@ -182,12 +65,13 @@ func Import(packages map[string]*types.Package, path, srcDir string, lookup func
 		}
 		rc = f
 	} else {
-		filename, id = FindPkg(path, srcDir)
+		var filename string
+		filename, id, err = FindPkg(path, srcDir)
 		if filename == "" {
 			if path == "unsafe" {
 				return types.Unsafe, nil
 			}
-			return nil, fmt.Errorf("can't find import: %q", id)
+			return nil, err
 		}
 
 		// no need to re-import if the package was imported completely before
@@ -210,57 +94,15 @@ func Import(packages map[string]*types.Package, path, srcDir string, lookup func
 	}
 	defer rc.Close()
 
-	var hdr string
-	var size int64
 	buf := bufio.NewReader(rc)
-	if hdr, size, err = FindExportData(buf); err != nil {
+	data, err := ReadUnified(buf)
+	if err != nil {
+		err = fmt.Errorf("import %q: %v", path, err)
 		return
 	}
 
-	switch hdr {
-	case "$$B\n":
-		var data []byte
-		data, err = io.ReadAll(buf)
-		if err != nil {
-			break
-		}
-
-		// TODO(gri): allow clients of go/importer to provide a FileSet.
-		// Or, define a new standard go/types/gcexportdata package.
-		fset := token.NewFileSet()
-
-		// Select appropriate importer.
-		if len(data) > 0 {
-			switch data[0] {
-			case 'v', 'c', 'd': // binary, till go1.10
-				return nil, fmt.Errorf("binary (%c) import format is no longer supported", data[0])
-
-			case 'i': // indexed, till go1.19
-				_, pkg, err := IImportData(fset, packages, data[1:], id)
-				return pkg, err
-
-			case 'u': // unified, from go1.20
-				_, pkg, err := UImportData(fset, packages, data[1:size], id)
-				return pkg, err
-
-			default:
-				l := len(data)
-				if l > 10 {
-					l = 10
-				}
-				return nil, fmt.Errorf("unexpected export data with prefix %q for path %s", string(data[:l]), id)
-			}
-		}
-
-	default:
-		err = fmt.Errorf("unknown export data header: %q", hdr)
-	}
+	// unified: emitted by cmd/compile since go1.20.
+	_, pkg, err = UImportData(fset, packages, data, id)
 
 	return
 }
-
-type byPath []*types.Package
-
-func (a byPath) Len() int           { return len(a) }
-func (a byPath) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
-func (a byPath) Less(i, j int) bool { return a[i].Path() < a[j].Path() }
diff --git a/test/integration/vendor/golang.org/x/tools/internal/gcimporter/iexport.go b/test/integration/vendor/golang.org/x/tools/internal/gcimporter/iexport.go
index 5f283281a2..7dfc31a37d 100644
--- a/test/integration/vendor/golang.org/x/tools/internal/gcimporter/iexport.go
+++ b/test/integration/vendor/golang.org/x/tools/internal/gcimporter/iexport.go
@@ -242,11 +242,30 @@ import (
 
 	"golang.org/x/tools/go/types/objectpath"
 	"golang.org/x/tools/internal/aliases"
-	"golang.org/x/tools/internal/tokeninternal"
 )
 
 // IExportShallow encodes "shallow" export data for the specified package.
 //
+// For types, we use "shallow" export data. Historically, the Go
+// compiler always produced a summary of the types for a given package
+// that included types from other packages that it indirectly
+// referenced: "deep" export data. This had the advantage that the
+// compiler (and analogous tools such as gopls) need only load one
+// file per direct import.  However, it meant that the files tended to
+// get larger based on the level of the package in the import
+// graph. For example, higher-level packages in the kubernetes module
+// have over 1MB of "deep" export data, even when they have almost no
+// content of their own, merely because they mention a major type that
+// references many others. In pathological cases the export data was
+// 300x larger than the source for a package due to this quadratic
+// growth.
+//
+// "Shallow" export data means that the serialized types describe only
+// a single package. If those types mention types from other packages,
+// the type checker may need to request additional packages beyond
+// just the direct imports. Type information for the entire transitive
+// closure of imports is provided (lazily) by the DAG.
+//
 // No promises are made about the encoding other than that it can be decoded by
 // the same version of IIExportShallow. If you plan to save export data in the
 // file system, be sure to include a cryptographic digest of the executable in
@@ -269,8 +288,8 @@ func IExportShallow(fset *token.FileSet, pkg *types.Package, reportf ReportFunc)
 }
 
 // IImportShallow decodes "shallow" types.Package data encoded by
-// IExportShallow in the same executable. This function cannot import data from
-// cmd/compile or gcexportdata.Write.
+// [IExportShallow] in the same executable. This function cannot import data
+// from cmd/compile or gcexportdata.Write.
 //
 // The importer calls getPackages to obtain package symbols for all
 // packages mentioned in the export data, including the one being
@@ -441,7 +460,7 @@ func (p *iexporter) encodeFile(w *intWriter, file *token.File, needed []uint64)
 	// Sort the set of needed offsets. Duplicates are harmless.
 	sort.Slice(needed, func(i, j int) bool { return needed[i] < needed[j] })
 
-	lines := tokeninternal.GetLines(file) // byte offset of each line start
+	lines := file.Lines() // byte offset of each line start
 	w.uint64(uint64(len(lines)))
 
 	// Rather than record the entire array of line start offsets,
@@ -725,13 +744,13 @@ func (p *iexporter) doDecl(obj types.Object) {
 	case *types.TypeName:
 		t := obj.Type()
 
-		if tparam, ok := aliases.Unalias(t).(*types.TypeParam); ok {
+		if tparam, ok := types.Unalias(t).(*types.TypeParam); ok {
 			w.tag(typeParamTag)
 			w.pos(obj.Pos())
 			constraint := tparam.Constraint()
 			if p.version >= iexportVersionGo1_18 {
 				implicit := false
-				if iface, _ := aliases.Unalias(constraint).(*types.Interface); iface != nil {
+				if iface, _ := types.Unalias(constraint).(*types.Interface); iface != nil {
 					implicit = iface.IsImplicit()
 				}
 				w.bool(implicit)
@@ -741,7 +760,7 @@ func (p *iexporter) doDecl(obj types.Object) {
 		}
 
 		if obj.IsAlias() {
-			alias, materialized := t.(*aliases.Alias) // may fail when aliases are not enabled
+			alias, materialized := t.(*types.Alias) // may fail when aliases are not enabled
 
 			var tparams *types.TypeParamList
 			if materialized {
@@ -975,7 +994,7 @@ func (w *exportWriter) doTyp(t types.Type, pkg *types.Package) {
 		}()
 	}
 	switch t := t.(type) {
-	case *aliases.Alias:
+	case *types.Alias:
 		if targs := aliases.TypeArgs(t); targs.Len() > 0 {
 			w.startType(instanceType)
 			w.pos(t.Obj().Pos())
@@ -1091,7 +1110,7 @@ func (w *exportWriter) doTyp(t types.Type, pkg *types.Package) {
 		for i := 0; i < n; i++ {
 			ft := t.EmbeddedType(i)
 			tPkg := pkg
-			if named, _ := aliases.Unalias(ft).(*types.Named); named != nil {
+			if named, _ := types.Unalias(ft).(*types.Named); named != nil {
 				w.pos(named.Obj().Pos())
 			} else {
 				w.pos(token.NoPos)
diff --git a/test/integration/vendor/golang.org/x/tools/internal/gcimporter/iimport.go b/test/integration/vendor/golang.org/x/tools/internal/gcimporter/iimport.go
index ed2d562959..69b1d697cb 100644
--- a/test/integration/vendor/golang.org/x/tools/internal/gcimporter/iimport.go
+++ b/test/integration/vendor/golang.org/x/tools/internal/gcimporter/iimport.go
@@ -5,8 +5,6 @@
 // Indexed package import.
 // See iexport.go for the export data format.
 
-// This file is a copy of $GOROOT/src/go/internal/gcimporter/iimport.go.
-
 package gcimporter
 
 import (
@@ -53,6 +51,7 @@ const (
 	iexportVersionPosCol   = 1
 	iexportVersionGo1_18   = 2
 	iexportVersionGenerics = 2
+	iexportVersion         = iexportVersionGenerics
 
 	iexportVersionCurrent = 2
 )
@@ -540,7 +539,7 @@ func canReuse(def *types.Named, rhs types.Type) bool {
 	if def == nil {
 		return true
 	}
-	iface, _ := aliases.Unalias(rhs).(*types.Interface)
+	iface, _ := types.Unalias(rhs).(*types.Interface)
 	if iface == nil {
 		return true
 	}
@@ -557,6 +556,14 @@ type importReader struct {
 	prevColumn int64
 }
 
+// markBlack is redefined in iimport_go123.go, to work around golang/go#69912.
+//
+// If TypeNames are not marked black (in the sense of go/types cycle
+// detection), they may be mutated when dot-imported. Fix this by punching a
+// hole through the type, when compiling with Go 1.23. (The bug has been fixed
+// for 1.24, but the fix was not worth back-porting).
+var markBlack = func(name *types.TypeName) {}
+
 func (r *importReader) obj(name string) {
 	tag := r.byte()
 	pos := r.pos()
@@ -569,6 +576,7 @@ func (r *importReader) obj(name string) {
 		}
 		typ := r.typ()
 		obj := aliases.NewAlias(r.p.aliases, pos, r.currPkg, name, typ, tparams)
+		markBlack(obj) // workaround for golang/go#69912
 		r.declare(obj)
 
 	case constTag:
@@ -589,6 +597,9 @@ func (r *importReader) obj(name string) {
 		// declaration before recursing.
 		obj := types.NewTypeName(pos, r.currPkg, name, nil)
 		named := types.NewNamed(obj, nil, nil)
+
+		markBlack(obj) // workaround for golang/go#69912
+
 		// Declare obj before calling r.tparamList, so the new type name is recognized
 		// if used in the constraint of one of its own typeparams (see #48280).
 		r.declare(obj)
@@ -615,7 +626,7 @@ func (r *importReader) obj(name string) {
 				if targs.Len() > 0 {
 					rparams = make([]*types.TypeParam, targs.Len())
 					for i := range rparams {
-						rparams[i] = aliases.Unalias(targs.At(i)).(*types.TypeParam)
+						rparams[i] = types.Unalias(targs.At(i)).(*types.TypeParam)
 					}
 				}
 				msig := r.signature(recv, rparams, nil)
@@ -645,7 +656,7 @@ func (r *importReader) obj(name string) {
 		}
 		constraint := r.typ()
 		if implicit {
-			iface, _ := aliases.Unalias(constraint).(*types.Interface)
+			iface, _ := types.Unalias(constraint).(*types.Interface)
 			if iface == nil {
 				errorf("non-interface constraint marked implicit")
 			}
@@ -852,7 +863,7 @@ func (r *importReader) typ() types.Type {
 }
 
 func isInterface(t types.Type) bool {
-	_, ok := aliases.Unalias(t).(*types.Interface)
+	_, ok := types.Unalias(t).(*types.Interface)
 	return ok
 }
 
@@ -959,7 +970,7 @@ func (r *importReader) doType(base *types.Named) (res types.Type) {
 			methods[i] = method
 		}
 
-		typ := newInterface(methods, embeddeds)
+		typ := types.NewInterfaceType(methods, embeddeds)
 		r.p.interfaceList = append(r.p.interfaceList, typ)
 		return typ
 
@@ -1051,7 +1062,7 @@ func (r *importReader) tparamList() []*types.TypeParam {
 	for i := range xs {
 		// Note: the standard library importer is tolerant of nil types here,
 		// though would panic in SetTypeParams.
-		xs[i] = aliases.Unalias(r.typ()).(*types.TypeParam)
+		xs[i] = types.Unalias(r.typ()).(*types.TypeParam)
 	}
 	return xs
 }
@@ -1098,3 +1109,9 @@ func (r *importReader) byte() byte {
 	}
 	return x
 }
+
+type byPath []*types.Package
+
+func (a byPath) Len() int           { return len(a) }
+func (a byPath) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
+func (a byPath) Less(i, j int) bool { return a[i].Path() < a[j].Path() }
diff --git a/test/integration/vendor/golang.org/x/tools/internal/gcimporter/iimport_go122.go b/test/integration/vendor/golang.org/x/tools/internal/gcimporter/iimport_go122.go
new file mode 100644
index 0000000000..7586bfaca6
--- /dev/null
+++ b/test/integration/vendor/golang.org/x/tools/internal/gcimporter/iimport_go122.go
@@ -0,0 +1,53 @@
+// Copyright 2024 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 go1.22 && !go1.24
+
+package gcimporter
+
+import (
+	"go/token"
+	"go/types"
+	"unsafe"
+)
+
+// TODO(rfindley): delete this workaround once go1.24 is assured.
+
+func init() {
+	// Update markBlack so that it correctly sets the color
+	// of imported TypeNames.
+	//
+	// See the doc comment for markBlack for details.
+
+	type color uint32
+	const (
+		white color = iota
+		black
+		grey
+	)
+	type object struct {
+		_      *types.Scope
+		_      token.Pos
+		_      *types.Package
+		_      string
+		_      types.Type
+		_      uint32
+		color_ color
+		_      token.Pos
+	}
+	type typeName struct {
+		object
+	}
+
+	// If the size of types.TypeName changes, this will fail to compile.
+	const delta = int64(unsafe.Sizeof(typeName{})) - int64(unsafe.Sizeof(types.TypeName{}))
+	var _ [-delta * delta]int
+
+	markBlack = func(obj *types.TypeName) {
+		type uP = unsafe.Pointer
+		var ptr *typeName
+		*(*uP)(uP(&ptr)) = uP(obj)
+		ptr.color_ = black
+	}
+}
diff --git a/test/integration/vendor/golang.org/x/tools/internal/gcimporter/newInterface10.go b/test/integration/vendor/golang.org/x/tools/internal/gcimporter/newInterface10.go
deleted file mode 100644
index 8b163e3d05..0000000000
--- a/test/integration/vendor/golang.org/x/tools/internal/gcimporter/newInterface10.go
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2018 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 !go1.11
-// +build !go1.11
-
-package gcimporter
-
-import "go/types"
-
-func newInterface(methods []*types.Func, embeddeds []types.Type) *types.Interface {
-	named := make([]*types.Named, len(embeddeds))
-	for i, e := range embeddeds {
-		var ok bool
-		named[i], ok = e.(*types.Named)
-		if !ok {
-			panic("embedding of non-defined interfaces in interfaces is not supported before Go 1.11")
-		}
-	}
-	return types.NewInterface(methods, named)
-}
diff --git a/test/integration/vendor/golang.org/x/tools/internal/gcimporter/newInterface11.go b/test/integration/vendor/golang.org/x/tools/internal/gcimporter/newInterface11.go
deleted file mode 100644
index 49984f40fd..0000000000
--- a/test/integration/vendor/golang.org/x/tools/internal/gcimporter/newInterface11.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2018 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 go1.11
-// +build go1.11
-
-package gcimporter
-
-import "go/types"
-
-func newInterface(methods []*types.Func, embeddeds []types.Type) *types.Interface {
-	return types.NewInterfaceType(methods, embeddeds)
-}
diff --git a/test/integration/vendor/golang.org/x/tools/internal/gcimporter/predeclared.go b/test/integration/vendor/golang.org/x/tools/internal/gcimporter/predeclared.go
new file mode 100644
index 0000000000..907c8557a5
--- /dev/null
+++ b/test/integration/vendor/golang.org/x/tools/internal/gcimporter/predeclared.go
@@ -0,0 +1,91 @@
+// Copyright 2024 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 gcimporter
+
+import (
+	"go/types"
+	"sync"
+)
+
+// predecl is a cache for the predeclared types in types.Universe.
+//
+// Cache a distinct result based on the runtime value of any.
+// The pointer value of the any type varies based on GODEBUG settings.
+var predeclMu sync.Mutex
+var predecl map[types.Type][]types.Type
+
+func predeclared() []types.Type {
+	anyt := types.Universe.Lookup("any").Type()
+
+	predeclMu.Lock()
+	defer predeclMu.Unlock()
+
+	if pre, ok := predecl[anyt]; ok {
+		return pre
+	}
+
+	if predecl == nil {
+		predecl = make(map[types.Type][]types.Type)
+	}
+
+	decls := []types.Type{ // basic types
+		types.Typ[types.Bool],
+		types.Typ[types.Int],
+		types.Typ[types.Int8],
+		types.Typ[types.Int16],
+		types.Typ[types.Int32],
+		types.Typ[types.Int64],
+		types.Typ[types.Uint],
+		types.Typ[types.Uint8],
+		types.Typ[types.Uint16],
+		types.Typ[types.Uint32],
+		types.Typ[types.Uint64],
+		types.Typ[types.Uintptr],
+		types.Typ[types.Float32],
+		types.Typ[types.Float64],
+		types.Typ[types.Complex64],
+		types.Typ[types.Complex128],
+		types.Typ[types.String],
+
+		// basic type aliases
+		types.Universe.Lookup("byte").Type(),
+		types.Universe.Lookup("rune").Type(),
+
+		// error
+		types.Universe.Lookup("error").Type(),
+
+		// untyped types
+		types.Typ[types.UntypedBool],
+		types.Typ[types.UntypedInt],
+		types.Typ[types.UntypedRune],
+		types.Typ[types.UntypedFloat],
+		types.Typ[types.UntypedComplex],
+		types.Typ[types.UntypedString],
+		types.Typ[types.UntypedNil],
+
+		// package unsafe
+		types.Typ[types.UnsafePointer],
+
+		// invalid type
+		types.Typ[types.Invalid], // only appears in packages with errors
+
+		// used internally by gc; never used by this package or in .a files
+		anyType{},
+
+		// comparable
+		types.Universe.Lookup("comparable").Type(),
+
+		// any
+		anyt,
+	}
+
+	predecl[anyt] = decls
+	return decls
+}
+
+type anyType struct{}
+
+func (t anyType) Underlying() types.Type { return t }
+func (t anyType) String() string         { return "any" }
diff --git a/test/integration/vendor/golang.org/x/tools/internal/gcimporter/support.go b/test/integration/vendor/golang.org/x/tools/internal/gcimporter/support.go
new file mode 100644
index 0000000000..4af810dc41
--- /dev/null
+++ b/test/integration/vendor/golang.org/x/tools/internal/gcimporter/support.go
@@ -0,0 +1,30 @@
+// Copyright 2024 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 gcimporter
+
+import (
+	"bufio"
+	"io"
+	"strconv"
+	"strings"
+)
+
+// Copy of $GOROOT/src/cmd/internal/archive.ReadHeader.
+func readArchiveHeader(b *bufio.Reader, name string) int {
+	// architecture-independent object file output
+	const HeaderSize = 60
+
+	var buf [HeaderSize]byte
+	if _, err := io.ReadFull(b, buf[:]); err != nil {
+		return -1
+	}
+	aname := strings.Trim(string(buf[0:16]), " ")
+	if !strings.HasPrefix(aname, name) {
+		return -1
+	}
+	asize := strings.Trim(string(buf[48:58]), " ")
+	i, _ := strconv.Atoi(asize)
+	return i
+}
diff --git a/test/integration/vendor/golang.org/x/tools/internal/gcimporter/support_go118.go b/test/integration/vendor/golang.org/x/tools/internal/gcimporter/support_go118.go
deleted file mode 100644
index 0cd3b91b65..0000000000
--- a/test/integration/vendor/golang.org/x/tools/internal/gcimporter/support_go118.go
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2021 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 gcimporter
-
-import "go/types"
-
-const iexportVersion = iexportVersionGenerics
-
-// additionalPredeclared returns additional predeclared types in go.1.18.
-func additionalPredeclared() []types.Type {
-	return []types.Type{
-		// comparable
-		types.Universe.Lookup("comparable").Type(),
-
-		// any
-		types.Universe.Lookup("any").Type(),
-	}
-}
-
-// See cmd/compile/internal/types.SplitVargenSuffix.
-func splitVargenSuffix(name string) (base, suffix string) {
-	i := len(name)
-	for i > 0 && name[i-1] >= '0' && name[i-1] <= '9' {
-		i--
-	}
-	const dot = "·"
-	if i >= len(dot) && name[i-len(dot):i] == dot {
-		i -= len(dot)
-		return name[:i], name[i:]
-	}
-	return name, ""
-}
diff --git a/test/integration/vendor/golang.org/x/tools/internal/gcimporter/unified_no.go b/test/integration/vendor/golang.org/x/tools/internal/gcimporter/unified_no.go
deleted file mode 100644
index 38b624cada..0000000000
--- a/test/integration/vendor/golang.org/x/tools/internal/gcimporter/unified_no.go
+++ /dev/null
@@ -1,10 +0,0 @@
-// 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 !goexperiment.unified
-// +build !goexperiment.unified
-
-package gcimporter
-
-const unifiedIR = false
diff --git a/test/integration/vendor/golang.org/x/tools/internal/gcimporter/unified_yes.go b/test/integration/vendor/golang.org/x/tools/internal/gcimporter/unified_yes.go
deleted file mode 100644
index b5118d0b3a..0000000000
--- a/test/integration/vendor/golang.org/x/tools/internal/gcimporter/unified_yes.go
+++ /dev/null
@@ -1,10 +0,0 @@
-// 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 goexperiment.unified
-// +build goexperiment.unified
-
-package gcimporter
-
-const unifiedIR = true
diff --git a/test/integration/vendor/golang.org/x/tools/internal/gcimporter/ureader_yes.go b/test/integration/vendor/golang.org/x/tools/internal/gcimporter/ureader_yes.go
index f0742f5404..6cdab448ec 100644
--- a/test/integration/vendor/golang.org/x/tools/internal/gcimporter/ureader_yes.go
+++ b/test/integration/vendor/golang.org/x/tools/internal/gcimporter/ureader_yes.go
@@ -11,7 +11,6 @@ import (
 	"go/token"
 	"go/types"
 	"sort"
-	"strings"
 
 	"golang.org/x/tools/internal/aliases"
 	"golang.org/x/tools/internal/pkgbits"
@@ -71,7 +70,6 @@ func UImportData(fset *token.FileSet, imports map[string]*types.Package, data []
 	}
 
 	s := string(data)
-	s = s[:strings.LastIndex(s, "\n$$\n")]
 	input := pkgbits.NewPkgDecoder(path, s)
 	pkg = readUnifiedPackage(fset, nil, imports, input)
 	return
@@ -266,7 +264,12 @@ func (pr *pkgReader) pkgIdx(idx pkgbits.Index) *types.Package {
 func (r *reader) doPkg() *types.Package {
 	path := r.String()
 	switch path {
-	case "":
+	// cmd/compile emits path="main" for main packages because
+	// that's the linker symbol prefix it used; but we need
+	// the package's path as it would be reported by go list,
+	// hence "main" below.
+	// See test at go/packages.TestMainPackagePathInModeTypes.
+	case "", "main":
 		path = r.p.PkgPath()
 	case "builtin":
 		return nil // universe
@@ -562,7 +565,7 @@ func (pr *pkgReader) objIdx(idx pkgbits.Index) (*types.Package, string) {
 				// If the underlying type is an interface, we need to
 				// duplicate its methods so we can replace the receiver
 				// parameter's type (#49906).
-				if iface, ok := aliases.Unalias(underlying).(*types.Interface); ok && iface.NumExplicitMethods() != 0 {
+				if iface, ok := types.Unalias(underlying).(*types.Interface); ok && iface.NumExplicitMethods() != 0 {
 					methods := make([]*types.Func, iface.NumExplicitMethods())
 					for i := range methods {
 						fn := iface.ExplicitMethod(i)
@@ -738,3 +741,17 @@ func pkgScope(pkg *types.Package) *types.Scope {
 	}
 	return types.Universe
 }
+
+// See cmd/compile/internal/types.SplitVargenSuffix.
+func splitVargenSuffix(name string) (base, suffix string) {
+	i := len(name)
+	for i > 0 && name[i-1] >= '0' && name[i-1] <= '9' {
+		i--
+	}
+	const dot = "·"
+	if i >= len(dot) && name[i-len(dot):i] == dot {
+		i -= len(dot)
+		return name[:i], name[i:]
+	}
+	return name, ""
+}
diff --git a/test/integration/vendor/golang.org/x/tools/internal/gocommand/invoke.go b/test/integration/vendor/golang.org/x/tools/internal/gocommand/invoke.go
index 2e59ff8558..e333efc87f 100644
--- a/test/integration/vendor/golang.org/x/tools/internal/gocommand/invoke.go
+++ b/test/integration/vendor/golang.org/x/tools/internal/gocommand/invoke.go
@@ -16,7 +16,6 @@ import (
 	"os"
 	"os/exec"
 	"path/filepath"
-	"reflect"
 	"regexp"
 	"runtime"
 	"strconv"
@@ -250,16 +249,13 @@ func (i *Invocation) run(ctx context.Context, stdout, stderr io.Writer) error {
 	cmd.Stdout = stdout
 	cmd.Stderr = stderr
 
-	// cmd.WaitDelay was added only in go1.20 (see #50436).
-	if waitDelay := reflect.ValueOf(cmd).Elem().FieldByName("WaitDelay"); waitDelay.IsValid() {
-		// https://go.dev/issue/59541: don't wait forever copying stderr
-		// after the command has exited.
-		// After CL 484741 we copy stdout manually, so we we'll stop reading that as
-		// soon as ctx is done. However, we also don't want to wait around forever
-		// for stderr. Give a much-longer-than-reasonable delay and then assume that
-		// something has wedged in the kernel or runtime.
-		waitDelay.Set(reflect.ValueOf(30 * time.Second))
-	}
+	// https://go.dev/issue/59541: don't wait forever copying stderr
+	// after the command has exited.
+	// After CL 484741 we copy stdout manually, so we we'll stop reading that as
+	// soon as ctx is done. However, we also don't want to wait around forever
+	// for stderr. Give a much-longer-than-reasonable delay and then assume that
+	// something has wedged in the kernel or runtime.
+	cmd.WaitDelay = 30 * time.Second
 
 	// The cwd gets resolved to the real path. On Darwin, where
 	// /tmp is a symlink, this breaks anything that expects the
diff --git a/test/integration/vendor/golang.org/x/tools/internal/imports/fix.go b/test/integration/vendor/golang.org/x/tools/internal/imports/fix.go
index dc7d50a7a4..5ae576977a 100644
--- a/test/integration/vendor/golang.org/x/tools/internal/imports/fix.go
+++ b/test/integration/vendor/golang.org/x/tools/internal/imports/fix.go
@@ -27,7 +27,6 @@ import (
 	"unicode"
 	"unicode/utf8"
 
-	"golang.org/x/sync/errgroup"
 	"golang.org/x/tools/go/ast/astutil"
 	"golang.org/x/tools/internal/event"
 	"golang.org/x/tools/internal/gocommand"
@@ -91,18 +90,6 @@ type ImportFix struct {
 	Relevance float64 // see pkg
 }
 
-// An ImportInfo represents a single import statement.
-type ImportInfo struct {
-	ImportPath string // import path, e.g. "crypto/rand".
-	Name       string // import name, e.g. "crand", or "" if none.
-}
-
-// A packageInfo represents what's known about a package.
-type packageInfo struct {
-	name    string          // real package name, if known.
-	exports map[string]bool // known exports.
-}
-
 // parseOtherFiles parses all the Go files in srcDir except filename, including
 // test files if filename looks like a test.
 //
@@ -131,7 +118,7 @@ func parseOtherFiles(ctx context.Context, fset *token.FileSet, srcDir, filename
 			continue
 		}
 
-		f, err := parser.ParseFile(fset, filepath.Join(srcDir, fi.Name()), nil, 0)
+		f, err := parser.ParseFile(fset, filepath.Join(srcDir, fi.Name()), nil, parser.SkipObjectResolution)
 		if err != nil {
 			continue
 		}
@@ -162,8 +149,8 @@ func addGlobals(f *ast.File, globals map[string]bool) {
 
 // collectReferences builds a map of selector expressions, from
 // left hand side (X) to a set of right hand sides (Sel).
-func collectReferences(f *ast.File) references {
-	refs := references{}
+func collectReferences(f *ast.File) References {
+	refs := References{}
 
 	var visitor visitFn
 	visitor = func(node ast.Node) ast.Visitor {
@@ -233,7 +220,7 @@ func (p *pass) findMissingImport(pkg string, syms map[string]bool) *ImportInfo {
 
 		allFound := true
 		for right := range syms {
-			if !pkgInfo.exports[right] {
+			if !pkgInfo.Exports[right] {
 				allFound = false
 				break
 			}
@@ -246,11 +233,6 @@ func (p *pass) findMissingImport(pkg string, syms map[string]bool) *ImportInfo {
 	return nil
 }
 
-// references is set of references found in a Go file. The first map key is the
-// left hand side of a selector expression, the second key is the right hand
-// side, and the value should always be true.
-type references map[string]map[string]bool
-
 // A pass contains all the inputs and state necessary to fix a file's imports.
 // It can be modified in some ways during use; see comments below.
 type pass struct {
@@ -258,27 +240,29 @@ type pass struct {
 	fset                 *token.FileSet // fset used to parse f and its siblings.
 	f                    *ast.File      // the file being fixed.
 	srcDir               string         // the directory containing f.
-	env                  *ProcessEnv    // the environment to use for go commands, etc.
-	loadRealPackageNames bool           // if true, load package names from disk rather than guessing them.
-	otherFiles           []*ast.File    // sibling files.
+	logf                 func(string, ...any)
+	source               Source      // the environment to use for go commands, etc.
+	loadRealPackageNames bool        // if true, load package names from disk rather than guessing them.
+	otherFiles           []*ast.File // sibling files.
+	goroot               string
 
 	// Intermediate state, generated by load.
 	existingImports map[string][]*ImportInfo
-	allRefs         references
-	missingRefs     references
+	allRefs         References
+	missingRefs     References
 
 	// Inputs to fix. These can be augmented between successive fix calls.
 	lastTry       bool                    // indicates that this is the last call and fix should clean up as best it can.
 	candidates    []*ImportInfo           // candidate imports in priority order.
-	knownPackages map[string]*packageInfo // information about all known packages.
+	knownPackages map[string]*PackageInfo // information about all known packages.
 }
 
 // loadPackageNames saves the package names for everything referenced by imports.
-func (p *pass) loadPackageNames(imports []*ImportInfo) error {
-	if p.env.Logf != nil {
-		p.env.Logf("loading package names for %v packages", len(imports))
+func (p *pass) loadPackageNames(ctx context.Context, imports []*ImportInfo) error {
+	if p.logf != nil {
+		p.logf("loading package names for %v packages", len(imports))
 		defer func() {
-			p.env.Logf("done loading package names for %v packages", len(imports))
+			p.logf("done loading package names for %v packages", len(imports))
 		}()
 	}
 	var unknown []string
@@ -289,20 +273,17 @@ func (p *pass) loadPackageNames(imports []*ImportInfo) error {
 		unknown = append(unknown, imp.ImportPath)
 	}
 
-	resolver, err := p.env.GetResolver()
-	if err != nil {
-		return err
-	}
-
-	names, err := resolver.loadPackageNames(unknown, p.srcDir)
+	names, err := p.source.LoadPackageNames(ctx, p.srcDir, unknown)
 	if err != nil {
 		return err
 	}
 
+	// TODO(rfindley): revisit this. Why do we need to store known packages with
+	// no exports? The inconsistent data is confusing.
 	for path, name := range names {
-		p.knownPackages[path] = &packageInfo{
-			name:    name,
-			exports: map[string]bool{},
+		p.knownPackages[path] = &PackageInfo{
+			Name:    name,
+			Exports: map[string]bool{},
 		}
 	}
 	return nil
@@ -330,8 +311,8 @@ func (p *pass) importIdentifier(imp *ImportInfo) string {
 		return imp.Name
 	}
 	known := p.knownPackages[imp.ImportPath]
-	if known != nil && known.name != "" {
-		return withoutVersion(known.name)
+	if known != nil && known.Name != "" {
+		return withoutVersion(known.Name)
 	}
 	return ImportPathToAssumedName(imp.ImportPath)
 }
@@ -339,9 +320,9 @@ func (p *pass) importIdentifier(imp *ImportInfo) string {
 // load reads in everything necessary to run a pass, and reports whether the
 // file already has all the imports it needs. It fills in p.missingRefs with the
 // file's missing symbols, if any, or removes unused imports if not.
-func (p *pass) load() ([]*ImportFix, bool) {
-	p.knownPackages = map[string]*packageInfo{}
-	p.missingRefs = references{}
+func (p *pass) load(ctx context.Context) ([]*ImportFix, bool) {
+	p.knownPackages = map[string]*PackageInfo{}
+	p.missingRefs = References{}
 	p.existingImports = map[string][]*ImportInfo{}
 
 	// Load basic information about the file in question.
@@ -364,9 +345,11 @@ func (p *pass) load() ([]*ImportFix, bool) {
 	// f's imports by the identifier they introduce.
 	imports := collectImports(p.f)
 	if p.loadRealPackageNames {
-		err := p.loadPackageNames(append(imports, p.candidates...))
+		err := p.loadPackageNames(ctx, append(imports, p.candidates...))
 		if err != nil {
-			p.env.logf("loading package names: %v", err)
+			if p.logf != nil {
+				p.logf("loading package names: %v", err)
+			}
 			return nil, false
 		}
 	}
@@ -535,9 +518,10 @@ func (p *pass) assumeSiblingImportsValid() {
 					// We have the stdlib in memory; no need to guess.
 					rights = symbolNameSet(m)
 				}
-				p.addCandidate(imp, &packageInfo{
+				// TODO(rfindley): we should set package name here, for consistency.
+				p.addCandidate(imp, &PackageInfo{
 					// no name; we already know it.
-					exports: rights,
+					Exports: rights,
 				})
 			}
 		}
@@ -546,14 +530,14 @@ func (p *pass) assumeSiblingImportsValid() {
 
 // addCandidate adds a candidate import to p, and merges in the information
 // in pkg.
-func (p *pass) addCandidate(imp *ImportInfo, pkg *packageInfo) {
+func (p *pass) addCandidate(imp *ImportInfo, pkg *PackageInfo) {
 	p.candidates = append(p.candidates, imp)
 	if existing, ok := p.knownPackages[imp.ImportPath]; ok {
-		if existing.name == "" {
-			existing.name = pkg.name
+		if existing.Name == "" {
+			existing.Name = pkg.Name
 		}
-		for export := range pkg.exports {
-			existing.exports[export] = true
+		for export := range pkg.Exports {
+			existing.Exports[export] = true
 		}
 	} else {
 		p.knownPackages[imp.ImportPath] = pkg
@@ -581,19 +565,42 @@ func fixImportsDefault(fset *token.FileSet, f *ast.File, filename string, env *P
 // getFixes gets the import fixes that need to be made to f in order to fix the imports.
 // It does not modify the ast.
 func getFixes(ctx context.Context, fset *token.FileSet, f *ast.File, filename string, env *ProcessEnv) ([]*ImportFix, error) {
+	source, err := NewProcessEnvSource(env, filename, f.Name.Name)
+	if err != nil {
+		return nil, err
+	}
+	goEnv, err := env.goEnv()
+	if err != nil {
+		return nil, err
+	}
+	return getFixesWithSource(ctx, fset, f, filename, goEnv["GOROOT"], env.logf, source)
+}
+
+func getFixesWithSource(ctx context.Context, fset *token.FileSet, f *ast.File, filename string, goroot string, logf func(string, ...any), source Source) ([]*ImportFix, error) {
+	// This logic is defensively duplicated from getFixes.
 	abs, err := filepath.Abs(filename)
 	if err != nil {
 		return nil, err
 	}
 	srcDir := filepath.Dir(abs)
-	env.logf("fixImports(filename=%q), abs=%q, srcDir=%q ...", filename, abs, srcDir)
+
+	if logf != nil {
+		logf("fixImports(filename=%q), srcDir=%q ...", filename, abs, srcDir)
+	}
 
 	// First pass: looking only at f, and using the naive algorithm to
 	// derive package names from import paths, see if the file is already
 	// complete. We can't add any imports yet, because we don't know
 	// if missing references are actually package vars.
-	p := &pass{fset: fset, f: f, srcDir: srcDir, env: env}
-	if fixes, done := p.load(); done {
+	p := &pass{
+		fset:   fset,
+		f:      f,
+		srcDir: srcDir,
+		logf:   logf,
+		goroot: goroot,
+		source: source,
+	}
+	if fixes, done := p.load(ctx); done {
 		return fixes, nil
 	}
 
@@ -605,7 +612,7 @@ func getFixes(ctx context.Context, fset *token.FileSet, f *ast.File, filename st
 	// Second pass: add information from other files in the same package,
 	// like their package vars and imports.
 	p.otherFiles = otherFiles
-	if fixes, done := p.load(); done {
+	if fixes, done := p.load(ctx); done {
 		return fixes, nil
 	}
 
@@ -618,10 +625,17 @@ func getFixes(ctx context.Context, fset *token.FileSet, f *ast.File, filename st
 
 	// Third pass: get real package names where we had previously used
 	// the naive algorithm.
-	p = &pass{fset: fset, f: f, srcDir: srcDir, env: env}
+	p = &pass{
+		fset:   fset,
+		f:      f,
+		srcDir: srcDir,
+		logf:   logf,
+		goroot: goroot,
+		source: p.source, // safe to reuse, as it's just a wrapper around env
+	}
 	p.loadRealPackageNames = true
 	p.otherFiles = otherFiles
-	if fixes, done := p.load(); done {
+	if fixes, done := p.load(ctx); done {
 		return fixes, nil
 	}
 
@@ -835,7 +849,7 @@ func GetPackageExports(ctx context.Context, wrapped func(PackageExport), searchP
 			return true
 		},
 		dirFound: func(pkg *pkg) bool {
-			return pkgIsCandidate(filename, references{searchPkg: nil}, pkg)
+			return pkgIsCandidate(filename, References{searchPkg: nil}, pkg)
 		},
 		packageNameLoaded: func(pkg *pkg) bool {
 			return pkg.packageName == searchPkg
@@ -1086,11 +1100,7 @@ func (e *ProcessEnv) invokeGo(ctx context.Context, verb string, args ...string)
 	return e.GocmdRunner.Run(ctx, inv)
 }
 
-func addStdlibCandidates(pass *pass, refs references) error {
-	goenv, err := pass.env.goEnv()
-	if err != nil {
-		return err
-	}
+func addStdlibCandidates(pass *pass, refs References) error {
 	localbase := func(nm string) string {
 		ans := path.Base(nm)
 		if ans[0] == 'v' {
@@ -1105,13 +1115,13 @@ func addStdlibCandidates(pass *pass, refs references) error {
 	}
 	add := func(pkg string) {
 		// Prevent self-imports.
-		if path.Base(pkg) == pass.f.Name.Name && filepath.Join(goenv["GOROOT"], "src", pkg) == pass.srcDir {
+		if path.Base(pkg) == pass.f.Name.Name && filepath.Join(pass.goroot, "src", pkg) == pass.srcDir {
 			return
 		}
 		exports := symbolNameSet(stdlib.PackageSymbols[pkg])
 		pass.addCandidate(
 			&ImportInfo{ImportPath: pkg},
-			&packageInfo{name: localbase(pkg), exports: exports})
+			&PackageInfo{Name: localbase(pkg), Exports: exports})
 	}
 	for left := range refs {
 		if left == "rand" {
@@ -1175,91 +1185,14 @@ type scanCallback struct {
 	exportsLoaded func(pkg *pkg, exports []stdlib.Symbol)
 }
 
-func addExternalCandidates(ctx context.Context, pass *pass, refs references, filename string) error {
+func addExternalCandidates(ctx context.Context, pass *pass, refs References, filename string) error {
 	ctx, done := event.Start(ctx, "imports.addExternalCandidates")
 	defer done()
 
-	var mu sync.Mutex
-	found := make(map[string][]pkgDistance)
-	callback := &scanCallback{
-		rootFound: func(gopathwalk.Root) bool {
-			return true // We want everything.
-		},
-		dirFound: func(pkg *pkg) bool {
-			return pkgIsCandidate(filename, refs, pkg)
-		},
-		packageNameLoaded: func(pkg *pkg) bool {
-			if _, want := refs[pkg.packageName]; !want {
-				return false
-			}
-			if pkg.dir == pass.srcDir && pass.f.Name.Name == pkg.packageName {
-				// The candidate is in the same directory and has the
-				// same package name. Don't try to import ourselves.
-				return false
-			}
-			if !canUse(filename, pkg.dir) {
-				return false
-			}
-			mu.Lock()
-			defer mu.Unlock()
-			found[pkg.packageName] = append(found[pkg.packageName], pkgDistance{pkg, distance(pass.srcDir, pkg.dir)})
-			return false // We'll do our own loading after we sort.
-		},
-	}
-	resolver, err := pass.env.GetResolver()
+	results, err := pass.source.ResolveReferences(ctx, filename, refs)
 	if err != nil {
 		return err
 	}
-	if err = resolver.scan(ctx, callback); err != nil {
-		return err
-	}
-
-	// Search for imports matching potential package references.
-	type result struct {
-		imp *ImportInfo
-		pkg *packageInfo
-	}
-	results := make([]*result, len(refs))
-
-	g, ctx := errgroup.WithContext(ctx)
-
-	searcher := symbolSearcher{
-		logf:        pass.env.logf,
-		srcDir:      pass.srcDir,
-		xtest:       strings.HasSuffix(pass.f.Name.Name, "_test"),
-		loadExports: resolver.loadExports,
-	}
-
-	i := 0
-	for pkgName, symbols := range refs {
-		index := i // claim an index in results
-		i++
-		pkgName := pkgName
-		symbols := symbols
-
-		g.Go(func() error {
-			found, err := searcher.search(ctx, found[pkgName], pkgName, symbols)
-			if err != nil {
-				return err
-			}
-			if found == nil {
-				return nil // No matching package.
-			}
-
-			imp := &ImportInfo{
-				ImportPath: found.importPathShort,
-			}
-			pkg := &packageInfo{
-				name:    pkgName,
-				exports: symbols,
-			}
-			results[index] = &result{imp, pkg}
-			return nil
-		})
-	}
-	if err := g.Wait(); err != nil {
-		return err
-	}
 
 	for _, result := range results {
 		if result == nil {
@@ -1267,7 +1200,7 @@ func addExternalCandidates(ctx context.Context, pass *pass, refs references, fil
 		}
 		// Don't offer completions that would shadow predeclared
 		// names, such as github.com/coreos/etcd/error.
-		if types.Universe.Lookup(result.pkg.name) != nil { // predeclared
+		if types.Universe.Lookup(result.Package.Name) != nil { // predeclared
 			// Ideally we would skip this candidate only
 			// if the predeclared name is actually
 			// referenced by the file, but that's a lot
@@ -1276,7 +1209,7 @@ func addExternalCandidates(ctx context.Context, pass *pass, refs references, fil
 			// user before long.
 			continue
 		}
-		pass.addCandidate(result.imp, result.pkg)
+		pass.addCandidate(result.Import, result.Package)
 	}
 	return nil
 }
@@ -1620,6 +1553,7 @@ func loadExportsFromFiles(ctx context.Context, env *ProcessEnv, dir string, incl
 		}
 
 		fullFile := filepath.Join(dir, fi.Name())
+		// Legacy ast.Object resolution is needed here.
 		f, err := parser.ParseFile(fset, fullFile, nil, 0)
 		if err != nil {
 			env.logf("error parsing %v: %v", fullFile, err)
@@ -1800,7 +1734,7 @@ func (s *symbolSearcher) searchOne(ctx context.Context, c pkgDistance, symbols m
 // filename is the file being formatted.
 // pkgIdent is the package being searched for, like "client" (if
 // searching for "client.New")
-func pkgIsCandidate(filename string, refs references, pkg *pkg) bool {
+func pkgIsCandidate(filename string, refs References, pkg *pkg) bool {
 	// Check "internal" and "vendor" visibility:
 	if !canUse(filename, pkg.dir) {
 		return false
diff --git a/test/integration/vendor/golang.org/x/tools/internal/imports/imports.go b/test/integration/vendor/golang.org/x/tools/internal/imports/imports.go
index f83465520a..2215a12880 100644
--- a/test/integration/vendor/golang.org/x/tools/internal/imports/imports.go
+++ b/test/integration/vendor/golang.org/x/tools/internal/imports/imports.go
@@ -47,7 +47,14 @@ type Options struct {
 // Process implements golang.org/x/tools/imports.Process with explicit context in opt.Env.
 func Process(filename string, src []byte, opt *Options) (formatted []byte, err error) {
 	fileSet := token.NewFileSet()
-	file, adjust, err := parse(fileSet, filename, src, opt)
+	var parserMode parser.Mode
+	if opt.Comments {
+		parserMode |= parser.ParseComments
+	}
+	if opt.AllErrors {
+		parserMode |= parser.AllErrors
+	}
+	file, adjust, err := parse(fileSet, filename, src, parserMode, opt.Fragment)
 	if err != nil {
 		return nil, err
 	}
@@ -66,17 +73,19 @@ func Process(filename string, src []byte, opt *Options) (formatted []byte, err e
 //
 // Note that filename's directory influences which imports can be chosen,
 // so it is important that filename be accurate.
-func FixImports(ctx context.Context, filename string, src []byte, opt *Options) (fixes []*ImportFix, err error) {
+func FixImports(ctx context.Context, filename string, src []byte, goroot string, logf func(string, ...any), source Source) (fixes []*ImportFix, err error) {
 	ctx, done := event.Start(ctx, "imports.FixImports")
 	defer done()
 
 	fileSet := token.NewFileSet()
-	file, _, err := parse(fileSet, filename, src, opt)
+	// TODO(rfindley): these default values for ParseComments and AllErrors were
+	// extracted from gopls, but are they even needed?
+	file, _, err := parse(fileSet, filename, src, parser.ParseComments|parser.AllErrors, true)
 	if err != nil {
 		return nil, err
 	}
 
-	return getFixes(ctx, fileSet, file, filename, opt.Env)
+	return getFixesWithSource(ctx, fileSet, file, filename, goroot, logf, source)
 }
 
 // ApplyFixes applies all of the fixes to the file and formats it. extraMode
@@ -86,7 +95,7 @@ func ApplyFixes(fixes []*ImportFix, filename string, src []byte, opt *Options, e
 	// Don't use parse() -- we don't care about fragments or statement lists
 	// here, and we need to work with unparseable files.
 	fileSet := token.NewFileSet()
-	parserMode := parser.Mode(0)
+	parserMode := parser.SkipObjectResolution
 	if opt.Comments {
 		parserMode |= parser.ParseComments
 	}
@@ -114,7 +123,7 @@ func ApplyFixes(fixes []*ImportFix, filename string, src []byte, opt *Options, e
 // formatted file, and returns the postpocessed result.
 func formatFile(fset *token.FileSet, file *ast.File, src []byte, adjust func(orig []byte, src []byte) []byte, opt *Options) ([]byte, error) {
 	mergeImports(file)
-	sortImports(opt.LocalPrefix, fset.File(file.Pos()), file)
+	sortImports(opt.LocalPrefix, fset.File(file.FileStart), file)
 	var spacesBefore []string // import paths we need spaces before
 	for _, impSection := range astutil.Imports(fset, file) {
 		// Within each block of contiguous imports, see if any
@@ -164,13 +173,9 @@ func formatFile(fset *token.FileSet, file *ast.File, src []byte, adjust func(ori
 
 // parse parses src, which was read from filename,
 // as a Go source file or statement list.
-func parse(fset *token.FileSet, filename string, src []byte, opt *Options) (*ast.File, func(orig, src []byte) []byte, error) {
-	parserMode := parser.Mode(0)
-	if opt.Comments {
-		parserMode |= parser.ParseComments
-	}
-	if opt.AllErrors {
-		parserMode |= parser.AllErrors
+func parse(fset *token.FileSet, filename string, src []byte, parserMode parser.Mode, fragment bool) (*ast.File, func(orig, src []byte) []byte, error) {
+	if parserMode&parser.SkipObjectResolution != 0 {
+		panic("legacy ast.Object resolution is required")
 	}
 
 	// Try as whole source file.
@@ -181,7 +186,7 @@ func parse(fset *token.FileSet, filename string, src []byte, opt *Options) (*ast
 	// If the error is that the source file didn't begin with a
 	// package line and we accept fragmented input, fall through to
 	// try as a source fragment.  Stop and return on any other error.
-	if !opt.Fragment || !strings.Contains(err.Error(), "expected 'package'") {
+	if !fragment || !strings.Contains(err.Error(), "expected 'package'") {
 		return nil, nil, err
 	}
 
diff --git a/test/integration/vendor/golang.org/x/tools/internal/imports/source.go b/test/integration/vendor/golang.org/x/tools/internal/imports/source.go
new file mode 100644
index 0000000000..cbe4f3c5ba
--- /dev/null
+++ b/test/integration/vendor/golang.org/x/tools/internal/imports/source.go
@@ -0,0 +1,63 @@
+// Copyright 2024 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 imports
+
+import "context"
+
+// These types document the APIs below.
+//
+// TODO(rfindley): consider making these defined types rather than aliases.
+type (
+	ImportPath  = string
+	PackageName = string
+	Symbol      = string
+
+	// References is set of References found in a Go file. The first map key is the
+	// left hand side of a selector expression, the second key is the right hand
+	// side, and the value should always be true.
+	References = map[PackageName]map[Symbol]bool
+)
+
+// A Result satisfies a missing import.
+//
+// The Import field describes the missing import spec, and the Package field
+// summarizes the package exports.
+type Result struct {
+	Import  *ImportInfo
+	Package *PackageInfo
+}
+
+// An ImportInfo represents a single import statement.
+type ImportInfo struct {
+	ImportPath string // import path, e.g. "crypto/rand".
+	Name       string // import name, e.g. "crand", or "" if none.
+}
+
+// A PackageInfo represents what's known about a package.
+type PackageInfo struct {
+	Name    string          // package name in the package declaration, if known
+	Exports map[string]bool // set of names of known package level sortSymbols
+}
+
+// A Source provides imports to satisfy unresolved references in the file being
+// fixed.
+type Source interface {
+	// LoadPackageNames queries PackageName information for the requested import
+	// paths, when operating from the provided srcDir.
+	//
+	// TODO(rfindley): try to refactor to remove this operation.
+	LoadPackageNames(ctx context.Context, srcDir string, paths []ImportPath) (map[ImportPath]PackageName, error)
+
+	// ResolveReferences asks the Source for the best package name to satisfy
+	// each of the missing references, in the context of fixing the given
+	// filename.
+	//
+	// Returns a map from package name to a [Result] for that package name that
+	// provides the required symbols. Keys may be omitted in the map if no
+	// candidates satisfy all missing references for that package name. It is up
+	// to each data source to select the best result for each entry in the
+	// missing map.
+	ResolveReferences(ctx context.Context, filename string, missing References) ([]*Result, error)
+}
diff --git a/test/integration/vendor/golang.org/x/tools/internal/imports/source_env.go b/test/integration/vendor/golang.org/x/tools/internal/imports/source_env.go
new file mode 100644
index 0000000000..d14abaa319
--- /dev/null
+++ b/test/integration/vendor/golang.org/x/tools/internal/imports/source_env.go
@@ -0,0 +1,129 @@
+// Copyright 2024 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 imports
+
+import (
+	"context"
+	"path/filepath"
+	"strings"
+	"sync"
+
+	"golang.org/x/sync/errgroup"
+	"golang.org/x/tools/internal/gopathwalk"
+)
+
+// ProcessEnvSource implements the [Source] interface using the legacy
+// [ProcessEnv] abstraction.
+type ProcessEnvSource struct {
+	env      *ProcessEnv
+	srcDir   string
+	filename string
+	pkgName  string
+}
+
+// NewProcessEnvSource returns a [ProcessEnvSource] wrapping the given
+// env, to be used for fixing imports in the file with name filename in package
+// named pkgName.
+func NewProcessEnvSource(env *ProcessEnv, filename, pkgName string) (*ProcessEnvSource, error) {
+	abs, err := filepath.Abs(filename)
+	if err != nil {
+		return nil, err
+	}
+	srcDir := filepath.Dir(abs)
+	return &ProcessEnvSource{
+		env:      env,
+		srcDir:   srcDir,
+		filename: filename,
+		pkgName:  pkgName,
+	}, nil
+}
+
+func (s *ProcessEnvSource) LoadPackageNames(ctx context.Context, srcDir string, unknown []string) (map[string]string, error) {
+	r, err := s.env.GetResolver()
+	if err != nil {
+		return nil, err
+	}
+	return r.loadPackageNames(unknown, srcDir)
+}
+
+func (s *ProcessEnvSource) ResolveReferences(ctx context.Context, filename string, refs map[string]map[string]bool) ([]*Result, error) {
+	var mu sync.Mutex
+	found := make(map[string][]pkgDistance)
+	callback := &scanCallback{
+		rootFound: func(gopathwalk.Root) bool {
+			return true // We want everything.
+		},
+		dirFound: func(pkg *pkg) bool {
+			return pkgIsCandidate(filename, refs, pkg)
+		},
+		packageNameLoaded: func(pkg *pkg) bool {
+			if _, want := refs[pkg.packageName]; !want {
+				return false
+			}
+			if pkg.dir == s.srcDir && s.pkgName == pkg.packageName {
+				// The candidate is in the same directory and has the
+				// same package name. Don't try to import ourselves.
+				return false
+			}
+			if !canUse(filename, pkg.dir) {
+				return false
+			}
+			mu.Lock()
+			defer mu.Unlock()
+			found[pkg.packageName] = append(found[pkg.packageName], pkgDistance{pkg, distance(s.srcDir, pkg.dir)})
+			return false // We'll do our own loading after we sort.
+		},
+	}
+	resolver, err := s.env.GetResolver()
+	if err != nil {
+		return nil, err
+	}
+	if err := resolver.scan(ctx, callback); err != nil {
+		return nil, err
+	}
+
+	g, ctx := errgroup.WithContext(ctx)
+
+	searcher := symbolSearcher{
+		logf:        s.env.logf,
+		srcDir:      s.srcDir,
+		xtest:       strings.HasSuffix(s.pkgName, "_test"),
+		loadExports: resolver.loadExports,
+	}
+
+	var resultMu sync.Mutex
+	results := make(map[string]*Result, len(refs))
+	for pkgName, symbols := range refs {
+		g.Go(func() error {
+			found, err := searcher.search(ctx, found[pkgName], pkgName, symbols)
+			if err != nil {
+				return err
+			}
+			if found == nil {
+				return nil // No matching package.
+			}
+
+			imp := &ImportInfo{
+				ImportPath: found.importPathShort,
+			}
+			pkg := &PackageInfo{
+				Name:    pkgName,
+				Exports: symbols,
+			}
+			resultMu.Lock()
+			results[pkgName] = &Result{Import: imp, Package: pkg}
+			resultMu.Unlock()
+			return nil
+		})
+	}
+	if err := g.Wait(); err != nil {
+		return nil, err
+	}
+	var ans []*Result
+	for _, x := range results {
+		ans = append(ans, x)
+	}
+	return ans, nil
+}
diff --git a/test/integration/vendor/golang.org/x/tools/internal/imports/source_modindex.go b/test/integration/vendor/golang.org/x/tools/internal/imports/source_modindex.go
new file mode 100644
index 0000000000..05229f06ce
--- /dev/null
+++ b/test/integration/vendor/golang.org/x/tools/internal/imports/source_modindex.go
@@ -0,0 +1,103 @@
+// Copyright 2024 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 imports
+
+import (
+	"context"
+	"sync"
+	"time"
+
+	"golang.org/x/tools/internal/modindex"
+)
+
+// This code is here rather than in the modindex package
+// to avoid import loops
+
+// implements Source using modindex, so only for module cache.
+//
+// this is perhaps over-engineered. A new Index is read at first use.
+// And then Update is called after every 15 minutes, and a new Index
+// is read if the index changed. It is not clear the Mutex is needed.
+type IndexSource struct {
+	modcachedir string
+	mutex       sync.Mutex
+	ix          *modindex.Index
+	expires     time.Time
+}
+
+// create a new Source. Called from NewView in cache/session.go.
+func NewIndexSource(cachedir string) *IndexSource {
+	return &IndexSource{modcachedir: cachedir}
+}
+
+func (s *IndexSource) LoadPackageNames(ctx context.Context, srcDir string, paths []ImportPath) (map[ImportPath]PackageName, error) {
+	/// This is used by goimports to resolve the package names of imports of the
+	// current package, which is irrelevant for the module cache.
+	return nil, nil
+}
+
+func (s *IndexSource) ResolveReferences(ctx context.Context, filename string, missing References) ([]*Result, error) {
+	if err := s.maybeReadIndex(); err != nil {
+		return nil, err
+	}
+	var cs []modindex.Candidate
+	for pkg, nms := range missing {
+		for nm := range nms {
+			x := s.ix.Lookup(pkg, nm, false)
+			cs = append(cs, x...)
+		}
+	}
+	found := make(map[string]*Result)
+	for _, c := range cs {
+		var x *Result
+		if x = found[c.ImportPath]; x == nil {
+			x = &Result{
+				Import: &ImportInfo{
+					ImportPath: c.ImportPath,
+					Name:       "",
+				},
+				Package: &PackageInfo{
+					Name:    c.PkgName,
+					Exports: make(map[string]bool),
+				},
+			}
+			found[c.ImportPath] = x
+		}
+		x.Package.Exports[c.Name] = true
+	}
+	var ans []*Result
+	for _, x := range found {
+		ans = append(ans, x)
+	}
+	return ans, nil
+}
+
+func (s *IndexSource) maybeReadIndex() error {
+	s.mutex.Lock()
+	defer s.mutex.Unlock()
+
+	var readIndex bool
+	if time.Now().After(s.expires) {
+		ok, err := modindex.Update(s.modcachedir)
+		if err != nil {
+			return err
+		}
+		if ok {
+			readIndex = true
+		}
+	}
+
+	if readIndex || s.ix == nil {
+		ix, err := modindex.ReadIndex(s.modcachedir)
+		if err != nil {
+			return err
+		}
+		s.ix = ix
+		// for now refresh every 15 minutes
+		s.expires = time.Now().Add(time.Minute * 15)
+	}
+
+	return nil
+}
diff --git a/test/integration/vendor/golang.org/x/tools/internal/modindex/directories.go b/test/integration/vendor/golang.org/x/tools/internal/modindex/directories.go
new file mode 100644
index 0000000000..1e1a02f239
--- /dev/null
+++ b/test/integration/vendor/golang.org/x/tools/internal/modindex/directories.go
@@ -0,0 +1,135 @@
+// Copyright 2024 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 modindex
+
+import (
+	"fmt"
+	"log"
+	"os"
+	"path/filepath"
+	"regexp"
+	"slices"
+	"strings"
+	"sync"
+	"time"
+
+	"golang.org/x/mod/semver"
+	"golang.org/x/tools/internal/gopathwalk"
+)
+
+type directory struct {
+	path       Relpath
+	importPath string
+	version    string // semantic version
+	syms       []symbol
+}
+
+// filterDirs groups the directories by import path,
+// sorting the ones with the same import path by semantic version,
+// most recent first.
+func byImportPath(dirs []Relpath) (map[string][]*directory, error) {
+	ans := make(map[string][]*directory) // key is import path
+	for _, d := range dirs {
+		ip, sv, err := DirToImportPathVersion(d)
+		if err != nil {
+			return nil, err
+		}
+		ans[ip] = append(ans[ip], &directory{
+			path:       d,
+			importPath: ip,
+			version:    sv,
+		})
+	}
+	for k, v := range ans {
+		semanticSort(v)
+		ans[k] = v
+	}
+	return ans, nil
+}
+
+// sort the directories by semantic version, latest first
+func semanticSort(v []*directory) {
+	slices.SortFunc(v, func(l, r *directory) int {
+		if n := semver.Compare(l.version, r.version); n != 0 {
+			return -n // latest first
+		}
+		return strings.Compare(string(l.path), string(r.path))
+	})
+}
+
+// modCacheRegexp splits a relpathpath into module, module version, and package.
+var modCacheRegexp = regexp.MustCompile(`(.*)@([^/\\]*)(.*)`)
+
+// DirToImportPathVersion computes import path and semantic version
+func DirToImportPathVersion(dir Relpath) (string, string, error) {
+	m := modCacheRegexp.FindStringSubmatch(string(dir))
+	// m[1] is the module path
+	// m[2] is the version major.minor.patch(-
 1 && flds[1][1] == 'D',
+			}
+			if px.Type == Func {
+				n, err := strconv.Atoi(flds[2])
+				if err != nil {
+					continue // should never happen
+				}
+				px.Results = int16(n)
+				if len(flds) >= 4 {
+					sig := strings.Split(flds[3], " ")
+					for i := 0; i < len(sig); i++ {
+						// $ cannot otherwise occur. removing the spaces
+						// almost works, but for chan struct{}, e.g.
+						sig[i] = strings.Replace(sig[i], "$", " ", -1)
+					}
+					px.Sig = toFields(sig)
+				}
+			}
+			ans = append(ans, px)
+		}
+	}
+	return ans
+}
+
+func toFields(sig []string) []Field {
+	ans := make([]Field, len(sig)/2)
+	for i := 0; i < len(ans); i++ {
+		ans[i] = Field{Arg: sig[2*i], Type: sig[2*i+1]}
+	}
+	return ans
+}
+
+// benchmarks show this is measurably better than strings.Split
+// split into first 4 fields separated by single space
+func fastSplit(x string) []string {
+	ans := make([]string, 0, 4)
+	nxt := 0
+	start := 0
+	for i := 0; i < len(x); i++ {
+		if x[i] != ' ' {
+			continue
+		}
+		ans = append(ans, x[start:i])
+		nxt++
+		start = i + 1
+		if nxt >= 3 {
+			break
+		}
+	}
+	ans = append(ans, x[start:])
+	return ans
+}
+
+func asLexType(c byte) LexType {
+	switch c {
+	case 'C':
+		return Const
+	case 'V':
+		return Var
+	case 'T':
+		return Type
+	case 'F':
+		return Func
+	}
+	return -1
+}
diff --git a/test/integration/vendor/golang.org/x/tools/internal/modindex/modindex.go b/test/integration/vendor/golang.org/x/tools/internal/modindex/modindex.go
new file mode 100644
index 0000000000..355a53e71a
--- /dev/null
+++ b/test/integration/vendor/golang.org/x/tools/internal/modindex/modindex.go
@@ -0,0 +1,164 @@
+// Copyright 2024 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 modindex contains code for building and searching an index to
+// the Go module cache. The directory containing the index, returned by
+// IndexDir(), contains a file index-name- that contains the name
+// of the current index. We believe writing that short file is atomic.
+// ReadIndex reads that file to get the file name of the index.
+// WriteIndex writes an index with a unique name and then
+// writes that name into a new version of index-name-.
+// ( stands for the CurrentVersion of the index format.)
+package modindex
+
+import (
+	"path/filepath"
+	"slices"
+	"strings"
+	"time"
+
+	"golang.org/x/mod/semver"
+)
+
+// Create always creates a new index for the go module cache that is in cachedir.
+func Create(cachedir string) error {
+	_, err := indexModCache(cachedir, true)
+	return err
+}
+
+// Update the index for the go module cache that is in cachedir,
+// If there is no existing index it will build one.
+// If there are changed directories since the last index, it will
+// write a new one and return true. Otherwise it returns false.
+func Update(cachedir string) (bool, error) {
+	return indexModCache(cachedir, false)
+}
+
+// indexModCache writes an index current as of when it is called.
+// If clear is true the index is constructed from all of GOMODCACHE
+// otherwise the index is constructed from the last previous index
+// and the updates to the cache. It returns true if it wrote an index,
+// false otherwise.
+func indexModCache(cachedir string, clear bool) (bool, error) {
+	cachedir, err := filepath.Abs(cachedir)
+	if err != nil {
+		return false, err
+	}
+	cd := Abspath(cachedir)
+	future := time.Now().Add(24 * time.Hour) // safely in the future
+	ok, err := modindexTimed(future, cd, clear)
+	if err != nil {
+		return false, err
+	}
+	return ok, nil
+}
+
+// modindexTimed writes an index current as of onlyBefore.
+// If clear is true the index is constructed from all of GOMODCACHE
+// otherwise the index is constructed from the last previous index
+// and all the updates to the cache before onlyBefore.
+// It returns true if it wrote a new index, false if it wrote nothing.
+func modindexTimed(onlyBefore time.Time, cachedir Abspath, clear bool) (bool, error) {
+	var curIndex *Index
+	if !clear {
+		var err error
+		curIndex, err = ReadIndex(string(cachedir))
+		if clear && err != nil {
+			return false, err
+		}
+		// TODO(pjw): check that most of those directories still exist
+	}
+	cfg := &work{
+		onlyBefore: onlyBefore,
+		oldIndex:   curIndex,
+		cacheDir:   cachedir,
+	}
+	if curIndex != nil {
+		cfg.onlyAfter = curIndex.Changed
+	}
+	if err := cfg.buildIndex(); err != nil {
+		return false, err
+	}
+	if len(cfg.newIndex.Entries) == 0 && curIndex != nil {
+		// no changes from existing curIndex, don't write a new index
+		return false, nil
+	}
+	if err := cfg.writeIndex(); err != nil {
+		return false, err
+	}
+	return true, nil
+}
+
+type work struct {
+	onlyBefore time.Time // do not use directories later than this
+	onlyAfter  time.Time // only interested in directories after this
+	// directories from before onlyAfter come from oldIndex
+	oldIndex *Index
+	newIndex *Index
+	cacheDir Abspath
+}
+
+func (w *work) buildIndex() error {
+	// The effective date of the new index should be at least
+	// slightly earlier than when the directories are scanned
+	// so set it now.
+	w.newIndex = &Index{Changed: time.Now(), Cachedir: w.cacheDir}
+	dirs := findDirs(string(w.cacheDir), w.onlyAfter, w.onlyBefore)
+	if len(dirs) == 0 {
+		return nil
+	}
+	newdirs, err := byImportPath(dirs)
+	if err != nil {
+		return err
+	}
+	// for each import path it might occur only in newdirs,
+	// only in w.oldIndex, or in both.
+	// If it occurs in both, use the semantically later one
+	if w.oldIndex != nil {
+		for _, e := range w.oldIndex.Entries {
+			found, ok := newdirs[e.ImportPath]
+			if !ok {
+				w.newIndex.Entries = append(w.newIndex.Entries, e)
+				continue // use this one, there is no new one
+			}
+			if semver.Compare(found[0].version, e.Version) > 0 {
+				// use the new one
+			} else {
+				// use the old one, forget the new one
+				w.newIndex.Entries = append(w.newIndex.Entries, e)
+				delete(newdirs, e.ImportPath)
+			}
+		}
+	}
+	// get symbol information for all the new diredtories
+	getSymbols(w.cacheDir, newdirs)
+	// assemble the new index entries
+	for k, v := range newdirs {
+		d := v[0]
+		pkg, names := processSyms(d.syms)
+		if pkg == "" {
+			continue // PJW: does this ever happen?
+		}
+		entry := Entry{
+			PkgName:    pkg,
+			Dir:        d.path,
+			ImportPath: k,
+			Version:    d.version,
+			Names:      names,
+		}
+		w.newIndex.Entries = append(w.newIndex.Entries, entry)
+	}
+	// sort the entries in the new index
+	slices.SortFunc(w.newIndex.Entries, func(l, r Entry) int {
+		if n := strings.Compare(l.PkgName, r.PkgName); n != 0 {
+			return n
+		}
+		return strings.Compare(l.ImportPath, r.ImportPath)
+	})
+	return nil
+}
+
+func (w *work) writeIndex() error {
+	return writeIndex(w.cacheDir, w.newIndex)
+}
diff --git a/test/integration/vendor/golang.org/x/tools/internal/modindex/symbols.go b/test/integration/vendor/golang.org/x/tools/internal/modindex/symbols.go
new file mode 100644
index 0000000000..33bf2641f7
--- /dev/null
+++ b/test/integration/vendor/golang.org/x/tools/internal/modindex/symbols.go
@@ -0,0 +1,217 @@
+// Copyright 2024 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 modindex
+
+import (
+	"fmt"
+	"go/ast"
+	"go/parser"
+	"go/token"
+	"go/types"
+	"os"
+	"path/filepath"
+	"slices"
+	"strings"
+
+	"golang.org/x/sync/errgroup"
+)
+
+// The name of a symbol contains information about the symbol:
+//  T for types, TD if the type is deprecated
+//  C for consts, CD if the const is deprecated
+//  V for vars, VD if the var is deprecated
+// and for funcs:  F  ( )*
+// any spaces in  are replaced by $s so that the fields
+// of the name are space separated. F is replaced by FD if the func
+// is deprecated.
+type symbol struct {
+	pkg  string // name of the symbols's package
+	name string // declared name
+	kind string // T, C, V, or F
+	sig  string // signature information, for F
+}
+
+// find the symbols for the best directories
+func getSymbols(cd Abspath, dirs map[string][]*directory) {
+	var g errgroup.Group
+	g.SetLimit(-1) // maybe throttle this some day
+	for _, vv := range dirs {
+		// throttling some day?
+		d := vv[0]
+		g.Go(func() error {
+			thedir := filepath.Join(string(cd), string(d.path))
+			mode := parser.SkipObjectResolution | parser.ParseComments
+
+			fi, err := os.ReadDir(thedir)
+			if err != nil {
+				return nil // log this someday?
+			}
+			for _, fx := range fi {
+				if !strings.HasSuffix(fx.Name(), ".go") || strings.HasSuffix(fx.Name(), "_test.go") {
+					continue
+				}
+				fname := filepath.Join(thedir, fx.Name())
+				tr, err := parser.ParseFile(token.NewFileSet(), fname, nil, mode)
+				if err != nil {
+					continue // ignore errors, someday log them?
+				}
+				d.syms = append(d.syms, getFileExports(tr)...)
+			}
+			return nil
+		})
+	}
+	g.Wait()
+}
+
+func getFileExports(f *ast.File) []symbol {
+	pkg := f.Name.Name
+	if pkg == "main" {
+		return nil
+	}
+	var ans []symbol
+	// should we look for //go:build ignore?
+	for _, decl := range f.Decls {
+		switch decl := decl.(type) {
+		case *ast.FuncDecl:
+			if decl.Recv != nil {
+				// ignore methods, as we are completing package selections
+				continue
+			}
+			name := decl.Name.Name
+			dtype := decl.Type
+			// not looking at dtype.TypeParams. That is, treating
+			// generic functions just like non-generic ones.
+			sig := dtype.Params
+			kind := "F"
+			if isDeprecated(decl.Doc) {
+				kind += "D"
+			}
+			result := []string{fmt.Sprintf("%d", dtype.Results.NumFields())}
+			for _, x := range sig.List {
+				// This code creates a string representing the type.
+				// TODO(pjw): it may be fragile:
+				// 1. x.Type could be nil, perhaps in ill-formed code
+				// 2. ExprString might someday change incompatibly to
+				//    include struct tags, which can be arbitrary strings
+				if x.Type == nil {
+					// Can this happen without a parse error? (Files with parse
+					// errors are ignored in getSymbols)
+					continue // maybe report this someday
+				}
+				tp := types.ExprString(x.Type)
+				if len(tp) == 0 {
+					// Can this happen?
+					continue // maybe report this someday
+				}
+				// This is only safe if ExprString never returns anything with a $
+				// The only place a $ can occur seems to be in a struct tag, which
+				// can be an arbitrary string literal, and ExprString does not presently
+				// print struct tags. So for this to happen the type of a formal parameter
+				// has to be a explict struct, e.g. foo(x struct{a int "$"}) and ExprString
+				// would have to show the struct tag. Even testing for this case seems
+				// a waste of effort, but let's not ignore such pathologies
+				if strings.Contains(tp, "$") {
+					continue
+				}
+				tp = strings.Replace(tp, " ", "$", -1)
+				if len(x.Names) == 0 {
+					result = append(result, "_")
+					result = append(result, tp)
+				} else {
+					for _, y := range x.Names {
+						result = append(result, y.Name)
+						result = append(result, tp)
+					}
+				}
+			}
+			sigs := strings.Join(result, " ")
+			if s := newsym(pkg, name, kind, sigs); s != nil {
+				ans = append(ans, *s)
+			}
+		case *ast.GenDecl:
+			depr := isDeprecated(decl.Doc)
+			switch decl.Tok {
+			case token.CONST, token.VAR:
+				tp := "V"
+				if decl.Tok == token.CONST {
+					tp = "C"
+				}
+				if depr {
+					tp += "D"
+				}
+				for _, sp := range decl.Specs {
+					for _, x := range sp.(*ast.ValueSpec).Names {
+						if s := newsym(pkg, x.Name, tp, ""); s != nil {
+							ans = append(ans, *s)
+						}
+					}
+				}
+			case token.TYPE:
+				tp := "T"
+				if depr {
+					tp += "D"
+				}
+				for _, sp := range decl.Specs {
+					if s := newsym(pkg, sp.(*ast.TypeSpec).Name.Name, tp, ""); s != nil {
+						ans = append(ans, *s)
+					}
+				}
+			}
+		}
+	}
+	return ans
+}
+
+func newsym(pkg, name, kind, sig string) *symbol {
+	if len(name) == 0 || !ast.IsExported(name) {
+		return nil
+	}
+	sym := symbol{pkg: pkg, name: name, kind: kind, sig: sig}
+	return &sym
+}
+
+func isDeprecated(doc *ast.CommentGroup) bool {
+	if doc == nil {
+		return false
+	}
+	// go.dev/wiki/Deprecated Paragraph starting 'Deprecated:'
+	// This code fails for /* Deprecated: */, but it's the code from
+	// gopls/internal/analysis/deprecated
+	lines := strings.Split(doc.Text(), "\n\n")
+	for _, line := range lines {
+		if strings.HasPrefix(line, "Deprecated:") {
+			return true
+		}
+	}
+	return false
+}
+
+// return the package name and the value for the symbols.
+// if there are multiple packages, choose one arbitrarily
+// the returned slice is sorted lexicographically
+func processSyms(syms []symbol) (string, []string) {
+	if len(syms) == 0 {
+		return "", nil
+	}
+	slices.SortFunc(syms, func(l, r symbol) int {
+		return strings.Compare(l.name, r.name)
+	})
+	pkg := syms[0].pkg
+	var names []string
+	for _, s := range syms {
+		var nx string
+		if s.pkg == pkg {
+			if s.sig != "" {
+				nx = fmt.Sprintf("%s %s %s", s.name, s.kind, s.sig)
+			} else {
+				nx = fmt.Sprintf("%s %s", s.name, s.kind)
+			}
+			names = append(names, nx)
+		} else {
+			continue // PJW: do we want to keep track of these?
+		}
+	}
+	return pkg, names
+}
diff --git a/test/integration/vendor/golang.org/x/tools/internal/modindex/types.go b/test/integration/vendor/golang.org/x/tools/internal/modindex/types.go
new file mode 100644
index 0000000000..ece4488630
--- /dev/null
+++ b/test/integration/vendor/golang.org/x/tools/internal/modindex/types.go
@@ -0,0 +1,25 @@
+// Copyright 2024 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 modindex
+
+import (
+	"strings"
+)
+
+// some special types to avoid confusions
+
+// distinguish various types of directory names. It's easy to get confused.
+type Abspath string // absolute paths
+type Relpath string // paths with GOMODCACHE prefix removed
+
+func toRelpath(cachedir Abspath, s string) Relpath {
+	if strings.HasPrefix(s, string(cachedir)) {
+		if s == string(cachedir) {
+			return Relpath("")
+		}
+		return Relpath(s[len(cachedir)+1:])
+	}
+	return Relpath(s)
+}
diff --git a/test/integration/vendor/golang.org/x/tools/internal/packagesinternal/packages.go b/test/integration/vendor/golang.org/x/tools/internal/packagesinternal/packages.go
index 44719de173..66e69b4389 100644
--- a/test/integration/vendor/golang.org/x/tools/internal/packagesinternal/packages.go
+++ b/test/integration/vendor/golang.org/x/tools/internal/packagesinternal/packages.go
@@ -5,7 +5,6 @@
 // Package packagesinternal exposes internal-only fields from go/packages.
 package packagesinternal
 
-var GetForTest = func(p interface{}) string { return "" }
 var GetDepsErrors = func(p interface{}) []*PackageError { return nil }
 
 type PackageError struct {
@@ -16,7 +15,6 @@ type PackageError struct {
 
 var TypecheckCgo int
 var DepsErrors int // must be set as a LoadMode to call GetDepsErrors
-var ForTest int    // must be set as a LoadMode to call GetForTest
 
 var SetModFlag = func(config interface{}, value string) {}
 var SetModFile = func(config interface{}, value string) {}
diff --git a/test/integration/vendor/golang.org/x/tools/internal/stdlib/manifest.go b/test/integration/vendor/golang.org/x/tools/internal/stdlib/manifest.go
index cdaac9ab34..9f0b871ff6 100644
--- a/test/integration/vendor/golang.org/x/tools/internal/stdlib/manifest.go
+++ b/test/integration/vendor/golang.org/x/tools/internal/stdlib/manifest.go
@@ -268,6 +268,8 @@ var PackageSymbols = map[string][]Symbol{
 		{"ErrTooLarge", Var, 0},
 		{"Fields", Func, 0},
 		{"FieldsFunc", Func, 0},
+		{"FieldsFuncSeq", Func, 24},
+		{"FieldsSeq", Func, 24},
 		{"HasPrefix", Func, 0},
 		{"HasSuffix", Func, 0},
 		{"Index", Func, 0},
@@ -280,6 +282,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"LastIndexAny", Func, 0},
 		{"LastIndexByte", Func, 5},
 		{"LastIndexFunc", Func, 0},
+		{"Lines", Func, 24},
 		{"Map", Func, 0},
 		{"MinRead", Const, 0},
 		{"NewBuffer", Func, 0},
@@ -293,7 +296,9 @@ var PackageSymbols = map[string][]Symbol{
 		{"Split", Func, 0},
 		{"SplitAfter", Func, 0},
 		{"SplitAfterN", Func, 0},
+		{"SplitAfterSeq", Func, 24},
 		{"SplitN", Func, 0},
+		{"SplitSeq", Func, 24},
 		{"Title", Func, 0},
 		{"ToLower", Func, 0},
 		{"ToLowerSpecial", Func, 0},
@@ -535,6 +540,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"NewCTR", Func, 0},
 		{"NewGCM", Func, 2},
 		{"NewGCMWithNonceSize", Func, 5},
+		{"NewGCMWithRandomNonce", Func, 24},
 		{"NewGCMWithTagSize", Func, 11},
 		{"NewOFB", Func, 0},
 		{"Stream", Type, 0},
@@ -673,6 +679,14 @@ var PackageSymbols = map[string][]Symbol{
 		{"Unmarshal", Func, 0},
 		{"UnmarshalCompressed", Func, 15},
 	},
+	"crypto/fips140": {
+		{"Enabled", Func, 24},
+	},
+	"crypto/hkdf": {
+		{"Expand", Func, 24},
+		{"Extract", Func, 24},
+		{"Key", Func, 24},
+	},
 	"crypto/hmac": {
 		{"Equal", Func, 1},
 		{"New", Func, 0},
@@ -683,11 +697,43 @@ var PackageSymbols = map[string][]Symbol{
 		{"Size", Const, 0},
 		{"Sum", Func, 2},
 	},
+	"crypto/mlkem": {
+		{"(*DecapsulationKey1024).Bytes", Method, 24},
+		{"(*DecapsulationKey1024).Decapsulate", Method, 24},
+		{"(*DecapsulationKey1024).EncapsulationKey", Method, 24},
+		{"(*DecapsulationKey768).Bytes", Method, 24},
+		{"(*DecapsulationKey768).Decapsulate", Method, 24},
+		{"(*DecapsulationKey768).EncapsulationKey", Method, 24},
+		{"(*EncapsulationKey1024).Bytes", Method, 24},
+		{"(*EncapsulationKey1024).Encapsulate", Method, 24},
+		{"(*EncapsulationKey768).Bytes", Method, 24},
+		{"(*EncapsulationKey768).Encapsulate", Method, 24},
+		{"CiphertextSize1024", Const, 24},
+		{"CiphertextSize768", Const, 24},
+		{"DecapsulationKey1024", Type, 24},
+		{"DecapsulationKey768", Type, 24},
+		{"EncapsulationKey1024", Type, 24},
+		{"EncapsulationKey768", Type, 24},
+		{"EncapsulationKeySize1024", Const, 24},
+		{"EncapsulationKeySize768", Const, 24},
+		{"GenerateKey1024", Func, 24},
+		{"GenerateKey768", Func, 24},
+		{"NewDecapsulationKey1024", Func, 24},
+		{"NewDecapsulationKey768", Func, 24},
+		{"NewEncapsulationKey1024", Func, 24},
+		{"NewEncapsulationKey768", Func, 24},
+		{"SeedSize", Const, 24},
+		{"SharedKeySize", Const, 24},
+	},
+	"crypto/pbkdf2": {
+		{"Key", Func, 24},
+	},
 	"crypto/rand": {
 		{"Int", Func, 0},
 		{"Prime", Func, 0},
 		{"Read", Func, 0},
 		{"Reader", Var, 0},
+		{"Text", Func, 24},
 	},
 	"crypto/rc4": {
 		{"(*Cipher).Reset", Method, 0},
@@ -766,6 +812,39 @@ var PackageSymbols = map[string][]Symbol{
 		{"Sum224", Func, 2},
 		{"Sum256", Func, 2},
 	},
+	"crypto/sha3": {
+		{"(*SHA3).AppendBinary", Method, 24},
+		{"(*SHA3).BlockSize", Method, 24},
+		{"(*SHA3).MarshalBinary", Method, 24},
+		{"(*SHA3).Reset", Method, 24},
+		{"(*SHA3).Size", Method, 24},
+		{"(*SHA3).Sum", Method, 24},
+		{"(*SHA3).UnmarshalBinary", Method, 24},
+		{"(*SHA3).Write", Method, 24},
+		{"(*SHAKE).AppendBinary", Method, 24},
+		{"(*SHAKE).BlockSize", Method, 24},
+		{"(*SHAKE).MarshalBinary", Method, 24},
+		{"(*SHAKE).Read", Method, 24},
+		{"(*SHAKE).Reset", Method, 24},
+		{"(*SHAKE).UnmarshalBinary", Method, 24},
+		{"(*SHAKE).Write", Method, 24},
+		{"New224", Func, 24},
+		{"New256", Func, 24},
+		{"New384", Func, 24},
+		{"New512", Func, 24},
+		{"NewCSHAKE128", Func, 24},
+		{"NewCSHAKE256", Func, 24},
+		{"NewSHAKE128", Func, 24},
+		{"NewSHAKE256", Func, 24},
+		{"SHA3", Type, 24},
+		{"SHAKE", Type, 24},
+		{"Sum224", Func, 24},
+		{"Sum256", Func, 24},
+		{"Sum384", Func, 24},
+		{"Sum512", Func, 24},
+		{"SumSHAKE128", Func, 24},
+		{"SumSHAKE256", Func, 24},
+	},
 	"crypto/sha512": {
 		{"BlockSize", Const, 0},
 		{"New", Func, 0},
@@ -788,6 +867,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"ConstantTimeEq", Func, 0},
 		{"ConstantTimeLessOrEq", Func, 2},
 		{"ConstantTimeSelect", Func, 0},
+		{"WithDataIndependentTiming", Func, 24},
 		{"XORBytes", Func, 20},
 	},
 	"crypto/tls": {
@@ -864,6 +944,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"ClientHelloInfo", Type, 4},
 		{"ClientHelloInfo.CipherSuites", Field, 4},
 		{"ClientHelloInfo.Conn", Field, 8},
+		{"ClientHelloInfo.Extensions", Field, 24},
 		{"ClientHelloInfo.ServerName", Field, 4},
 		{"ClientHelloInfo.SignatureSchemes", Field, 8},
 		{"ClientHelloInfo.SupportedCurves", Field, 4},
@@ -881,6 +962,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"Config.CurvePreferences", Field, 3},
 		{"Config.DynamicRecordSizingDisabled", Field, 7},
 		{"Config.EncryptedClientHelloConfigList", Field, 23},
+		{"Config.EncryptedClientHelloKeys", Field, 24},
 		{"Config.EncryptedClientHelloRejectionVerify", Field, 23},
 		{"Config.GetCertificate", Field, 4},
 		{"Config.GetClientCertificate", Field, 8},
@@ -934,6 +1016,10 @@ var PackageSymbols = map[string][]Symbol{
 		{"ECHRejectionError", Type, 23},
 		{"ECHRejectionError.RetryConfigList", Field, 23},
 		{"Ed25519", Const, 13},
+		{"EncryptedClientHelloKey", Type, 24},
+		{"EncryptedClientHelloKey.Config", Field, 24},
+		{"EncryptedClientHelloKey.PrivateKey", Field, 24},
+		{"EncryptedClientHelloKey.SendAsRetry", Field, 24},
 		{"InsecureCipherSuites", Func, 14},
 		{"Listen", Func, 0},
 		{"LoadX509KeyPair", Func, 0},
@@ -1032,6 +1118,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"VersionTLS12", Const, 2},
 		{"VersionTLS13", Const, 12},
 		{"X25519", Const, 8},
+		{"X25519MLKEM768", Const, 24},
 		{"X509KeyPair", Func, 0},
 	},
 	"crypto/x509": {
@@ -1056,6 +1143,8 @@ var PackageSymbols = map[string][]Symbol{
 		{"(ConstraintViolationError).Error", Method, 0},
 		{"(HostnameError).Error", Method, 0},
 		{"(InsecureAlgorithmError).Error", Method, 6},
+		{"(OID).AppendBinary", Method, 24},
+		{"(OID).AppendText", Method, 24},
 		{"(OID).Equal", Method, 22},
 		{"(OID).EqualASN1OID", Method, 22},
 		{"(OID).MarshalBinary", Method, 23},
@@ -1084,6 +1173,10 @@ var PackageSymbols = map[string][]Symbol{
 		{"Certificate.Extensions", Field, 2},
 		{"Certificate.ExtraExtensions", Field, 2},
 		{"Certificate.IPAddresses", Field, 1},
+		{"Certificate.InhibitAnyPolicy", Field, 24},
+		{"Certificate.InhibitAnyPolicyZero", Field, 24},
+		{"Certificate.InhibitPolicyMapping", Field, 24},
+		{"Certificate.InhibitPolicyMappingZero", Field, 24},
 		{"Certificate.IsCA", Field, 0},
 		{"Certificate.Issuer", Field, 0},
 		{"Certificate.IssuingCertificateURL", Field, 2},
@@ -1100,6 +1193,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"Certificate.PermittedURIDomains", Field, 10},
 		{"Certificate.Policies", Field, 22},
 		{"Certificate.PolicyIdentifiers", Field, 0},
+		{"Certificate.PolicyMappings", Field, 24},
 		{"Certificate.PublicKey", Field, 0},
 		{"Certificate.PublicKeyAlgorithm", Field, 0},
 		{"Certificate.Raw", Field, 0},
@@ -1107,6 +1201,8 @@ var PackageSymbols = map[string][]Symbol{
 		{"Certificate.RawSubject", Field, 0},
 		{"Certificate.RawSubjectPublicKeyInfo", Field, 0},
 		{"Certificate.RawTBSCertificate", Field, 0},
+		{"Certificate.RequireExplicitPolicy", Field, 24},
+		{"Certificate.RequireExplicitPolicyZero", Field, 24},
 		{"Certificate.SerialNumber", Field, 0},
 		{"Certificate.Signature", Field, 0},
 		{"Certificate.SignatureAlgorithm", Field, 0},
@@ -1198,6 +1294,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"NameConstraintsWithoutSANs", Const, 10},
 		{"NameMismatch", Const, 8},
 		{"NewCertPool", Func, 0},
+		{"NoValidChains", Const, 24},
 		{"NotAuthorizedToSign", Const, 0},
 		{"OID", Type, 22},
 		{"OIDFromInts", Func, 22},
@@ -1219,6 +1316,9 @@ var PackageSymbols = map[string][]Symbol{
 		{"ParsePKCS8PrivateKey", Func, 0},
 		{"ParsePKIXPublicKey", Func, 0},
 		{"ParseRevocationList", Func, 19},
+		{"PolicyMapping", Type, 24},
+		{"PolicyMapping.IssuerDomainPolicy", Field, 24},
+		{"PolicyMapping.SubjectDomainPolicy", Field, 24},
 		{"PublicKeyAlgorithm", Type, 0},
 		{"PureEd25519", Const, 13},
 		{"RSA", Const, 0},
@@ -1265,6 +1365,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"UnknownPublicKeyAlgorithm", Const, 0},
 		{"UnknownSignatureAlgorithm", Const, 0},
 		{"VerifyOptions", Type, 0},
+		{"VerifyOptions.CertificatePolicies", Field, 24},
 		{"VerifyOptions.CurrentTime", Field, 0},
 		{"VerifyOptions.DNSName", Field, 0},
 		{"VerifyOptions.Intermediates", Field, 0},
@@ -1975,6 +2076,8 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*File).DynString", Method, 1},
 		{"(*File).DynValue", Method, 21},
 		{"(*File).DynamicSymbols", Method, 4},
+		{"(*File).DynamicVersionNeeds", Method, 24},
+		{"(*File).DynamicVersions", Method, 24},
 		{"(*File).ImportedLibraries", Method, 0},
 		{"(*File).ImportedSymbols", Method, 0},
 		{"(*File).Section", Method, 0},
@@ -2240,6 +2343,19 @@ var PackageSymbols = map[string][]Symbol{
 		{"DynFlag", Type, 0},
 		{"DynFlag1", Type, 21},
 		{"DynTag", Type, 0},
+		{"DynamicVersion", Type, 24},
+		{"DynamicVersion.Deps", Field, 24},
+		{"DynamicVersion.Flags", Field, 24},
+		{"DynamicVersion.Index", Field, 24},
+		{"DynamicVersion.Name", Field, 24},
+		{"DynamicVersionDep", Type, 24},
+		{"DynamicVersionDep.Dep", Field, 24},
+		{"DynamicVersionDep.Flags", Field, 24},
+		{"DynamicVersionDep.Index", Field, 24},
+		{"DynamicVersionFlag", Type, 24},
+		{"DynamicVersionNeed", Type, 24},
+		{"DynamicVersionNeed.Name", Field, 24},
+		{"DynamicVersionNeed.Needs", Field, 24},
 		{"EI_ABIVERSION", Const, 0},
 		{"EI_CLASS", Const, 0},
 		{"EI_DATA", Const, 0},
@@ -3726,8 +3842,19 @@ var PackageSymbols = map[string][]Symbol{
 		{"Symbol.Size", Field, 0},
 		{"Symbol.Value", Field, 0},
 		{"Symbol.Version", Field, 13},
+		{"Symbol.VersionIndex", Field, 24},
+		{"Symbol.VersionScope", Field, 24},
+		{"SymbolVersionScope", Type, 24},
 		{"Type", Type, 0},
+		{"VER_FLG_BASE", Const, 24},
+		{"VER_FLG_INFO", Const, 24},
+		{"VER_FLG_WEAK", Const, 24},
 		{"Version", Type, 0},
+		{"VersionScopeGlobal", Const, 24},
+		{"VersionScopeHidden", Const, 24},
+		{"VersionScopeLocal", Const, 24},
+		{"VersionScopeNone", Const, 24},
+		{"VersionScopeSpecific", Const, 24},
 	},
 	"debug/gosym": {
 		{"(*DecodingError).Error", Method, 0},
@@ -4453,8 +4580,10 @@ var PackageSymbols = map[string][]Symbol{
 		{"FS", Type, 16},
 	},
 	"encoding": {
+		{"BinaryAppender", Type, 24},
 		{"BinaryMarshaler", Type, 2},
 		{"BinaryUnmarshaler", Type, 2},
+		{"TextAppender", Type, 24},
 		{"TextMarshaler", Type, 2},
 		{"TextUnmarshaler", Type, 2},
 	},
@@ -5984,13 +6113,16 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*Interface).Complete", Method, 5},
 		{"(*Interface).Embedded", Method, 5},
 		{"(*Interface).EmbeddedType", Method, 11},
+		{"(*Interface).EmbeddedTypes", Method, 24},
 		{"(*Interface).Empty", Method, 5},
 		{"(*Interface).ExplicitMethod", Method, 5},
+		{"(*Interface).ExplicitMethods", Method, 24},
 		{"(*Interface).IsComparable", Method, 18},
 		{"(*Interface).IsImplicit", Method, 18},
 		{"(*Interface).IsMethodSet", Method, 18},
 		{"(*Interface).MarkImplicit", Method, 18},
 		{"(*Interface).Method", Method, 5},
+		{"(*Interface).Methods", Method, 24},
 		{"(*Interface).NumEmbeddeds", Method, 5},
 		{"(*Interface).NumExplicitMethods", Method, 5},
 		{"(*Interface).NumMethods", Method, 5},
@@ -6011,9 +6143,11 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*MethodSet).At", Method, 5},
 		{"(*MethodSet).Len", Method, 5},
 		{"(*MethodSet).Lookup", Method, 5},
+		{"(*MethodSet).Methods", Method, 24},
 		{"(*MethodSet).String", Method, 5},
 		{"(*Named).AddMethod", Method, 5},
 		{"(*Named).Method", Method, 5},
+		{"(*Named).Methods", Method, 24},
 		{"(*Named).NumMethods", Method, 5},
 		{"(*Named).Obj", Method, 5},
 		{"(*Named).Origin", Method, 18},
@@ -6054,6 +6188,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*Pointer).String", Method, 5},
 		{"(*Pointer).Underlying", Method, 5},
 		{"(*Scope).Child", Method, 5},
+		{"(*Scope).Children", Method, 24},
 		{"(*Scope).Contains", Method, 5},
 		{"(*Scope).End", Method, 5},
 		{"(*Scope).Innermost", Method, 5},
@@ -6089,6 +6224,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*StdSizes).Offsetsof", Method, 5},
 		{"(*StdSizes).Sizeof", Method, 5},
 		{"(*Struct).Field", Method, 5},
+		{"(*Struct).Fields", Method, 24},
 		{"(*Struct).NumFields", Method, 5},
 		{"(*Struct).String", Method, 5},
 		{"(*Struct).Tag", Method, 5},
@@ -6100,8 +6236,10 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*Tuple).Len", Method, 5},
 		{"(*Tuple).String", Method, 5},
 		{"(*Tuple).Underlying", Method, 5},
+		{"(*Tuple).Variables", Method, 24},
 		{"(*TypeList).At", Method, 18},
 		{"(*TypeList).Len", Method, 18},
+		{"(*TypeList).Types", Method, 24},
 		{"(*TypeName).Exported", Method, 5},
 		{"(*TypeName).Id", Method, 5},
 		{"(*TypeName).IsAlias", Method, 9},
@@ -6119,9 +6257,11 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*TypeParam).Underlying", Method, 18},
 		{"(*TypeParamList).At", Method, 18},
 		{"(*TypeParamList).Len", Method, 18},
+		{"(*TypeParamList).TypeParams", Method, 24},
 		{"(*Union).Len", Method, 18},
 		{"(*Union).String", Method, 18},
 		{"(*Union).Term", Method, 18},
+		{"(*Union).Terms", Method, 24},
 		{"(*Union).Underlying", Method, 18},
 		{"(*Var).Anonymous", Method, 5},
 		{"(*Var).Embedded", Method, 11},
@@ -6392,10 +6532,12 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*Hash).WriteByte", Method, 14},
 		{"(*Hash).WriteString", Method, 14},
 		{"Bytes", Func, 19},
+		{"Comparable", Func, 24},
 		{"Hash", Type, 14},
 		{"MakeSeed", Func, 14},
 		{"Seed", Type, 14},
 		{"String", Func, 19},
+		{"WriteComparable", Func, 24},
 	},
 	"html": {
 		{"EscapeString", Func, 0},
@@ -7082,6 +7224,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*JSONHandler).WithGroup", Method, 21},
 		{"(*Level).UnmarshalJSON", Method, 21},
 		{"(*Level).UnmarshalText", Method, 21},
+		{"(*LevelVar).AppendText", Method, 24},
 		{"(*LevelVar).Level", Method, 21},
 		{"(*LevelVar).MarshalText", Method, 21},
 		{"(*LevelVar).Set", Method, 21},
@@ -7110,6 +7253,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"(Attr).Equal", Method, 21},
 		{"(Attr).String", Method, 21},
 		{"(Kind).String", Method, 21},
+		{"(Level).AppendText", Method, 24},
 		{"(Level).Level", Method, 21},
 		{"(Level).MarshalJSON", Method, 21},
 		{"(Level).MarshalText", Method, 21},
@@ -7140,6 +7284,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"Debug", Func, 21},
 		{"DebugContext", Func, 21},
 		{"Default", Func, 21},
+		{"DiscardHandler", Var, 24},
 		{"Duration", Func, 21},
 		{"DurationValue", Func, 21},
 		{"Error", Func, 21},
@@ -7375,6 +7520,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*Float).Acc", Method, 5},
 		{"(*Float).Add", Method, 5},
 		{"(*Float).Append", Method, 5},
+		{"(*Float).AppendText", Method, 24},
 		{"(*Float).Cmp", Method, 5},
 		{"(*Float).Copy", Method, 5},
 		{"(*Float).Float32", Method, 5},
@@ -7421,6 +7567,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*Int).And", Method, 0},
 		{"(*Int).AndNot", Method, 0},
 		{"(*Int).Append", Method, 6},
+		{"(*Int).AppendText", Method, 24},
 		{"(*Int).Binomial", Method, 0},
 		{"(*Int).Bit", Method, 0},
 		{"(*Int).BitLen", Method, 0},
@@ -7477,6 +7624,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*Int).Xor", Method, 0},
 		{"(*Rat).Abs", Method, 0},
 		{"(*Rat).Add", Method, 0},
+		{"(*Rat).AppendText", Method, 24},
 		{"(*Rat).Cmp", Method, 0},
 		{"(*Rat).Denom", Method, 0},
 		{"(*Rat).Float32", Method, 4},
@@ -7659,11 +7807,13 @@ var PackageSymbols = map[string][]Symbol{
 		{"Zipf", Type, 0},
 	},
 	"math/rand/v2": {
+		{"(*ChaCha8).AppendBinary", Method, 24},
 		{"(*ChaCha8).MarshalBinary", Method, 22},
 		{"(*ChaCha8).Read", Method, 23},
 		{"(*ChaCha8).Seed", Method, 22},
 		{"(*ChaCha8).Uint64", Method, 22},
 		{"(*ChaCha8).UnmarshalBinary", Method, 22},
+		{"(*PCG).AppendBinary", Method, 24},
 		{"(*PCG).MarshalBinary", Method, 22},
 		{"(*PCG).Seed", Method, 22},
 		{"(*PCG).Uint64", Method, 22},
@@ -7931,6 +8081,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*UnixListener).SyscallConn", Method, 10},
 		{"(Flags).String", Method, 0},
 		{"(HardwareAddr).String", Method, 0},
+		{"(IP).AppendText", Method, 24},
 		{"(IP).DefaultMask", Method, 0},
 		{"(IP).Equal", Method, 0},
 		{"(IP).IsGlobalUnicast", Method, 0},
@@ -8131,6 +8282,9 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*MaxBytesError).Error", Method, 19},
 		{"(*ProtocolError).Error", Method, 0},
 		{"(*ProtocolError).Is", Method, 21},
+		{"(*Protocols).SetHTTP1", Method, 24},
+		{"(*Protocols).SetHTTP2", Method, 24},
+		{"(*Protocols).SetUnencryptedHTTP2", Method, 24},
 		{"(*Request).AddCookie", Method, 0},
 		{"(*Request).BasicAuth", Method, 4},
 		{"(*Request).Clone", Method, 13},
@@ -8190,6 +8344,10 @@ var PackageSymbols = map[string][]Symbol{
 		{"(Header).Values", Method, 14},
 		{"(Header).Write", Method, 0},
 		{"(Header).WriteSubset", Method, 0},
+		{"(Protocols).HTTP1", Method, 24},
+		{"(Protocols).HTTP2", Method, 24},
+		{"(Protocols).String", Method, 24},
+		{"(Protocols).UnencryptedHTTP2", Method, 24},
 		{"AllowQuerySemicolons", Func, 17},
 		{"CanonicalHeaderKey", Func, 0},
 		{"Client", Type, 0},
@@ -8252,6 +8410,18 @@ var PackageSymbols = map[string][]Symbol{
 		{"FileSystem", Type, 0},
 		{"Flusher", Type, 0},
 		{"Get", Func, 0},
+		{"HTTP2Config", Type, 24},
+		{"HTTP2Config.CountError", Field, 24},
+		{"HTTP2Config.MaxConcurrentStreams", Field, 24},
+		{"HTTP2Config.MaxDecoderHeaderTableSize", Field, 24},
+		{"HTTP2Config.MaxEncoderHeaderTableSize", Field, 24},
+		{"HTTP2Config.MaxReadFrameSize", Field, 24},
+		{"HTTP2Config.MaxReceiveBufferPerConnection", Field, 24},
+		{"HTTP2Config.MaxReceiveBufferPerStream", Field, 24},
+		{"HTTP2Config.PermitProhibitedCipherSuites", Field, 24},
+		{"HTTP2Config.PingTimeout", Field, 24},
+		{"HTTP2Config.SendPingTimeout", Field, 24},
+		{"HTTP2Config.WriteByteTimeout", Field, 24},
 		{"Handle", Func, 0},
 		{"HandleFunc", Func, 0},
 		{"Handler", Type, 0},
@@ -8292,6 +8462,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"PostForm", Func, 0},
 		{"ProtocolError", Type, 0},
 		{"ProtocolError.ErrorString", Field, 0},
+		{"Protocols", Type, 24},
 		{"ProxyFromEnvironment", Func, 0},
 		{"ProxyURL", Func, 0},
 		{"PushOptions", Type, 8},
@@ -8361,9 +8532,11 @@ var PackageSymbols = map[string][]Symbol{
 		{"Server.ConnState", Field, 3},
 		{"Server.DisableGeneralOptionsHandler", Field, 20},
 		{"Server.ErrorLog", Field, 3},
+		{"Server.HTTP2", Field, 24},
 		{"Server.Handler", Field, 0},
 		{"Server.IdleTimeout", Field, 8},
 		{"Server.MaxHeaderBytes", Field, 0},
+		{"Server.Protocols", Field, 24},
 		{"Server.ReadHeaderTimeout", Field, 8},
 		{"Server.ReadTimeout", Field, 0},
 		{"Server.TLSConfig", Field, 0},
@@ -8453,12 +8626,14 @@ var PackageSymbols = map[string][]Symbol{
 		{"Transport.ExpectContinueTimeout", Field, 6},
 		{"Transport.ForceAttemptHTTP2", Field, 13},
 		{"Transport.GetProxyConnectHeader", Field, 16},
+		{"Transport.HTTP2", Field, 24},
 		{"Transport.IdleConnTimeout", Field, 7},
 		{"Transport.MaxConnsPerHost", Field, 11},
 		{"Transport.MaxIdleConns", Field, 7},
 		{"Transport.MaxIdleConnsPerHost", Field, 0},
 		{"Transport.MaxResponseHeaderBytes", Field, 7},
 		{"Transport.OnProxyConnectResponse", Field, 20},
+		{"Transport.Protocols", Field, 24},
 		{"Transport.Proxy", Field, 0},
 		{"Transport.ProxyConnectHeader", Field, 8},
 		{"Transport.ReadBufferSize", Field, 13},
@@ -8646,6 +8821,8 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*AddrPort).UnmarshalText", Method, 18},
 		{"(*Prefix).UnmarshalBinary", Method, 18},
 		{"(*Prefix).UnmarshalText", Method, 18},
+		{"(Addr).AppendBinary", Method, 24},
+		{"(Addr).AppendText", Method, 24},
 		{"(Addr).AppendTo", Method, 18},
 		{"(Addr).As16", Method, 18},
 		{"(Addr).As4", Method, 18},
@@ -8676,6 +8853,8 @@ var PackageSymbols = map[string][]Symbol{
 		{"(Addr).WithZone", Method, 18},
 		{"(Addr).Zone", Method, 18},
 		{"(AddrPort).Addr", Method, 18},
+		{"(AddrPort).AppendBinary", Method, 24},
+		{"(AddrPort).AppendText", Method, 24},
 		{"(AddrPort).AppendTo", Method, 18},
 		{"(AddrPort).Compare", Method, 22},
 		{"(AddrPort).IsValid", Method, 18},
@@ -8684,6 +8863,8 @@ var PackageSymbols = map[string][]Symbol{
 		{"(AddrPort).Port", Method, 18},
 		{"(AddrPort).String", Method, 18},
 		{"(Prefix).Addr", Method, 18},
+		{"(Prefix).AppendBinary", Method, 24},
+		{"(Prefix).AppendText", Method, 24},
 		{"(Prefix).AppendTo", Method, 18},
 		{"(Prefix).Bits", Method, 18},
 		{"(Prefix).Contains", Method, 18},
@@ -8868,6 +9049,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*Error).Temporary", Method, 6},
 		{"(*Error).Timeout", Method, 6},
 		{"(*Error).Unwrap", Method, 13},
+		{"(*URL).AppendBinary", Method, 24},
 		{"(*URL).EscapedFragment", Method, 15},
 		{"(*URL).EscapedPath", Method, 5},
 		{"(*URL).Hostname", Method, 8},
@@ -8967,6 +9149,17 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*ProcessState).SysUsage", Method, 0},
 		{"(*ProcessState).SystemTime", Method, 0},
 		{"(*ProcessState).UserTime", Method, 0},
+		{"(*Root).Close", Method, 24},
+		{"(*Root).Create", Method, 24},
+		{"(*Root).FS", Method, 24},
+		{"(*Root).Lstat", Method, 24},
+		{"(*Root).Mkdir", Method, 24},
+		{"(*Root).Name", Method, 24},
+		{"(*Root).Open", Method, 24},
+		{"(*Root).OpenFile", Method, 24},
+		{"(*Root).OpenRoot", Method, 24},
+		{"(*Root).Remove", Method, 24},
+		{"(*Root).Stat", Method, 24},
 		{"(*SyscallError).Error", Method, 0},
 		{"(*SyscallError).Timeout", Method, 10},
 		{"(*SyscallError).Unwrap", Method, 13},
@@ -9060,6 +9253,8 @@ var PackageSymbols = map[string][]Symbol{
 		{"O_WRONLY", Const, 0},
 		{"Open", Func, 0},
 		{"OpenFile", Func, 0},
+		{"OpenInRoot", Func, 24},
+		{"OpenRoot", Func, 24},
 		{"PathError", Type, 0},
 		{"PathError.Err", Field, 0},
 		{"PathError.Op", Field, 0},
@@ -9081,6 +9276,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"Remove", Func, 0},
 		{"RemoveAll", Func, 0},
 		{"Rename", Func, 0},
+		{"Root", Type, 24},
 		{"SEEK_CUR", Const, 0},
 		{"SEEK_END", Const, 0},
 		{"SEEK_SET", Const, 0},
@@ -9422,6 +9618,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"Zero", Func, 0},
 	},
 	"regexp": {
+		{"(*Regexp).AppendText", Method, 24},
 		{"(*Regexp).Copy", Method, 6},
 		{"(*Regexp).Expand", Method, 0},
 		{"(*Regexp).ExpandString", Method, 0},
@@ -9602,6 +9799,8 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*StackRecord).Stack", Method, 0},
 		{"(*TypeAssertionError).Error", Method, 0},
 		{"(*TypeAssertionError).RuntimeError", Method, 0},
+		{"(Cleanup).Stop", Method, 24},
+		{"AddCleanup", Func, 24},
 		{"BlockProfile", Func, 1},
 		{"BlockProfileRecord", Type, 1},
 		{"BlockProfileRecord.Count", Field, 1},
@@ -9612,6 +9811,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"Caller", Func, 0},
 		{"Callers", Func, 0},
 		{"CallersFrames", Func, 7},
+		{"Cleanup", Type, 24},
 		{"Compiler", Const, 0},
 		{"Error", Type, 0},
 		{"Frame", Type, 7},
@@ -9974,6 +10174,8 @@ var PackageSymbols = map[string][]Symbol{
 		{"EqualFold", Func, 0},
 		{"Fields", Func, 0},
 		{"FieldsFunc", Func, 0},
+		{"FieldsFuncSeq", Func, 24},
+		{"FieldsSeq", Func, 24},
 		{"HasPrefix", Func, 0},
 		{"HasSuffix", Func, 0},
 		{"Index", Func, 0},
@@ -9986,6 +10188,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"LastIndexAny", Func, 0},
 		{"LastIndexByte", Func, 5},
 		{"LastIndexFunc", Func, 0},
+		{"Lines", Func, 24},
 		{"Map", Func, 0},
 		{"NewReader", Func, 0},
 		{"NewReplacer", Func, 0},
@@ -9997,7 +10200,9 @@ var PackageSymbols = map[string][]Symbol{
 		{"Split", Func, 0},
 		{"SplitAfter", Func, 0},
 		{"SplitAfterN", Func, 0},
+		{"SplitAfterSeq", Func, 24},
 		{"SplitN", Func, 0},
+		{"SplitSeq", Func, 24},
 		{"Title", Func, 0},
 		{"ToLower", Func, 0},
 		{"ToLowerSpecial", Func, 0},
@@ -16413,7 +16618,9 @@ var PackageSymbols = map[string][]Symbol{
 		{"ValueOf", Func, 0},
 	},
 	"testing": {
+		{"(*B).Chdir", Method, 24},
 		{"(*B).Cleanup", Method, 14},
+		{"(*B).Context", Method, 24},
 		{"(*B).Elapsed", Method, 20},
 		{"(*B).Error", Method, 0},
 		{"(*B).Errorf", Method, 0},
@@ -16425,6 +16632,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*B).Helper", Method, 9},
 		{"(*B).Log", Method, 0},
 		{"(*B).Logf", Method, 0},
+		{"(*B).Loop", Method, 24},
 		{"(*B).Name", Method, 8},
 		{"(*B).ReportAllocs", Method, 1},
 		{"(*B).ReportMetric", Method, 13},
@@ -16442,7 +16650,9 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*B).StopTimer", Method, 0},
 		{"(*B).TempDir", Method, 15},
 		{"(*F).Add", Method, 18},
+		{"(*F).Chdir", Method, 24},
 		{"(*F).Cleanup", Method, 18},
+		{"(*F).Context", Method, 24},
 		{"(*F).Error", Method, 18},
 		{"(*F).Errorf", Method, 18},
 		{"(*F).Fail", Method, 18},
@@ -16463,7 +16673,9 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*F).TempDir", Method, 18},
 		{"(*M).Run", Method, 4},
 		{"(*PB).Next", Method, 3},
+		{"(*T).Chdir", Method, 24},
 		{"(*T).Cleanup", Method, 14},
+		{"(*T).Context", Method, 24},
 		{"(*T).Deadline", Method, 15},
 		{"(*T).Error", Method, 0},
 		{"(*T).Errorf", Method, 0},
@@ -16954,7 +17166,9 @@ var PackageSymbols = map[string][]Symbol{
 		{"(Time).Add", Method, 0},
 		{"(Time).AddDate", Method, 0},
 		{"(Time).After", Method, 0},
+		{"(Time).AppendBinary", Method, 24},
 		{"(Time).AppendFormat", Method, 5},
+		{"(Time).AppendText", Method, 24},
 		{"(Time).Before", Method, 0},
 		{"(Time).Clock", Method, 0},
 		{"(Time).Compare", Method, 20},
@@ -17428,4 +17642,9 @@ var PackageSymbols = map[string][]Symbol{
 		{"String", Func, 0},
 		{"StringData", Func, 0},
 	},
+	"weak": {
+		{"(Pointer).Value", Method, 24},
+		{"Make", Func, 24},
+		{"Pointer", Type, 24},
+	},
 }
diff --git a/test/integration/vendor/golang.org/x/tools/internal/tokeninternal/tokeninternal.go b/test/integration/vendor/golang.org/x/tools/internal/tokeninternal/tokeninternal.go
deleted file mode 100644
index ff9437a36c..0000000000
--- a/test/integration/vendor/golang.org/x/tools/internal/tokeninternal/tokeninternal.go
+++ /dev/null
@@ -1,137 +0,0 @@
-// Copyright 2023 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 tokeninternal provides access to some internal features of the token
-// package.
-package tokeninternal
-
-import (
-	"fmt"
-	"go/token"
-	"sort"
-	"sync"
-	"unsafe"
-)
-
-// GetLines returns the table of line-start offsets from a token.File.
-func GetLines(file *token.File) []int {
-	// token.File has a Lines method on Go 1.21 and later.
-	if file, ok := (interface{})(file).(interface{ Lines() []int }); ok {
-		return file.Lines()
-	}
-
-	// This declaration must match that of token.File.
-	// This creates a risk of dependency skew.
-	// For now we check that the size of the two
-	// declarations is the same, on the (fragile) assumption
-	// that future changes would add fields.
-	type tokenFile119 struct {
-		_     string
-		_     int
-		_     int
-		mu    sync.Mutex // we're not complete monsters
-		lines []int
-		_     []struct{}
-	}
-
-	if unsafe.Sizeof(*file) != unsafe.Sizeof(tokenFile119{}) {
-		panic("unexpected token.File size")
-	}
-	var ptr *tokenFile119
-	type uP = unsafe.Pointer
-	*(*uP)(uP(&ptr)) = uP(file)
-	ptr.mu.Lock()
-	defer ptr.mu.Unlock()
-	return ptr.lines
-}
-
-// AddExistingFiles adds the specified files to the FileSet if they
-// are not already present. It panics if any pair of files in the
-// resulting FileSet would overlap.
-func AddExistingFiles(fset *token.FileSet, files []*token.File) {
-	// Punch through the FileSet encapsulation.
-	type tokenFileSet struct {
-		// This type remained essentially consistent from go1.16 to go1.21.
-		mutex sync.RWMutex
-		base  int
-		files []*token.File
-		_     *token.File // changed to atomic.Pointer[token.File] in go1.19
-	}
-
-	// If the size of token.FileSet changes, this will fail to compile.
-	const delta = int64(unsafe.Sizeof(tokenFileSet{})) - int64(unsafe.Sizeof(token.FileSet{}))
-	var _ [-delta * delta]int
-
-	type uP = unsafe.Pointer
-	var ptr *tokenFileSet
-	*(*uP)(uP(&ptr)) = uP(fset)
-	ptr.mutex.Lock()
-	defer ptr.mutex.Unlock()
-
-	// Merge and sort.
-	newFiles := append(ptr.files, files...)
-	sort.Slice(newFiles, func(i, j int) bool {
-		return newFiles[i].Base() < newFiles[j].Base()
-	})
-
-	// Reject overlapping files.
-	// Discard adjacent identical files.
-	out := newFiles[:0]
-	for i, file := range newFiles {
-		if i > 0 {
-			prev := newFiles[i-1]
-			if file == prev {
-				continue
-			}
-			if prev.Base()+prev.Size()+1 > file.Base() {
-				panic(fmt.Sprintf("file %s (%d-%d) overlaps with file %s (%d-%d)",
-					prev.Name(), prev.Base(), prev.Base()+prev.Size(),
-					file.Name(), file.Base(), file.Base()+file.Size()))
-			}
-		}
-		out = append(out, file)
-	}
-	newFiles = out
-
-	ptr.files = newFiles
-
-	// Advance FileSet.Base().
-	if len(newFiles) > 0 {
-		last := newFiles[len(newFiles)-1]
-		newBase := last.Base() + last.Size() + 1
-		if ptr.base < newBase {
-			ptr.base = newBase
-		}
-	}
-}
-
-// FileSetFor returns a new FileSet containing a sequence of new Files with
-// the same base, size, and line as the input files, for use in APIs that
-// require a FileSet.
-//
-// Precondition: the input files must be non-overlapping, and sorted in order
-// of their Base.
-func FileSetFor(files ...*token.File) *token.FileSet {
-	fset := token.NewFileSet()
-	for _, f := range files {
-		f2 := fset.AddFile(f.Name(), f.Base(), f.Size())
-		lines := GetLines(f)
-		f2.SetLines(lines)
-	}
-	return fset
-}
-
-// CloneFileSet creates a new FileSet holding all files in fset. It does not
-// create copies of the token.Files in fset: they are added to the resulting
-// FileSet unmodified.
-func CloneFileSet(fset *token.FileSet) *token.FileSet {
-	var files []*token.File
-	fset.Iterate(func(f *token.File) bool {
-		files = append(files, f)
-		return true
-	})
-	newFileSet := token.NewFileSet()
-	AddExistingFiles(newFileSet, files)
-	return newFileSet
-}
diff --git a/test/integration/vendor/golang.org/x/tools/internal/typeparams/common.go b/test/integration/vendor/golang.org/x/tools/internal/typeparams/common.go
index 89bd256dc6..cdae2b8e81 100644
--- a/test/integration/vendor/golang.org/x/tools/internal/typeparams/common.go
+++ b/test/integration/vendor/golang.org/x/tools/internal/typeparams/common.go
@@ -16,8 +16,6 @@ import (
 	"go/ast"
 	"go/token"
 	"go/types"
-
-	"golang.org/x/tools/internal/aliases"
 )
 
 // UnpackIndexExpr extracts data from AST nodes that represent index
@@ -65,78 +63,6 @@ func PackIndexExpr(x ast.Expr, lbrack token.Pos, indices []ast.Expr, rbrack toke
 
 // IsTypeParam reports whether t is a type parameter (or an alias of one).
 func IsTypeParam(t types.Type) bool {
-	_, ok := aliases.Unalias(t).(*types.TypeParam)
+	_, ok := types.Unalias(t).(*types.TypeParam)
 	return ok
 }
-
-// GenericAssignableTo is a generalization of types.AssignableTo that
-// implements the following rule for uninstantiated generic types:
-//
-// If V and T are generic named types, then V is considered assignable to T if,
-// for every possible instantiation of V[A_1, ..., A_N], the instantiation
-// T[A_1, ..., A_N] is valid and V[A_1, ..., A_N] implements T[A_1, ..., A_N].
-//
-// If T has structural constraints, they must be satisfied by V.
-//
-// For example, consider the following type declarations:
-//
-//	type Interface[T any] interface {
-//		Accept(T)
-//	}
-//
-//	type Container[T any] struct {
-//		Element T
-//	}
-//
-//	func (c Container[T]) Accept(t T) { c.Element = t }
-//
-// In this case, GenericAssignableTo reports that instantiations of Container
-// are assignable to the corresponding instantiation of Interface.
-func GenericAssignableTo(ctxt *types.Context, V, T types.Type) bool {
-	V = aliases.Unalias(V)
-	T = aliases.Unalias(T)
-
-	// If V and T are not both named, or do not have matching non-empty type
-	// parameter lists, fall back on types.AssignableTo.
-
-	VN, Vnamed := V.(*types.Named)
-	TN, Tnamed := T.(*types.Named)
-	if !Vnamed || !Tnamed {
-		return types.AssignableTo(V, T)
-	}
-
-	vtparams := VN.TypeParams()
-	ttparams := TN.TypeParams()
-	if vtparams.Len() == 0 || vtparams.Len() != ttparams.Len() || VN.TypeArgs().Len() != 0 || TN.TypeArgs().Len() != 0 {
-		return types.AssignableTo(V, T)
-	}
-
-	// V and T have the same (non-zero) number of type params. Instantiate both
-	// with the type parameters of V. This must always succeed for V, and will
-	// succeed for T if and only if the type set of each type parameter of V is a
-	// subset of the type set of the corresponding type parameter of T, meaning
-	// that every instantiation of V corresponds to a valid instantiation of T.
-
-	// Minor optimization: ensure we share a context across the two
-	// instantiations below.
-	if ctxt == nil {
-		ctxt = types.NewContext()
-	}
-
-	var targs []types.Type
-	for i := 0; i < vtparams.Len(); i++ {
-		targs = append(targs, vtparams.At(i))
-	}
-
-	vinst, err := types.Instantiate(ctxt, V, targs, true)
-	if err != nil {
-		panic("type parameters should satisfy their own constraints")
-	}
-
-	tinst, err := types.Instantiate(ctxt, T, targs, true)
-	if err != nil {
-		return false
-	}
-
-	return types.AssignableTo(vinst, tinst)
-}
diff --git a/test/integration/vendor/golang.org/x/tools/internal/typeparams/free.go b/test/integration/vendor/golang.org/x/tools/internal/typeparams/free.go
index a1d138226c..0ade5c2949 100644
--- a/test/integration/vendor/golang.org/x/tools/internal/typeparams/free.go
+++ b/test/integration/vendor/golang.org/x/tools/internal/typeparams/free.go
@@ -37,8 +37,20 @@ func (w *Free) Has(typ types.Type) (res bool) {
 	case nil, *types.Basic: // TODO(gri) should nil be handled here?
 		break
 
-	case *aliases.Alias:
-		return w.Has(aliases.Unalias(t))
+	case *types.Alias:
+		if aliases.TypeParams(t).Len() > aliases.TypeArgs(t).Len() {
+			return true // This is an uninstantiated Alias.
+		}
+		// The expansion of an alias can have free type parameters,
+		// whether or not the alias itself has type parameters:
+		//
+		//   func _[K comparable]() {
+		//     type Set      = map[K]bool // free(Set)      = {K}
+		//     type MapTo[V] = map[K]V    // free(Map[foo]) = {V}
+		//   }
+		//
+		// So, we must Unalias.
+		return w.Has(types.Unalias(t))
 
 	case *types.Array:
 		return w.Has(t.Elem())
@@ -98,9 +110,8 @@ func (w *Free) Has(typ types.Type) (res bool) {
 
 	case *types.Named:
 		args := t.TypeArgs()
-		// TODO(taking): this does not match go/types/infer.go. Check with rfindley.
 		if params := t.TypeParams(); params.Len() > args.Len() {
-			return true
+			return true // this is an uninstantiated named type.
 		}
 		for i, n := 0, args.Len(); i < n; i++ {
 			if w.Has(args.At(i)) {
diff --git a/test/integration/vendor/golang.org/x/tools/internal/typesinternal/element.go b/test/integration/vendor/golang.org/x/tools/internal/typesinternal/element.go
new file mode 100644
index 0000000000..4957f02164
--- /dev/null
+++ b/test/integration/vendor/golang.org/x/tools/internal/typesinternal/element.go
@@ -0,0 +1,133 @@
+// Copyright 2024 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 typesinternal
+
+import (
+	"fmt"
+	"go/types"
+
+	"golang.org/x/tools/go/types/typeutil"
+)
+
+// ForEachElement calls f for type T and each type reachable from its
+// type through reflection. It does this by recursively stripping off
+// type constructors; in addition, for each named type N, the type *N
+// is added to the result as it may have additional methods.
+//
+// The caller must provide an initially empty set used to de-duplicate
+// identical types, potentially across multiple calls to ForEachElement.
+// (Its final value holds all the elements seen, matching the arguments
+// passed to f.)
+//
+// TODO(adonovan): share/harmonize with go/callgraph/rta.
+func ForEachElement(rtypes *typeutil.Map, msets *typeutil.MethodSetCache, T types.Type, f func(types.Type)) {
+	var visit func(T types.Type, skip bool)
+	visit = func(T types.Type, skip bool) {
+		if !skip {
+			if seen, _ := rtypes.Set(T, true).(bool); seen {
+				return // de-dup
+			}
+
+			f(T) // notify caller of new element type
+		}
+
+		// Recursion over signatures of each method.
+		tmset := msets.MethodSet(T)
+		for i := 0; i < tmset.Len(); i++ {
+			sig := tmset.At(i).Type().(*types.Signature)
+			// It is tempting to call visit(sig, false)
+			// but, as noted in golang.org/cl/65450043,
+			// the Signature.Recv field is ignored by
+			// types.Identical and typeutil.Map, which
+			// is confusing at best.
+			//
+			// More importantly, the true signature rtype
+			// reachable from a method using reflection
+			// has no receiver but an extra ordinary parameter.
+			// For the Read method of io.Reader we want:
+			//   func(Reader, []byte) (int, error)
+			// but here sig is:
+			//   func([]byte) (int, error)
+			// with .Recv = Reader (though it is hard to
+			// notice because it doesn't affect Signature.String
+			// or types.Identical).
+			//
+			// TODO(adonovan): construct and visit the correct
+			// non-method signature with an extra parameter
+			// (though since unnamed func types have no methods
+			// there is essentially no actual demand for this).
+			//
+			// TODO(adonovan): document whether or not it is
+			// safe to skip non-exported methods (as RTA does).
+			visit(sig.Params(), true)  // skip the Tuple
+			visit(sig.Results(), true) // skip the Tuple
+		}
+
+		switch T := T.(type) {
+		case *types.Alias:
+			visit(types.Unalias(T), skip) // emulates the pre-Alias behavior
+
+		case *types.Basic:
+			// nop
+
+		case *types.Interface:
+			// nop---handled by recursion over method set.
+
+		case *types.Pointer:
+			visit(T.Elem(), false)
+
+		case *types.Slice:
+			visit(T.Elem(), false)
+
+		case *types.Chan:
+			visit(T.Elem(), false)
+
+		case *types.Map:
+			visit(T.Key(), false)
+			visit(T.Elem(), false)
+
+		case *types.Signature:
+			if T.Recv() != nil {
+				panic(fmt.Sprintf("Signature %s has Recv %s", T, T.Recv()))
+			}
+			visit(T.Params(), true)  // skip the Tuple
+			visit(T.Results(), true) // skip the Tuple
+
+		case *types.Named:
+			// A pointer-to-named type can be derived from a named
+			// type via reflection.  It may have methods too.
+			visit(types.NewPointer(T), false)
+
+			// Consider 'type T struct{S}' where S has methods.
+			// Reflection provides no way to get from T to struct{S},
+			// only to S, so the method set of struct{S} is unwanted,
+			// so set 'skip' flag during recursion.
+			visit(T.Underlying(), true) // skip the unnamed type
+
+		case *types.Array:
+			visit(T.Elem(), false)
+
+		case *types.Struct:
+			for i, n := 0, T.NumFields(); i < n; i++ {
+				// TODO(adonovan): document whether or not
+				// it is safe to skip non-exported fields.
+				visit(T.Field(i).Type(), false)
+			}
+
+		case *types.Tuple:
+			for i, n := 0, T.Len(); i < n; i++ {
+				visit(T.At(i).Type(), false)
+			}
+
+		case *types.TypeParam, *types.Union:
+			// forEachReachable must not be called on parameterized types.
+			panic(T)
+
+		default:
+			panic(T)
+		}
+	}
+	visit(T, false)
+}
diff --git a/test/integration/vendor/golang.org/x/tools/internal/typesinternal/qualifier.go b/test/integration/vendor/golang.org/x/tools/internal/typesinternal/qualifier.go
new file mode 100644
index 0000000000..b64f714eb3
--- /dev/null
+++ b/test/integration/vendor/golang.org/x/tools/internal/typesinternal/qualifier.go
@@ -0,0 +1,46 @@
+// Copyright 2024 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 typesinternal
+
+import (
+	"go/ast"
+	"go/types"
+	"strconv"
+)
+
+// FileQualifier returns a [types.Qualifier] function that qualifies
+// imported symbols appropriately based on the import environment of a given
+// file.
+// If the same package is imported multiple times, the last appearance is
+// recorded.
+func FileQualifier(f *ast.File, pkg *types.Package) types.Qualifier {
+	// Construct mapping of import paths to their defined names.
+	// It is only necessary to look at renaming imports.
+	imports := make(map[string]string)
+	for _, imp := range f.Imports {
+		if imp.Name != nil && imp.Name.Name != "_" {
+			path, _ := strconv.Unquote(imp.Path.Value)
+			imports[path] = imp.Name.Name
+		}
+	}
+
+	// Define qualifier to replace full package paths with names of the imports.
+	return func(p *types.Package) string {
+		if p == nil || p == pkg {
+			return ""
+		}
+
+		if name, ok := imports[p.Path()]; ok {
+			if name == "." {
+				return ""
+			} else {
+				return name
+			}
+		}
+
+		// If there is no local renaming, fall back to the package name.
+		return p.Name()
+	}
+}
diff --git a/test/integration/vendor/golang.org/x/tools/internal/typesinternal/recv.go b/test/integration/vendor/golang.org/x/tools/internal/typesinternal/recv.go
index fea7c8b75e..e54accc69a 100644
--- a/test/integration/vendor/golang.org/x/tools/internal/typesinternal/recv.go
+++ b/test/integration/vendor/golang.org/x/tools/internal/typesinternal/recv.go
@@ -6,20 +6,20 @@ package typesinternal
 
 import (
 	"go/types"
-
-	"golang.org/x/tools/internal/aliases"
 )
 
 // ReceiverNamed returns the named type (if any) associated with the
 // type of recv, which may be of the form N or *N, or aliases thereof.
 // It also reports whether a Pointer was present.
+//
+// The named result may be nil in ill-typed code.
 func ReceiverNamed(recv *types.Var) (isPtr bool, named *types.Named) {
 	t := recv.Type()
-	if ptr, ok := aliases.Unalias(t).(*types.Pointer); ok {
+	if ptr, ok := types.Unalias(t).(*types.Pointer); ok {
 		isPtr = true
 		t = ptr.Elem()
 	}
-	named, _ = aliases.Unalias(t).(*types.Named)
+	named, _ = types.Unalias(t).(*types.Named)
 	return
 }
 
@@ -36,7 +36,7 @@ func ReceiverNamed(recv *types.Var) (isPtr bool, named *types.Named) {
 // indirection from the type, regardless of named types (analogous to
 // a LOAD instruction).
 func Unpointer(t types.Type) types.Type {
-	if ptr, ok := aliases.Unalias(t).(*types.Pointer); ok {
+	if ptr, ok := types.Unalias(t).(*types.Pointer); ok {
 		return ptr.Elem()
 	}
 	return t
diff --git a/test/integration/vendor/golang.org/x/tools/internal/typesinternal/types.go b/test/integration/vendor/golang.org/x/tools/internal/typesinternal/types.go
index 8392328612..a93d51f988 100644
--- a/test/integration/vendor/golang.org/x/tools/internal/typesinternal/types.go
+++ b/test/integration/vendor/golang.org/x/tools/internal/typesinternal/types.go
@@ -11,6 +11,8 @@ import (
 	"go/types"
 	"reflect"
 	"unsafe"
+
+	"golang.org/x/tools/internal/aliases"
 )
 
 func SetUsesCgo(conf *types.Config) bool {
@@ -63,3 +65,58 @@ func NameRelativeTo(pkg *types.Package) types.Qualifier {
 		return other.Name()
 	}
 }
+
+// A NamedOrAlias is a [types.Type] that is named (as
+// defined by the spec) and capable of bearing type parameters: it
+// abstracts aliases ([types.Alias]) and defined types
+// ([types.Named]).
+//
+// Every type declared by an explicit "type" declaration is a
+// NamedOrAlias. (Built-in type symbols may additionally
+// have type [types.Basic], which is not a NamedOrAlias,
+// though the spec regards them as "named".)
+//
+// NamedOrAlias cannot expose the Origin method, because
+// [types.Alias.Origin] and [types.Named.Origin] have different
+// (covariant) result types; use [Origin] instead.
+type NamedOrAlias interface {
+	types.Type
+	Obj() *types.TypeName
+	// TODO(hxjiang): add method TypeArgs() *types.TypeList after stop supporting go1.22.
+}
+
+// TypeParams is a light shim around t.TypeParams().
+// (go/types.Alias).TypeParams requires >= 1.23.
+func TypeParams(t NamedOrAlias) *types.TypeParamList {
+	switch t := t.(type) {
+	case *types.Alias:
+		return aliases.TypeParams(t)
+	case *types.Named:
+		return t.TypeParams()
+	}
+	return nil
+}
+
+// TypeArgs is a light shim around t.TypeArgs().
+// (go/types.Alias).TypeArgs requires >= 1.23.
+func TypeArgs(t NamedOrAlias) *types.TypeList {
+	switch t := t.(type) {
+	case *types.Alias:
+		return aliases.TypeArgs(t)
+	case *types.Named:
+		return t.TypeArgs()
+	}
+	return nil
+}
+
+// Origin returns the generic type of the Named or Alias type t if it
+// is instantiated, otherwise it returns t.
+func Origin(t NamedOrAlias) NamedOrAlias {
+	switch t := t.(type) {
+	case *types.Alias:
+		return aliases.Origin(t)
+	case *types.Named:
+		return t.Origin()
+	}
+	return t
+}
diff --git a/test/integration/vendor/golang.org/x/tools/internal/typesinternal/zerovalue.go b/test/integration/vendor/golang.org/x/tools/internal/typesinternal/zerovalue.go
new file mode 100644
index 0000000000..d272949c17
--- /dev/null
+++ b/test/integration/vendor/golang.org/x/tools/internal/typesinternal/zerovalue.go
@@ -0,0 +1,392 @@
+// Copyright 2024 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 typesinternal
+
+import (
+	"fmt"
+	"go/ast"
+	"go/token"
+	"go/types"
+	"strings"
+)
+
+// ZeroString returns the string representation of the zero value for any type t.
+// The boolean result indicates whether the type is or contains an invalid type
+// or a non-basic (constraint) interface type.
+//
+// Even for invalid input types, ZeroString may return a partially correct
+// string representation. The caller should use the returned isValid boolean
+// to determine the validity of the expression.
+//
+// When assigning to a wider type (such as 'any'), it's the caller's
+// responsibility to handle any necessary type conversions.
+//
+// This string can be used on the right-hand side of an assignment where the
+// left-hand side has that explicit type.
+// References to named types are qualified by an appropriate (optional)
+// qualifier function.
+// Exception: This does not apply to tuples. Their string representation is
+// informational only and cannot be used in an assignment.
+//
+// See [ZeroExpr] for a variant that returns an [ast.Expr].
+func ZeroString(t types.Type, qual types.Qualifier) (_ string, isValid bool) {
+	switch t := t.(type) {
+	case *types.Basic:
+		switch {
+		case t.Info()&types.IsBoolean != 0:
+			return "false", true
+		case t.Info()&types.IsNumeric != 0:
+			return "0", true
+		case t.Info()&types.IsString != 0:
+			return `""`, true
+		case t.Kind() == types.UnsafePointer:
+			fallthrough
+		case t.Kind() == types.UntypedNil:
+			return "nil", true
+		case t.Kind() == types.Invalid:
+			return "invalid", false
+		default:
+			panic(fmt.Sprintf("ZeroString for unexpected type %v", t))
+		}
+
+	case *types.Pointer, *types.Slice, *types.Chan, *types.Map, *types.Signature:
+		return "nil", true
+
+	case *types.Interface:
+		if !t.IsMethodSet() {
+			return "invalid", false
+		}
+		return "nil", true
+
+	case *types.Named:
+		switch under := t.Underlying().(type) {
+		case *types.Struct, *types.Array:
+			return types.TypeString(t, qual) + "{}", true
+		default:
+			return ZeroString(under, qual)
+		}
+
+	case *types.Alias:
+		switch t.Underlying().(type) {
+		case *types.Struct, *types.Array:
+			return types.TypeString(t, qual) + "{}", true
+		default:
+			// A type parameter can have alias but alias type's underlying type
+			// can never be a type parameter.
+			// Use types.Unalias to preserve the info of type parameter instead
+			// of call Underlying() going right through and get the underlying
+			// type of the type parameter which is always an interface.
+			return ZeroString(types.Unalias(t), qual)
+		}
+
+	case *types.Array, *types.Struct:
+		return types.TypeString(t, qual) + "{}", true
+
+	case *types.TypeParam:
+		// Assumes func new is not shadowed.
+		return "*new(" + types.TypeString(t, qual) + ")", true
+
+	case *types.Tuple:
+		// Tuples are not normal values.
+		// We are currently format as "(t[0], ..., t[n])". Could be something else.
+		isValid := true
+		components := make([]string, t.Len())
+		for i := 0; i < t.Len(); i++ {
+			comp, ok := ZeroString(t.At(i).Type(), qual)
+
+			components[i] = comp
+			isValid = isValid && ok
+		}
+		return "(" + strings.Join(components, ", ") + ")", isValid
+
+	case *types.Union:
+		// Variables of these types cannot be created, so it makes
+		// no sense to ask for their zero value.
+		panic(fmt.Sprintf("invalid type for a variable: %v", t))
+
+	default:
+		panic(t) // unreachable.
+	}
+}
+
+// ZeroExpr returns the ast.Expr representation of the zero value for any type t.
+// The boolean result indicates whether the type is or contains an invalid type
+// or a non-basic (constraint) interface type.
+//
+// Even for invalid input types, ZeroExpr may return a partially correct ast.Expr
+// representation. The caller should use the returned isValid boolean to determine
+// the validity of the expression.
+//
+// This function is designed for types suitable for variables and should not be
+// used with Tuple or Union types.References to named types are qualified by an
+// appropriate (optional) qualifier function.
+//
+// See [ZeroString] for a variant that returns a string.
+func ZeroExpr(t types.Type, qual types.Qualifier) (_ ast.Expr, isValid bool) {
+	switch t := t.(type) {
+	case *types.Basic:
+		switch {
+		case t.Info()&types.IsBoolean != 0:
+			return &ast.Ident{Name: "false"}, true
+		case t.Info()&types.IsNumeric != 0:
+			return &ast.BasicLit{Kind: token.INT, Value: "0"}, true
+		case t.Info()&types.IsString != 0:
+			return &ast.BasicLit{Kind: token.STRING, Value: `""`}, true
+		case t.Kind() == types.UnsafePointer:
+			fallthrough
+		case t.Kind() == types.UntypedNil:
+			return ast.NewIdent("nil"), true
+		case t.Kind() == types.Invalid:
+			return &ast.BasicLit{Kind: token.STRING, Value: `"invalid"`}, false
+		default:
+			panic(fmt.Sprintf("ZeroExpr for unexpected type %v", t))
+		}
+
+	case *types.Pointer, *types.Slice, *types.Chan, *types.Map, *types.Signature:
+		return ast.NewIdent("nil"), true
+
+	case *types.Interface:
+		if !t.IsMethodSet() {
+			return &ast.BasicLit{Kind: token.STRING, Value: `"invalid"`}, false
+		}
+		return ast.NewIdent("nil"), true
+
+	case *types.Named:
+		switch under := t.Underlying().(type) {
+		case *types.Struct, *types.Array:
+			return &ast.CompositeLit{
+				Type: TypeExpr(t, qual),
+			}, true
+		default:
+			return ZeroExpr(under, qual)
+		}
+
+	case *types.Alias:
+		switch t.Underlying().(type) {
+		case *types.Struct, *types.Array:
+			return &ast.CompositeLit{
+				Type: TypeExpr(t, qual),
+			}, true
+		default:
+			return ZeroExpr(types.Unalias(t), qual)
+		}
+
+	case *types.Array, *types.Struct:
+		return &ast.CompositeLit{
+			Type: TypeExpr(t, qual),
+		}, true
+
+	case *types.TypeParam:
+		return &ast.StarExpr{ // *new(T)
+			X: &ast.CallExpr{
+				// Assumes func new is not shadowed.
+				Fun: ast.NewIdent("new"),
+				Args: []ast.Expr{
+					ast.NewIdent(t.Obj().Name()),
+				},
+			},
+		}, true
+
+	case *types.Tuple:
+		// Unlike ZeroString, there is no ast.Expr can express tuple by
+		// "(t[0], ..., t[n])".
+		panic(fmt.Sprintf("invalid type for a variable: %v", t))
+
+	case *types.Union:
+		// Variables of these types cannot be created, so it makes
+		// no sense to ask for their zero value.
+		panic(fmt.Sprintf("invalid type for a variable: %v", t))
+
+	default:
+		panic(t) // unreachable.
+	}
+}
+
+// IsZeroExpr uses simple syntactic heuristics to report whether expr
+// is a obvious zero value, such as 0, "", nil, or false.
+// It cannot do better without type information.
+func IsZeroExpr(expr ast.Expr) bool {
+	switch e := expr.(type) {
+	case *ast.BasicLit:
+		return e.Value == "0" || e.Value == `""`
+	case *ast.Ident:
+		return e.Name == "nil" || e.Name == "false"
+	default:
+		return false
+	}
+}
+
+// TypeExpr returns syntax for the specified type. References to named types
+// are qualified by an appropriate (optional) qualifier function.
+// It may panic for types such as Tuple or Union.
+func TypeExpr(t types.Type, qual types.Qualifier) ast.Expr {
+	switch t := t.(type) {
+	case *types.Basic:
+		switch t.Kind() {
+		case types.UnsafePointer:
+			return &ast.SelectorExpr{X: ast.NewIdent(qual(types.NewPackage("unsafe", "unsafe"))), Sel: ast.NewIdent("Pointer")}
+		default:
+			return ast.NewIdent(t.Name())
+		}
+
+	case *types.Pointer:
+		return &ast.UnaryExpr{
+			Op: token.MUL,
+			X:  TypeExpr(t.Elem(), qual),
+		}
+
+	case *types.Array:
+		return &ast.ArrayType{
+			Len: &ast.BasicLit{
+				Kind:  token.INT,
+				Value: fmt.Sprintf("%d", t.Len()),
+			},
+			Elt: TypeExpr(t.Elem(), qual),
+		}
+
+	case *types.Slice:
+		return &ast.ArrayType{
+			Elt: TypeExpr(t.Elem(), qual),
+		}
+
+	case *types.Map:
+		return &ast.MapType{
+			Key:   TypeExpr(t.Key(), qual),
+			Value: TypeExpr(t.Elem(), qual),
+		}
+
+	case *types.Chan:
+		dir := ast.ChanDir(t.Dir())
+		if t.Dir() == types.SendRecv {
+			dir = ast.SEND | ast.RECV
+		}
+		return &ast.ChanType{
+			Dir:   dir,
+			Value: TypeExpr(t.Elem(), qual),
+		}
+
+	case *types.Signature:
+		var params []*ast.Field
+		for i := 0; i < t.Params().Len(); i++ {
+			params = append(params, &ast.Field{
+				Type: TypeExpr(t.Params().At(i).Type(), qual),
+				Names: []*ast.Ident{
+					{
+						Name: t.Params().At(i).Name(),
+					},
+				},
+			})
+		}
+		if t.Variadic() {
+			last := params[len(params)-1]
+			last.Type = &ast.Ellipsis{Elt: last.Type.(*ast.ArrayType).Elt}
+		}
+		var returns []*ast.Field
+		for i := 0; i < t.Results().Len(); i++ {
+			returns = append(returns, &ast.Field{
+				Type: TypeExpr(t.Results().At(i).Type(), qual),
+			})
+		}
+		return &ast.FuncType{
+			Params: &ast.FieldList{
+				List: params,
+			},
+			Results: &ast.FieldList{
+				List: returns,
+			},
+		}
+
+	case *types.TypeParam:
+		pkgName := qual(t.Obj().Pkg())
+		if pkgName == "" || t.Obj().Pkg() == nil {
+			return ast.NewIdent(t.Obj().Name())
+		}
+		return &ast.SelectorExpr{
+			X:   ast.NewIdent(pkgName),
+			Sel: ast.NewIdent(t.Obj().Name()),
+		}
+
+	// types.TypeParam also implements interface NamedOrAlias. To differentiate,
+	// case TypeParam need to be present before case NamedOrAlias.
+	// TODO(hxjiang): remove this comment once TypeArgs() is added to interface
+	// NamedOrAlias.
+	case NamedOrAlias:
+		var expr ast.Expr = ast.NewIdent(t.Obj().Name())
+		if pkgName := qual(t.Obj().Pkg()); pkgName != "." && pkgName != "" {
+			expr = &ast.SelectorExpr{
+				X:   ast.NewIdent(pkgName),
+				Sel: expr.(*ast.Ident),
+			}
+		}
+
+		// TODO(hxjiang): call t.TypeArgs after adding method TypeArgs() to
+		// typesinternal.NamedOrAlias.
+		if hasTypeArgs, ok := t.(interface{ TypeArgs() *types.TypeList }); ok {
+			if typeArgs := hasTypeArgs.TypeArgs(); typeArgs != nil && typeArgs.Len() > 0 {
+				var indices []ast.Expr
+				for i := range typeArgs.Len() {
+					indices = append(indices, TypeExpr(typeArgs.At(i), qual))
+				}
+				expr = &ast.IndexListExpr{
+					X:       expr,
+					Indices: indices,
+				}
+			}
+		}
+
+		return expr
+
+	case *types.Struct:
+		return ast.NewIdent(t.String())
+
+	case *types.Interface:
+		return ast.NewIdent(t.String())
+
+	case *types.Union:
+		if t.Len() == 0 {
+			panic("Union type should have at least one term")
+		}
+		// Same as go/ast, the return expression will put last term in the
+		// Y field at topmost level of BinaryExpr.
+		// For union of type "float32 | float64 | int64", the structure looks
+		// similar to:
+		// {
+		// 	X: {
+		// 		X: float32,
+		// 		Op: |
+		// 		Y: float64,
+		// 	}
+		// 	Op: |,
+		// 	Y: int64,
+		// }
+		var union ast.Expr
+		for i := range t.Len() {
+			term := t.Term(i)
+			termExpr := TypeExpr(term.Type(), qual)
+			if term.Tilde() {
+				termExpr = &ast.UnaryExpr{
+					Op: token.TILDE,
+					X:  termExpr,
+				}
+			}
+			if i == 0 {
+				union = termExpr
+			} else {
+				union = &ast.BinaryExpr{
+					X:  union,
+					Op: token.OR,
+					Y:  termExpr,
+				}
+			}
+		}
+		return union
+
+	case *types.Tuple:
+		panic("invalid input type types.Tuple")
+
+	default:
+		panic("unreachable")
+	}
+}
diff --git a/test/integration/vendor/golang.org/x/tools/internal/versions/constraint.go b/test/integration/vendor/golang.org/x/tools/internal/versions/constraint.go
deleted file mode 100644
index 179063d484..0000000000
--- a/test/integration/vendor/golang.org/x/tools/internal/versions/constraint.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2024 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 versions
-
-import "go/build/constraint"
-
-// ConstraintGoVersion is constraint.GoVersion (if built with go1.21+).
-// Otherwise nil.
-//
-// Deprecate once x/tools is after go1.21.
-var ConstraintGoVersion func(x constraint.Expr) string
diff --git a/test/integration/vendor/golang.org/x/tools/internal/versions/constraint_go121.go b/test/integration/vendor/golang.org/x/tools/internal/versions/constraint_go121.go
deleted file mode 100644
index 38011407d5..0000000000
--- a/test/integration/vendor/golang.org/x/tools/internal/versions/constraint_go121.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2024 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 go1.21
-// +build go1.21
-
-package versions
-
-import "go/build/constraint"
-
-func init() {
-	ConstraintGoVersion = constraint.GoVersion
-}
diff --git a/test/integration/vendor/golang.org/x/tools/internal/versions/toolchain.go b/test/integration/vendor/golang.org/x/tools/internal/versions/toolchain.go
deleted file mode 100644
index 377bf7a53b..0000000000
--- a/test/integration/vendor/golang.org/x/tools/internal/versions/toolchain.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2024 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 versions
-
-// toolchain is maximum version (<1.22) that the go toolchain used
-// to build the current tool is known to support.
-//
-// When a tool is built with >=1.22, the value of toolchain is unused.
-//
-// x/tools does not support building with go <1.18. So we take this
-// as the minimum possible maximum.
-var toolchain string = Go1_18
diff --git a/test/integration/vendor/golang.org/x/tools/internal/versions/toolchain_go119.go b/test/integration/vendor/golang.org/x/tools/internal/versions/toolchain_go119.go
deleted file mode 100644
index f65beed9d8..0000000000
--- a/test/integration/vendor/golang.org/x/tools/internal/versions/toolchain_go119.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2024 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 go1.19
-// +build go1.19
-
-package versions
-
-func init() {
-	if Compare(toolchain, Go1_19) < 0 {
-		toolchain = Go1_19
-	}
-}
diff --git a/test/integration/vendor/golang.org/x/tools/internal/versions/toolchain_go120.go b/test/integration/vendor/golang.org/x/tools/internal/versions/toolchain_go120.go
deleted file mode 100644
index 1a9efa126c..0000000000
--- a/test/integration/vendor/golang.org/x/tools/internal/versions/toolchain_go120.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2024 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 go1.20
-// +build go1.20
-
-package versions
-
-func init() {
-	if Compare(toolchain, Go1_20) < 0 {
-		toolchain = Go1_20
-	}
-}
diff --git a/test/integration/vendor/golang.org/x/tools/internal/versions/toolchain_go121.go b/test/integration/vendor/golang.org/x/tools/internal/versions/toolchain_go121.go
deleted file mode 100644
index b7ef216dfe..0000000000
--- a/test/integration/vendor/golang.org/x/tools/internal/versions/toolchain_go121.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2024 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 go1.21
-// +build go1.21
-
-package versions
-
-func init() {
-	if Compare(toolchain, Go1_21) < 0 {
-		toolchain = Go1_21
-	}
-}
diff --git a/test/integration/vendor/golang.org/x/tools/internal/versions/types.go b/test/integration/vendor/golang.org/x/tools/internal/versions/types.go
index 562eef21fa..0fc10ce4eb 100644
--- a/test/integration/vendor/golang.org/x/tools/internal/versions/types.go
+++ b/test/integration/vendor/golang.org/x/tools/internal/versions/types.go
@@ -5,15 +5,29 @@
 package versions
 
 import (
+	"go/ast"
 	"go/types"
 )
 
-// GoVersion returns the Go version of the type package.
-// It returns zero if no version can be determined.
-func GoVersion(pkg *types.Package) string {
-	// TODO(taking): x/tools can call GoVersion() [from 1.21] after 1.25.
-	if pkg, ok := any(pkg).(interface{ GoVersion() string }); ok {
-		return pkg.GoVersion()
+// FileVersion returns a file's Go version.
+// The reported version is an unknown Future version if a
+// version cannot be determined.
+func FileVersion(info *types.Info, file *ast.File) string {
+	// In tools built with Go >= 1.22, the Go version of a file
+	// follow a cascades of sources:
+	// 1) types.Info.FileVersion, which follows the cascade:
+	//   1.a) file version (ast.File.GoVersion),
+	//   1.b) the package version (types.Config.GoVersion), or
+	// 2) is some unknown Future version.
+	//
+	// File versions require a valid package version to be provided to types
+	// in Config.GoVersion. Config.GoVersion is either from the package's module
+	// or the toolchain (go run). This value should be provided by go/packages
+	// or unitchecker.Config.GoVersion.
+	if v := info.FileVersions[file]; IsValid(v) {
+		return v
 	}
-	return ""
+	// Note: we could instead return runtime.Version() [if valid].
+	// This would act as a max version on what a tool can support.
+	return Future
 }
diff --git a/test/integration/vendor/golang.org/x/tools/internal/versions/types_go121.go b/test/integration/vendor/golang.org/x/tools/internal/versions/types_go121.go
deleted file mode 100644
index b4345d3349..0000000000
--- a/test/integration/vendor/golang.org/x/tools/internal/versions/types_go121.go
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2023 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 !go1.22
-// +build !go1.22
-
-package versions
-
-import (
-	"go/ast"
-	"go/types"
-)
-
-// FileVersion returns a language version (<=1.21) derived from runtime.Version()
-// or an unknown future version.
-func FileVersion(info *types.Info, file *ast.File) string {
-	// In x/tools built with Go <= 1.21, we do not have Info.FileVersions
-	// available. We use a go version derived from the toolchain used to
-	// compile the tool by default.
-	// This will be <= go1.21. We take this as the maximum version that
-	// this tool can support.
-	//
-	// There are no features currently in x/tools that need to tell fine grained
-	// differences for versions <1.22.
-	return toolchain
-}
-
-// InitFileVersions is a noop when compiled with this Go version.
-func InitFileVersions(*types.Info) {}
diff --git a/test/integration/vendor/golang.org/x/tools/internal/versions/types_go122.go b/test/integration/vendor/golang.org/x/tools/internal/versions/types_go122.go
deleted file mode 100644
index aac5db62c9..0000000000
--- a/test/integration/vendor/golang.org/x/tools/internal/versions/types_go122.go
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2023 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 go1.22
-// +build go1.22
-
-package versions
-
-import (
-	"go/ast"
-	"go/types"
-)
-
-// FileVersion returns a file's Go version.
-// The reported version is an unknown Future version if a
-// version cannot be determined.
-func FileVersion(info *types.Info, file *ast.File) string {
-	// In tools built with Go >= 1.22, the Go version of a file
-	// follow a cascades of sources:
-	// 1) types.Info.FileVersion, which follows the cascade:
-	//   1.a) file version (ast.File.GoVersion),
-	//   1.b) the package version (types.Config.GoVersion), or
-	// 2) is some unknown Future version.
-	//
-	// File versions require a valid package version to be provided to types
-	// in Config.GoVersion. Config.GoVersion is either from the package's module
-	// or the toolchain (go run). This value should be provided by go/packages
-	// or unitchecker.Config.GoVersion.
-	if v := info.FileVersions[file]; IsValid(v) {
-		return v
-	}
-	// Note: we could instead return runtime.Version() [if valid].
-	// This would act as a max version on what a tool can support.
-	return Future
-}
-
-// InitFileVersions initializes info to record Go versions for Go files.
-func InitFileVersions(info *types.Info) {
-	info.FileVersions = make(map[*ast.File]string)
-}
diff --git a/test/integration/vendor/modules.txt b/test/integration/vendor/modules.txt
index 36b3ee2c9b..08f95f99c2 100644
--- a/test/integration/vendor/modules.txt
+++ b/test/integration/vendor/modules.txt
@@ -496,8 +496,6 @@ github.com/josharian/intern
 github.com/json-iterator/go
 # github.com/jstemmer/go-junit-report v1.0.0
 ## explicit; go 1.2
-github.com/jstemmer/go-junit-report
-github.com/jstemmer/go-junit-report/formatter
 github.com/jstemmer/go-junit-report/parser
 # github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51
 ## explicit
@@ -537,11 +535,8 @@ github.com/mattn/go-runewidth
 # github.com/mattn/go-shellwords v1.0.12
 ## explicit; go 1.13
 github.com/mattn/go-shellwords
-# github.com/maxbrunsfeld/counterfeiter/v6 v6.8.1
-## explicit; go 1.20
-github.com/maxbrunsfeld/counterfeiter/v6
-github.com/maxbrunsfeld/counterfeiter/v6/arguments
-github.com/maxbrunsfeld/counterfeiter/v6/command
+# github.com/maxbrunsfeld/counterfeiter/v6 v6.11.2
+## explicit; go 1.23
 github.com/maxbrunsfeld/counterfeiter/v6/generator
 # github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d
 ## explicit
@@ -689,7 +684,7 @@ github.com/nginx/agent/v2/src/extensions/advanced-metrics/tables/sample
 github.com/nginx/agent/v2/src/extensions/advanced-metrics/tables/schema
 github.com/nginx/agent/v2/test/utils
 github.com/nginx/agent/v2/test/utils/system
-# github.com/nginxinc/nginx-go-crossplane v0.4.48
+# github.com/nginxinc/nginx-go-crossplane v0.4.70
 ## explicit; go 1.19
 github.com/nginxinc/nginx-go-crossplane
 # github.com/onsi/ginkgo/v2 v2.13.0
@@ -817,9 +812,10 @@ github.com/spf13/viper/internal/features
 # github.com/stretchr/objx v0.5.2
 ## explicit; go 1.20
 github.com/stretchr/objx
-# github.com/stretchr/testify v1.9.0
+# github.com/stretchr/testify v1.10.0
 ## explicit; go 1.17
 github.com/stretchr/testify/assert
+github.com/stretchr/testify/assert/yaml
 github.com/stretchr/testify/mock
 github.com/stretchr/testify/require
 # github.com/subosito/gotenv v1.6.0
@@ -962,7 +958,7 @@ go.opentelemetry.io/proto/otlp/trace/v1
 # go.uber.org/multierr v1.11.0
 ## explicit; go 1.19
 go.uber.org/multierr
-# golang.org/x/crypto v0.31.0
+# golang.org/x/crypto v0.32.0
 ## explicit; go 1.20
 golang.org/x/crypto/blowfish
 golang.org/x/crypto/chacha20
@@ -982,12 +978,12 @@ golang.org/x/exp/slices
 golang.org/x/exp/slog
 golang.org/x/exp/slog/internal
 golang.org/x/exp/slog/internal/buffer
-# golang.org/x/mod v0.21.0
+# golang.org/x/mod v0.22.0
 ## explicit; go 1.22.0
 golang.org/x/mod/internal/lazyregexp
 golang.org/x/mod/module
 golang.org/x/mod/semver
-# golang.org/x/net v0.33.0
+# golang.org/x/net v0.34.0
 ## explicit; go 1.18
 golang.org/x/net/http/httpguts
 golang.org/x/net/http2
@@ -1007,7 +1003,7 @@ golang.org/x/oauth2/internal
 golang.org/x/sync/errgroup
 golang.org/x/sync/semaphore
 golang.org/x/sync/singleflight
-# golang.org/x/sys v0.28.0
+# golang.org/x/sys v0.29.0
 ## explicit; go 1.18
 golang.org/x/sys/cpu
 golang.org/x/sys/execabs
@@ -1015,7 +1011,7 @@ golang.org/x/sys/plan9
 golang.org/x/sys/unix
 golang.org/x/sys/windows
 golang.org/x/sys/windows/registry
-# golang.org/x/term v0.27.0
+# golang.org/x/term v0.28.0
 ## explicit; go 1.18
 golang.org/x/term
 # golang.org/x/text v0.21.0
@@ -1040,9 +1036,8 @@ golang.org/x/text/width
 # golang.org/x/time v0.5.0
 ## explicit; go 1.18
 golang.org/x/time/rate
-# golang.org/x/tools v0.25.0
+# golang.org/x/tools v0.29.0
 ## explicit; go 1.22.0
-golang.org/x/tools/cmd/goimports
 golang.org/x/tools/cmd/stringer
 golang.org/x/tools/go/ast/astutil
 golang.org/x/tools/go/gcexportdata
@@ -1059,10 +1054,10 @@ golang.org/x/tools/internal/gcimporter
 golang.org/x/tools/internal/gocommand
 golang.org/x/tools/internal/gopathwalk
 golang.org/x/tools/internal/imports
+golang.org/x/tools/internal/modindex
 golang.org/x/tools/internal/packagesinternal
 golang.org/x/tools/internal/pkgbits
 golang.org/x/tools/internal/stdlib
-golang.org/x/tools/internal/tokeninternal
 golang.org/x/tools/internal/typeparams
 golang.org/x/tools/internal/typesinternal
 golang.org/x/tools/internal/versions
diff --git a/test/performance/go.mod b/test/performance/go.mod
index a5ae8be62b..022a39774b 100644
--- a/test/performance/go.mod
+++ b/test/performance/go.mod
@@ -15,7 +15,7 @@ require (
 	github.com/prometheus/client_golang v1.19.1
 	github.com/sanity-io/litter v1.5.5
 	github.com/sirupsen/logrus v1.9.3
-	github.com/stretchr/testify v1.9.0
+	github.com/stretchr/testify v1.10.0
 	go.uber.org/atomic v1.11.0
 	google.golang.org/grpc v1.60.1
 )
@@ -38,14 +38,14 @@ require (
 	github.com/klauspost/cpuid/v2 v2.2.5 // indirect
 	github.com/lufia/plan9stats v0.0.0-20231016141302-07b5767bb0ed // indirect
 	github.com/magiconair/properties v1.8.7 // indirect
-	github.com/maxbrunsfeld/counterfeiter/v6 v6.8.1 // indirect
+	github.com/maxbrunsfeld/counterfeiter/v6 v6.11.2 // indirect
 	github.com/minio/highwayhash v1.0.2 // indirect
 	github.com/mitchellh/mapstructure v1.5.0 // indirect
 	github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
 	github.com/nats-io/jwt/v2 v2.5.2 // indirect
 	github.com/nats-io/nkeys v0.4.6 // indirect
 	github.com/nats-io/nuid v1.0.1 // indirect
-	github.com/nginxinc/nginx-go-crossplane v0.4.48 // indirect
+	github.com/nginxinc/nginx-go-crossplane v0.4.70 // indirect
 	github.com/nginxinc/nginx-plus-go-client/v2 v2.0.1 // indirect
 	github.com/nginxinc/nginx-prometheus-exporter v1.2.0 // indirect
 	github.com/nxadm/tail v1.4.11 // indirect
@@ -76,15 +76,15 @@ require (
 	github.com/vardius/message-bus v1.1.5 // indirect
 	github.com/yusufpapurcu/wmi v1.2.3 // indirect
 	go.uber.org/multierr v1.11.0 // indirect
-	golang.org/x/crypto v0.31.0 // indirect
+	golang.org/x/crypto v0.32.0 // indirect
 	golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 // indirect
-	golang.org/x/mod v0.21.0 // indirect
-	golang.org/x/net v0.33.0 // indirect
+	golang.org/x/mod v0.22.0 // indirect
+	golang.org/x/net v0.34.0 // indirect
 	golang.org/x/sync v0.10.0 // indirect
-	golang.org/x/sys v0.28.0 // indirect
+	golang.org/x/sys v0.29.0 // indirect
 	golang.org/x/text v0.21.0 // indirect
 	golang.org/x/time v0.5.0 // indirect
-	golang.org/x/tools v0.25.0 // indirect
+	golang.org/x/tools v0.29.0 // indirect
 	google.golang.org/genproto/googleapis/rpc v0.0.0-20240116215550-a9fa1716bcac // indirect
 	google.golang.org/protobuf v1.34.2 // indirect
 	gopkg.in/ini.v1 v1.67.0 // indirect
diff --git a/test/performance/go.sum b/test/performance/go.sum
index b9e14c362b..4a1e94dacf 100644
--- a/test/performance/go.sum
+++ b/test/performance/go.sum
@@ -78,8 +78,8 @@ github.com/lufia/plan9stats v0.0.0-20231016141302-07b5767bb0ed h1:036IscGBfJsFIg
 github.com/lufia/plan9stats v0.0.0-20231016141302-07b5767bb0ed/go.mod h1:ilwx/Dta8jXAgpFYFvSWEMwxmbWXyiUHkd5FwyKhb5k=
 github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY=
 github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
-github.com/maxbrunsfeld/counterfeiter/v6 v6.8.1 h1:NicmruxkeqHjDv03SfSxqmaLuisddudfP3h5wdXFbhM=
-github.com/maxbrunsfeld/counterfeiter/v6 v6.8.1/go.mod h1:eyp4DdUJAKkr9tvxR3jWhw2mDK7CWABMG5r9uyaKC7I=
+github.com/maxbrunsfeld/counterfeiter/v6 v6.11.2 h1:yVCLo4+ACVroOEr4iFU1iH46Ldlzz2rTuu18Ra7M8sU=
+github.com/maxbrunsfeld/counterfeiter/v6 v6.11.2/go.mod h1:VzB2VoMh1Y32/QqDfg9ZJYHj99oM4LiGtqPZydTiQSQ=
 github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g=
 github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY=
 github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
@@ -96,16 +96,16 @@ github.com/nats-io/nkeys v0.4.6 h1:IzVe95ru2CT6ta874rt9saQRkWfe2nFj1NtvYSLqMzY=
 github.com/nats-io/nkeys v0.4.6/go.mod h1:4DxZNzenSVd1cYQoAa8948QY3QDjrHfcfVADymtkpts=
 github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw=
 github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
-github.com/nginxinc/nginx-go-crossplane v0.4.48 h1:Cf8sn8dTLJevtvNjGsla/wwa+rPTjm8eTfwSMqWisoI=
-github.com/nginxinc/nginx-go-crossplane v0.4.48/go.mod h1:fgSibLM12jGRsh7QHpgL8wTKMEbfc594vSLK9ovwM6U=
+github.com/nginxinc/nginx-go-crossplane v0.4.70 h1:zrmF8rk97TgB3uy5QtRZ4mY0tFAdhKG97H3XAM2LOBA=
+github.com/nginxinc/nginx-go-crossplane v0.4.70/go.mod h1:o0dpGb2Nw1nYKHp8+b2dCxwrMWXGkjaVsZL1Jm3ouvQ=
 github.com/nginxinc/nginx-plus-go-client/v2 v2.0.1 h1:5VVK38bnELMDWnwfF6dSv57ResXh9AUzeDa72ENj94o=
 github.com/nginxinc/nginx-plus-go-client/v2 v2.0.1/go.mod h1:He+1izxYxVVO5/C9ZTukwOpvkAx5eS19nRQgKXDhX5I=
 github.com/nginxinc/nginx-prometheus-exporter v1.2.0 h1:jmu63tEm3hcupIpaIH72NEdwuNgGaQ/9q0IrnNqaPto=
 github.com/nginxinc/nginx-prometheus-exporter v1.2.0/go.mod h1:y8KANg4+7e/9HxT3vZDetjETLR5YhU0zv2WhZquo7C0=
 github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY=
 github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc=
-github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8=
-github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ=
+github.com/onsi/gomega v1.36.1 h1:bJDPBO7ibjxcbHMgSCoo4Yj18UWbKDlLwX1x9sybDcw=
+github.com/onsi/gomega v1.36.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog=
 github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
 github.com/orcaman/concurrent-map v1.0.0 h1:I/2A2XPCb4IuQWcQhBhSwGfiuybl/J0ev9HDbW65HOY=
 github.com/orcaman/concurrent-map v1.0.0/go.mod h1:Lu3tH6HLW3feq74c2GC+jIMS/K2CFcDWnWD9XkenwhI=
@@ -178,8 +178,8 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
 github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
 github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
-github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
-github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
+github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
+github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
 github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
 github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
 github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU=
@@ -214,8 +214,8 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U
 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
-golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
-golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
+golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc=
+golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 h1:e66Fs6Z+fZTbFBAxKfP3PALWBtpfqks2bwGcexMxgtk=
 golang.org/x/exp v0.0.0-20240909161429-701f63a606c0/go.mod h1:2TbTHSBQa924w8M6Xs1QcRcFwyucIwBGpK1p2f1YFFY=
@@ -227,8 +227,8 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
 golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
-golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0=
-golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
+golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4=
+golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -242,8 +242,8 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug
 golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
 golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
 golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
-golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
-golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
+golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0=
+golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -274,8 +274,8 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
-golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU=
+golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
@@ -303,8 +303,8 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY
 golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
 golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
 golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
-golang.org/x/tools v0.25.0 h1:oFU9pkj/iJgs+0DT+VMHrx+oBKs/LJMV+Uvg78sl+fE=
-golang.org/x/tools v0.25.0/go.mod h1:/vtpO8WL1N9cQC3FN5zPqb//fRXskFHbLKk4OW1Q7rg=
+golang.org/x/tools v0.29.0 h1:Xx0h3TtM9rzQpQuR4dKLrdglAmCEN5Oi+P74JdhdzXE=
+golang.org/x/tools v0.29.0/go.mod h1:KMQVMRsVxU6nHCFXrBPhDB8XncLNLM0lIy/F14RP588=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
diff --git a/test/performance/vendor/github.com/jstemmer/go-junit-report/.gitignore b/test/performance/vendor/github.com/jstemmer/go-junit-report/.gitignore
deleted file mode 100644
index 7216c087e1..0000000000
--- a/test/performance/vendor/github.com/jstemmer/go-junit-report/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-go-junit-report
-build/
diff --git a/test/performance/vendor/github.com/jstemmer/go-junit-report/.travis.yml b/test/performance/vendor/github.com/jstemmer/go-junit-report/.travis.yml
deleted file mode 100644
index d0dff3ef8e..0000000000
--- a/test/performance/vendor/github.com/jstemmer/go-junit-report/.travis.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-language: go
-
-go:
-  - tip
-  - "1.13.x"
-  - "1.12.x"
-  - "1.11.x"
-  - "1.10.x"
-  - "1.9.x"
-  - "1.8.x"
-  - "1.7.x"
-  - "1.6.x"
-  - "1.5.x"
-  - "1.4.x"
-  - "1.3.x"
-  - "1.2.x"
diff --git a/test/performance/vendor/github.com/jstemmer/go-junit-report/CONTRIBUTING.md b/test/performance/vendor/github.com/jstemmer/go-junit-report/CONTRIBUTING.md
deleted file mode 100644
index 125d350e11..0000000000
--- a/test/performance/vendor/github.com/jstemmer/go-junit-report/CONTRIBUTING.md
+++ /dev/null
@@ -1,21 +0,0 @@
-# Contributing
-
-## Bug reports
-
-- Before reporting a bug, have a look at the [issue
-  list](https://github.com/jstemmer/go-junit-report/issues) to see if an issue
-  already exists for your problem.
-- Include as much information as you can in the bug report, e.g.: the versions
-  of go-junit-report and the Go compiler, how go-junit-report was called, what
-  input was given to go-junit-report, what the actual output was, was the
-  expected output was.
-
-## Pull requests
-
-- Before sending a pull request for new features, open an issue to discuss it.
-- Run `go fmt` to format your code.
-- Add test coverage and run all tests.
-- Prefer small PRs, avoid making unrelated changes in the same PR.
-- Limit the first line of the commit message to 72 characters.
-- Write commit messages in the imperative mood ("Fix bug", not "Fixed bug" or
-  "Fixes bug") .
diff --git a/test/performance/vendor/github.com/jstemmer/go-junit-report/Makefile b/test/performance/vendor/github.com/jstemmer/go-junit-report/Makefile
deleted file mode 100644
index 4c0aaf218f..0000000000
--- a/test/performance/vendor/github.com/jstemmer/go-junit-report/Makefile
+++ /dev/null
@@ -1,26 +0,0 @@
-VERSION=$(shell git describe --match="v*")
-REVISION=$(shell git rev-parse HEAD)
-TIMESTAMP=$(shell date +%FT%T)
-
-test:
-	go test ./...
-
-build/go-junit-report build/go-junit-report.exe: clean
-	go build --ldflags "-s -X main.Version=$(VERSION) -X main.Revision=$(REVISION) -X main.BuildTime=$(TIMESTAMP)" -o $@
-
-build/go-junit-report-$(VERSION)-$(GOOS)-$(GOARCH).tar.gz: build/go-junit-report
-	tar czf $@ -C build go-junit-report
-
-build/go-junit-report-$(VERSION)-windows-amd64.zip: build/go-junit-report.exe
-	zip -j $@ build/go-junit-report.exe
-
-release: test
-	$(MAKE) GOOS=linux GOARCH=amd64 build/go-junit-report-$(VERSION)-linux-amd64.tar.gz
-	$(MAKE) GOOS=windows GOARCH=amd64 build/go-junit-report-$(VERSION)-windows-amd64.zip
-	$(MAKE) GOOS=darwin GOARCH=amd64 build/go-junit-report-$(VERSION)-darwin-amd64.tar.gz
-
-clean:
-	rm -f build/go-junit-report
-	rm -f build/go-junit-report.exe
-
-.PHONY: build clean release test
diff --git a/test/performance/vendor/github.com/jstemmer/go-junit-report/README.md b/test/performance/vendor/github.com/jstemmer/go-junit-report/README.md
deleted file mode 100644
index a81ad10e46..0000000000
--- a/test/performance/vendor/github.com/jstemmer/go-junit-report/README.md
+++ /dev/null
@@ -1,56 +0,0 @@
-# go-junit-report
-
-go-junit-report is a tool that converts [`go test`] output to an XML report,
-suitable for applications that expect JUnit-style XML reports (e.g.
-[Jenkins](http://jenkins-ci.org)).
-
-The test output [parser] and JUnit report [formatter] are also available as Go
-packages.
-
-[![Build Status][travis-badge]][travis-link]
-
-## Install from package (recommended)
-
-Pre-built packages for Windows, macOS and Linux are found on the [Releases]
-page.
-
-## Install from source
-
-Download and install the latest stable version from source by running:
-
-```bash
-go install github.com/jstemmer/go-junit-report@latest
-```
-
-## Usage
-
-go-junit-report reads the full `go test` output from stdin and writes JUnit
-compatible XML to stdout. In order to capture build errors as well as test
-output, redirect both stdout and stderr to go-junit-report.
-
-```bash
-go test -v 2>&1 | go-junit-report > report.xml
-```
-
-Parsing benchmark output is also supported, for example:
-
-```bash
-go test -v -bench . -count 5 2>&1 | go-junit-report > report.xml
-```
-
-If you want go-junit-report to exit with a non-zero exit code when it encounters
-build errors or test failures, set the `-set-exit-code` flag.
-
-Run `go-junit-report -help` for a list of all supported flags.
-
-## Contributing
-
-See [CONTRIBUTING.md].
-
-[`go test`]: https://pkg.go.dev/cmd/go#hdr-Test_packages
-[parser]: https://pkg.go.dev/github.com/jstemmer/go-junit-report/parser
-[formatter]: https://pkg.go.dev/github.com/jstemmer/go-junit-report/formatter
-[travis-badge]: https://travis-ci.org/jstemmer/go-junit-report.svg?branch=master
-[travis-link]: https://travis-ci.org/jstemmer/go-junit-report
-[Releases]: https://github.com/jstemmer/go-junit-report/releases
-[CONTRIBUTING.md]: https://github.com/jstemmer/go-junit-report/blob/master/CONTRIBUTING.md
diff --git a/test/performance/vendor/github.com/jstemmer/go-junit-report/formatter/formatter.go b/test/performance/vendor/github.com/jstemmer/go-junit-report/formatter/formatter.go
deleted file mode 100644
index 6e1a0f31d6..0000000000
--- a/test/performance/vendor/github.com/jstemmer/go-junit-report/formatter/formatter.go
+++ /dev/null
@@ -1,182 +0,0 @@
-package formatter
-
-import (
-	"bufio"
-	"encoding/xml"
-	"fmt"
-	"io"
-	"runtime"
-	"strings"
-	"time"
-
-	"github.com/jstemmer/go-junit-report/parser"
-)
-
-// JUnitTestSuites is a collection of JUnit test suites.
-type JUnitTestSuites struct {
-	XMLName xml.Name         `xml:"testsuites"`
-	Suites  []JUnitTestSuite `xml:"testsuite"`
-}
-
-// JUnitTestSuite is a single JUnit test suite which may contain many
-// testcases.
-type JUnitTestSuite struct {
-	XMLName    xml.Name        `xml:"testsuite"`
-	Tests      int             `xml:"tests,attr"`
-	Failures   int             `xml:"failures,attr"`
-	Time       string          `xml:"time,attr"`
-	Name       string          `xml:"name,attr"`
-	Properties []JUnitProperty `xml:"properties>property,omitempty"`
-	TestCases  []JUnitTestCase `xml:"testcase"`
-}
-
-// JUnitTestCase is a single test case with its result.
-type JUnitTestCase struct {
-	XMLName     xml.Name          `xml:"testcase"`
-	Classname   string            `xml:"classname,attr"`
-	Name        string            `xml:"name,attr"`
-	Time        string            `xml:"time,attr"`
-	SkipMessage *JUnitSkipMessage `xml:"skipped,omitempty"`
-	Failure     *JUnitFailure     `xml:"failure,omitempty"`
-}
-
-// JUnitSkipMessage contains the reason why a testcase was skipped.
-type JUnitSkipMessage struct {
-	Message string `xml:"message,attr"`
-}
-
-// JUnitProperty represents a key/value pair used to define properties.
-type JUnitProperty struct {
-	Name  string `xml:"name,attr"`
-	Value string `xml:"value,attr"`
-}
-
-// JUnitFailure contains data related to a failed test.
-type JUnitFailure struct {
-	Message  string `xml:"message,attr"`
-	Type     string `xml:"type,attr"`
-	Contents string `xml:",chardata"`
-}
-
-// JUnitReportXML writes a JUnit xml representation of the given report to w
-// in the format described at http://windyroad.org/dl/Open%20Source/JUnit.xsd
-func JUnitReportXML(report *parser.Report, noXMLHeader bool, goVersion string, w io.Writer) error {
-	suites := JUnitTestSuites{}
-
-	// convert Report to JUnit test suites
-	for _, pkg := range report.Packages {
-		pkg.Benchmarks = mergeBenchmarks(pkg.Benchmarks)
-		ts := JUnitTestSuite{
-			Tests:      len(pkg.Tests) + len(pkg.Benchmarks),
-			Failures:   0,
-			Time:       formatTime(pkg.Duration),
-			Name:       pkg.Name,
-			Properties: []JUnitProperty{},
-			TestCases:  []JUnitTestCase{},
-		}
-
-		classname := pkg.Name
-		if idx := strings.LastIndex(classname, "/"); idx > -1 && idx < len(pkg.Name) {
-			classname = pkg.Name[idx+1:]
-		}
-
-		// properties
-		if goVersion == "" {
-			// if goVersion was not specified as a flag, fall back to version reported by runtime
-			goVersion = runtime.Version()
-		}
-		ts.Properties = append(ts.Properties, JUnitProperty{"go.version", goVersion})
-		if pkg.CoveragePct != "" {
-			ts.Properties = append(ts.Properties, JUnitProperty{"coverage.statements.pct", pkg.CoveragePct})
-		}
-
-		// individual test cases
-		for _, test := range pkg.Tests {
-			testCase := JUnitTestCase{
-				Classname: classname,
-				Name:      test.Name,
-				Time:      formatTime(test.Duration),
-				Failure:   nil,
-			}
-
-			if test.Result == parser.FAIL {
-				ts.Failures++
-				testCase.Failure = &JUnitFailure{
-					Message:  "Failed",
-					Type:     "",
-					Contents: strings.Join(test.Output, "\n"),
-				}
-			}
-
-			if test.Result == parser.SKIP {
-				testCase.SkipMessage = &JUnitSkipMessage{strings.Join(test.Output, "\n")}
-			}
-
-			ts.TestCases = append(ts.TestCases, testCase)
-		}
-
-		// individual benchmarks
-		for _, benchmark := range pkg.Benchmarks {
-			benchmarkCase := JUnitTestCase{
-				Classname: classname,
-				Name:      benchmark.Name,
-				Time:      formatBenchmarkTime(benchmark.Duration),
-			}
-
-			ts.TestCases = append(ts.TestCases, benchmarkCase)
-		}
-
-		suites.Suites = append(suites.Suites, ts)
-	}
-
-	// to xml
-	bytes, err := xml.MarshalIndent(suites, "", "\t")
-	if err != nil {
-		return err
-	}
-
-	writer := bufio.NewWriter(w)
-
-	if !noXMLHeader {
-		writer.WriteString(xml.Header)
-	}
-
-	writer.Write(bytes)
-	writer.WriteByte('\n')
-	writer.Flush()
-
-	return nil
-}
-
-func mergeBenchmarks(benchmarks []*parser.Benchmark) []*parser.Benchmark {
-	var merged []*parser.Benchmark
-	benchmap := make(map[string][]*parser.Benchmark)
-	for _, bm := range benchmarks {
-		if _, ok := benchmap[bm.Name]; !ok {
-			merged = append(merged, &parser.Benchmark{Name: bm.Name})
-		}
-		benchmap[bm.Name] = append(benchmap[bm.Name], bm)
-	}
-
-	for _, bm := range merged {
-		for _, b := range benchmap[bm.Name] {
-			bm.Allocs += b.Allocs
-			bm.Bytes += b.Bytes
-			bm.Duration += b.Duration
-		}
-		n := len(benchmap[bm.Name])
-		bm.Allocs /= n
-		bm.Bytes /= n
-		bm.Duration /= time.Duration(n)
-	}
-
-	return merged
-}
-
-func formatTime(d time.Duration) string {
-	return fmt.Sprintf("%.3f", d.Seconds())
-}
-
-func formatBenchmarkTime(d time.Duration) string {
-	return fmt.Sprintf("%.9f", d.Seconds())
-}
diff --git a/test/performance/vendor/github.com/jstemmer/go-junit-report/go-junit-report.go b/test/performance/vendor/github.com/jstemmer/go-junit-report/go-junit-report.go
deleted file mode 100644
index 24de3d9c4a..0000000000
--- a/test/performance/vendor/github.com/jstemmer/go-junit-report/go-junit-report.go
+++ /dev/null
@@ -1,57 +0,0 @@
-package main
-
-import (
-	"flag"
-	"fmt"
-	"os"
-
-	"github.com/jstemmer/go-junit-report/formatter"
-	"github.com/jstemmer/go-junit-report/parser"
-)
-
-var (
-	Version   = "v1.0.0-dev"
-	Revision  = "HEAD"
-	BuildTime string
-)
-
-var (
-	noXMLHeader   = flag.Bool("no-xml-header", false, "do not print xml header")
-	packageName   = flag.String("package-name", "", "specify a package name (compiled test have no package name in output)")
-	goVersionFlag = flag.String("go-version", "", "specify the value to use for the go.version property in the generated XML")
-	setExitCode   = flag.Bool("set-exit-code", false, "set exit code to 1 if tests failed")
-	version       = flag.Bool("version", false, "print version")
-)
-
-func main() {
-	flag.Parse()
-
-	if *version {
-		fmt.Printf("go-junit-report %s %s (%s)\n", Version, BuildTime, Revision)
-		return
-	}
-
-	if flag.NArg() != 0 {
-		fmt.Fprintf(os.Stderr, "%s does not accept positional arguments\n", os.Args[0])
-		flag.Usage()
-		os.Exit(1)
-	}
-
-	// Read input
-	report, err := parser.Parse(os.Stdin, *packageName)
-	if err != nil {
-		fmt.Printf("Error reading input: %s\n", err)
-		os.Exit(1)
-	}
-
-	// Write xml
-	err = formatter.JUnitReportXML(report, *noXMLHeader, *goVersionFlag, os.Stdout)
-	if err != nil {
-		fmt.Printf("Error writing XML: %s\n", err)
-		os.Exit(1)
-	}
-
-	if *setExitCode && report.Failures() > 0 {
-		os.Exit(1)
-	}
-}
diff --git a/test/performance/vendor/github.com/maxbrunsfeld/counterfeiter/v6/.gitattributes b/test/performance/vendor/github.com/maxbrunsfeld/counterfeiter/v6/.gitattributes
deleted file mode 100644
index fcadb2cf97..0000000000
--- a/test/performance/vendor/github.com/maxbrunsfeld/counterfeiter/v6/.gitattributes
+++ /dev/null
@@ -1 +0,0 @@
-* text eol=lf
diff --git a/test/performance/vendor/github.com/maxbrunsfeld/counterfeiter/v6/.gitignore b/test/performance/vendor/github.com/maxbrunsfeld/counterfeiter/v6/.gitignore
deleted file mode 100644
index 1597f12b71..0000000000
--- a/test/performance/vendor/github.com/maxbrunsfeld/counterfeiter/v6/.gitignore
+++ /dev/null
@@ -1,32 +0,0 @@
-# Compiled Object files, Static and Dynamic libs (Shared Objects)
-*.o
-*.a
-*.so
-
-# Folders
-_obj
-_test
-
-# Architecture specific extensions/prefixes
-*.[568vq]
-[568vq].out
-
-*.cgo1.go
-*.cgo2.c
-_cgo_defun.c
-_cgo_gotypes.go
-_cgo_export.*
-
-_testmain.go
-
-*.exe
-*.test
-*.iml
-.idea
-.envrc
-
-/counterfeiter
-integration/testdata/output
-*.profile
-*.bench
-/.vscode
diff --git a/test/performance/vendor/github.com/maxbrunsfeld/counterfeiter/v6/.golangci.yaml b/test/performance/vendor/github.com/maxbrunsfeld/counterfeiter/v6/.golangci.yaml
deleted file mode 100644
index 1f2afa43bb..0000000000
--- a/test/performance/vendor/github.com/maxbrunsfeld/counterfeiter/v6/.golangci.yaml
+++ /dev/null
@@ -1,3 +0,0 @@
-run:
-  skip-dirs:
-    - fixtures
\ No newline at end of file
diff --git a/test/performance/vendor/github.com/maxbrunsfeld/counterfeiter/v6/README.md b/test/performance/vendor/github.com/maxbrunsfeld/counterfeiter/v6/README.md
deleted file mode 100644
index 5d471d6431..0000000000
--- a/test/performance/vendor/github.com/maxbrunsfeld/counterfeiter/v6/README.md
+++ /dev/null
@@ -1,228 +0,0 @@
-# `counterfeiter` [![GitHub Actions](https://github.com/maxbrunsfeld/counterfeiter/actions/workflows/go.yml/badge.svg)](https://github.com/maxbrunsfeld/counterfeiter/actions/workflows/go.yml) [![Go Report Card](https://goreportcard.com/badge/github.com/maxbrunsfeld/counterfeiter/v6)](https://goreportcard.com/report/github.com/maxbrunsfeld/counterfeiter/v6) [![GoDoc](https://godoc.org/github.com/maxbrunsfeld/counterfeiter/v6?status.svg)](https://godoc.org/github.com/maxbrunsfeld/counterfeiter/v6)
-
-When writing unit-tests for an object, it is often useful to have fake implementations
-of the object's collaborators. In go, such fake implementations cannot be generated
-automatically at runtime, and writing them by hand can be quite arduous.
-
-`counterfeiter` allows you to simply generate test doubles for a given interface.
-
-### Supported Versions Of `go`
-
-`counterfeiter` follows the [support policy of `go` itself](https://golang.org/doc/devel/release.html#policy):
-
-> Each major Go release is supported until there are two newer major releases. For example, Go 1.5 was supported until the Go 1.7 release, and Go 1.6 was supported until the Go 1.8 release. We fix critical problems, including [critical security problems](https://golang.org/security), in supported releases as needed by issuing minor revisions (for example, Go 1.6.1, Go 1.6.2, and so on).
-
-If you are having problems with `counterfeiter` and are not using a supported version of go, please update to use a supported version of go before opening an issue.
-
-### Using `counterfeiter`
-
-⚠️ Please use [`go modules`](https://blog.golang.org/using-go-modules) when working with counterfeiter.
-
-Typically, `counterfeiter` is used in `go generate` directives. It can be frustrating when you change your interface declaration and suddenly all of your generated code is suddenly out-of-date. The best practice here is to use the [`go generate` command](https://blog.golang.org/generate) to make it easier to keep your test doubles up to date.
-
-#### Step 1 - Create `tools.go`
-
-You can take a dependency on tools by creating a `tools.go` file, as described in [How can I track tool dependencies for a module?](https://github.com/golang/go/wiki/Modules#how-can-i-track-tool-dependencies-for-a-module). This ensures that everyone working with your module is using the same version of each tool you use.
-
-```shell
-$ cat tools/tools.go
-```
-
-```go
-//go:build tools
-
-package tools
-
-import (
-	_ "github.com/maxbrunsfeld/counterfeiter/v6"
-)
-
-// This file imports packages that are used when running go generate, or used
-// during the development process but not otherwise depended on by built code.
-```
-
-#### Step 2a - Add `go:generate` Directives
-
-You can add directives right next to your interface definitions (or not), in any `.go` file in your module.
-
-```shell
-$ cat myinterface.go
-```
-
-```go
-package foo
-
-//go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 . MySpecialInterface
-
-type MySpecialInterface interface {
-	DoThings(string, uint64) (int, error)
-}
-```
-
-```shell
-$ go generate ./...
-Writing `FakeMySpecialInterface` to `foofakes/fake_my_special_interface.go`... Done
-```
-
-#### Step 2b - Add `counterfeiter:generate` Directives
-
-If you plan to have many directives in a single package, consider using this
-option. You can add directives right next to your interface definitions
-(or not), in any `.go` file in your module.
-
-```shell
-$ cat myinterface.go
-```
-
-```go
-package foo
-
-// You only need **one** of these per package!
-//go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -generate
-
-// You will add lots of directives like these in the same package...
-//counterfeiter:generate . MySpecialInterface
-type MySpecialInterface interface {
-	DoThings(string, uint64) (int, error)
-}
-
-// Like this...
-//counterfeiter:generate . MyOtherInterface
-type MyOtherInterface interface {
-	DoOtherThings(string, uint64) (int, error)
-}
-```
-
-```shell
-$ go generate ./...
-Writing `FakeMySpecialInterface` to `foofakes/fake_my_special_interface.go`... Done
-Writing `FakeMyOtherInterface` to `foofakes/fake_my_other_interface.go`... Done
-```
-
-#### Step 3 - Run `go generate`
-
-You can run `go generate` in the directory with your directive, or in the root of your module (to ensure you generate for all packages in your module):
-
-```shell
-$ go generate ./...
-```
-
-#### Invoking `counterfeiter` from the shell
-
-You can use the following command to invoke `counterfeiter` from within a go module:
-
-```shell
-$ go run github.com/maxbrunsfeld/counterfeiter/v6
-
-USAGE
-	counterfeiter
-		[-generate>] [-o ] [-p] [--fake-name ]
-		[-header ]
-		[]  [-]
-```
-
-#### Installing `counterfeiter` to `$GOPATH/bin`
-
-This is unnecessary if you're using the approach described above, but does allow you to invoke `counterfeiter` in your shell _outside_ of a module:
-
-```shell
-$ go install github.com/maxbrunsfeld/counterfeiter/v6
-$ ~/go/bin/counterfeiter
-
-USAGE
-	counterfeiter
-		[-generate>] [-o ] [-p] [--fake-name ]
-		[-header ]
-		[]  [-]
-```
-
-### Generating Test Doubles
-
-Given a path to a package and an interface name, you can generate a test double.
-
-```shell
-$ cat path/to/foo/file.go
-```
-
-```go
-package foo
-
-type MySpecialInterface interface {
-		DoThings(string, uint64) (int, error)
-}
-```
-
-```shell
-$ go run github.com/maxbrunsfeld/counterfeiter/v6 path/to/foo MySpecialInterface
-Wrote `FakeMySpecialInterface` to `path/to/foo/foofakes/fake_my_special_interface.go`
-```
-
-### Using Test Doubles In Your Tests
-
-Instantiate fakes`:
-
-```go
-import "my-repo/path/to/foo/foofakes"
-
-var fake = &foofakes.FakeMySpecialInterface{}
-```
-
-Fakes record the arguments they were called with:
-
-```go
-fake.DoThings("stuff", 5)
-
-Expect(fake.DoThingsCallCount()).To(Equal(1))
-
-str, num := fake.DoThingsArgsForCall(0)
-Expect(str).To(Equal("stuff"))
-Expect(num).To(Equal(uint64(5)))
-```
-
-You can stub their return values:
-
-```go
-fake.DoThingsReturns(3, errors.New("the-error"))
-
-num, err := fake.DoThings("stuff", 5)
-Expect(num).To(Equal(3))
-Expect(err).To(Equal(errors.New("the-error")))
-```
-
-For more examples of using the `counterfeiter` API, look at [some of the provided examples](https://github.com/maxbrunsfeld/counterfeiter/blob/master/generated_fakes_test.go).
-
-### Generating Test Doubles For Third Party Interfaces
-
-For third party interfaces, you can specify the interface using the alternative syntax `.`, for example:
-
-```shell
-$ go run github.com/maxbrunsfeld/counterfeiter/v6 github.com/go-redis/redis.Pipeliner
-```
-
-### Running The Tests For `counterfeiter`
-
-If you want to run the tests for `counterfeiter` (perhaps, because you want to contribute a PR), all you have to do is run `scripts/ci.sh`.
-
-### Contributions
-
-So you want to contribute to `counterfeiter`! That's great, here's exactly what you should do:
-
-- open a new github issue, describing your problem, or use case
-- help us understand how you want to fix or extend `counterfeiter`
-- write one or more unit tests for the behavior you want
-- write the simplest code you can for the feature you're working on
-- try to find any opportunities to refactor
-- avoid writing code that isn't covered by unit tests
-
-`counterfeiter` has a few high level goals for contributors to keep in mind
-
-- keep unit-level test coverage as high as possible
-- keep `main.go` as simple as possible
-- avoid making the command line options any more complicated
-- avoid making the internals of `counterfeiter` any more complicated
-
-If you have any questions about how to contribute, rest assured that @tjarratt and other maintainers will work with you to ensure we make `counterfeiter` better, together. This project has largely been maintained by the community, and we greatly appreciate any PR (whether big or small).
-
-### License
-
-`counterfeiter` is MIT-licensed.
diff --git a/test/performance/vendor/github.com/maxbrunsfeld/counterfeiter/v6/arguments/files.go b/test/performance/vendor/github.com/maxbrunsfeld/counterfeiter/v6/arguments/files.go
deleted file mode 100644
index a2485878db..0000000000
--- a/test/performance/vendor/github.com/maxbrunsfeld/counterfeiter/v6/arguments/files.go
+++ /dev/null
@@ -1,6 +0,0 @@
-package arguments
-
-import "os"
-
-type Evaler func(string) (string, error)
-type Stater func(string) (os.FileInfo, error)
diff --git a/test/performance/vendor/github.com/maxbrunsfeld/counterfeiter/v6/arguments/parser.go b/test/performance/vendor/github.com/maxbrunsfeld/counterfeiter/v6/arguments/parser.go
deleted file mode 100644
index 557d4959f1..0000000000
--- a/test/performance/vendor/github.com/maxbrunsfeld/counterfeiter/v6/arguments/parser.go
+++ /dev/null
@@ -1,271 +0,0 @@
-package arguments
-
-import (
-	"encoding/json"
-	"errors"
-	"flag"
-	"fmt"
-	"path"
-	"path/filepath"
-	"regexp"
-	"strings"
-	"unicode"
-)
-
-func New(args []string, workingDir string, evaler Evaler, stater Stater) (*ParsedArguments, error) {
-	if len(args) == 0 {
-		return nil, errors.New("argument parsing requires at least one argument")
-	}
-
-	fs := flag.NewFlagSet("counterfeiter", flag.ContinueOnError)
-	fakeNameFlag := fs.String(
-		"fake-name",
-		"",
-		"The name of the fake struct",
-	)
-
-	outputPathFlag := fs.String(
-		"o",
-		"",
-		"The file or directory to which the generated fake will be written",
-	)
-
-	packageFlag := fs.Bool(
-		"p",
-		false,
-		"Whether or not to generate a package shim",
-	)
-	generateFlag := fs.Bool(
-		"generate",
-		false,
-		"Identify all //counterfeiter:generate directives in the current working directory and generate fakes for them",
-	)
-	headerFlag := fs.String(
-		"header",
-		"",
-		"A path to a file that should be used as a header for the generated fake",
-	)
-	quietFlag := fs.Bool(
-		"q",
-		false,
-		"Suppress status statements",
-	)
-	helpFlag := fs.Bool(
-		"help",
-		false,
-		"Display this help",
-	)
-
-	err := fs.Parse(args[1:])
-	if err != nil {
-		return nil, err
-	}
-	if *helpFlag {
-		return nil, errors.New(usage)
-	}
-	if len(fs.Args()) == 0 && !*generateFlag {
-		return nil, errors.New(usage)
-	}
-
-	packageMode := *packageFlag
-	result := &ParsedArguments{
-		PrintToStdOut: any(args, "-"),
-		GenerateInterfaceAndShimFromPackageDirectory: packageMode,
-		GenerateMode: *generateFlag,
-		HeaderFile:   *headerFlag,
-		Quiet:        *quietFlag,
-	}
-	if *generateFlag {
-		return result, nil
-	}
-	err = result.parseSourcePackageDir(packageMode, workingDir, evaler, stater, fs.Args())
-	if err != nil {
-		return nil, err
-	}
-	result.parseInterfaceName(packageMode, fs.Args())
-	result.parseFakeName(packageMode, *fakeNameFlag, fs.Args())
-	result.parseOutputPath(packageMode, workingDir, *outputPathFlag, fs.Args())
-	result.parseDestinationPackageName(packageMode, fs.Args())
-	result.parsePackagePath(packageMode, fs.Args())
-	return result, nil
-}
-
-func (a *ParsedArguments) PrettyPrint() {
-	b, _ := json.Marshal(a)
-	fmt.Println(string(b))
-}
-
-func (a *ParsedArguments) parseInterfaceName(packageMode bool, args []string) {
-	if packageMode {
-		a.InterfaceName = ""
-		return
-	}
-	if len(args) == 1 {
-		fullyQualifiedInterface := strings.Split(args[0], ".")
-		a.InterfaceName = fullyQualifiedInterface[len(fullyQualifiedInterface)-1]
-	} else {
-		a.InterfaceName = args[1]
-	}
-}
-
-func (a *ParsedArguments) parseSourcePackageDir(packageMode bool, workingDir string, evaler Evaler, stater Stater, args []string) error {
-	if packageMode {
-		a.SourcePackageDir = args[0]
-		return nil
-	}
-	if len(args) <= 1 {
-		return nil
-	}
-	s, err := getSourceDir(args[0], workingDir, evaler, stater)
-	if err != nil {
-		return err
-	}
-	a.SourcePackageDir = s
-	return nil
-}
-
-func (a *ParsedArguments) parseFakeName(packageMode bool, fakeName string, args []string) {
-	if packageMode {
-		a.parsePackagePath(packageMode, args)
-		a.FakeImplName = strings.ToUpper(path.Base(a.PackagePath))[:1] + path.Base(a.PackagePath)[1:]
-		return
-	}
-	if fakeName == "" {
-		fakeName = "Fake" + fixupUnexportedNames(a.InterfaceName)
-	}
-	a.FakeImplName = fakeName
-}
-
-func (a *ParsedArguments) parseOutputPath(packageMode bool, workingDir string, outputPath string, args []string) {
-	outputPathIsFilename := false
-	if strings.HasSuffix(outputPath, ".go") {
-		outputPathIsFilename = true
-	}
-	snakeCaseName := strings.ToLower(camelRegexp.ReplaceAllString(a.FakeImplName, "${1}_${2}"))
-
-	if outputPath != "" {
-		if !filepath.IsAbs(outputPath) {
-			outputPath = filepath.Join(workingDir, outputPath)
-		}
-		a.OutputPath = outputPath
-		if !outputPathIsFilename {
-			a.OutputPath = filepath.Join(a.OutputPath, snakeCaseName+".go")
-		}
-		return
-	}
-
-	if packageMode {
-		a.parseDestinationPackageName(packageMode, args)
-		a.OutputPath = path.Join(workingDir, a.DestinationPackageName, snakeCaseName+".go")
-		return
-	}
-
-	d := workingDir
-	if len(args) > 1 {
-		d = a.SourcePackageDir
-	}
-	a.OutputPath = filepath.Join(d, packageNameForPath(d), snakeCaseName+".go")
-}
-
-func (a *ParsedArguments) parseDestinationPackageName(packageMode bool, args []string) {
-	if packageMode {
-		a.parsePackagePath(packageMode, args)
-		a.DestinationPackageName = path.Base(a.PackagePath) + "shim"
-		return
-	}
-
-	a.DestinationPackageName = restrictToValidPackageName(filepath.Base(filepath.Dir(a.OutputPath)))
-}
-
-func (a *ParsedArguments) parsePackagePath(packageMode bool, args []string) {
-	if packageMode {
-		a.PackagePath = args[0]
-		return
-	}
-	if len(args) == 1 {
-		fullyQualifiedInterface := strings.Split(args[0], ".")
-		a.PackagePath = strings.Join(fullyQualifiedInterface[:len(fullyQualifiedInterface)-1], ".")
-	} else {
-		a.InterfaceName = args[1]
-	}
-
-	if a.PackagePath == "" {
-		a.PackagePath = a.SourcePackageDir
-	}
-}
-
-type ParsedArguments struct {
-	GenerateInterfaceAndShimFromPackageDirectory bool
-
-	SourcePackageDir string // abs path to the dir containing the interface to fake
-	PackagePath      string // package path to the package containing the interface to fake
-	OutputPath       string // path to write the fake file to
-
-	DestinationPackageName string // often the base-dir for OutputPath but must be a valid package name
-
-	InterfaceName string // the interface to counterfeit
-	FakeImplName  string // the name of the struct implementing the given interface
-
-	PrintToStdOut bool
-	GenerateMode  bool
-	Quiet         bool
-
-	HeaderFile string
-}
-
-func fixupUnexportedNames(interfaceName string) string {
-	asRunes := []rune(interfaceName)
-	if len(asRunes) == 0 || !unicode.IsLower(asRunes[0]) {
-		return interfaceName
-	}
-	asRunes[0] = unicode.ToUpper(asRunes[0])
-	return string(asRunes)
-}
-
-var camelRegexp = regexp.MustCompile("([a-z])([A-Z])")
-
-func packageNameForPath(pathToPackage string) string {
-	_, packageName := filepath.Split(pathToPackage)
-	return packageName + "fakes"
-}
-
-func getSourceDir(path string, workingDir string, evaler Evaler, stater Stater) (string, error) {
-	if !filepath.IsAbs(path) {
-		path = filepath.Join(workingDir, path)
-	}
-
-	evaluatedPath, err := evaler(path)
-	if err != nil {
-		return "", fmt.Errorf("No such file/directory/package [%s]: %v", path, err)
-	}
-
-	stat, err := stater(evaluatedPath)
-	if err != nil {
-		return "", fmt.Errorf("No such file/directory/package [%s]: %v", path, err)
-	}
-
-	if !stat.IsDir() {
-		return filepath.Dir(path), nil
-	}
-	return path, nil
-}
-
-func any(slice []string, needle string) bool {
-	for _, str := range slice {
-		if str == needle {
-			return true
-		}
-	}
-
-	return false
-}
-
-func restrictToValidPackageName(input string) string {
-	return strings.Map(func(r rune) rune {
-		if (r >= 'a' && r <= 'z') || (r >= 'A' && r <= 'Z') || (r >= '0' && r <= '9') || r == '_' {
-			return r
-		} else {
-			return -1
-		}
-	}, input)
-}
diff --git a/test/performance/vendor/github.com/maxbrunsfeld/counterfeiter/v6/arguments/usage.go b/test/performance/vendor/github.com/maxbrunsfeld/counterfeiter/v6/arguments/usage.go
deleted file mode 100644
index 0d707afaaa..0000000000
--- a/test/performance/vendor/github.com/maxbrunsfeld/counterfeiter/v6/arguments/usage.go
+++ /dev/null
@@ -1,112 +0,0 @@
-package arguments
-
-const usage = `
-USAGE
-	counterfeiter
-		[-generate>] [-o ] [-p] [--fake-name ]
-		[-header ]
-		[]  [-]
-
-ARGUMENTS
-	source-path
-		Path to the file or directory containing the interface to fake.
-		In package mode (-p), source-path should instead specify the path
-		of the input package; alternatively you can use the package name
-		(e.g. "os") and the path will be inferred from your GOROOT.
-
-	interface
-		If source-path is specified: Name of the interface to fake.
-		If no source-path is specified: Fully qualified interface path of the interface to fake.
-    If -p is specified, this will be the name of the interface to generate.
-
-	example:
-		# writes "FakeStdInterface" to ./packagefakes/fake_std_interface.go
-		counterfeiter package/subpackage.StdInterface
-
-	'-' argument
-		Write code to standard out instead of to a file
-
-OPTIONS
-	-generate
-		Identify all //counterfeiter:generate directives in .go file in the
-		current working directory and generate fakes for them. You can pass
-		arguments as usual.
-
-		NOTE: This is not the same as //go:generate directives
-		(used with the 'go generate' command), but it can be combined with
-		go generate by adding the following to a .go file:
-
-		# runs counterfeiter in generate mode
-		//go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -generate
-
-	example:
-		Add the following to a .go file:
-
-		//counterfeiter:generate . MyInterface
-		//counterfeiter:generate . MyOtherInterface
-		//counterfeiter:generate . MyThirdInterface
-
-		# run counterfeiter
-		counterfeiter -generate
-		# writes "FakeMyInterface" to ./mypackagefakes/fake_my_interface.go
-		# writes "FakeMyOtherInterface" to ./mypackagefakes/fake_my_other_interface.go
-		# writes "FakeMyThirdInterface" to ./mypackagefakes/fake_my_third_interface.go
-
-	-o
-		Path to the file or directory for the generated fakes.
-		This also determines the package name that will be used.
-		By default, the generated fakes will be generated in
-		the package "xyzfakes" which is nested in package "xyz",
-		where "xyz" is the name of referenced package.
-
-	example:
-		# writes "FakeMyInterface" to ./mySpecialFakesDir/specialFake.go
-		counterfeiter -o ./mySpecialFakesDir/specialFake.go ./mypackage MyInterface
-
-		# writes "FakeMyInterface" to ./mySpecialFakesDir/fake_my_interface.go
-		counterfeiter -o ./mySpecialFakesDir ./mypackage MyInterface
-
-	-p
-		Package mode:  When invoked in package mode, counterfeiter
-		will generate an interface and shim implementation from a
-		package in your module.  Counterfeiter finds the public methods
-		in the package  and adds those method signatures
-		to the generated interface .
-
-	example:
-		# generates os.go (interface) and osshim.go (shim) in ${PWD}/osshim
-		counterfeiter -p os
-		# now generate fake in ${PWD}/osshim/os_fake (fake_os.go)
-		go generate osshim/...
-
-	-header
-		Path to the file which should be used as a header for all generated fakes.
-		By default, no special header is used.
-		This is useful to e.g. add a licence header to every fake.
-
-		If the generate mode is used and both the "go:generate" and the
-		"counterfeiter:generate" specify a header file, the header file from the
-		"counterfeiter:generate" line takes precedence.
-
-	example:
-		# having the following code in a package ...
-		//go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -header ./generic.go.txt -generate
-		//counterfeiter:generate -header ./specific.go.txt . MyInterface
-		//counterfeiter:generate . MyOtherInterface
-		//counterfeiter:generate . MyThirdInterface
-
-		# ... generating the fakes ...
-		go generate .
-
-		# writes "FakeMyInterface" with ./specific.go.txt as a header
-		# writes "FakeMyOtherInterface" & "FakeMyThirdInterface" with ./generic.go.txt as a header
-
-	--fake-name
-		Name of the fake struct to generate. By default, 'Fake' will
-		be prepended to the name of the original interface. (ignored in
-		-p mode)
-
-	example:
-		# writes "CoolThing" to ./mypackagefakes/cool_thing.go
-		counterfeiter --fake-name CoolThing ./mypackage MyInterface
-`
diff --git a/test/performance/vendor/github.com/maxbrunsfeld/counterfeiter/v6/command/runner.go b/test/performance/vendor/github.com/maxbrunsfeld/counterfeiter/v6/command/runner.go
deleted file mode 100644
index 161fc4b2f4..0000000000
--- a/test/performance/vendor/github.com/maxbrunsfeld/counterfeiter/v6/command/runner.go
+++ /dev/null
@@ -1,117 +0,0 @@
-package command
-
-import (
-	"fmt"
-	"go/build"
-	"os"
-	"path/filepath"
-	"sort"
-	"strconv"
-	"strings"
-)
-
-func Detect(cwd string, args []string, generateMode bool) ([]Invocation, error) {
-	if generateMode {
-		return generateModeInvocations(cwd)
-	}
-
-	file := os.Getenv("GOFILE")
-	var lineno int
-	if goline, err := strconv.Atoi(os.Getenv("GOLINE")); err == nil {
-		lineno = goline
-	}
-
-	i, err := NewInvocation(file, lineno, args)
-	if err != nil {
-		return nil, err
-	}
-	return []Invocation{i}, nil
-}
-
-type Invocation struct {
-	Args []string
-	Line int
-	File string
-}
-
-func NewInvocation(file string, line int, args []string) (Invocation, error) {
-	if len(args) < 1 {
-		return Invocation{}, fmt.Errorf("%s:%v an invocation of counterfeiter must have arguments", file, line)
-	}
-	i := Invocation{
-		File: file,
-		Line: line,
-		Args: args,
-	}
-	return i, nil
-}
-
-func generateModeInvocations(cwd string) ([]Invocation, error) {
-	var result []Invocation
-	// Find all the go files
-	pkg, err := build.ImportDir(cwd, build.IgnoreVendor)
-	if err != nil {
-		return nil, err
-	}
-
-	gofiles := make([]string, 0, len(pkg.GoFiles)+len(pkg.CgoFiles)+len(pkg.TestGoFiles)+len(pkg.XTestGoFiles))
-	gofiles = append(gofiles, pkg.GoFiles...)
-	gofiles = append(gofiles, pkg.CgoFiles...)
-	gofiles = append(gofiles, pkg.TestGoFiles...)
-	gofiles = append(gofiles, pkg.XTestGoFiles...)
-	sort.Strings(gofiles)
-
-	for _, file := range gofiles {
-		invocations, err := invocationsInFile(cwd, file)
-		if err != nil {
-			return nil, err
-		}
-		result = append(result, invocations...)
-	}
-
-	return result, nil
-}
-
-func invocationsInFile(dir string, file string) ([]Invocation, error) {
-	str, err := os.ReadFile(filepath.Join(dir, file))
-	if err != nil {
-		return nil, err
-	}
-	lines := strings.Split(string(str), "\n")
-
-	var result []Invocation
-	line := 0
-	for i := range lines {
-		line++
-		args, ok := matchForString(lines[i])
-		if !ok {
-			continue
-		}
-		inv, err := NewInvocation(file, line, args)
-		if err != nil {
-			return nil, err
-		}
-
-		result = append(result, inv)
-	}
-
-	return result, nil
-}
-
-const generateDirectivePrefix = "//counterfeiter:generate "
-
-func matchForString(s string) ([]string, bool) {
-	if !strings.HasPrefix(s, generateDirectivePrefix) {
-		return nil, false
-	}
-	return stringToArgs(s[len(generateDirectivePrefix):]), true
-}
-
-func stringToArgs(s string) []string {
-	a := strings.Fields(s)
-	result := []string{
-		"counterfeiter",
-	}
-	result = append(result, a...)
-	return result
-}
diff --git a/test/performance/vendor/github.com/maxbrunsfeld/counterfeiter/v6/generator/fake.go b/test/performance/vendor/github.com/maxbrunsfeld/counterfeiter/v6/generator/fake.go
index bf88f18d79..5c2a6fd1ac 100644
--- a/test/performance/vendor/github.com/maxbrunsfeld/counterfeiter/v6/generator/fake.go
+++ b/test/performance/vendor/github.com/maxbrunsfeld/counterfeiter/v6/generator/fake.go
@@ -25,19 +25,22 @@ const (
 
 // Fake is used to generate a Fake implementation of an interface.
 type Fake struct {
-	Packages           []*packages.Package
-	Package            *packages.Package
-	Target             *types.TypeName
-	Mode               FakeMode
-	DestinationPackage string
-	Name               string
-	TargetAlias        string
-	TargetName         string
-	TargetPackage      string
-	Imports            Imports
-	Methods            []Method
-	Function           Method
-	Header             string
+	Packages                            []*packages.Package
+	Package                             *packages.Package
+	Target                              *types.TypeName
+	Mode                                FakeMode
+	DestinationPackage                  string
+	Name                                string
+	GenericTypeParametersAndConstraints string
+	GenericTypeParameters               string
+	GenericTypeConstraints              string
+	TargetAlias                         string
+	TargetName                          string
+	TargetPackage                       string
+	Imports                             Imports
+	Methods                             []Method
+	Function                            Method
+	Header                              string
 }
 
 // Method is a method of the interface.
diff --git a/test/performance/vendor/github.com/maxbrunsfeld/counterfeiter/v6/generator/interface_template.go b/test/performance/vendor/github.com/maxbrunsfeld/counterfeiter/v6/generator/interface_template.go
index 1a8fde9b46..3be9c1a5c3 100644
--- a/test/performance/vendor/github.com/maxbrunsfeld/counterfeiter/v6/generator/interface_template.go
+++ b/test/performance/vendor/github.com/maxbrunsfeld/counterfeiter/v6/generator/interface_template.go
@@ -27,7 +27,7 @@ import (
 	{{- end}}
 )
 
-type {{.Name}} struct {
+type {{.Name}}{{.GenericTypeParametersAndConstraints}} struct {
 	{{- range .Methods}}
 	{{.Name}}Stub func({{.Params.AsArgs}}) {{.Returns.AsReturnSignature}}
 	{{UnExport .Name}}Mutex sync.RWMutex
@@ -54,7 +54,7 @@ type {{.Name}} struct {
 }
 
 {{range .Methods -}}
-func (fake *{{$.Name}}) {{.Name}}({{.Params.AsNamedArgsWithTypes}}) {{.Returns.AsReturnSignature}} {
+func (fake *{{$.Name}}{{$.GenericTypeParameters}}) {{.Name}}({{.Params.AsNamedArgsWithTypes}}) {{.Returns.AsReturnSignature}} {
 	{{- range .Params.Slices}}
 	var {{UnExport .Name}}Copy {{.Type}}
 	if {{UnExport .Name}} != nil {
@@ -90,20 +90,20 @@ func (fake *{{$.Name}}) {{.Name}}({{.Params.AsNamedArgsWithTypes}}) {{.Returns.A
 	{{- end}}
 }
 
-func (fake *{{$.Name}}) {{Title .Name}}CallCount() int {
+func (fake *{{$.Name}}{{$.GenericTypeParameters}}) {{Title .Name}}CallCount() int {
 	fake.{{UnExport .Name}}Mutex.RLock()
 	defer fake.{{UnExport .Name}}Mutex.RUnlock()
 	return len(fake.{{UnExport .Name}}ArgsForCall)
 }
 
-func (fake *{{$.Name}}) {{Title .Name}}Calls(stub func({{.Params.AsArgs}}) {{.Returns.AsReturnSignature}}) {
+func (fake *{{$.Name}}{{$.GenericTypeParameters}}) {{Title .Name}}Calls(stub func({{.Params.AsArgs}}) {{.Returns.AsReturnSignature}}) {
 	fake.{{UnExport .Name}}Mutex.Lock()
 	defer fake.{{UnExport .Name}}Mutex.Unlock()
 	fake.{{.Name}}Stub = stub
 }
 
 {{if .Params.HasLength -}}
-func (fake *{{$.Name}}) {{Title .Name}}ArgsForCall(i int) {{.Params.AsReturnSignature}} {
+func (fake *{{$.Name}}{{$.GenericTypeParameters}}) {{Title .Name}}ArgsForCall(i int) {{.Params.AsReturnSignature}} {
 	fake.{{UnExport .Name}}Mutex.RLock()
 	defer fake.{{UnExport .Name}}Mutex.RUnlock()
 	argsForCall := fake.{{UnExport .Name}}ArgsForCall[i]
@@ -112,7 +112,7 @@ func (fake *{{$.Name}}) {{Title .Name}}ArgsForCall(i int) {{.Params.AsReturnSign
 {{- end}}
 
 {{if .Returns.HasLength -}}
-func (fake *{{$.Name}}) {{Title .Name}}Returns({{.Returns.AsNamedArgsWithTypes}}) {
+func (fake *{{$.Name}}{{$.GenericTypeParameters}}) {{Title .Name}}Returns({{.Returns.AsNamedArgsWithTypes}}) {
 	fake.{{UnExport .Name}}Mutex.Lock()
 	defer fake.{{UnExport .Name}}Mutex.Unlock()
 	fake.{{.Name}}Stub = nil
@@ -123,7 +123,7 @@ func (fake *{{$.Name}}) {{Title .Name}}Returns({{.Returns.AsNamedArgsWithTypes}}
 	}{ {{- .Returns.AsNamedArgs -}} }
 }
 
-func (fake *{{$.Name}}) {{Title .Name}}ReturnsOnCall(i int, {{.Returns.AsNamedArgsWithTypes}}) {
+func (fake *{{$.Name}}{{$.GenericTypeParameters}}) {{Title .Name}}ReturnsOnCall(i int, {{.Returns.AsNamedArgsWithTypes}}) {
 	fake.{{UnExport .Name}}Mutex.Lock()
 	defer fake.{{UnExport .Name}}Mutex.Unlock()
 	fake.{{.Name}}Stub = nil
@@ -144,7 +144,7 @@ func (fake *{{$.Name}}) {{Title .Name}}ReturnsOnCall(i int, {{.Returns.AsNamedAr
 {{end -}}
 {{end}}
 
-func (fake *{{.Name}}) Invocations() map[string][][]interface{} {
+func (fake *{{.Name}}{{$.GenericTypeParameters}}) Invocations() map[string][][]interface{} {
 	fake.invocationsMutex.RLock()
 	defer fake.invocationsMutex.RUnlock()
 	{{- range .Methods}}
@@ -158,7 +158,7 @@ func (fake *{{.Name}}) Invocations() map[string][][]interface{} {
 	return copiedInvocations
 }
 
-func (fake *{{.Name}}) recordInvocation(key string, args []interface{}) {
+func (fake *{{.Name}}{{$.GenericTypeParameters}}) recordInvocation(key string, args []interface{}) {
 	fake.invocationsMutex.Lock()
 	defer fake.invocationsMutex.Unlock()
 	if fake.invocations == nil {
@@ -171,6 +171,6 @@ func (fake *{{.Name}}) recordInvocation(key string, args []interface{}) {
 }
 
 {{if IsExported .TargetName -}}
-var _ {{.TargetAlias}}.{{.TargetName}} = new({{.Name}})
+var _ {{.TargetAlias}}.{{.TargetName}}{{.GenericTypeConstraints}} = new({{.Name}}{{.GenericTypeConstraints}})
 {{- end}}
 `
diff --git a/test/performance/vendor/github.com/maxbrunsfeld/counterfeiter/v6/generator/loader.go b/test/performance/vendor/github.com/maxbrunsfeld/counterfeiter/v6/generator/loader.go
index 4a8695b1ed..106ddfbd58 100644
--- a/test/performance/vendor/github.com/maxbrunsfeld/counterfeiter/v6/generator/loader.go
+++ b/test/performance/vendor/github.com/maxbrunsfeld/counterfeiter/v6/generator/loader.go
@@ -57,9 +57,34 @@ func (f *Fake) loadPackages(c Cacher, workingDir string) error {
 	return nil
 }
 
+func (f *Fake) getGenericTypeData(typeName *types.TypeName) (paramNames []string, constraintNames []string, paramAndConstraintNames []string, found bool) {
+	if named, ok := typeName.Type().(*types.Named); ok {
+		if _, ok := named.Underlying().(*types.Interface); ok {
+			typeParams := named.TypeParams()
+			if typeParams.Len() > 0 {
+				for i := 0; i < typeParams.Len(); i++ {
+					param := typeParams.At(i)
+					paramName := param.Obj().Name()
+					constraint := param.Constraint()
+					constraintSections := strings.Split(constraint.String(), "/")
+					constraintName := constraintSections[len(constraintSections)-1]
+					paramNames = append(paramNames, paramName)
+					constraintNames = append(constraintNames, constraintName)
+					paramAndConstraintNames = append(paramAndConstraintNames, fmt.Sprintf("%s %s", paramName, constraintName))
+					found = true
+				}
+			}
+		}
+	}
+	return
+}
+
 func (f *Fake) findPackage() error {
 	var target *types.TypeName
 	var pkg *packages.Package
+	genericTypeParametersAndConstraints := []string{}
+	genericTypeConstraints := []string{}
+	genericTypeParameters := []string{}
 	for i := range f.Packages {
 		if f.Packages[i].Types == nil || f.Packages[i].Types.Scope() == nil {
 			continue
@@ -72,6 +97,15 @@ func (f *Fake) findPackage() error {
 		raw := pkg.Types.Scope().Lookup(f.TargetName)
 		if raw != nil {
 			if typeName, ok := raw.(*types.TypeName); ok {
+				if paramNames, constraintNames, paramAndConstraintNames, found := f.getGenericTypeData(typeName); found {
+					genericTypeParameters = append(genericTypeParameters, paramNames...)
+					genericTypeConstraints = append(genericTypeConstraints, constraintNames...)
+					genericTypeParametersAndConstraints = append(
+						genericTypeParametersAndConstraints,
+						paramAndConstraintNames...,
+					)
+				}
+
 				target = typeName
 				break
 			}
@@ -89,6 +123,11 @@ func (f *Fake) findPackage() error {
 	f.Target = target
 	f.Package = pkg
 	f.TargetPackage = imports.VendorlessPath(pkg.PkgPath)
+	if len(genericTypeParameters) > 0 {
+		f.GenericTypeParametersAndConstraints = fmt.Sprintf("[%s]", strings.Join(genericTypeParametersAndConstraints, ", "))
+		f.GenericTypeParameters = fmt.Sprintf("[%s]", strings.Join(genericTypeParameters, ", "))
+		f.GenericTypeConstraints = fmt.Sprintf("[%s]", strings.Join(genericTypeConstraints, ", "))
+	}
 	t := f.Imports.Add(pkg.Name, f.TargetPackage)
 	f.TargetAlias = t.Alias
 	if f.Mode != Package {
@@ -97,7 +136,7 @@ func (f *Fake) findPackage() error {
 
 	if f.Mode == InterfaceOrFunction {
 		if !f.IsInterface() && !f.IsFunction() {
-			return fmt.Errorf("cannot generate an fake for %s because it is not an interface or function", f.TargetName)
+			return fmt.Errorf("cannot generate a fake for %s because it is not an interface or function", f.TargetName)
 		}
 	}
 
@@ -130,14 +169,10 @@ func (f *Fake) addImportsFor(typ types.Type) {
 		f.addImportsFor(t.Elem())
 	case *types.Chan:
 		f.addImportsFor(t.Elem())
+	case *types.Alias:
+		f.addImportsForNamedType(t)
 	case *types.Named:
-		if t.Obj() != nil && t.Obj().Pkg() != nil {
-			typeArgs := t.TypeArgs()
-			for i := 0; i < typeArgs.Len(); i++ {
-				f.addImportsFor(typeArgs.At(i))
-			}
-			f.Imports.Add(t.Obj().Pkg().Name(), t.Obj().Pkg().Path())
-		}
+		f.addImportsForNamedType(t)
 	case *types.Slice:
 		f.addImportsFor(t.Elem())
 	case *types.Array:
@@ -154,3 +189,16 @@ func (f *Fake) addImportsFor(typ types.Type) {
 		log.Printf("!!! WARNING: Missing case for type %s\n", reflect.TypeOf(typ).String())
 	}
 }
+
+func (f *Fake) addImportsForNamedType(t interface {
+	Obj() *types.TypeName
+	TypeArgs() *types.TypeList
+}) {
+	if t.Obj() != nil && t.Obj().Pkg() != nil {
+		typeArgs := t.TypeArgs()
+		for i := 0; i < typeArgs.Len(); i++ {
+			f.addImportsFor(typeArgs.At(i))
+		}
+		f.Imports.Add(t.Obj().Pkg().Name(), t.Obj().Pkg().Path())
+	}
+}
diff --git a/test/performance/vendor/github.com/maxbrunsfeld/counterfeiter/v6/main.go b/test/performance/vendor/github.com/maxbrunsfeld/counterfeiter/v6/main.go
deleted file mode 100644
index fcaf995a6f..0000000000
--- a/test/performance/vendor/github.com/maxbrunsfeld/counterfeiter/v6/main.go
+++ /dev/null
@@ -1,207 +0,0 @@
-package main
-
-import (
-	"errors"
-	"fmt"
-	"go/format"
-	"io"
-	"log"
-	"os"
-	"path/filepath"
-	"runtime/debug"
-	"runtime/pprof"
-
-	"github.com/maxbrunsfeld/counterfeiter/v6/arguments"
-	"github.com/maxbrunsfeld/counterfeiter/v6/command"
-	"github.com/maxbrunsfeld/counterfeiter/v6/generator"
-)
-
-func main() {
-	debug.SetGCPercent(-1)
-
-	if err := run(); err != nil {
-		fail("%v", err)
-	}
-}
-
-func run() error {
-	profile := os.Getenv("COUNTERFEITER_PROFILE") != ""
-	if profile {
-		p, err := filepath.Abs(filepath.Join(".", "counterfeiter.profile"))
-		if err != nil {
-			return err
-		}
-		f, err := os.Create(p)
-		if err != nil {
-			return err
-		}
-		if err := pprof.StartCPUProfile(f); err != nil {
-			return err
-		}
-		fmt.Printf("Profile: %s\n", p)
-		defer pprof.StopCPUProfile()
-	}
-
-	log.SetFlags(log.Lshortfile)
-	if !isDebug() {
-		log.SetOutput(io.Discard)
-	}
-
-	cwd, err := os.Getwd()
-	if err != nil {
-		return errors.New("Error - couldn't determine current working directory")
-	}
-
-	var cache generator.Cacher
-	var headerReader generator.FileReader
-	if disableCache() {
-		cache = &generator.FakeCache{}
-		headerReader = &generator.SimpleFileReader{}
-	} else {
-		cache = &generator.Cache{}
-		headerReader = &generator.CachedFileReader{}
-	}
-	var invocations []command.Invocation
-	var args *arguments.ParsedArguments
-	args, _ = arguments.New(os.Args, cwd, filepath.EvalSymlinks, os.Stat)
-	generateMode := false
-	if args != nil {
-		generateMode = args.GenerateMode
-	}
-	if !generateMode && shouldPrintGenerateWarning() {
-		fmt.Printf("\nWARNING: Invoking counterfeiter multiple times from \"go generate\" is slow.\nConsider using counterfeiter:generate directives to speed things up.\nSee https://github.com/maxbrunsfeld/counterfeiter#step-2b---add-counterfeitergenerate-directives for more information.\nSet the \"COUNTERFEITER_NO_GENERATE_WARNING\" environment variable to suppress this message.\n\n")
-	}
-	invocations, err = command.Detect(cwd, os.Args, generateMode)
-	if err != nil {
-		return err
-	}
-
-	for i := range invocations {
-		a, err := arguments.New(invocations[i].Args, cwd, filepath.EvalSymlinks, os.Stat)
-		if err != nil {
-			return err
-		}
-
-		// If the '//counterfeiter:generate ...' line does not have a '-header'
-		// flag, we use the one from the "global"
-		// '//go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -generate -header /some/header.txt'
-		// line (which defaults to none). By doing so, we can configure the header
-		// once per package, which is probably the most common case for adding
-		// licence headers (i.e. all the fakes will have the same licence headers).
-		a.HeaderFile = or(a.HeaderFile, args.HeaderFile)
-
-		err = generate(cwd, a, cache, headerReader)
-		if err != nil {
-			return err
-		}
-	}
-	return nil
-}
-
-func or(opts ...string) string {
-	for _, s := range opts {
-		if s != "" {
-			return s
-		}
-	}
-	return ""
-}
-
-func isDebug() bool {
-	return os.Getenv("COUNTERFEITER_DEBUG") != ""
-}
-
-func disableCache() bool {
-	return os.Getenv("COUNTERFEITER_DISABLECACHE") != ""
-}
-
-func shouldPrintGenerateWarning() bool {
-	return invokedByGoGenerate() && os.Getenv("COUNTERFEITER_NO_GENERATE_WARNING") == ""
-}
-
-func invokedByGoGenerate() bool {
-	return os.Getenv("DOLLAR") == "$"
-}
-
-func generate(workingDir string, args *arguments.ParsedArguments, cache generator.Cacher, headerReader generator.FileReader) error {
-	if !args.Quiet {
-		if err := reportStarting(workingDir, args.OutputPath, args.FakeImplName); err != nil {
-			return err
-		}
-	}
-
-	b, err := doGenerate(workingDir, args, cache, headerReader)
-	if err != nil {
-		return err
-	}
-
-	if err := printCode(b, args.OutputPath, args.PrintToStdOut); err != nil {
-		return err
-	}
-
-	if !args.Quiet {
-		fmt.Fprint(os.Stderr, "Done\n")
-	}
-
-	return nil
-}
-
-func doGenerate(workingDir string, args *arguments.ParsedArguments, cache generator.Cacher, headerReader generator.FileReader) ([]byte, error) {
-	mode := generator.InterfaceOrFunction
-	if args.GenerateInterfaceAndShimFromPackageDirectory {
-		mode = generator.Package
-	}
-
-	headerContent, err := headerReader.Get(workingDir, args.HeaderFile)
-	if err != nil {
-		return nil, err
-	}
-
-	f, err := generator.NewFake(mode, args.InterfaceName, args.PackagePath, args.FakeImplName, args.DestinationPackageName, headerContent, workingDir, cache)
-	if err != nil {
-		return nil, err
-	}
-	return f.Generate(true)
-}
-
-func printCode(code []byte, outputPath string, printToStdOut bool) error {
-	formattedCode, err := format.Source(code)
-	if err != nil {
-		return err
-	}
-
-	if printToStdOut {
-		fmt.Println(string(formattedCode))
-		return nil
-	}
-	_ = os.MkdirAll(filepath.Dir(outputPath), 0777)
-	file, err := os.Create(outputPath)
-	if err != nil {
-		return fmt.Errorf("Couldn't create fake file - %v", err)
-	}
-
-	_, err = file.Write(formattedCode)
-	if err != nil {
-		return fmt.Errorf("Couldn't write to fake file - %v", err)
-	}
-	return nil
-}
-
-func reportStarting(workingDir string, outputPath, fakeName string) error {
-	rel, err := filepath.Rel(workingDir, outputPath)
-	if err != nil {
-		return err
-	}
-
-	msg := fmt.Sprintf("Writing `%s` to `%s`... ", fakeName, rel)
-	if isDebug() {
-		msg = msg + "\n"
-	}
-	fmt.Fprint(os.Stderr, msg)
-	return nil
-}
-
-func fail(s string, args ...interface{}) {
-	fmt.Printf("\n"+s+"\n", args...)
-	os.Exit(1)
-}
diff --git a/test/performance/vendor/github.com/nginx/agent/sdk/v2/config_helpers.go b/test/performance/vendor/github.com/nginx/agent/sdk/v2/config_helpers.go
index ed2595be87..9baa07e828 100644
--- a/test/performance/vendor/github.com/nginx/agent/sdk/v2/config_helpers.go
+++ b/test/performance/vendor/github.com/nginx/agent/sdk/v2/config_helpers.go
@@ -125,6 +125,7 @@ func GetNginxConfigWithIgnoreDirectives(
 		},
 	)
 	if err != nil {
+		readLock.Unlock()
 		return nil, fmt.Errorf("error reading config from %s, error: %s", confFile, err)
 	}
 
@@ -144,10 +145,11 @@ func GetNginxConfigWithIgnoreDirectives(
 
 	err = updateNginxConfigFromPayload(confFile, payload, nginxConfig, allowedDirectories)
 	if err != nil {
+		readLock.Unlock()
 		return nil, fmt.Errorf("error assemble payload from %s, error: %s", confFile, err)
 	}
-	readLock.Unlock()
 
+	readLock.Unlock()
 	return nginxConfig, nil
 }
 
diff --git a/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/.gitignore b/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/.gitignore
index 82c668079f..e8838f9fa9 100644
--- a/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/.gitignore
+++ b/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/.gitignore
@@ -16,9 +16,6 @@ __pycache__/
 *.out
 coverage.*
 
-# Kubernetes Generated files - skip generated files, except for vendored files
-!vendor/**/zz_generated.*
-
 # editor and IDE paraphernalia
 .idea
 .vscode
diff --git a/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/.golangci.yml b/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/.golangci.yml
index 7888e9f1a6..593c5b9d06 100644
--- a/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/.golangci.yml
+++ b/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/.golangci.yml
@@ -40,9 +40,10 @@ linters:
 run:
   # 10 minute timeout for analysis
   timeout: 10m
-  modules-download-mode: vendor
+  modules-download-mode: mod
   skip-dirs-use-default: true
 
+
 # Specific linter settings
 linters-settings:
   gocyclo:
@@ -62,6 +63,9 @@ linters-settings:
     local-prefixes: gitswarm.f5net.com/indigo,gitlab.com/f5
   errcheck:
     ignore: ^Close.*,os:^Setenv.*,fmt:.*,io/ioutil:^Read.*,github.com/spf13/viper:.*,github.com/pkg/errors:^Wrap.*
+  funclen:
+    skip-ifles:
+        - ".*\\.gen\\.go"
 
   lll:
     line-length: 140
diff --git a/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/Makefile b/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/Makefile
index aada8bcacb..80ee2c08e4 100644
--- a/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/Makefile
+++ b/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/Makefile
@@ -1,6 +1,5 @@
 PACKAGE           = $(notdir $(patsubst %/,%,$(dir $(realpath $(lastword $(MAKEFILE_LIST))))))
 OUT_DIR          ?= build
-VENDOR_DIR       ?= vendor
 RESULTS_DIR		 ?= results
 DOCKER_REGISTRY  ?= local
 DOCKER_TAG       ?= latest
@@ -25,7 +24,6 @@ deps:
 	go mod download
 	go mod tidy
 	go mod verify
-	go mod vendor
 
 deps-upgrade:
 	GOFLAGS="" go get -u ./...
@@ -36,7 +34,7 @@ deps-upgrade:
 #######################################
 fmt:
 	$(info Running goimports...)
-	@goimports -w -e $$(find . -type f -name '*.go' -not -path "./vendor/*")
+	@goimports -w -e $$(find . -type f -name '*.go')
 
 test:
 	$(info Running unit tests...)
@@ -60,7 +58,7 @@ lint-docker:
 	docker run --rm -v "${PWD}":/app -w /app golangci/golangci-lint:v1.51.2 golangci-lint run
 
 lint-shell:
-	shellcheck -x $$(find . -name "*.sh" -type f -not -path "./vendor/*")
+	shellcheck -x $$(find . -name "*.sh" -type f)
 
 gen:
 	go generate -x ./...
diff --git a/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/README.md b/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/README.md
index 3f84bce266..e75f02cf44 100644
--- a/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/README.md
+++ b/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/README.md
@@ -74,7 +74,9 @@ func main() {
 ```
 
 # Generate support for third-party modules
-This is an example that takes the path of a third-party module source code to generate support for it. Assume the source code path of that module is `./src`. You can call `go run cmd/generate/main.go ./src`. The stdout will be like
+This is a simple example that takes the path of a third-party module source code to generate support for it. For detailed usage of the tool, please run
+`go run ./cmd/generate/ --help`.
+Assuming the source code path of that module is `./src`, you can call `go run ./cmd/generate/ --src-path=./src -directive-map-name=directives -match-func-name=Match -match-func-comment=comment`. The output will be similar to:
 
 ```go
 /**
@@ -107,8 +109,7 @@ var directives = map[string][]uint{
     },
 }
 
-// Match is a matchFunc for parsing an NGINX config that contains the
-// preceding directives.
+// comment
 func Match(directive string) ([]uint, bool) {
     m, ok := directives[directive]
     return m, ok
diff --git a/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze.go b/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze.go
index d453b3d67e..e1127b2da7 100644
--- a/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze.go
+++ b/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze.go
@@ -7,6 +7,39 @@
 
 package crossplane
 
+// Upgrade for .gen.go files. If you don't have access to some private modules,
+// please use -skip options to skip them. e.g. go generate -skip="nap".
+
+// Update for headersmore
+//go:generate sh -c "sh ./scripts/generate/generate.sh --url https://github.com/openresty/headers-more-nginx-module.git --config-path ./scripts/generate/configs/headersmore_config.json > ./analyze_headersMore_directives.gen.go"
+
+// Update for njs
+//go:generate sh -c "sh ./scripts/generate/generate.sh --url https://github.com/nginx/njs.git --config-path ./scripts/generate/configs/njs_config.json > ./analyze_njs_directives.gen.go"
+
+// Update for OSS, filter in config is the directives not in https://nginx.org/en/docs/dirindex.html but in source code.
+// Override in config is for the "if" directive. We create a bitmask ngxConfExpr for it in crossplane, which is not in source code.
+//go:generate sh -c "sh ./scripts/generate/generate.sh --url https://github.com/nginx/nginx.git --config-path ./scripts/generate/configs/oss_latest_config.json > ./analyze_oss_latest_directives.gen.go"
+//go:generate sh -c "sh ./scripts/generate/generate.sh --url https://github.com/nginx/nginx.git --config-path ./scripts/generate/configs/oss_126_config.json --branch branches/stable-1.26 > ./analyze_oss_126_directives.gen.go"
+//go:generate sh -c "sh ./scripts/generate/generate.sh --url https://github.com/nginx/nginx.git --config-path ./scripts/generate/configs/oss_124_config.json --branch branches/stable-1.24 > ./analyze_oss_124_directives.gen.go"
+
+// Update for lua, override is for the lua block directives, see https://github.com/nginxinc/nginx-go-crossplane/pull/86.
+//go:generate sh -c "sh ./scripts/generate/generate.sh --url https://github.com/openresty/lua-nginx-module.git --config-path ./scripts/generate/configs/lua_config.json  --path ./src > ./analyze_lua_directives.gen.go"
+
+// Update for otel. Filter is for some directives withou context.
+// Otel provides its own config handler for some directives and they don't have context. Currently we don't support them.
+//go:generate sh -c "sh ./scripts/generate/generate.sh --url https://github.com/nginxinc/nginx-otel.git --config-path ./scripts/generate/configs/otel_config.json --branch main > ./analyze_otel_directives.gen.go"
+
+// Update for NAP v4 and v5.
+// NAP is a private module. Please ensure you have correct access and put the url.
+// and branch of it in environment variable NAP_URL, NAP_V4_BRANCH, and NAP_V5_BRANCH.
+// Override is for flag dirctives. NAP used ngxConfTake1 for flag directives, we change them to ngxConfFlag in crossplane.
+// NAP v4
+//go:generate sh -c "sh ./scripts/generate/generate.sh --url $NAP_URL --config-path ./scripts/generate/configs/nap_v4_config.json --branch $NAP_V4_BRANCH --path ./src > analyze_appProtectWAFv4_directives.gen.go"
+// NAP v5
+//go:generate sh -c "sh ./scripts/generate/generate.sh --url $NAP_URL --config-path ./scripts/generate/configs/nap_v5_config.json --branch $NAP_V5_BRANCH --path ./src > analyze_appProtectWAFv5_directives.gen.go"
+
+// Update for geoip2
+//go:generate sh -c "sh ./scripts/generate/generate.sh --url https://github.com/leev/ngx_http_geoip2_module.git --config-path ./scripts/generate/configs/geoip2_config.json > ./analyze_geoip2_directives.gen.go"
 import (
 	"fmt"
 )
@@ -219,7 +252,7 @@ func unionBitmaskMaps(maps ...map[string][]uint) map[string][]uint {
 // not provided. It is union of latest Nplus, Njs, and Otel.
 //
 //nolint:gochecknoglobals
-var defaultDirectives = unionBitmaskMaps(ngxPlusLatestDirectives, moduleNjsDirectives, moduleOtelDirectives)
+var defaultDirectives = unionBitmaskMaps(nginxPlusLatestDirectives, njsDirectives, otelDirectives)
 
 func DefaultDirectivesMatchFunc(directive string) ([]uint, bool) {
 	masks, matched := defaultDirectives[directive]
diff --git a/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_appProtectWAFv4_directives.gen.go b/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_appProtectWAFv4_directives.gen.go
new file mode 100644
index 0000000000..c639b73fb4
--- /dev/null
+++ b/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_appProtectWAFv4_directives.gen.go
@@ -0,0 +1,88 @@
+/**
+ * Copyright (c) F5, Inc.
+ *
+ * This source code is licensed under the Apache License, Version 2.0 license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+// Code generated by generator; DO NOT EDIT.
+// All the definitions are extracted from the source code
+// Each bit mask describes these behaviors:
+//   - how many arguments the directive can take
+//   - whether or not it is a block directive
+//   - whether this is a flag (takes one argument that's either "on" or "off")
+//   - which contexts it's allowed to be in
+
+package crossplane
+
+var appProtectWAFv4Directives = map[string][]uint{
+    "app_protect_app_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "app_protect_compressed_requests_action": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_config_set_timeout": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_cookie_seed": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_cpu_thresholds": {
+        ngxHTTPMainConf | ngxConfTake2,
+    },
+    "app_protect_custom_log_attribute": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "app_protect_enable": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "app_protect_enforcer_address": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_enforcer_memory_limit_mb": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_failure_mode_action": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_global_settings": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_logging_str": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "app_protect_physical_memory_util_thresholds": {
+        ngxHTTPMainConf | ngxConfTake2,
+    },
+    "app_protect_policy_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "app_protect_reconnect_period_seconds": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_request_buffer_overflow_action": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_response_enforcement_disable": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_security_log": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "app_protect_security_log_enable": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "app_protect_streaming_buffer_watermarks": {
+        ngxHTTPMainConf | ngxConfTake2,
+    },
+    "app_protect_user_defined_signatures": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+}
+
+// MatchAppProtectWAFv4 is a MatchFunc for App Protect v4 module.
+func MatchAppProtectWAFv4(directive string) ([]uint, bool) {
+    m, ok := appProtectWAFv4Directives[directive]
+    return m, ok
+}
diff --git a/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_appProtectWAFv4_directives.go b/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_appProtectWAFv4_directives.go
deleted file mode 100644
index 4ef764f6f9..0000000000
--- a/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_appProtectWAFv4_directives.go
+++ /dev/null
@@ -1,51 +0,0 @@
-package crossplane
-
-// nginx app protect specific and global directives, inferred from
-// [https://docs.nginx.com/nginx-app-protect/configuration-guide/configuration/#directives]
-
-//nolint:gochecknoglobals
-var appProtectWAFv4Directives = map[string][]uint{
-	"app_protect_compressed_requests_action": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"app_protect_cookie_seed": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"app_protect_cpu_thresholds": {
-		ngxHTTPMainConf | ngxConfTake2,
-	},
-	"app_protect_enable": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"app_protect_failure_mode_action": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"app_protect_physical_memory_util_thresholds": {
-		ngxHTTPMainConf | ngxConfTake2,
-	},
-	"app_protect_policy_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"app_protect_reconnect_period_seconds": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"app_protect_request_buffer_overflow_action": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"app_protect_security_log_enable": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"app_protect_security_log": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"app_protect_user_defined_signatures": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-}
-
-// AppProtectWAFv4DirectivesMatchFn is a match function for parsing an NGINX config that contains the
-// App Protect v4 module.
-func AppProtectWAFv4DirectivesMatchFn(directive string) ([]uint, bool) {
-	masks, matched := appProtectWAFv4Directives[directive]
-	return masks, matched
-}
diff --git a/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_appProtectWAFv5_directives.gen.go b/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_appProtectWAFv5_directives.gen.go
new file mode 100644
index 0000000000..4601a25a1e
--- /dev/null
+++ b/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_appProtectWAFv5_directives.gen.go
@@ -0,0 +1,88 @@
+/**
+ * Copyright (c) F5, Inc.
+ *
+ * This source code is licensed under the Apache License, Version 2.0 license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+// Code generated by generator; DO NOT EDIT.
+// All the definitions are extracted from the source code
+// Each bit mask describes these behaviors:
+//   - how many arguments the directive can take
+//   - whether or not it is a block directive
+//   - whether this is a flag (takes one argument that's either "on" or "off")
+//   - which contexts it's allowed to be in
+
+package crossplane
+
+var appProtectWAFv5Directives = map[string][]uint{
+    "app_protect_app_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "app_protect_compressed_requests_action": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_config_set_timeout": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_cookie_seed": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_cpu_thresholds": {
+        ngxHTTPMainConf | ngxConfTake2,
+    },
+    "app_protect_custom_log_attribute": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "app_protect_enable": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "app_protect_enforcer_address": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_enforcer_memory_limit_mb": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_failure_mode_action": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_global_settings": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_logging_str": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "app_protect_physical_memory_util_thresholds": {
+        ngxHTTPMainConf | ngxConfTake2,
+    },
+    "app_protect_policy_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "app_protect_reconnect_period_seconds": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_request_buffer_overflow_action": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_response_enforcement_disable": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_security_log": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "app_protect_security_log_enable": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "app_protect_streaming_buffer_watermarks": {
+        ngxHTTPMainConf | ngxConfTake2,
+    },
+    "app_protect_user_defined_signatures": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+}
+
+// MatchAppProtectWAFv5 is a MatchFunc for App Protect v5 module.
+func MatchAppProtectWAFv5(directive string) ([]uint, bool) {
+    m, ok := appProtectWAFv5Directives[directive]
+    return m, ok
+}
diff --git a/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_appProtectWAFv5_directives.go b/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_appProtectWAFv5_directives.go
deleted file mode 100644
index bba7faa142..0000000000
--- a/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_appProtectWAFv5_directives.go
+++ /dev/null
@@ -1,51 +0,0 @@
-package crossplane
-
-// nginx app protect specific and global directives, inferred from
-// [https://docs.nginx.com/nginx-app-protect/configuration-guide/configuration/#directives]
-
-//nolint:gochecknoglobals
-var appProtectWAFv5Directives = map[string][]uint{
-	"app_protect_physical_memory_util_thresholds": {
-		ngxHTTPMainConf | ngxConfTake2,
-	},
-	"app_protect_cpu_thresholds": {
-		ngxHTTPMainConf | ngxConfTake2,
-	},
-	"app_protect_failure_mode_action": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"app_protect_cookie_seed": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"app_protect_request_buffer_overflow_action": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"app_protect_reconnect_period_seconds": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"app_protect_enforcer_address": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"app_protect_enable": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"app_protect_policy_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"app_protect_security_log_enable": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"app_protect_security_log": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"app_protect_custom_log_attribute": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-}
-
-// AppProtectWAFv5DirectivesMatchFn is a match function for parsing an NGINX config that contains the
-// App Protect v5 module.
-func AppProtectWAFv5DirectivesMatchFn(directive string) ([]uint, bool) {
-	masks, matched := appProtectWAFv5Directives[directive]
-	return masks, matched
-}
diff --git a/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_geoip2_directives.gen.go b/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_geoip2_directives.gen.go
new file mode 100644
index 0000000000..998d61a948
--- /dev/null
+++ b/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_geoip2_directives.gen.go
@@ -0,0 +1,35 @@
+/**
+ * Copyright (c) F5, Inc.
+ *
+ * This source code is licensed under the Apache License, Version 2.0 license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+// Code generated by generator; DO NOT EDIT.
+// All the definitions are extracted from the source code
+// Each bit mask describes these behaviors:
+//   - how many arguments the directive can take
+//   - whether or not it is a block directive
+//   - whether this is a flag (takes one argument that's either "on" or "off")
+//   - which contexts it's allowed to be in
+
+package crossplane
+
+var geoip2Directives = map[string][]uint{
+    "geoip2": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfTake1,
+        ngxStreamMainConf | ngxConfBlock | ngxConfTake1,
+    },
+    "geoip2_proxy": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "geoip2_proxy_recursive": {
+        ngxHTTPMainConf | ngxConfFlag,
+    },
+}
+
+// MatchGeoip2Latest is a MatchFunc for the latest version of geoip2.
+func MatchGeoip2Latest(directive string) ([]uint, bool) {
+    m, ok := geoip2Directives[directive]
+    return m, ok
+}
diff --git a/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_headersMore_directives.gen.go b/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_headersMore_directives.gen.go
new file mode 100644
index 0000000000..462a81bd82
--- /dev/null
+++ b/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_headersMore_directives.gen.go
@@ -0,0 +1,37 @@
+/**
+ * Copyright (c) F5, Inc.
+ *
+ * This source code is licensed under the Apache License, Version 2.0 license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+// Code generated by generator; DO NOT EDIT.
+// All the definitions are extracted from the source code
+// Each bit mask describes these behaviors:
+//   - how many arguments the directive can take
+//   - whether or not it is a block directive
+//   - whether this is a flag (takes one argument that's either "on" or "off")
+//   - which contexts it's allowed to be in
+
+package crossplane
+
+var headersMoreDirectives = map[string][]uint{
+    "more_clear_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf1More,
+    },
+    "more_clear_input_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf1More,
+    },
+    "more_set_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf1More,
+    },
+    "more_set_input_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf1More,
+    },
+}
+
+// MatchHeadersMoreLatest is a MatchFunc for the latest version of headersmore.
+func MatchHeadersMoreLatest(directive string) ([]uint, bool) {
+    m, ok := headersMoreDirectives[directive]
+    return m, ok
+}
diff --git a/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_headersMore_directives.go b/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_headersMore_directives.go
deleted file mode 100644
index d32558dfb9..0000000000
--- a/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_headersMore_directives.go
+++ /dev/null
@@ -1,36 +0,0 @@
-/**
- * Copyright (c) F5, Inc.
- *
- * This source code is licensed under the Apache License, Version 2.0 license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-// All the definitions are extracted from the source code
-// Each bit mask describes these behaviors:
-//   - how many arguments the directive can take
-//   - whether or not it is a block directive
-//   - whether this is a flag (takes one argument that's either "on" or "off")
-//   - which contexts it's allowed to be in
-
-package crossplane
-
-//nolint:gochecknoglobals
-var moduleHeadersMoreDirectives = map[string][]uint{
-	"more_clear_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf1More,
-	},
-	"more_clear_input_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf1More,
-	},
-	"more_set_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf1More,
-	},
-	"more_set_input_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf1More,
-	},
-}
-
-func HeadersMoreDirectivesMatchFn(directive string) ([]uint, bool) {
-	masks, matched := moduleHeadersMoreDirectives[directive]
-	return masks, matched
-}
diff --git a/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_lua_directives.gen.go b/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_lua_directives.gen.go
new file mode 100644
index 0000000000..d30e0b29d1
--- /dev/null
+++ b/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_lua_directives.gen.go
@@ -0,0 +1,262 @@
+/**
+ * Copyright (c) F5, Inc.
+ *
+ * This source code is licensed under the Apache License, Version 2.0 license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+// Code generated by generator; DO NOT EDIT.
+// All the definitions are extracted from the source code
+// Each bit mask describes these behaviors:
+//   - how many arguments the directive can take
+//   - whether or not it is a block directive
+//   - whether this is a flag (takes one argument that's either "on" or "off")
+//   - which contexts it's allowed to be in
+
+package crossplane
+
+var luaDirectives = map[string][]uint{
+    "access_by_lua": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "access_by_lua_block": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "access_by_lua_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "access_by_lua_no_postpone": {
+        ngxHTTPMainConf | ngxConfFlag,
+    },
+    "balancer_by_lua_block": {
+        ngxHTTPUpsConf | ngxConfTake1,
+    },
+    "balancer_by_lua_file": {
+        ngxHTTPUpsConf | ngxConfTake1,
+    },
+    "balancer_keepalive": {
+        ngxHTTPUpsConf | ngxConfTake1,
+    },
+    "body_filter_by_lua": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "body_filter_by_lua_block": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "body_filter_by_lua_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "content_by_lua": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "content_by_lua_block": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "content_by_lua_file": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "exit_worker_by_lua_block": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "exit_worker_by_lua_file": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "header_filter_by_lua": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "header_filter_by_lua_block": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "header_filter_by_lua_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "init_by_lua": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "init_by_lua_block": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "init_by_lua_file": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "init_worker_by_lua": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "init_worker_by_lua_block": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "init_worker_by_lua_file": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "log_by_lua": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "log_by_lua_block": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "log_by_lua_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "lua_capture_error_log": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "lua_check_client_abort": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "lua_code_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "lua_http10_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "lua_load_resty_core": {
+        ngxHTTPMainConf | ngxConfFlag,
+    },
+    "lua_malloc_trim": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "lua_max_pending_timers": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "lua_max_running_timers": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "lua_need_request_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "lua_package_cpath": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "lua_package_path": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "lua_regex_cache_max_entries": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "lua_regex_match_limit": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "lua_sa_restart": {
+        ngxHTTPMainConf | ngxConfFlag,
+    },
+    "lua_shared_dict": {
+        ngxHTTPMainConf | ngxConfTake2,
+    },
+    "lua_socket_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "lua_socket_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "lua_socket_keepalive_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "lua_socket_log_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "lua_socket_pool_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "lua_socket_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "lua_socket_send_lowat": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "lua_socket_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "lua_ssl_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "lua_ssl_certificate_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "lua_ssl_ciphers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "lua_ssl_conf_command": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "lua_ssl_crl": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "lua_ssl_protocols": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "lua_ssl_trusted_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "lua_ssl_verify_depth": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "lua_thread_cache_max_entries": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "lua_transform_underscores_in_response_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "lua_use_default_type": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "lua_worker_thread_vm_pool_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "rewrite_by_lua": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "rewrite_by_lua_block": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "rewrite_by_lua_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "rewrite_by_lua_no_postpone": {
+        ngxHTTPMainConf | ngxConfFlag,
+    },
+    "server_rewrite_by_lua_block": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "server_rewrite_by_lua_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "set_by_lua": {
+        ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf2More,
+    },
+    "set_by_lua_block": {
+        ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake2,
+    },
+    "set_by_lua_file": {
+        ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf2More,
+    },
+    "ssl_certificate_by_lua_block": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_certificate_by_lua_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_client_hello_by_lua_block": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_client_hello_by_lua_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_session_fetch_by_lua_block": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "ssl_session_fetch_by_lua_file": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "ssl_session_store_by_lua_block": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "ssl_session_store_by_lua_file": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+}
+
+// MatchLuaLatest is a MatchFunc for latest version of Lua.
+func MatchLuaLatest(directive string) ([]uint, bool) {
+    m, ok := luaDirectives[directive]
+    return m, ok
+}
diff --git a/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_lua_directives.go b/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_lua_directives.go
deleted file mode 100644
index 5008baaf4c..0000000000
--- a/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_lua_directives.go
+++ /dev/null
@@ -1,261 +0,0 @@
-/**
- * Copyright (c) F5, Inc.
- *
- * This source code is licensed under the Apache License, Version 2.0 license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-// All the definitions are extracted from the source code
-// Each bit mask describes these behaviors:
-//   - how many arguments the directive can take
-//   - whether or not it is a block directive
-//   - whether this is a flag (takes one argument that's either "on" or "off")
-//   - which contexts it's allowed to be in
-
-package crossplane
-
-//nolint:gochecknoglobals
-var moduleLuaDirectives = map[string][]uint{
-	"access_by_lua": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"access_by_lua_block": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"access_by_lua_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"access_by_lua_no_postpone": {
-		ngxHTTPMainConf | ngxConfFlag,
-	},
-	"balancer_by_lua_block": {
-		ngxHTTPUpsConf | ngxConfTake1,
-	},
-	"balancer_by_lua_file": {
-		ngxHTTPUpsConf | ngxConfTake1,
-	},
-	"body_filter_by_lua": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"body_filter_by_lua_block": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"body_filter_by_lua_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"content_by_lua": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"content_by_lua_block": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"content_by_lua_file": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"exit_worker_by_lua_block": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"exit_worker_by_lua_file": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"header_filter_by_lua": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"header_filter_by_lua_block": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"header_filter_by_lua_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"init_by_lua": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"init_by_lua_block": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"init_by_lua_file": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"init_worker_by_lua": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"init_worker_by_lua_block": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"init_worker_by_lua_file": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"log_by_lua": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"log_by_lua_block": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"log_by_lua_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"lua_capture_error_log": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"lua_check_client_abort": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"lua_code_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"lua_fake_shm": {
-		ngxHTTPMainConf | ngxConfTake2,
-	},
-	"lua_http10_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"lua_load_resty_core": {
-		ngxHTTPMainConf | ngxConfFlag,
-	},
-	"lua_malloc_trim": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"lua_max_pending_timers": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"lua_max_running_timers": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"lua_need_request_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"lua_package_cpath": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"lua_package_path": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"lua_regex_cache_max_entries": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"lua_regex_match_limit": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"lua_sa_restart": {
-		ngxHTTPMainConf | ngxConfFlag,
-	},
-	"lua_shared_dict": {
-		ngxHTTPMainConf | ngxConfTake2,
-	},
-	"lua_socket_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"lua_socket_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"lua_socket_keepalive_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"lua_socket_log_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"lua_socket_pool_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"lua_socket_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"lua_socket_send_lowat": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"lua_socket_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"lua_ssl_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"lua_ssl_certificate_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"lua_ssl_ciphers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"lua_ssl_conf_command": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"lua_ssl_crl": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"lua_ssl_protocols": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"lua_ssl_trusted_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"lua_ssl_verify_depth": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"lua_thread_cache_max_entries": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"lua_transform_underscores_in_response_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"lua_use_default_type": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"lua_worker_thread_vm_pool_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"rewrite_by_lua": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"rewrite_by_lua_block": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"rewrite_by_lua_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"rewrite_by_lua_no_postpone": {
-		ngxHTTPMainConf | ngxConfFlag,
-	},
-	"server_rewrite_by_lua_block": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"server_rewrite_by_lua_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"set_by_lua": {
-		ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf2More,
-	},
-	"set_by_lua_block": {
-		ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake2,
-	},
-	"set_by_lua_file": {
-		ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf2More,
-	},
-	"ssl_certificate_by_lua_block": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_certificate_by_lua_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_client_hello_by_lua_block": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_client_hello_by_lua_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_session_fetch_by_lua_block": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"ssl_session_fetch_by_lua_file": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"ssl_session_store_by_lua_block": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"ssl_session_store_by_lua_file": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-}
-
-func LuaDirectivesMatchFn(directive string) ([]uint, bool) {
-	masks, matched := moduleLuaDirectives[directive]
-	return masks, matched
-}
diff --git a/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_map.go b/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_map.go
index 731f3640f2..e0570e4721 100644
--- a/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_map.go
+++ b/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_map.go
@@ -39,6 +39,7 @@ var mapBodies = map[string]mapParameterMasks{
 		defaultMasks: ngxConfTake1,
 	},
 	"geoip2": {
+		specialParameterMasks: map[string]uint{"auto_reload": ngxConfTake1},
 		defaultMasks: ngxConf1More,
 	},
 	"otel_exporter": {
diff --git a/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_njs_directives.gen.go b/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_njs_directives.gen.go
new file mode 100644
index 0000000000..3e0f9e047a
--- /dev/null
+++ b/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_njs_directives.gen.go
@@ -0,0 +1,103 @@
+/**
+ * Copyright (c) F5, Inc.
+ *
+ * This source code is licensed under the Apache License, Version 2.0 license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+// Code generated by generator; DO NOT EDIT.
+// All the definitions are extracted from the source code
+// Each bit mask describes these behaviors:
+//   - how many arguments the directive can take
+//   - whether or not it is a block directive
+//   - whether this is a flag (takes one argument that's either "on" or "off")
+//   - which contexts it's allowed to be in
+
+package crossplane
+
+var njsDirectives = map[string][]uint{
+    "js_access": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "js_body_filter": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConfTake12,
+    },
+    "js_content": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConfTake1,
+    },
+    "js_fetch_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "js_fetch_ciphers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "js_fetch_max_response_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "js_fetch_protocols": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "js_fetch_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "js_fetch_trusted_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "js_fetch_verify": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "js_fetch_verify_depth": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "js_filter": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "js_header_filter": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConfTake1,
+    },
+    "js_import": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake13,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake13,
+    },
+    "js_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "js_periodic": {
+        ngxHTTPLocConf | ngxConfAny,
+        ngxStreamSrvConf | ngxConfAny,
+    },
+    "js_preload_object": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake13,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake13,
+    },
+    "js_preread": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "js_set": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
+    },
+    "js_shared_dict_zone": {
+        ngxHTTPMainConf | ngxConf1More,
+        ngxStreamMainConf | ngxConf1More,
+    },
+    "js_var": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12,
+    },
+}
+
+// MatchNjsLatest is a MatchFunc for the latest version of njs.
+func MatchNjsLatest(directive string) ([]uint, bool) {
+    m, ok := njsDirectives[directive]
+    return m, ok
+}
diff --git a/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_njs_directives.go b/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_njs_directives.go
deleted file mode 100644
index 414aee1cb0..0000000000
--- a/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_njs_directives.go
+++ /dev/null
@@ -1,102 +0,0 @@
-/**
- * Copyright (c) F5, Inc.
- *
- * This source code is licensed under the Apache License, Version 2.0 license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-// All the definitions are extracted from the source code
-// Each bit mask describes these behaviors:
-//   - how many arguments the directive can take
-//   - whether or not it is a block directive
-//   - whether this is a flag (takes one argument that's either "on" or "off")
-//   - which contexts it's allowed to be in
-
-package crossplane
-
-//nolint:gochecknoglobals
-var moduleNjsDirectives = map[string][]uint{
-	"js_access": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"js_body_filter": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConfTake12,
-	},
-	"js_content": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConfTake1,
-	},
-	"js_fetch_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"js_fetch_ciphers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"js_fetch_max_response_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"js_fetch_protocols": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"js_fetch_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"js_fetch_trusted_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"js_fetch_verify": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"js_fetch_verify_depth": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"js_filter": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"js_header_filter": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConfTake1,
-	},
-	"js_import": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake13,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake13,
-	},
-	"js_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"js_periodic": {
-		ngxHTTPLocConf | ngxConfAny,
-		ngxStreamSrvConf | ngxConfAny,
-	},
-	"js_preload_object": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake13,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake13,
-	},
-	"js_preread": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"js_set": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
-	},
-	"js_shared_dict_zone": {
-		ngxHTTPMainConf | ngxConf1More,
-		ngxStreamMainConf | ngxConf1More,
-	},
-	"js_var": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12,
-	},
-}
-
-func NjsDirectivesMatchFn(directive string) ([]uint, bool) {
-	masks, matched := moduleNjsDirectives[directive]
-	return masks, matched
-}
diff --git a/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_nplus_R30_directives.go b/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_nplus_R30_directives.go
index 8ed60cd4f3..e06a42a9e1 100644
--- a/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_nplus_R30_directives.go
+++ b/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_nplus_R30_directives.go
@@ -15,7 +15,7 @@
 package crossplane
 
 //nolint:gochecknoglobals
-var ngxPlusR30Directives = map[string][]uint{
+var nginxPlusR30Directives = map[string][]uint{
 	"absolute_redirect": {
 		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
 	},
@@ -2106,7 +2106,7 @@ var ngxPlusR30Directives = map[string][]uint{
 	},
 }
 
-func NgxPlusR30DirectivesMatchFn(directive string) ([]uint, bool) {
-	masks, matched := ngxPlusR30Directives[directive]
+func MatchNginxPlusR30(directive string) ([]uint, bool) {
+	masks, matched := nginxPlusR30Directives[directive]
 	return masks, matched
 }
diff --git a/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_nplus_R31_directives.go b/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_nplus_R31_directives.go
index 1fa3960e03..13d31ef47e 100644
--- a/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_nplus_R31_directives.go
+++ b/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_nplus_R31_directives.go
@@ -15,7 +15,7 @@
 package crossplane
 
 //nolint:gochecknoglobals
-var ngxPlusR31Directives = map[string][]uint{
+var nginxPlusR31Directives = map[string][]uint{
 	"absolute_redirect": {
 		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
 	},
@@ -2144,7 +2144,7 @@ var ngxPlusR31Directives = map[string][]uint{
 	},
 }
 
-func NgxPlusR31DirectivesMatchFn(directive string) ([]uint, bool) {
-	masks, matched := ngxPlusR31Directives[directive]
+func MatchNginxPlusR31(directive string) ([]uint, bool) {
+	masks, matched := nginxPlusR31Directives[directive]
 	return masks, matched
 }
diff --git a/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_nplus_latest_directives.go b/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_nplus_latest_directives.go
index 66cec3bc0b..7434823698 100644
--- a/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_nplus_latest_directives.go
+++ b/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_nplus_latest_directives.go
@@ -15,7 +15,7 @@
 package crossplane
 
 //nolint:gochecknoglobals
-var ngxPlusLatestDirectives = map[string][]uint{
+var nginxPlusLatestDirectives = map[string][]uint{
 	"absolute_redirect": {
 		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
 	},
@@ -2151,7 +2151,7 @@ var ngxPlusLatestDirectives = map[string][]uint{
 	},
 }
 
-func NgxPlusLatestDirectivesMatchFn(directive string) ([]uint, bool) {
-	masks, matched := ngxPlusLatestDirectives[directive]
+func MatchNginxPlusLatest(directive string) ([]uint, bool) {
+	masks, matched := nginxPlusLatestDirectives[directive]
 	return masks, matched
 }
diff --git a/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_124_directives.gen.go b/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_124_directives.gen.go
new file mode 100644
index 0000000000..2e2b8da4dd
--- /dev/null
+++ b/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_124_directives.gen.go
@@ -0,0 +1,1874 @@
+/**
+ * Copyright (c) F5, Inc.
+ *
+ * This source code is licensed under the Apache License, Version 2.0 license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+// Code generated by generator; DO NOT EDIT.
+// All the definitions are extracted from the source code
+// Each bit mask describes these behaviors:
+//   - how many arguments the directive can take
+//   - whether or not it is a block directive
+//   - whether this is a flag (takes one argument that's either "on" or "off")
+//   - which contexts it's allowed to be in
+
+package crossplane
+
+var oss124Directives = map[string][]uint{
+    "absolute_redirect": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "accept_mutex": {
+        ngxEventConf | ngxConfFlag,
+    },
+    "accept_mutex_delay": {
+        ngxEventConf | ngxConfTake1,
+    },
+    "access_log": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "add_after_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "add_before_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "add_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23,
+    },
+    "add_trailer": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23,
+    },
+    "addition_types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "aio": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "aio_write": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "alias": {
+        ngxHTTPLocConf | ngxConfTake1,
+    },
+    "allow": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ancient_browser": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "ancient_browser_value": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "auth_basic": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
+    },
+    "auth_basic_user_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
+    },
+    "auth_delay": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "auth_http": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "auth_http_header": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake2,
+    },
+    "auth_http_pass_client_cert": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+    },
+    "auth_http_timeout": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "auth_request": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "auth_request_set": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "autoindex": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "autoindex_exact_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "autoindex_format": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "autoindex_localtime": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "break": {
+        ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfNoArgs,
+    },
+    "charset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "charset_map": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfTake2,
+    },
+    "charset_types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "chunked_transfer_encoding": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "client_body_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "client_body_in_file_only": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "client_body_in_single_buffer": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "client_body_temp_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+    },
+    "client_body_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "client_header_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "client_header_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "client_max_body_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "connection_pool_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "create_full_put_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "daemon": {
+        ngxMainConf | ngxDirectConf | ngxConfFlag,
+    },
+    "dav_access": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "dav_methods": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "debug_connection": {
+        ngxEventConf | ngxConfTake1,
+    },
+    "debug_points": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "default_type": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "deny": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "directio": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "directio_alignment": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "disable_symlinks": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "empty_gif": {
+        ngxHTTPLocConf | ngxConfNoArgs,
+    },
+    "env": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "error_log": {
+        ngxMainConf | ngxConf1More,
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "error_page": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf2More,
+    },
+    "etag": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "events": {
+        ngxMainConf | ngxConfBlock | ngxConfNoArgs,
+    },
+    "expires": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake12,
+    },
+    "fastcgi_bind": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "fastcgi_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "fastcgi_busy_buffers_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache_background_update": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_cache_bypass": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_cache_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache_lock": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_cache_lock_age": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache_lock_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache_max_range_offset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache_methods": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_cache_min_uses": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache_path": {
+        ngxHTTPMainConf | ngxConf2More,
+    },
+    "fastcgi_cache_revalidate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_cache_use_stale": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_cache_valid": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_catch_stderr": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_force_ranges": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_hide_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_ignore_client_abort": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_ignore_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_index": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_intercept_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_keep_conn": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_limit_rate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_max_temp_file_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_next_upstream": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_next_upstream_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_next_upstream_tries": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_no_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_param": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23,
+    },
+    "fastcgi_pass": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "fastcgi_pass_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_pass_request_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_pass_request_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_request_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_send_lowat": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_socket_keepalive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_split_path_info": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_store": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_store_access": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "fastcgi_temp_file_write_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_temp_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+    },
+    "flv": {
+        ngxHTTPLocConf | ngxConfNoArgs,
+    },
+    "geo": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfTake12,
+        ngxStreamMainConf | ngxConfBlock | ngxConfTake12,
+    },
+    "geoip_city": {
+        ngxHTTPMainConf | ngxConfTake12,
+        ngxStreamMainConf | ngxConfTake12,
+    },
+    "geoip_country": {
+        ngxHTTPMainConf | ngxConfTake12,
+        ngxStreamMainConf | ngxConfTake12,
+    },
+    "geoip_org": {
+        ngxHTTPMainConf | ngxConfTake12,
+        ngxStreamMainConf | ngxConfTake12,
+    },
+    "geoip_proxy": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "geoip_proxy_recursive": {
+        ngxHTTPMainConf | ngxConfFlag,
+    },
+    "google_perftools_profiles": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "grpc_bind": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "grpc_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_hide_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ignore_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "grpc_intercept_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "grpc_next_upstream": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "grpc_next_upstream_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_next_upstream_tries": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_pass": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "grpc_pass_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_set_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "grpc_socket_keepalive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "grpc_ssl_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_certificate_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_ciphers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_conf_command": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "grpc_ssl_crl": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_password_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_protocols": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "grpc_ssl_server_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "grpc_ssl_session_reuse": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "grpc_ssl_trusted_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_verify": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "grpc_ssl_verify_depth": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "gunzip": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "gunzip_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "gzip": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "gzip_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "gzip_comp_level": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "gzip_disable": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "gzip_http_version": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "gzip_min_length": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "gzip_proxied": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "gzip_static": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "gzip_types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "gzip_vary": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "hash": {
+        ngxHTTPUpsConf | ngxConfTake12,
+        ngxStreamUpsConf | ngxConfTake12,
+    },
+    "http": {
+        ngxMainConf | ngxConfBlock | ngxConfNoArgs,
+    },
+    "http2_body_preread_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_chunk_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "http2_idle_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_max_concurrent_pushes": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_max_concurrent_streams": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_max_field_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_max_header_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_max_requests": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_push": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "http2_push_preload": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "http2_recv_buffer_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "http2_recv_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "if": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfExpr | ngxConf1More,
+    },
+    "if_modified_since": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "ignore_invalid_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "image_filter": {
+        ngxHTTPLocConf | ngxConfTake123,
+    },
+    "image_filter_buffer": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "image_filter_interlace": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "image_filter_jpeg_quality": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "image_filter_sharpen": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "image_filter_transparency": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "image_filter_webp_quality": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "imap_auth": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+    },
+    "imap_capabilities": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+    },
+    "imap_client_buffer": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "include": {
+        ngxAnyConf | ngxConfTake1,
+    },
+    "index": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "internal": {
+        ngxHTTPLocConf | ngxConfNoArgs,
+    },
+    "ip_hash": {
+        ngxHTTPUpsConf | ngxConfNoArgs,
+    },
+    "keepalive": {
+        ngxHTTPUpsConf | ngxConfTake1,
+    },
+    "keepalive_disable": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "keepalive_requests": {
+        ngxHTTPUpsConf | ngxConfTake1,
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "keepalive_time": {
+        ngxHTTPUpsConf | ngxConfTake1,
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "keepalive_timeout": {
+        ngxHTTPUpsConf | ngxConfTake1,
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "large_client_header_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake2,
+    },
+    "least_conn": {
+        ngxHTTPUpsConf | ngxConfNoArgs,
+        ngxStreamUpsConf | ngxConfNoArgs,
+    },
+    "limit_conn": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
+    },
+    "limit_conn_dry_run": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "limit_conn_log_level": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "limit_conn_status": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "limit_conn_zone": {
+        ngxHTTPMainConf | ngxConfTake2,
+        ngxStreamMainConf | ngxConfTake2,
+    },
+    "limit_except": {
+        ngxHTTPLocConf | ngxConfBlock | ngxConf1More,
+    },
+    "limit_rate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "limit_rate_after": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "limit_req": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "limit_req_dry_run": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "limit_req_log_level": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "limit_req_status": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "limit_req_zone": {
+        ngxHTTPMainConf | ngxConfTake3,
+    },
+    "lingering_close": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "lingering_time": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "lingering_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "listen": {
+        ngxHTTPSrvConf | ngxConf1More,
+        ngxMailSrvConf | ngxConf1More,
+        ngxStreamSrvConf | ngxConf1More,
+    },
+    "load_module": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "location": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfTake12,
+    },
+    "lock_file": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "log_format": {
+        ngxHTTPMainConf | ngxConf2More,
+        ngxStreamMainConf | ngxConf2More,
+    },
+    "log_not_found": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "log_subrequest": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "mail": {
+        ngxMainConf | ngxConfBlock | ngxConfNoArgs,
+    },
+    "map": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfTake2,
+        ngxStreamMainConf | ngxConfBlock | ngxConfTake2,
+    },
+    "map_hash_bucket_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+        ngxStreamMainConf | ngxConfTake1,
+    },
+    "map_hash_max_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+        ngxStreamMainConf | ngxConfTake1,
+    },
+    "master_process": {
+        ngxMainConf | ngxDirectConf | ngxConfFlag,
+    },
+    "max_errors": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "max_ranges": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_bind": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "memcached_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_gzip_flag": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_next_upstream": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "memcached_next_upstream_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_next_upstream_tries": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_pass": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "memcached_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_socket_keepalive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "merge_slashes": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "min_delete_depth": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "mirror": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "mirror_request_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "modern_browser": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "modern_browser_value": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "mp4": {
+        ngxHTTPLocConf | ngxConfNoArgs,
+    },
+    "mp4_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "mp4_max_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "mp4_start_key_frame": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "msie_padding": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "msie_refresh": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "multi_accept": {
+        ngxEventConf | ngxConfFlag,
+    },
+    "open_file_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "open_file_cache_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "open_file_cache_min_uses": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "open_file_cache_valid": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "open_log_file_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1234,
+    },
+    "output_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "override_charset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "pcre_jit": {
+        ngxMainConf | ngxDirectConf | ngxConfFlag,
+    },
+    "perl": {
+        ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
+    },
+    "perl_modules": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "perl_require": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "perl_set": {
+        ngxHTTPMainConf | ngxConfTake2,
+    },
+    "pid": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "pop3_auth": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+    },
+    "pop3_capabilities": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+    },
+    "port_in_redirect": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "postpone_output": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "preread_buffer_size": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "preread_timeout": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "protocol": {
+        ngxMailSrvConf | ngxConfTake1,
+    },
+    "proxy_bind": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12,
+    },
+    "proxy_buffer": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "proxy_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "proxy_busy_buffers_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache_background_update": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_cache_bypass": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "proxy_cache_convert_head": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_cache_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache_lock": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_cache_lock_age": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache_lock_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache_max_range_offset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache_methods": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "proxy_cache_min_uses": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache_path": {
+        ngxHTTPMainConf | ngxConf2More,
+    },
+    "proxy_cache_revalidate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_cache_use_stale": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "proxy_cache_valid": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "proxy_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_cookie_domain": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "proxy_cookie_flags": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+    },
+    "proxy_cookie_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "proxy_download_rate": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_force_ranges": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_half_close": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_headers_hash_bucket_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_headers_hash_max_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_hide_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_http_version": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_ignore_client_abort": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_ignore_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "proxy_intercept_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_limit_rate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_max_temp_file_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_method": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_next_upstream": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_next_upstream_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_next_upstream_tries": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_no_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "proxy_pass": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConfTake1,
+        ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_pass_error_message": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+    },
+    "proxy_pass_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_pass_request_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_pass_request_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_protocol": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_protocol_timeout": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_redirect": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "proxy_request_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_requests": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_responses": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_send_lowat": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_set_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_set_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "proxy_smtp_auth": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+    },
+    "proxy_socket_keepalive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_ssl": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_ssl_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_certificate_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_ciphers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_conf_command": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
+    },
+    "proxy_ssl_crl": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_password_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_protocols": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "proxy_ssl_server_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_ssl_session_reuse": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_ssl_trusted_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_verify": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_ssl_verify_depth": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_store": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_store_access": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "proxy_temp_file_write_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_temp_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+    },
+    "proxy_timeout": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_upload_rate": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "random": {
+        ngxHTTPUpsConf | ngxConfNoArgs | ngxConfTake12,
+        ngxStreamUpsConf | ngxConfNoArgs | ngxConfTake12,
+    },
+    "random_index": {
+        ngxHTTPLocConf | ngxConfFlag,
+    },
+    "read_ahead": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "real_ip_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "real_ip_recursive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "recursive_error_pages": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "referer_hash_bucket_size": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "referer_hash_max_size": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "request_pool_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "reset_timedout_connection": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "resolver": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "resolver_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "return": {
+        ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake12,
+        ngxStreamSrvConf | ngxConfTake1,
+    },
+    "rewrite": {
+        ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23,
+    },
+    "rewrite_log": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "root": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "satisfy": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_bind": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "scgi_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "scgi_busy_buffers_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache_background_update": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_cache_bypass": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_cache_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache_lock": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_cache_lock_age": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache_lock_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache_max_range_offset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache_methods": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_cache_min_uses": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache_path": {
+        ngxHTTPMainConf | ngxConf2More,
+    },
+    "scgi_cache_revalidate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_cache_use_stale": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_cache_valid": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_force_ranges": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_hide_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_ignore_client_abort": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_ignore_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_intercept_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_limit_rate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_max_temp_file_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_next_upstream": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_next_upstream_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_next_upstream_tries": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_no_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_param": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23,
+    },
+    "scgi_pass": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "scgi_pass_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_pass_request_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_pass_request_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_request_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_socket_keepalive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_store": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_store_access": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "scgi_temp_file_write_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_temp_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+    },
+    "secure_link": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "secure_link_md5": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "secure_link_secret": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "send_lowat": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "sendfile": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "sendfile_max_chunk": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "server": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfNoArgs,
+        ngxHTTPUpsConf | ngxConf1More,
+        ngxMailMainConf | ngxConfBlock | ngxConfNoArgs,
+        ngxStreamMainConf | ngxConfBlock | ngxConfNoArgs,
+        ngxStreamUpsConf | ngxConf1More,
+    },
+    "server_name": {
+        ngxHTTPSrvConf | ngxConf1More,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "server_name_in_redirect": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "server_names_hash_bucket_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "server_names_hash_max_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "server_tokens": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "set": {
+        ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake2,
+        ngxStreamSrvConf | ngxConfTake2,
+    },
+    "set_real_ip_from": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "slice": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "smtp_auth": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+    },
+    "smtp_capabilities": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+    },
+    "smtp_client_buffer": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "smtp_greeting_delay": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "source_charset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "split_clients": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfTake2,
+        ngxStreamMainConf | ngxConfBlock | ngxConfTake2,
+    },
+    "ssi": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "ssi_last_modified": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "ssi_min_file_chunk": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "ssi_silent_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "ssi_types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "ssi_value_length": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "ssl": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+    },
+    "ssl_alpn": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "ssl_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_certificate_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_ciphers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_client_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_conf_command": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake2,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake2,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
+    },
+    "ssl_crl": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_dhparam": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_early_data": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "ssl_ecdh_curve": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_engine": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "ssl_handshake_timeout": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_ocsp": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "ssl_ocsp_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_ocsp_responder": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_password_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_prefer_server_ciphers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "ssl_preread": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "ssl_protocols": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConf1More,
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "ssl_reject_handshake": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "ssl_session_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake12,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake12,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12,
+    },
+    "ssl_session_ticket_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_session_tickets": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "ssl_session_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_stapling": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "ssl_stapling_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_stapling_responder": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_stapling_verify": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "ssl_trusted_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_verify_client": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_verify_depth": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "starttls": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "stream": {
+        ngxMainConf | ngxConfBlock | ngxConfNoArgs,
+    },
+    "stub_status": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfNoArgs | ngxConfTake1,
+    },
+    "sub_filter": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "sub_filter_last_modified": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "sub_filter_once": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "sub_filter_types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "subrequest_output_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "tcp_nodelay": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "tcp_nopush": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "thread_pool": {
+        ngxMainConf | ngxDirectConf | ngxConfTake23,
+    },
+    "timeout": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "timer_resolution": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "try_files": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf2More,
+    },
+    "types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfNoArgs,
+    },
+    "types_hash_bucket_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "types_hash_max_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "underscores_in_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "uninitialized_variable_warn": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "upstream": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfTake1,
+        ngxStreamMainConf | ngxConfBlock | ngxConfTake1,
+    },
+    "use": {
+        ngxEventConf | ngxConfTake1,
+    },
+    "user": {
+        ngxMainConf | ngxDirectConf | ngxConfTake12,
+    },
+    "userid": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_domain": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_expires": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_flags": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "userid_mark": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_p3p": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_service": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_bind": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "uwsgi_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "uwsgi_busy_buffers_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_background_update": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_bypass": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_cache_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_lock": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_cache_lock_age": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_lock_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_max_range_offset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_methods": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_cache_min_uses": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_path": {
+        ngxHTTPMainConf | ngxConf2More,
+    },
+    "uwsgi_cache_revalidate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_cache_use_stale": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_cache_valid": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_force_ranges": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_hide_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ignore_client_abort": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_ignore_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_intercept_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_limit_rate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_max_temp_file_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_modifier1": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_modifier2": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_next_upstream": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_next_upstream_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_next_upstream_tries": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_no_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_param": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23,
+    },
+    "uwsgi_pass": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "uwsgi_pass_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_pass_request_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_pass_request_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_request_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_socket_keepalive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_ssl_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_certificate_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_ciphers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_conf_command": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "uwsgi_ssl_crl": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_password_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_protocols": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_ssl_server_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_ssl_session_reuse": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_ssl_trusted_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_verify": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_ssl_verify_depth": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_store": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_store_access": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "uwsgi_temp_file_write_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_temp_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+    },
+    "valid_referers": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "variables_hash_bucket_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+        ngxStreamMainConf | ngxConfTake1,
+    },
+    "variables_hash_max_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+        ngxStreamMainConf | ngxConfTake1,
+    },
+    "worker_aio_requests": {
+        ngxEventConf | ngxConfTake1,
+    },
+    "worker_connections": {
+        ngxEventConf | ngxConfTake1,
+    },
+    "worker_cpu_affinity": {
+        ngxMainConf | ngxDirectConf | ngxConf1More,
+    },
+    "worker_priority": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "worker_processes": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "worker_rlimit_core": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "worker_rlimit_nofile": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "worker_shutdown_timeout": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "working_directory": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "xclient": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+    },
+    "xml_entities": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "xslt_last_modified": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "xslt_param": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "xslt_string_param": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "xslt_stylesheet": {
+        ngxHTTPLocConf | ngxConf1More,
+    },
+    "xslt_types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "zone": {
+        ngxHTTPUpsConf | ngxConfTake12,
+        ngxStreamUpsConf | ngxConfTake12,
+    },
+}
+
+// MatchOss124 contains directives in OSS 1.2.4 source code(including GEOIP, Perl, and XSLT)
+func MatchOss124(directive string) ([]uint, bool) {
+    m, ok := oss124Directives[directive]
+    return m, ok
+}
diff --git a/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_124_directives.go b/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_124_directives.go
deleted file mode 100644
index 10808c90b4..0000000000
--- a/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_124_directives.go
+++ /dev/null
@@ -1,1873 +0,0 @@
-/**
- * Copyright (c) F5, Inc.
- *
- * This source code is licensed under the Apache License, Version 2.0 license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-// All the definitions are extracted from the source code
-// Each bit mask describes these behaviors:
-//   - how many arguments the directive can take
-//   - whether or not it is a block directive
-//   - whether this is a flag (takes one argument that's either "on" or "off")
-//   - which contexts it's allowed to be in
-
-package crossplane
-
-//nolint:gochecknoglobals
-var ngxOss124Directives = map[string][]uint{
-	"absolute_redirect": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"accept_mutex": {
-		ngxEventConf | ngxConfFlag,
-	},
-	"accept_mutex_delay": {
-		ngxEventConf | ngxConfTake1,
-	},
-	"access_log": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"add_after_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"add_before_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"add_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23,
-	},
-	"add_trailer": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23,
-	},
-	"addition_types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"aio": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"aio_write": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"alias": {
-		ngxHTTPLocConf | ngxConfTake1,
-	},
-	"allow": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ancient_browser": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"ancient_browser_value": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"auth_basic": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
-	},
-	"auth_basic_user_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
-	},
-	"auth_delay": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"auth_http": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"auth_http_header": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake2,
-	},
-	"auth_http_pass_client_cert": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-	},
-	"auth_http_timeout": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"auth_request": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"auth_request_set": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"autoindex": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"autoindex_exact_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"autoindex_format": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"autoindex_localtime": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"break": {
-		ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfNoArgs,
-	},
-	"charset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"charset_map": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfTake2,
-	},
-	"charset_types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"chunked_transfer_encoding": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"client_body_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"client_body_in_file_only": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"client_body_in_single_buffer": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"client_body_temp_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-	},
-	"client_body_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"client_header_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"client_header_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"client_max_body_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"connection_pool_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"create_full_put_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"daemon": {
-		ngxMainConf | ngxDirectConf | ngxConfFlag,
-	},
-	"dav_access": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"dav_methods": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"debug_connection": {
-		ngxEventConf | ngxConfTake1,
-	},
-	"debug_points": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"default_type": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"deny": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"directio": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"directio_alignment": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"disable_symlinks": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"empty_gif": {
-		ngxHTTPLocConf | ngxConfNoArgs,
-	},
-	"env": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"error_log": {
-		ngxMainConf | ngxConf1More,
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"error_page": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf2More,
-	},
-	"etag": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"events": {
-		ngxMainConf | ngxConfBlock | ngxConfNoArgs,
-	},
-	"expires": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake12,
-	},
-	"fastcgi_bind": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"fastcgi_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"fastcgi_busy_buffers_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache_background_update": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_cache_bypass": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_cache_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache_lock": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_cache_lock_age": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache_lock_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache_max_range_offset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache_methods": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_cache_min_uses": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache_path": {
-		ngxHTTPMainConf | ngxConf2More,
-	},
-	"fastcgi_cache_revalidate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_cache_use_stale": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_cache_valid": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_catch_stderr": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_force_ranges": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_hide_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_ignore_client_abort": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_ignore_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_index": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_intercept_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_keep_conn": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_limit_rate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_max_temp_file_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_next_upstream": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_next_upstream_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_next_upstream_tries": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_no_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_param": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23,
-	},
-	"fastcgi_pass": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"fastcgi_pass_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_pass_request_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_pass_request_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_request_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_send_lowat": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_socket_keepalive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_split_path_info": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_store": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_store_access": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"fastcgi_temp_file_write_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_temp_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-	},
-	"flv": {
-		ngxHTTPLocConf | ngxConfNoArgs,
-	},
-	"geo": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfTake12,
-		ngxStreamMainConf | ngxConfBlock | ngxConfTake12,
-	},
-	"geoip_city": {
-		ngxHTTPMainConf | ngxConfTake12,
-		ngxStreamMainConf | ngxConfTake12,
-	},
-	"geoip_country": {
-		ngxHTTPMainConf | ngxConfTake12,
-		ngxStreamMainConf | ngxConfTake12,
-	},
-	"geoip_org": {
-		ngxHTTPMainConf | ngxConfTake12,
-		ngxStreamMainConf | ngxConfTake12,
-	},
-	"geoip_proxy": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"geoip_proxy_recursive": {
-		ngxHTTPMainConf | ngxConfFlag,
-	},
-	"google_perftools_profiles": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"grpc_bind": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"grpc_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_hide_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ignore_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"grpc_intercept_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"grpc_next_upstream": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"grpc_next_upstream_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_next_upstream_tries": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_pass": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"grpc_pass_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_set_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"grpc_socket_keepalive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"grpc_ssl_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_certificate_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_ciphers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_conf_command": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"grpc_ssl_crl": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_password_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_protocols": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"grpc_ssl_server_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"grpc_ssl_session_reuse": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"grpc_ssl_trusted_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_verify": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"grpc_ssl_verify_depth": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"gunzip": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"gunzip_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"gzip": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"gzip_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"gzip_comp_level": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"gzip_disable": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"gzip_http_version": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"gzip_min_length": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"gzip_proxied": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"gzip_static": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"gzip_types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"gzip_vary": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"hash": {
-		ngxHTTPUpsConf | ngxConfTake12,
-		ngxStreamUpsConf | ngxConfTake12,
-	},
-	"http": {
-		ngxMainConf | ngxConfBlock | ngxConfNoArgs,
-	},
-	"http2_body_preread_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_chunk_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"http2_idle_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_max_concurrent_pushes": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_max_concurrent_streams": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_max_field_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_max_header_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_max_requests": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_push": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"http2_push_preload": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"http2_recv_buffer_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"http2_recv_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"if": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfExpr | ngxConf1More,
-	},
-	"if_modified_since": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"ignore_invalid_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"image_filter": {
-		ngxHTTPLocConf | ngxConfTake123,
-	},
-	"image_filter_buffer": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"image_filter_interlace": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"image_filter_jpeg_quality": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"image_filter_sharpen": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"image_filter_transparency": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"image_filter_webp_quality": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"imap_auth": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-	},
-	"imap_capabilities": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-	},
-	"imap_client_buffer": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"include": {
-		ngxAnyConf | ngxConfTake1,
-	},
-	"index": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"internal": {
-		ngxHTTPLocConf | ngxConfNoArgs,
-	},
-	"ip_hash": {
-		ngxHTTPUpsConf | ngxConfNoArgs,
-	},
-	"keepalive": {
-		ngxHTTPUpsConf | ngxConfTake1,
-	},
-	"keepalive_disable": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"keepalive_requests": {
-		ngxHTTPUpsConf | ngxConfTake1,
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"keepalive_time": {
-		ngxHTTPUpsConf | ngxConfTake1,
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"keepalive_timeout": {
-		ngxHTTPUpsConf | ngxConfTake1,
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"large_client_header_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake2,
-	},
-	"least_conn": {
-		ngxHTTPUpsConf | ngxConfNoArgs,
-		ngxStreamUpsConf | ngxConfNoArgs,
-	},
-	"limit_conn": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
-	},
-	"limit_conn_dry_run": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"limit_conn_log_level": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"limit_conn_status": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"limit_conn_zone": {
-		ngxHTTPMainConf | ngxConfTake2,
-		ngxStreamMainConf | ngxConfTake2,
-	},
-	"limit_except": {
-		ngxHTTPLocConf | ngxConfBlock | ngxConf1More,
-	},
-	"limit_rate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"limit_rate_after": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"limit_req": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"limit_req_dry_run": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"limit_req_log_level": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"limit_req_status": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"limit_req_zone": {
-		ngxHTTPMainConf | ngxConfTake3,
-	},
-	"lingering_close": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"lingering_time": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"lingering_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"listen": {
-		ngxHTTPSrvConf | ngxConf1More,
-		ngxMailSrvConf | ngxConf1More,
-		ngxStreamSrvConf | ngxConf1More,
-	},
-	"load_module": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"location": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfTake12,
-	},
-	"lock_file": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"log_format": {
-		ngxHTTPMainConf | ngxConf2More,
-		ngxStreamMainConf | ngxConf2More,
-	},
-	"log_not_found": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"log_subrequest": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"mail": {
-		ngxMainConf | ngxConfBlock | ngxConfNoArgs,
-	},
-	"map": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfTake2,
-		ngxStreamMainConf | ngxConfBlock | ngxConfTake2,
-	},
-	"map_hash_bucket_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-		ngxStreamMainConf | ngxConfTake1,
-	},
-	"map_hash_max_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-		ngxStreamMainConf | ngxConfTake1,
-	},
-	"master_process": {
-		ngxMainConf | ngxDirectConf | ngxConfFlag,
-	},
-	"max_errors": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"max_ranges": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_bind": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"memcached_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_gzip_flag": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_next_upstream": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"memcached_next_upstream_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_next_upstream_tries": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_pass": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"memcached_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_socket_keepalive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"merge_slashes": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"min_delete_depth": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"mirror": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"mirror_request_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"modern_browser": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"modern_browser_value": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"mp4": {
-		ngxHTTPLocConf | ngxConfNoArgs,
-	},
-	"mp4_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"mp4_max_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"mp4_start_key_frame": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"msie_padding": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"msie_refresh": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"multi_accept": {
-		ngxEventConf | ngxConfFlag,
-	},
-	"open_file_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"open_file_cache_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"open_file_cache_min_uses": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"open_file_cache_valid": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"open_log_file_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1234,
-	},
-	"output_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"override_charset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"pcre_jit": {
-		ngxMainConf | ngxDirectConf | ngxConfFlag,
-	},
-	"perl": {
-		ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
-	},
-	"perl_modules": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"perl_require": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"perl_set": {
-		ngxHTTPMainConf | ngxConfTake2,
-	},
-	"pid": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"pop3_auth": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-	},
-	"pop3_capabilities": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-	},
-	"port_in_redirect": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"postpone_output": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"preread_buffer_size": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"preread_timeout": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"protocol": {
-		ngxMailSrvConf | ngxConfTake1,
-	},
-	"proxy_bind": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12,
-	},
-	"proxy_buffer": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"proxy_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"proxy_busy_buffers_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache_background_update": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_cache_bypass": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"proxy_cache_convert_head": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_cache_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache_lock": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_cache_lock_age": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache_lock_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache_max_range_offset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache_methods": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"proxy_cache_min_uses": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache_path": {
-		ngxHTTPMainConf | ngxConf2More,
-	},
-	"proxy_cache_revalidate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_cache_use_stale": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"proxy_cache_valid": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"proxy_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_cookie_domain": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"proxy_cookie_flags": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-	},
-	"proxy_cookie_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"proxy_download_rate": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_force_ranges": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_half_close": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_headers_hash_bucket_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_headers_hash_max_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_hide_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_http_version": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_ignore_client_abort": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_ignore_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"proxy_intercept_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_limit_rate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_max_temp_file_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_method": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_next_upstream": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_next_upstream_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_next_upstream_tries": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_no_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"proxy_pass": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConfTake1,
-		ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_pass_error_message": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-	},
-	"proxy_pass_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_pass_request_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_pass_request_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_protocol": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_protocol_timeout": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_redirect": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"proxy_request_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_requests": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_responses": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_send_lowat": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_set_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_set_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"proxy_smtp_auth": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-	},
-	"proxy_socket_keepalive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_ssl": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_ssl_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_certificate_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_ciphers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_conf_command": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
-	},
-	"proxy_ssl_crl": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_password_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_protocols": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"proxy_ssl_server_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_ssl_session_reuse": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_ssl_trusted_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_verify": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_ssl_verify_depth": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_store": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_store_access": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"proxy_temp_file_write_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_temp_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-	},
-	"proxy_timeout": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_upload_rate": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"random": {
-		ngxHTTPUpsConf | ngxConfNoArgs | ngxConfTake12,
-		ngxStreamUpsConf | ngxConfNoArgs | ngxConfTake12,
-	},
-	"random_index": {
-		ngxHTTPLocConf | ngxConfFlag,
-	},
-	"read_ahead": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"real_ip_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"real_ip_recursive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"recursive_error_pages": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"referer_hash_bucket_size": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"referer_hash_max_size": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"request_pool_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"reset_timedout_connection": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"resolver": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"resolver_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"return": {
-		ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake12,
-		ngxStreamSrvConf | ngxConfTake1,
-	},
-	"rewrite": {
-		ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23,
-	},
-	"rewrite_log": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"root": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"satisfy": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_bind": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"scgi_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"scgi_busy_buffers_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache_background_update": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_cache_bypass": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_cache_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache_lock": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_cache_lock_age": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache_lock_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache_max_range_offset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache_methods": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_cache_min_uses": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache_path": {
-		ngxHTTPMainConf | ngxConf2More,
-	},
-	"scgi_cache_revalidate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_cache_use_stale": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_cache_valid": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_force_ranges": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_hide_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_ignore_client_abort": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_ignore_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_intercept_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_limit_rate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_max_temp_file_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_next_upstream": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_next_upstream_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_next_upstream_tries": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_no_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_param": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23,
-	},
-	"scgi_pass": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"scgi_pass_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_pass_request_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_pass_request_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_request_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_socket_keepalive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_store": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_store_access": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"scgi_temp_file_write_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_temp_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-	},
-	"secure_link": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"secure_link_md5": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"secure_link_secret": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"send_lowat": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"sendfile": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"sendfile_max_chunk": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"server": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfNoArgs,
-		ngxHTTPUpsConf | ngxConf1More,
-		ngxMailMainConf | ngxConfBlock | ngxConfNoArgs,
-		ngxStreamMainConf | ngxConfBlock | ngxConfNoArgs,
-		ngxStreamUpsConf | ngxConf1More,
-	},
-	"server_name": {
-		ngxHTTPSrvConf | ngxConf1More,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"server_name_in_redirect": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"server_names_hash_bucket_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"server_names_hash_max_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"server_tokens": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"set": {
-		ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake2,
-		ngxStreamSrvConf | ngxConfTake2,
-	},
-	"set_real_ip_from": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"slice": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"smtp_auth": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-	},
-	"smtp_capabilities": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-	},
-	"smtp_client_buffer": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"smtp_greeting_delay": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"source_charset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"split_clients": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfTake2,
-		ngxStreamMainConf | ngxConfBlock | ngxConfTake2,
-	},
-	"ssi": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"ssi_last_modified": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"ssi_min_file_chunk": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"ssi_silent_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"ssi_types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"ssi_value_length": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"ssl": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-	},
-	"ssl_alpn": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"ssl_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_certificate_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_ciphers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_client_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_conf_command": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake2,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake2,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
-	},
-	"ssl_crl": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_dhparam": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_early_data": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"ssl_ecdh_curve": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_engine": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"ssl_handshake_timeout": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_ocsp": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"ssl_ocsp_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_ocsp_responder": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_password_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_prefer_server_ciphers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"ssl_preread": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"ssl_protocols": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConf1More,
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"ssl_reject_handshake": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"ssl_session_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake12,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake12,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12,
-	},
-	"ssl_session_ticket_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_session_tickets": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"ssl_session_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_stapling": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"ssl_stapling_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_stapling_responder": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_stapling_verify": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"ssl_trusted_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_verify_client": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_verify_depth": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"starttls": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"stream": {
-		ngxMainConf | ngxConfBlock | ngxConfNoArgs,
-	},
-	"stub_status": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfNoArgs | ngxConfTake1,
-	},
-	"sub_filter": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"sub_filter_last_modified": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"sub_filter_once": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"sub_filter_types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"subrequest_output_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"tcp_nodelay": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"tcp_nopush": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"thread_pool": {
-		ngxMainConf | ngxDirectConf | ngxConfTake23,
-	},
-	"timeout": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"timer_resolution": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"try_files": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf2More,
-	},
-	"types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfNoArgs,
-	},
-	"types_hash_bucket_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"types_hash_max_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"underscores_in_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"uninitialized_variable_warn": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"upstream": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfTake1,
-		ngxStreamMainConf | ngxConfBlock | ngxConfTake1,
-	},
-	"use": {
-		ngxEventConf | ngxConfTake1,
-	},
-	"user": {
-		ngxMainConf | ngxDirectConf | ngxConfTake12,
-	},
-	"userid": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_domain": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_expires": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_flags": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"userid_mark": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_p3p": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_service": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_bind": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"uwsgi_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"uwsgi_busy_buffers_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_background_update": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_bypass": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_cache_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_lock": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_cache_lock_age": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_lock_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_max_range_offset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_methods": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_cache_min_uses": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_path": {
-		ngxHTTPMainConf | ngxConf2More,
-	},
-	"uwsgi_cache_revalidate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_cache_use_stale": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_cache_valid": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_force_ranges": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_hide_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ignore_client_abort": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_ignore_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_intercept_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_limit_rate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_max_temp_file_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_modifier1": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_modifier2": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_next_upstream": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_next_upstream_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_next_upstream_tries": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_no_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_param": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23,
-	},
-	"uwsgi_pass": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"uwsgi_pass_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_pass_request_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_pass_request_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_request_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_socket_keepalive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_ssl_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_certificate_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_ciphers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_conf_command": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"uwsgi_ssl_crl": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_password_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_protocols": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_ssl_server_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_ssl_session_reuse": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_ssl_trusted_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_verify": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_ssl_verify_depth": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_store": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_store_access": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"uwsgi_temp_file_write_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_temp_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-	},
-	"valid_referers": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"variables_hash_bucket_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-		ngxStreamMainConf | ngxConfTake1,
-	},
-	"variables_hash_max_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-		ngxStreamMainConf | ngxConfTake1,
-	},
-	"worker_aio_requests": {
-		ngxEventConf | ngxConfTake1,
-	},
-	"worker_connections": {
-		ngxEventConf | ngxConfTake1,
-	},
-	"worker_cpu_affinity": {
-		ngxMainConf | ngxDirectConf | ngxConf1More,
-	},
-	"worker_priority": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"worker_processes": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"worker_rlimit_core": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"worker_rlimit_nofile": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"worker_shutdown_timeout": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"working_directory": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"xclient": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-	},
-	"xml_entities": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"xslt_last_modified": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"xslt_param": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"xslt_string_param": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"xslt_stylesheet": {
-		ngxHTTPLocConf | ngxConf1More,
-	},
-	"xslt_types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"zone": {
-		ngxHTTPUpsConf | ngxConfTake12,
-		ngxStreamUpsConf | ngxConfTake12,
-	},
-}
-
-func Oss124DirectivesMatchFn(directive string) ([]uint, bool) {
-	masks, matched := ngxOss124Directives[directive]
-	return masks, matched
-}
diff --git a/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_126_directives.gen.go b/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_126_directives.gen.go
new file mode 100644
index 0000000000..1fb0ee8cf1
--- /dev/null
+++ b/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_126_directives.gen.go
@@ -0,0 +1,1907 @@
+/**
+ * Copyright (c) F5, Inc.
+ *
+ * This source code is licensed under the Apache License, Version 2.0 license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+// Code generated by generator; DO NOT EDIT.
+// All the definitions are extracted from the source code
+// Each bit mask describes these behaviors:
+//   - how many arguments the directive can take
+//   - whether or not it is a block directive
+//   - whether this is a flag (takes one argument that's either "on" or "off")
+//   - which contexts it's allowed to be in
+
+package crossplane
+
+var oss126Directives = map[string][]uint{
+    "absolute_redirect": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "accept_mutex": {
+        ngxEventConf | ngxConfFlag,
+    },
+    "accept_mutex_delay": {
+        ngxEventConf | ngxConfTake1,
+    },
+    "access_log": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "add_after_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "add_before_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "add_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23,
+    },
+    "add_trailer": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23,
+    },
+    "addition_types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "aio": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "aio_write": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "alias": {
+        ngxHTTPLocConf | ngxConfTake1,
+    },
+    "allow": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ancient_browser": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "ancient_browser_value": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "auth_basic": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
+    },
+    "auth_basic_user_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
+    },
+    "auth_delay": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "auth_http": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "auth_http_header": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake2,
+    },
+    "auth_http_pass_client_cert": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+    },
+    "auth_http_timeout": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "auth_request": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "auth_request_set": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "autoindex": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "autoindex_exact_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "autoindex_format": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "autoindex_localtime": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "break": {
+        ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfNoArgs,
+    },
+    "charset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "charset_map": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfTake2,
+    },
+    "charset_types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "chunked_transfer_encoding": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "client_body_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "client_body_in_file_only": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "client_body_in_single_buffer": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "client_body_temp_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+    },
+    "client_body_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "client_header_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "client_header_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "client_max_body_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "connection_pool_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "create_full_put_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "daemon": {
+        ngxMainConf | ngxDirectConf | ngxConfFlag,
+    },
+    "dav_access": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "dav_methods": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "debug_connection": {
+        ngxEventConf | ngxConfTake1,
+    },
+    "debug_points": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "default_type": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "deny": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "directio": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "directio_alignment": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "disable_symlinks": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "empty_gif": {
+        ngxHTTPLocConf | ngxConfNoArgs,
+    },
+    "env": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "error_log": {
+        ngxMainConf | ngxConf1More,
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "error_page": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf2More,
+    },
+    "etag": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "events": {
+        ngxMainConf | ngxConfBlock | ngxConfNoArgs,
+    },
+    "expires": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake12,
+    },
+    "fastcgi_bind": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "fastcgi_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "fastcgi_busy_buffers_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache_background_update": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_cache_bypass": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_cache_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache_lock": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_cache_lock_age": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache_lock_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache_max_range_offset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache_methods": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_cache_min_uses": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache_path": {
+        ngxHTTPMainConf | ngxConf2More,
+    },
+    "fastcgi_cache_revalidate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_cache_use_stale": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_cache_valid": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_catch_stderr": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_force_ranges": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_hide_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_ignore_client_abort": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_ignore_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_index": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_intercept_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_keep_conn": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_limit_rate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_max_temp_file_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_next_upstream": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_next_upstream_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_next_upstream_tries": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_no_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_param": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23,
+    },
+    "fastcgi_pass": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "fastcgi_pass_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_pass_request_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_pass_request_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_request_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_send_lowat": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_socket_keepalive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_split_path_info": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_store": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_store_access": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "fastcgi_temp_file_write_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_temp_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+    },
+    "flv": {
+        ngxHTTPLocConf | ngxConfNoArgs,
+    },
+    "geo": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfTake12,
+        ngxStreamMainConf | ngxConfBlock | ngxConfTake12,
+    },
+    "geoip_city": {
+        ngxHTTPMainConf | ngxConfTake12,
+        ngxStreamMainConf | ngxConfTake12,
+    },
+    "geoip_country": {
+        ngxHTTPMainConf | ngxConfTake12,
+        ngxStreamMainConf | ngxConfTake12,
+    },
+    "geoip_org": {
+        ngxHTTPMainConf | ngxConfTake12,
+        ngxStreamMainConf | ngxConfTake12,
+    },
+    "geoip_proxy": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "geoip_proxy_recursive": {
+        ngxHTTPMainConf | ngxConfFlag,
+    },
+    "google_perftools_profiles": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "grpc_bind": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "grpc_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_hide_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ignore_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "grpc_intercept_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "grpc_next_upstream": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "grpc_next_upstream_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_next_upstream_tries": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_pass": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "grpc_pass_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_set_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "grpc_socket_keepalive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "grpc_ssl_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_certificate_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_ciphers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_conf_command": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "grpc_ssl_crl": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_password_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_protocols": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "grpc_ssl_server_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "grpc_ssl_session_reuse": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "grpc_ssl_trusted_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_verify": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "grpc_ssl_verify_depth": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "gunzip": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "gunzip_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "gzip": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "gzip_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "gzip_comp_level": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "gzip_disable": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "gzip_http_version": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "gzip_min_length": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "gzip_proxied": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "gzip_static": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "gzip_types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "gzip_vary": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "hash": {
+        ngxHTTPUpsConf | ngxConfTake12,
+        ngxStreamUpsConf | ngxConfTake12,
+    },
+    "http": {
+        ngxMainConf | ngxConfBlock | ngxConfNoArgs,
+    },
+    "http2": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "http2_body_preread_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_chunk_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "http2_idle_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_max_concurrent_pushes": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_max_concurrent_streams": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_max_field_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_max_header_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_max_requests": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_push": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "http2_push_preload": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "http2_recv_buffer_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "http2_recv_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http3": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "http3_hq": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "http3_max_concurrent_streams": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http3_stream_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "if": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfExpr | ngxConf1More,
+    },
+    "if_modified_since": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "ignore_invalid_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "image_filter": {
+        ngxHTTPLocConf | ngxConfTake123,
+    },
+    "image_filter_buffer": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "image_filter_interlace": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "image_filter_jpeg_quality": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "image_filter_sharpen": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "image_filter_transparency": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "image_filter_webp_quality": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "imap_auth": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+    },
+    "imap_capabilities": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+    },
+    "imap_client_buffer": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "include": {
+        ngxAnyConf | ngxConfTake1,
+    },
+    "index": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "internal": {
+        ngxHTTPLocConf | ngxConfNoArgs,
+    },
+    "ip_hash": {
+        ngxHTTPUpsConf | ngxConfNoArgs,
+    },
+    "keepalive": {
+        ngxHTTPUpsConf | ngxConfTake1,
+    },
+    "keepalive_disable": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "keepalive_requests": {
+        ngxHTTPUpsConf | ngxConfTake1,
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "keepalive_time": {
+        ngxHTTPUpsConf | ngxConfTake1,
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "keepalive_timeout": {
+        ngxHTTPUpsConf | ngxConfTake1,
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "large_client_header_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake2,
+    },
+    "least_conn": {
+        ngxHTTPUpsConf | ngxConfNoArgs,
+        ngxStreamUpsConf | ngxConfNoArgs,
+    },
+    "limit_conn": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
+    },
+    "limit_conn_dry_run": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "limit_conn_log_level": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "limit_conn_status": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "limit_conn_zone": {
+        ngxHTTPMainConf | ngxConfTake2,
+        ngxStreamMainConf | ngxConfTake2,
+    },
+    "limit_except": {
+        ngxHTTPLocConf | ngxConfBlock | ngxConf1More,
+    },
+    "limit_rate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "limit_rate_after": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "limit_req": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "limit_req_dry_run": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "limit_req_log_level": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "limit_req_status": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "limit_req_zone": {
+        ngxHTTPMainConf | ngxConfTake3,
+    },
+    "lingering_close": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "lingering_time": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "lingering_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "listen": {
+        ngxHTTPSrvConf | ngxConf1More,
+        ngxMailSrvConf | ngxConf1More,
+        ngxStreamSrvConf | ngxConf1More,
+    },
+    "load_module": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "location": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfTake12,
+    },
+    "lock_file": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "log_format": {
+        ngxHTTPMainConf | ngxConf2More,
+        ngxStreamMainConf | ngxConf2More,
+    },
+    "log_not_found": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "log_subrequest": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "mail": {
+        ngxMainConf | ngxConfBlock | ngxConfNoArgs,
+    },
+    "map": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfTake2,
+        ngxStreamMainConf | ngxConfBlock | ngxConfTake2,
+    },
+    "map_hash_bucket_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+        ngxStreamMainConf | ngxConfTake1,
+    },
+    "map_hash_max_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+        ngxStreamMainConf | ngxConfTake1,
+    },
+    "master_process": {
+        ngxMainConf | ngxDirectConf | ngxConfFlag,
+    },
+    "max_errors": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "max_ranges": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_bind": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "memcached_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_gzip_flag": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_next_upstream": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "memcached_next_upstream_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_next_upstream_tries": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_pass": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "memcached_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_socket_keepalive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "merge_slashes": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "min_delete_depth": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "mirror": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "mirror_request_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "modern_browser": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "modern_browser_value": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "mp4": {
+        ngxHTTPLocConf | ngxConfNoArgs,
+    },
+    "mp4_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "mp4_max_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "mp4_start_key_frame": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "msie_padding": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "msie_refresh": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "multi_accept": {
+        ngxEventConf | ngxConfFlag,
+    },
+    "open_file_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "open_file_cache_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "open_file_cache_min_uses": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "open_file_cache_valid": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "open_log_file_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1234,
+    },
+    "output_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "override_charset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "pass": {
+        ngxStreamSrvConf | ngxConfTake1,
+    },
+    "pcre_jit": {
+        ngxMainConf | ngxDirectConf | ngxConfFlag,
+    },
+    "perl": {
+        ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
+    },
+    "perl_modules": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "perl_require": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "perl_set": {
+        ngxHTTPMainConf | ngxConfTake2,
+    },
+    "pid": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "pop3_auth": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+    },
+    "pop3_capabilities": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+    },
+    "port_in_redirect": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "postpone_output": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "preread_buffer_size": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "preread_timeout": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "protocol": {
+        ngxMailSrvConf | ngxConfTake1,
+    },
+    "proxy_bind": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12,
+    },
+    "proxy_buffer": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "proxy_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "proxy_busy_buffers_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache_background_update": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_cache_bypass": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "proxy_cache_convert_head": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_cache_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache_lock": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_cache_lock_age": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache_lock_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache_max_range_offset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache_methods": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "proxy_cache_min_uses": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache_path": {
+        ngxHTTPMainConf | ngxConf2More,
+    },
+    "proxy_cache_revalidate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_cache_use_stale": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "proxy_cache_valid": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "proxy_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_cookie_domain": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "proxy_cookie_flags": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+    },
+    "proxy_cookie_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "proxy_download_rate": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_force_ranges": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_half_close": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_headers_hash_bucket_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_headers_hash_max_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_hide_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_http_version": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_ignore_client_abort": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_ignore_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "proxy_intercept_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_limit_rate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_max_temp_file_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_method": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_next_upstream": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_next_upstream_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_next_upstream_tries": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_no_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "proxy_pass": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConfTake1,
+        ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_pass_error_message": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+    },
+    "proxy_pass_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_pass_request_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_pass_request_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_protocol": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_protocol_timeout": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_redirect": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "proxy_request_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_requests": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_responses": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_send_lowat": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_set_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_set_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "proxy_smtp_auth": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+    },
+    "proxy_socket_keepalive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_ssl": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_ssl_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_certificate_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_ciphers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_conf_command": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
+    },
+    "proxy_ssl_crl": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_password_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_protocols": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "proxy_ssl_server_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_ssl_session_reuse": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_ssl_trusted_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_verify": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_ssl_verify_depth": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_store": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_store_access": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "proxy_temp_file_write_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_temp_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+    },
+    "proxy_timeout": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_upload_rate": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "quic_active_connection_id_limit": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "quic_bpf": {
+        ngxMainConf | ngxDirectConf | ngxConfFlag,
+    },
+    "quic_gso": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "quic_host_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "quic_retry": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "random": {
+        ngxHTTPUpsConf | ngxConfNoArgs | ngxConfTake12,
+        ngxStreamUpsConf | ngxConfNoArgs | ngxConfTake12,
+    },
+    "random_index": {
+        ngxHTTPLocConf | ngxConfFlag,
+    },
+    "read_ahead": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "real_ip_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "real_ip_recursive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "recursive_error_pages": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "referer_hash_bucket_size": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "referer_hash_max_size": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "request_pool_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "reset_timedout_connection": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "resolver": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "resolver_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "return": {
+        ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake12,
+        ngxStreamSrvConf | ngxConfTake1,
+    },
+    "rewrite": {
+        ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23,
+    },
+    "rewrite_log": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "root": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "satisfy": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_bind": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "scgi_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "scgi_busy_buffers_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache_background_update": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_cache_bypass": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_cache_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache_lock": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_cache_lock_age": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache_lock_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache_max_range_offset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache_methods": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_cache_min_uses": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache_path": {
+        ngxHTTPMainConf | ngxConf2More,
+    },
+    "scgi_cache_revalidate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_cache_use_stale": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_cache_valid": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_force_ranges": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_hide_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_ignore_client_abort": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_ignore_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_intercept_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_limit_rate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_max_temp_file_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_next_upstream": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_next_upstream_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_next_upstream_tries": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_no_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_param": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23,
+    },
+    "scgi_pass": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "scgi_pass_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_pass_request_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_pass_request_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_request_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_socket_keepalive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_store": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_store_access": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "scgi_temp_file_write_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_temp_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+    },
+    "secure_link": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "secure_link_md5": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "secure_link_secret": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "send_lowat": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "sendfile": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "sendfile_max_chunk": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "server": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfNoArgs,
+        ngxHTTPUpsConf | ngxConf1More,
+        ngxMailMainConf | ngxConfBlock | ngxConfNoArgs,
+        ngxStreamMainConf | ngxConfBlock | ngxConfNoArgs,
+        ngxStreamUpsConf | ngxConf1More,
+    },
+    "server_name": {
+        ngxHTTPSrvConf | ngxConf1More,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamSrvConf | ngxConf1More,
+    },
+    "server_name_in_redirect": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "server_names_hash_bucket_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+        ngxStreamMainConf | ngxConfTake1,
+    },
+    "server_names_hash_max_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+        ngxStreamMainConf | ngxConfTake1,
+    },
+    "server_tokens": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "set": {
+        ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake2,
+        ngxStreamSrvConf | ngxConfTake2,
+    },
+    "set_real_ip_from": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "slice": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "smtp_auth": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+    },
+    "smtp_capabilities": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+    },
+    "smtp_client_buffer": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "smtp_greeting_delay": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "source_charset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "split_clients": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfTake2,
+        ngxStreamMainConf | ngxConfBlock | ngxConfTake2,
+    },
+    "ssi": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "ssi_last_modified": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "ssi_min_file_chunk": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "ssi_silent_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "ssi_types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "ssi_value_length": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "ssl_alpn": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "ssl_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_certificate_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_ciphers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_client_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_conf_command": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake2,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake2,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
+    },
+    "ssl_crl": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_dhparam": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_early_data": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "ssl_ecdh_curve": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_engine": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "ssl_handshake_timeout": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_ocsp": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "ssl_ocsp_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_ocsp_responder": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_password_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_prefer_server_ciphers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "ssl_preread": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "ssl_protocols": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConf1More,
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "ssl_reject_handshake": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "ssl_session_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake12,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake12,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12,
+    },
+    "ssl_session_ticket_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_session_tickets": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "ssl_session_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_stapling": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "ssl_stapling_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_stapling_responder": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_stapling_verify": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "ssl_trusted_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_verify_client": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_verify_depth": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "starttls": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "stream": {
+        ngxMainConf | ngxConfBlock | ngxConfNoArgs,
+    },
+    "stub_status": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfNoArgs | ngxConfTake1,
+    },
+    "sub_filter": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "sub_filter_last_modified": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "sub_filter_once": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "sub_filter_types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "subrequest_output_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "tcp_nodelay": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "tcp_nopush": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "thread_pool": {
+        ngxMainConf | ngxDirectConf | ngxConfTake23,
+    },
+    "timeout": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "timer_resolution": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "try_files": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf2More,
+    },
+    "types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfNoArgs,
+    },
+    "types_hash_bucket_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "types_hash_max_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "underscores_in_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "uninitialized_variable_warn": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "upstream": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfTake1,
+        ngxStreamMainConf | ngxConfBlock | ngxConfTake1,
+    },
+    "use": {
+        ngxEventConf | ngxConfTake1,
+    },
+    "user": {
+        ngxMainConf | ngxDirectConf | ngxConfTake12,
+    },
+    "userid": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_domain": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_expires": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_flags": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "userid_mark": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_p3p": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_service": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_bind": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "uwsgi_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "uwsgi_busy_buffers_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_background_update": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_bypass": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_cache_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_lock": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_cache_lock_age": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_lock_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_max_range_offset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_methods": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_cache_min_uses": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_path": {
+        ngxHTTPMainConf | ngxConf2More,
+    },
+    "uwsgi_cache_revalidate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_cache_use_stale": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_cache_valid": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_force_ranges": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_hide_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ignore_client_abort": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_ignore_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_intercept_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_limit_rate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_max_temp_file_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_modifier1": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_modifier2": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_next_upstream": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_next_upstream_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_next_upstream_tries": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_no_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_param": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23,
+    },
+    "uwsgi_pass": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "uwsgi_pass_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_pass_request_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_pass_request_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_request_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_socket_keepalive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_ssl_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_certificate_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_ciphers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_conf_command": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "uwsgi_ssl_crl": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_password_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_protocols": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_ssl_server_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_ssl_session_reuse": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_ssl_trusted_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_verify": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_ssl_verify_depth": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_store": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_store_access": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "uwsgi_temp_file_write_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_temp_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+    },
+    "valid_referers": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "variables_hash_bucket_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+        ngxStreamMainConf | ngxConfTake1,
+    },
+    "variables_hash_max_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+        ngxStreamMainConf | ngxConfTake1,
+    },
+    "worker_aio_requests": {
+        ngxEventConf | ngxConfTake1,
+    },
+    "worker_connections": {
+        ngxEventConf | ngxConfTake1,
+    },
+    "worker_cpu_affinity": {
+        ngxMainConf | ngxDirectConf | ngxConf1More,
+    },
+    "worker_priority": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "worker_processes": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "worker_rlimit_core": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "worker_rlimit_nofile": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "worker_shutdown_timeout": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "working_directory": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "xclient": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+    },
+    "xml_entities": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "xslt_last_modified": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "xslt_param": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "xslt_string_param": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "xslt_stylesheet": {
+        ngxHTTPLocConf | ngxConf1More,
+    },
+    "xslt_types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "zone": {
+        ngxHTTPUpsConf | ngxConfTake12,
+        ngxStreamUpsConf | ngxConfTake12,
+    },
+}
+
+// MatchOss126 contains directives in OSS 1.2.6 source code(including GEOIP, Perl, and XSLT)
+func MatchOss126(directive string) ([]uint, bool) {
+    m, ok := oss126Directives[directive]
+    return m, ok
+}
diff --git a/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_126_directives.go b/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_126_directives.go
deleted file mode 100644
index 6a35295eed..0000000000
--- a/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_126_directives.go
+++ /dev/null
@@ -1,1906 +0,0 @@
-/**
- * Copyright (c) F5, Inc.
- *
- * This source code is licensed under the Apache License, Version 2.0 license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-// All the definitions are extracted from the source code
-// Each bit mask describes these behaviors:
-//   - how many arguments the directive can take
-//   - whether or not it is a block directive
-//   - whether this is a flag (takes one argument that's either "on" or "off")
-//   - which contexts it's allowed to be in
-
-package crossplane
-
-//nolint:gochecknoglobals
-var ngxOss126Directives = map[string][]uint{
-	"absolute_redirect": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"accept_mutex": {
-		ngxEventConf | ngxConfFlag,
-	},
-	"accept_mutex_delay": {
-		ngxEventConf | ngxConfTake1,
-	},
-	"access_log": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"add_after_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"add_before_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"add_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23,
-	},
-	"add_trailer": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23,
-	},
-	"addition_types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"aio": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"aio_write": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"alias": {
-		ngxHTTPLocConf | ngxConfTake1,
-	},
-	"allow": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ancient_browser": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"ancient_browser_value": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"auth_basic": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
-	},
-	"auth_basic_user_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
-	},
-	"auth_delay": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"auth_http": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"auth_http_header": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake2,
-	},
-	"auth_http_pass_client_cert": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-	},
-	"auth_http_timeout": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"auth_request": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"auth_request_set": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"autoindex": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"autoindex_exact_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"autoindex_format": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"autoindex_localtime": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"break": {
-		ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfNoArgs,
-	},
-	"charset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"charset_map": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfTake2,
-	},
-	"charset_types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"chunked_transfer_encoding": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"client_body_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"client_body_in_file_only": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"client_body_in_single_buffer": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"client_body_temp_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-	},
-	"client_body_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"client_header_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"client_header_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"client_max_body_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"connection_pool_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"create_full_put_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"daemon": {
-		ngxMainConf | ngxDirectConf | ngxConfFlag,
-	},
-	"dav_access": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"dav_methods": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"debug_connection": {
-		ngxEventConf | ngxConfTake1,
-	},
-	"debug_points": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"default_type": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"deny": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"directio": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"directio_alignment": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"disable_symlinks": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"empty_gif": {
-		ngxHTTPLocConf | ngxConfNoArgs,
-	},
-	"env": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"error_log": {
-		ngxMainConf | ngxConf1More,
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"error_page": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf2More,
-	},
-	"etag": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"events": {
-		ngxMainConf | ngxConfBlock | ngxConfNoArgs,
-	},
-	"expires": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake12,
-	},
-	"fastcgi_bind": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"fastcgi_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"fastcgi_busy_buffers_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache_background_update": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_cache_bypass": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_cache_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache_lock": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_cache_lock_age": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache_lock_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache_max_range_offset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache_methods": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_cache_min_uses": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache_path": {
-		ngxHTTPMainConf | ngxConf2More,
-	},
-	"fastcgi_cache_revalidate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_cache_use_stale": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_cache_valid": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_catch_stderr": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_force_ranges": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_hide_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_ignore_client_abort": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_ignore_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_index": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_intercept_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_keep_conn": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_limit_rate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_max_temp_file_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_next_upstream": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_next_upstream_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_next_upstream_tries": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_no_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_param": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23,
-	},
-	"fastcgi_pass": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"fastcgi_pass_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_pass_request_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_pass_request_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_request_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_send_lowat": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_socket_keepalive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_split_path_info": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_store": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_store_access": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"fastcgi_temp_file_write_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_temp_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-	},
-	"flv": {
-		ngxHTTPLocConf | ngxConfNoArgs,
-	},
-	"geo": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfTake12,
-		ngxStreamMainConf | ngxConfBlock | ngxConfTake12,
-	},
-	"geoip_city": {
-		ngxHTTPMainConf | ngxConfTake12,
-		ngxStreamMainConf | ngxConfTake12,
-	},
-	"geoip_country": {
-		ngxHTTPMainConf | ngxConfTake12,
-		ngxStreamMainConf | ngxConfTake12,
-	},
-	"geoip_org": {
-		ngxHTTPMainConf | ngxConfTake12,
-		ngxStreamMainConf | ngxConfTake12,
-	},
-	"geoip_proxy": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"geoip_proxy_recursive": {
-		ngxHTTPMainConf | ngxConfFlag,
-	},
-	"google_perftools_profiles": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"grpc_bind": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"grpc_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_hide_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ignore_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"grpc_intercept_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"grpc_next_upstream": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"grpc_next_upstream_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_next_upstream_tries": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_pass": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"grpc_pass_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_set_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"grpc_socket_keepalive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"grpc_ssl_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_certificate_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_ciphers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_conf_command": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"grpc_ssl_crl": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_password_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_protocols": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"grpc_ssl_server_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"grpc_ssl_session_reuse": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"grpc_ssl_trusted_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_verify": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"grpc_ssl_verify_depth": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"gunzip": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"gunzip_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"gzip": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"gzip_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"gzip_comp_level": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"gzip_disable": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"gzip_http_version": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"gzip_min_length": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"gzip_proxied": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"gzip_static": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"gzip_types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"gzip_vary": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"hash": {
-		ngxHTTPUpsConf | ngxConfTake12,
-		ngxStreamUpsConf | ngxConfTake12,
-	},
-	"http": {
-		ngxMainConf | ngxConfBlock | ngxConfNoArgs,
-	},
-	"http2": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"http2_body_preread_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_chunk_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"http2_idle_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_max_concurrent_pushes": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_max_concurrent_streams": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_max_field_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_max_header_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_max_requests": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_push": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"http2_push_preload": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"http2_recv_buffer_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"http2_recv_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http3": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"http3_hq": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"http3_max_concurrent_streams": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http3_stream_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"if": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfExpr | ngxConf1More,
-	},
-	"if_modified_since": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"ignore_invalid_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"image_filter": {
-		ngxHTTPLocConf | ngxConfTake123,
-	},
-	"image_filter_buffer": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"image_filter_interlace": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"image_filter_jpeg_quality": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"image_filter_sharpen": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"image_filter_transparency": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"image_filter_webp_quality": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"imap_auth": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-	},
-	"imap_capabilities": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-	},
-	"imap_client_buffer": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"include": {
-		ngxAnyConf | ngxConfTake1,
-	},
-	"index": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"internal": {
-		ngxHTTPLocConf | ngxConfNoArgs,
-	},
-	"ip_hash": {
-		ngxHTTPUpsConf | ngxConfNoArgs,
-	},
-	"keepalive": {
-		ngxHTTPUpsConf | ngxConfTake1,
-	},
-	"keepalive_disable": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"keepalive_requests": {
-		ngxHTTPUpsConf | ngxConfTake1,
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"keepalive_time": {
-		ngxHTTPUpsConf | ngxConfTake1,
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"keepalive_timeout": {
-		ngxHTTPUpsConf | ngxConfTake1,
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"large_client_header_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake2,
-	},
-	"least_conn": {
-		ngxHTTPUpsConf | ngxConfNoArgs,
-		ngxStreamUpsConf | ngxConfNoArgs,
-	},
-	"limit_conn": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
-	},
-	"limit_conn_dry_run": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"limit_conn_log_level": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"limit_conn_status": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"limit_conn_zone": {
-		ngxHTTPMainConf | ngxConfTake2,
-		ngxStreamMainConf | ngxConfTake2,
-	},
-	"limit_except": {
-		ngxHTTPLocConf | ngxConfBlock | ngxConf1More,
-	},
-	"limit_rate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"limit_rate_after": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"limit_req": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"limit_req_dry_run": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"limit_req_log_level": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"limit_req_status": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"limit_req_zone": {
-		ngxHTTPMainConf | ngxConfTake3,
-	},
-	"lingering_close": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"lingering_time": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"lingering_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"listen": {
-		ngxHTTPSrvConf | ngxConf1More,
-		ngxMailSrvConf | ngxConf1More,
-		ngxStreamSrvConf | ngxConf1More,
-	},
-	"load_module": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"location": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfTake12,
-	},
-	"lock_file": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"log_format": {
-		ngxHTTPMainConf | ngxConf2More,
-		ngxStreamMainConf | ngxConf2More,
-	},
-	"log_not_found": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"log_subrequest": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"mail": {
-		ngxMainConf | ngxConfBlock | ngxConfNoArgs,
-	},
-	"map": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfTake2,
-		ngxStreamMainConf | ngxConfBlock | ngxConfTake2,
-	},
-	"map_hash_bucket_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-		ngxStreamMainConf | ngxConfTake1,
-	},
-	"map_hash_max_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-		ngxStreamMainConf | ngxConfTake1,
-	},
-	"master_process": {
-		ngxMainConf | ngxDirectConf | ngxConfFlag,
-	},
-	"max_errors": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"max_ranges": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_bind": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"memcached_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_gzip_flag": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_next_upstream": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"memcached_next_upstream_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_next_upstream_tries": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_pass": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"memcached_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_socket_keepalive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"merge_slashes": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"min_delete_depth": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"mirror": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"mirror_request_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"modern_browser": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"modern_browser_value": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"mp4": {
-		ngxHTTPLocConf | ngxConfNoArgs,
-	},
-	"mp4_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"mp4_max_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"mp4_start_key_frame": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"msie_padding": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"msie_refresh": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"multi_accept": {
-		ngxEventConf | ngxConfFlag,
-	},
-	"open_file_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"open_file_cache_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"open_file_cache_min_uses": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"open_file_cache_valid": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"open_log_file_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1234,
-	},
-	"output_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"override_charset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"pass": {
-		ngxStreamSrvConf | ngxConfTake1,
-	},
-	"pcre_jit": {
-		ngxMainConf | ngxDirectConf | ngxConfFlag,
-	},
-	"perl": {
-		ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
-	},
-	"perl_modules": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"perl_require": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"perl_set": {
-		ngxHTTPMainConf | ngxConfTake2,
-	},
-	"pid": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"pop3_auth": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-	},
-	"pop3_capabilities": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-	},
-	"port_in_redirect": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"postpone_output": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"preread_buffer_size": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"preread_timeout": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"protocol": {
-		ngxMailSrvConf | ngxConfTake1,
-	},
-	"proxy_bind": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12,
-	},
-	"proxy_buffer": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"proxy_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"proxy_busy_buffers_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache_background_update": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_cache_bypass": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"proxy_cache_convert_head": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_cache_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache_lock": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_cache_lock_age": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache_lock_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache_max_range_offset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache_methods": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"proxy_cache_min_uses": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache_path": {
-		ngxHTTPMainConf | ngxConf2More,
-	},
-	"proxy_cache_revalidate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_cache_use_stale": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"proxy_cache_valid": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"proxy_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_cookie_domain": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"proxy_cookie_flags": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-	},
-	"proxy_cookie_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"proxy_download_rate": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_force_ranges": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_half_close": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_headers_hash_bucket_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_headers_hash_max_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_hide_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_http_version": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_ignore_client_abort": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_ignore_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"proxy_intercept_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_limit_rate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_max_temp_file_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_method": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_next_upstream": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_next_upstream_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_next_upstream_tries": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_no_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"proxy_pass": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConfTake1,
-		ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_pass_error_message": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-	},
-	"proxy_pass_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_pass_request_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_pass_request_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_protocol": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_protocol_timeout": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_redirect": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"proxy_request_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_requests": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_responses": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_send_lowat": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_set_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_set_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"proxy_smtp_auth": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-	},
-	"proxy_socket_keepalive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_ssl": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_ssl_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_certificate_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_ciphers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_conf_command": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
-	},
-	"proxy_ssl_crl": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_password_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_protocols": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"proxy_ssl_server_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_ssl_session_reuse": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_ssl_trusted_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_verify": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_ssl_verify_depth": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_store": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_store_access": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"proxy_temp_file_write_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_temp_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-	},
-	"proxy_timeout": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_upload_rate": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"quic_active_connection_id_limit": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"quic_bpf": {
-		ngxMainConf | ngxDirectConf | ngxConfFlag,
-	},
-	"quic_gso": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"quic_host_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"quic_retry": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"random": {
-		ngxHTTPUpsConf | ngxConfNoArgs | ngxConfTake12,
-		ngxStreamUpsConf | ngxConfNoArgs | ngxConfTake12,
-	},
-	"random_index": {
-		ngxHTTPLocConf | ngxConfFlag,
-	},
-	"read_ahead": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"real_ip_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"real_ip_recursive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"recursive_error_pages": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"referer_hash_bucket_size": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"referer_hash_max_size": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"request_pool_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"reset_timedout_connection": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"resolver": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"resolver_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"return": {
-		ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake12,
-		ngxStreamSrvConf | ngxConfTake1,
-	},
-	"rewrite": {
-		ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23,
-	},
-	"rewrite_log": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"root": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"satisfy": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_bind": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"scgi_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"scgi_busy_buffers_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache_background_update": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_cache_bypass": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_cache_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache_lock": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_cache_lock_age": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache_lock_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache_max_range_offset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache_methods": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_cache_min_uses": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache_path": {
-		ngxHTTPMainConf | ngxConf2More,
-	},
-	"scgi_cache_revalidate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_cache_use_stale": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_cache_valid": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_force_ranges": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_hide_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_ignore_client_abort": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_ignore_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_intercept_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_limit_rate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_max_temp_file_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_next_upstream": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_next_upstream_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_next_upstream_tries": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_no_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_param": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23,
-	},
-	"scgi_pass": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"scgi_pass_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_pass_request_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_pass_request_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_request_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_socket_keepalive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_store": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_store_access": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"scgi_temp_file_write_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_temp_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-	},
-	"secure_link": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"secure_link_md5": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"secure_link_secret": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"send_lowat": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"sendfile": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"sendfile_max_chunk": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"server": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfNoArgs,
-		ngxHTTPUpsConf | ngxConf1More,
-		ngxMailMainConf | ngxConfBlock | ngxConfNoArgs,
-		ngxStreamMainConf | ngxConfBlock | ngxConfNoArgs,
-		ngxStreamUpsConf | ngxConf1More,
-	},
-	"server_name": {
-		ngxHTTPSrvConf | ngxConf1More,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamSrvConf | ngxConf1More,
-	},
-	"server_name_in_redirect": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"server_names_hash_bucket_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-		ngxStreamMainConf | ngxConfTake1,
-	},
-	"server_names_hash_max_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-		ngxStreamMainConf | ngxConfTake1,
-	},
-	"server_tokens": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"set": {
-		ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake2,
-		ngxStreamSrvConf | ngxConfTake2,
-	},
-	"set_real_ip_from": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"slice": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"smtp_auth": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-	},
-	"smtp_capabilities": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-	},
-	"smtp_client_buffer": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"smtp_greeting_delay": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"source_charset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"split_clients": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfTake2,
-		ngxStreamMainConf | ngxConfBlock | ngxConfTake2,
-	},
-	"ssi": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"ssi_last_modified": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"ssi_min_file_chunk": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"ssi_silent_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"ssi_types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"ssi_value_length": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"ssl_alpn": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"ssl_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_certificate_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_ciphers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_client_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_conf_command": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake2,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake2,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
-	},
-	"ssl_crl": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_dhparam": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_early_data": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"ssl_ecdh_curve": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_engine": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"ssl_handshake_timeout": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_ocsp": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"ssl_ocsp_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_ocsp_responder": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_password_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_prefer_server_ciphers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"ssl_preread": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"ssl_protocols": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConf1More,
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"ssl_reject_handshake": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"ssl_session_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake12,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake12,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12,
-	},
-	"ssl_session_ticket_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_session_tickets": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"ssl_session_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_stapling": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"ssl_stapling_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_stapling_responder": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_stapling_verify": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"ssl_trusted_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_verify_client": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_verify_depth": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"starttls": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"stream": {
-		ngxMainConf | ngxConfBlock | ngxConfNoArgs,
-	},
-	"stub_status": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfNoArgs | ngxConfTake1,
-	},
-	"sub_filter": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"sub_filter_last_modified": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"sub_filter_once": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"sub_filter_types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"subrequest_output_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"tcp_nodelay": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"tcp_nopush": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"thread_pool": {
-		ngxMainConf | ngxDirectConf | ngxConfTake23,
-	},
-	"timeout": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"timer_resolution": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"try_files": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf2More,
-	},
-	"types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfNoArgs,
-	},
-	"types_hash_bucket_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"types_hash_max_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"underscores_in_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"uninitialized_variable_warn": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"upstream": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfTake1,
-		ngxStreamMainConf | ngxConfBlock | ngxConfTake1,
-	},
-	"use": {
-		ngxEventConf | ngxConfTake1,
-	},
-	"user": {
-		ngxMainConf | ngxDirectConf | ngxConfTake12,
-	},
-	"userid": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_domain": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_expires": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_flags": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"userid_mark": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_p3p": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_service": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_bind": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"uwsgi_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"uwsgi_busy_buffers_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_background_update": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_bypass": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_cache_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_lock": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_cache_lock_age": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_lock_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_max_range_offset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_methods": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_cache_min_uses": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_path": {
-		ngxHTTPMainConf | ngxConf2More,
-	},
-	"uwsgi_cache_revalidate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_cache_use_stale": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_cache_valid": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_force_ranges": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_hide_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ignore_client_abort": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_ignore_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_intercept_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_limit_rate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_max_temp_file_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_modifier1": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_modifier2": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_next_upstream": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_next_upstream_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_next_upstream_tries": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_no_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_param": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23,
-	},
-	"uwsgi_pass": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"uwsgi_pass_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_pass_request_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_pass_request_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_request_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_socket_keepalive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_ssl_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_certificate_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_ciphers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_conf_command": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"uwsgi_ssl_crl": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_password_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_protocols": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_ssl_server_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_ssl_session_reuse": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_ssl_trusted_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_verify": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_ssl_verify_depth": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_store": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_store_access": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"uwsgi_temp_file_write_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_temp_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-	},
-	"valid_referers": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"variables_hash_bucket_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-		ngxStreamMainConf | ngxConfTake1,
-	},
-	"variables_hash_max_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-		ngxStreamMainConf | ngxConfTake1,
-	},
-	"worker_aio_requests": {
-		ngxEventConf | ngxConfTake1,
-	},
-	"worker_connections": {
-		ngxEventConf | ngxConfTake1,
-	},
-	"worker_cpu_affinity": {
-		ngxMainConf | ngxDirectConf | ngxConf1More,
-	},
-	"worker_priority": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"worker_processes": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"worker_rlimit_core": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"worker_rlimit_nofile": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"worker_shutdown_timeout": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"working_directory": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"xclient": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-	},
-	"xml_entities": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"xslt_last_modified": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"xslt_param": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"xslt_string_param": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"xslt_stylesheet": {
-		ngxHTTPLocConf | ngxConf1More,
-	},
-	"xslt_types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"zone": {
-		ngxHTTPUpsConf | ngxConfTake12,
-		ngxStreamUpsConf | ngxConfTake12,
-	},
-}
-
-func Oss126DirectivesMatchFn(directive string) ([]uint, bool) {
-	masks, matched := ngxOss126Directives[directive]
-	return masks, matched
-}
diff --git a/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_latest_directives.gen.go b/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_latest_directives.gen.go
new file mode 100644
index 0000000000..5ef3eac02a
--- /dev/null
+++ b/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_latest_directives.gen.go
@@ -0,0 +1,1907 @@
+/**
+ * Copyright (c) F5, Inc.
+ *
+ * This source code is licensed under the Apache License, Version 2.0 license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+// Code generated by generator; DO NOT EDIT.
+// All the definitions are extracted from the source code
+// Each bit mask describes these behaviors:
+//   - how many arguments the directive can take
+//   - whether or not it is a block directive
+//   - whether this is a flag (takes one argument that's either "on" or "off")
+//   - which contexts it's allowed to be in
+
+package crossplane
+
+var ossLatestDirectives = map[string][]uint{
+    "absolute_redirect": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "accept_mutex": {
+        ngxEventConf | ngxConfFlag,
+    },
+    "accept_mutex_delay": {
+        ngxEventConf | ngxConfTake1,
+    },
+    "access_log": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "add_after_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "add_before_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "add_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23,
+    },
+    "add_trailer": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23,
+    },
+    "addition_types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "aio": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "aio_write": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "alias": {
+        ngxHTTPLocConf | ngxConfTake1,
+    },
+    "allow": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ancient_browser": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "ancient_browser_value": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "auth_basic": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
+    },
+    "auth_basic_user_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
+    },
+    "auth_delay": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "auth_http": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "auth_http_header": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake2,
+    },
+    "auth_http_pass_client_cert": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+    },
+    "auth_http_timeout": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "auth_request": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "auth_request_set": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "autoindex": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "autoindex_exact_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "autoindex_format": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "autoindex_localtime": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "break": {
+        ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfNoArgs,
+    },
+    "charset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "charset_map": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfTake2,
+    },
+    "charset_types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "chunked_transfer_encoding": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "client_body_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "client_body_in_file_only": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "client_body_in_single_buffer": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "client_body_temp_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+    },
+    "client_body_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "client_header_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "client_header_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "client_max_body_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "connection_pool_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "create_full_put_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "daemon": {
+        ngxMainConf | ngxDirectConf | ngxConfFlag,
+    },
+    "dav_access": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "dav_methods": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "debug_connection": {
+        ngxEventConf | ngxConfTake1,
+    },
+    "debug_points": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "default_type": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "deny": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "directio": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "directio_alignment": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "disable_symlinks": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "empty_gif": {
+        ngxHTTPLocConf | ngxConfNoArgs,
+    },
+    "env": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "error_log": {
+        ngxMainConf | ngxConf1More,
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "error_page": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf2More,
+    },
+    "etag": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "events": {
+        ngxMainConf | ngxConfBlock | ngxConfNoArgs,
+    },
+    "expires": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake12,
+    },
+    "fastcgi_bind": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "fastcgi_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "fastcgi_busy_buffers_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache_background_update": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_cache_bypass": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_cache_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache_lock": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_cache_lock_age": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache_lock_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache_max_range_offset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache_methods": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_cache_min_uses": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache_path": {
+        ngxHTTPMainConf | ngxConf2More,
+    },
+    "fastcgi_cache_revalidate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_cache_use_stale": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_cache_valid": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_catch_stderr": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_force_ranges": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_hide_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_ignore_client_abort": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_ignore_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_index": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_intercept_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_keep_conn": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_limit_rate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_max_temp_file_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_next_upstream": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_next_upstream_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_next_upstream_tries": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_no_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_param": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23,
+    },
+    "fastcgi_pass": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "fastcgi_pass_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_pass_request_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_pass_request_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_request_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_send_lowat": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_socket_keepalive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_split_path_info": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_store": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_store_access": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "fastcgi_temp_file_write_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_temp_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+    },
+    "flv": {
+        ngxHTTPLocConf | ngxConfNoArgs,
+    },
+    "geo": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfTake12,
+        ngxStreamMainConf | ngxConfBlock | ngxConfTake12,
+    },
+    "geoip_city": {
+        ngxHTTPMainConf | ngxConfTake12,
+        ngxStreamMainConf | ngxConfTake12,
+    },
+    "geoip_country": {
+        ngxHTTPMainConf | ngxConfTake12,
+        ngxStreamMainConf | ngxConfTake12,
+    },
+    "geoip_org": {
+        ngxHTTPMainConf | ngxConfTake12,
+        ngxStreamMainConf | ngxConfTake12,
+    },
+    "geoip_proxy": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "geoip_proxy_recursive": {
+        ngxHTTPMainConf | ngxConfFlag,
+    },
+    "google_perftools_profiles": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "grpc_bind": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "grpc_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_hide_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ignore_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "grpc_intercept_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "grpc_next_upstream": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "grpc_next_upstream_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_next_upstream_tries": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_pass": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "grpc_pass_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_set_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "grpc_socket_keepalive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "grpc_ssl_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_certificate_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_ciphers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_conf_command": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "grpc_ssl_crl": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_password_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_protocols": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "grpc_ssl_server_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "grpc_ssl_session_reuse": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "grpc_ssl_trusted_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_verify": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "grpc_ssl_verify_depth": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "gunzip": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "gunzip_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "gzip": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "gzip_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "gzip_comp_level": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "gzip_disable": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "gzip_http_version": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "gzip_min_length": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "gzip_proxied": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "gzip_static": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "gzip_types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "gzip_vary": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "hash": {
+        ngxHTTPUpsConf | ngxConfTake12,
+        ngxStreamUpsConf | ngxConfTake12,
+    },
+    "http": {
+        ngxMainConf | ngxConfBlock | ngxConfNoArgs,
+    },
+    "http2": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "http2_body_preread_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_chunk_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "http2_idle_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_max_concurrent_pushes": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_max_concurrent_streams": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_max_field_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_max_header_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_max_requests": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_push": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "http2_push_preload": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "http2_recv_buffer_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "http2_recv_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http3": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "http3_hq": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "http3_max_concurrent_streams": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http3_stream_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "if": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfExpr | ngxConf1More,
+    },
+    "if_modified_since": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "ignore_invalid_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "image_filter": {
+        ngxHTTPLocConf | ngxConfTake123,
+    },
+    "image_filter_buffer": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "image_filter_interlace": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "image_filter_jpeg_quality": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "image_filter_sharpen": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "image_filter_transparency": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "image_filter_webp_quality": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "imap_auth": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+    },
+    "imap_capabilities": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+    },
+    "imap_client_buffer": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "include": {
+        ngxAnyConf | ngxConfTake1,
+    },
+    "index": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "internal": {
+        ngxHTTPLocConf | ngxConfNoArgs,
+    },
+    "ip_hash": {
+        ngxHTTPUpsConf | ngxConfNoArgs,
+    },
+    "keepalive": {
+        ngxHTTPUpsConf | ngxConfTake1,
+    },
+    "keepalive_disable": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "keepalive_requests": {
+        ngxHTTPUpsConf | ngxConfTake1,
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "keepalive_time": {
+        ngxHTTPUpsConf | ngxConfTake1,
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "keepalive_timeout": {
+        ngxHTTPUpsConf | ngxConfTake1,
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "large_client_header_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake2,
+    },
+    "least_conn": {
+        ngxHTTPUpsConf | ngxConfNoArgs,
+        ngxStreamUpsConf | ngxConfNoArgs,
+    },
+    "limit_conn": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
+    },
+    "limit_conn_dry_run": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "limit_conn_log_level": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "limit_conn_status": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "limit_conn_zone": {
+        ngxHTTPMainConf | ngxConfTake2,
+        ngxStreamMainConf | ngxConfTake2,
+    },
+    "limit_except": {
+        ngxHTTPLocConf | ngxConfBlock | ngxConf1More,
+    },
+    "limit_rate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "limit_rate_after": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "limit_req": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "limit_req_dry_run": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "limit_req_log_level": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "limit_req_status": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "limit_req_zone": {
+        ngxHTTPMainConf | ngxConfTake3,
+    },
+    "lingering_close": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "lingering_time": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "lingering_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "listen": {
+        ngxHTTPSrvConf | ngxConf1More,
+        ngxMailSrvConf | ngxConf1More,
+        ngxStreamSrvConf | ngxConf1More,
+    },
+    "load_module": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "location": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfTake12,
+    },
+    "lock_file": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "log_format": {
+        ngxHTTPMainConf | ngxConf2More,
+        ngxStreamMainConf | ngxConf2More,
+    },
+    "log_not_found": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "log_subrequest": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "mail": {
+        ngxMainConf | ngxConfBlock | ngxConfNoArgs,
+    },
+    "map": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfTake2,
+        ngxStreamMainConf | ngxConfBlock | ngxConfTake2,
+    },
+    "map_hash_bucket_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+        ngxStreamMainConf | ngxConfTake1,
+    },
+    "map_hash_max_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+        ngxStreamMainConf | ngxConfTake1,
+    },
+    "master_process": {
+        ngxMainConf | ngxDirectConf | ngxConfFlag,
+    },
+    "max_errors": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "max_ranges": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_bind": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "memcached_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_gzip_flag": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_next_upstream": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "memcached_next_upstream_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_next_upstream_tries": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_pass": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "memcached_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_socket_keepalive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "merge_slashes": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "min_delete_depth": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "mirror": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "mirror_request_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "modern_browser": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "modern_browser_value": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "mp4": {
+        ngxHTTPLocConf | ngxConfNoArgs,
+    },
+    "mp4_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "mp4_max_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "mp4_start_key_frame": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "msie_padding": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "msie_refresh": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "multi_accept": {
+        ngxEventConf | ngxConfFlag,
+    },
+    "open_file_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "open_file_cache_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "open_file_cache_min_uses": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "open_file_cache_valid": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "open_log_file_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1234,
+    },
+    "output_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "override_charset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "pass": {
+        ngxStreamSrvConf | ngxConfTake1,
+    },
+    "pcre_jit": {
+        ngxMainConf | ngxDirectConf | ngxConfFlag,
+    },
+    "perl": {
+        ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
+    },
+    "perl_modules": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "perl_require": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "perl_set": {
+        ngxHTTPMainConf | ngxConfTake2,
+    },
+    "pid": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "pop3_auth": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+    },
+    "pop3_capabilities": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+    },
+    "port_in_redirect": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "postpone_output": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "preread_buffer_size": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "preread_timeout": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "protocol": {
+        ngxMailSrvConf | ngxConfTake1,
+    },
+    "proxy_bind": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12,
+    },
+    "proxy_buffer": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "proxy_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "proxy_busy_buffers_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache_background_update": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_cache_bypass": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "proxy_cache_convert_head": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_cache_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache_lock": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_cache_lock_age": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache_lock_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache_max_range_offset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache_methods": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "proxy_cache_min_uses": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache_path": {
+        ngxHTTPMainConf | ngxConf2More,
+    },
+    "proxy_cache_revalidate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_cache_use_stale": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "proxy_cache_valid": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "proxy_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_cookie_domain": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "proxy_cookie_flags": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+    },
+    "proxy_cookie_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "proxy_download_rate": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_force_ranges": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_half_close": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_headers_hash_bucket_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_headers_hash_max_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_hide_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_http_version": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_ignore_client_abort": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_ignore_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "proxy_intercept_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_limit_rate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_max_temp_file_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_method": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_next_upstream": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_next_upstream_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_next_upstream_tries": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_no_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "proxy_pass": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConfTake1,
+        ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_pass_error_message": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+    },
+    "proxy_pass_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_pass_request_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_pass_request_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_protocol": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_protocol_timeout": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_redirect": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "proxy_request_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_requests": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_responses": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_send_lowat": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_set_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_set_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "proxy_smtp_auth": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+    },
+    "proxy_socket_keepalive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_ssl": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_ssl_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_certificate_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_ciphers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_conf_command": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
+    },
+    "proxy_ssl_crl": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_password_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_protocols": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "proxy_ssl_server_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_ssl_session_reuse": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_ssl_trusted_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_verify": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_ssl_verify_depth": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_store": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_store_access": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "proxy_temp_file_write_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_temp_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+    },
+    "proxy_timeout": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_upload_rate": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "quic_active_connection_id_limit": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "quic_bpf": {
+        ngxMainConf | ngxDirectConf | ngxConfFlag,
+    },
+    "quic_gso": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "quic_host_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "quic_retry": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "random": {
+        ngxHTTPUpsConf | ngxConfNoArgs | ngxConfTake12,
+        ngxStreamUpsConf | ngxConfNoArgs | ngxConfTake12,
+    },
+    "random_index": {
+        ngxHTTPLocConf | ngxConfFlag,
+    },
+    "read_ahead": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "real_ip_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "real_ip_recursive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "recursive_error_pages": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "referer_hash_bucket_size": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "referer_hash_max_size": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "request_pool_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "reset_timedout_connection": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "resolver": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "resolver_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "return": {
+        ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake12,
+        ngxStreamSrvConf | ngxConfTake1,
+    },
+    "rewrite": {
+        ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23,
+    },
+    "rewrite_log": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "root": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "satisfy": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_bind": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "scgi_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "scgi_busy_buffers_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache_background_update": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_cache_bypass": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_cache_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache_lock": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_cache_lock_age": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache_lock_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache_max_range_offset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache_methods": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_cache_min_uses": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache_path": {
+        ngxHTTPMainConf | ngxConf2More,
+    },
+    "scgi_cache_revalidate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_cache_use_stale": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_cache_valid": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_force_ranges": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_hide_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_ignore_client_abort": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_ignore_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_intercept_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_limit_rate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_max_temp_file_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_next_upstream": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_next_upstream_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_next_upstream_tries": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_no_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_param": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23,
+    },
+    "scgi_pass": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "scgi_pass_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_pass_request_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_pass_request_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_request_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_socket_keepalive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_store": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_store_access": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "scgi_temp_file_write_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_temp_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+    },
+    "secure_link": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "secure_link_md5": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "secure_link_secret": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "send_lowat": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "sendfile": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "sendfile_max_chunk": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "server": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfNoArgs,
+        ngxHTTPUpsConf | ngxConf1More,
+        ngxMailMainConf | ngxConfBlock | ngxConfNoArgs,
+        ngxStreamMainConf | ngxConfBlock | ngxConfNoArgs,
+        ngxStreamUpsConf | ngxConf1More,
+    },
+    "server_name": {
+        ngxHTTPSrvConf | ngxConf1More,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamSrvConf | ngxConf1More,
+    },
+    "server_name_in_redirect": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "server_names_hash_bucket_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+        ngxStreamMainConf | ngxConfTake1,
+    },
+    "server_names_hash_max_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+        ngxStreamMainConf | ngxConfTake1,
+    },
+    "server_tokens": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "set": {
+        ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake2,
+        ngxStreamSrvConf | ngxConfTake2,
+    },
+    "set_real_ip_from": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "slice": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "smtp_auth": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+    },
+    "smtp_capabilities": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+    },
+    "smtp_client_buffer": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "smtp_greeting_delay": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "source_charset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "split_clients": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfTake2,
+        ngxStreamMainConf | ngxConfBlock | ngxConfTake2,
+    },
+    "ssi": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "ssi_last_modified": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "ssi_min_file_chunk": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "ssi_silent_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "ssi_types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "ssi_value_length": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "ssl_alpn": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "ssl_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_certificate_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_ciphers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_client_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_conf_command": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake2,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake2,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
+    },
+    "ssl_crl": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_dhparam": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_early_data": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "ssl_ecdh_curve": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_engine": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "ssl_handshake_timeout": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_ocsp": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "ssl_ocsp_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_ocsp_responder": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_password_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_prefer_server_ciphers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "ssl_preread": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "ssl_protocols": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConf1More,
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "ssl_reject_handshake": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "ssl_session_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake12,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake12,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12,
+    },
+    "ssl_session_ticket_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_session_tickets": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "ssl_session_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_stapling": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "ssl_stapling_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_stapling_responder": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_stapling_verify": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "ssl_trusted_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_verify_client": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_verify_depth": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "starttls": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "stream": {
+        ngxMainConf | ngxConfBlock | ngxConfNoArgs,
+    },
+    "stub_status": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfNoArgs | ngxConfTake1,
+    },
+    "sub_filter": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "sub_filter_last_modified": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "sub_filter_once": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "sub_filter_types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "subrequest_output_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "tcp_nodelay": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "tcp_nopush": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "thread_pool": {
+        ngxMainConf | ngxDirectConf | ngxConfTake23,
+    },
+    "timeout": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "timer_resolution": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "try_files": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf2More,
+    },
+    "types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfNoArgs,
+    },
+    "types_hash_bucket_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "types_hash_max_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "underscores_in_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "uninitialized_variable_warn": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "upstream": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfTake1,
+        ngxStreamMainConf | ngxConfBlock | ngxConfTake1,
+    },
+    "use": {
+        ngxEventConf | ngxConfTake1,
+    },
+    "user": {
+        ngxMainConf | ngxDirectConf | ngxConfTake12,
+    },
+    "userid": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_domain": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_expires": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_flags": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "userid_mark": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_p3p": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_service": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_bind": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "uwsgi_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "uwsgi_busy_buffers_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_background_update": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_bypass": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_cache_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_lock": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_cache_lock_age": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_lock_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_max_range_offset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_methods": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_cache_min_uses": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_path": {
+        ngxHTTPMainConf | ngxConf2More,
+    },
+    "uwsgi_cache_revalidate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_cache_use_stale": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_cache_valid": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_force_ranges": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_hide_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ignore_client_abort": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_ignore_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_intercept_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_limit_rate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_max_temp_file_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_modifier1": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_modifier2": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_next_upstream": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_next_upstream_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_next_upstream_tries": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_no_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_param": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23,
+    },
+    "uwsgi_pass": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "uwsgi_pass_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_pass_request_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_pass_request_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_request_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_socket_keepalive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_ssl_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_certificate_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_ciphers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_conf_command": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "uwsgi_ssl_crl": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_password_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_protocols": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_ssl_server_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_ssl_session_reuse": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_ssl_trusted_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_verify": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_ssl_verify_depth": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_store": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_store_access": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "uwsgi_temp_file_write_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_temp_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+    },
+    "valid_referers": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "variables_hash_bucket_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+        ngxStreamMainConf | ngxConfTake1,
+    },
+    "variables_hash_max_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+        ngxStreamMainConf | ngxConfTake1,
+    },
+    "worker_aio_requests": {
+        ngxEventConf | ngxConfTake1,
+    },
+    "worker_connections": {
+        ngxEventConf | ngxConfTake1,
+    },
+    "worker_cpu_affinity": {
+        ngxMainConf | ngxDirectConf | ngxConf1More,
+    },
+    "worker_priority": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "worker_processes": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "worker_rlimit_core": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "worker_rlimit_nofile": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "worker_shutdown_timeout": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "working_directory": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "xclient": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+    },
+    "xml_entities": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "xslt_last_modified": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "xslt_param": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "xslt_string_param": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "xslt_stylesheet": {
+        ngxHTTPLocConf | ngxConf1More,
+    },
+    "xslt_types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "zone": {
+        ngxHTTPUpsConf | ngxConfTake12,
+        ngxStreamUpsConf | ngxConfTake12,
+    },
+}
+
+// MatchOssLatest contains directives in latest version of OSS source code(including GEOIP, Perl, and XSLT)
+func MatchOssLatest(directive string) ([]uint, bool) {
+    m, ok := ossLatestDirectives[directive]
+    return m, ok
+}
diff --git a/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_latest_directives.go b/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_latest_directives.go
deleted file mode 100644
index c74abb00c4..0000000000
--- a/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_latest_directives.go
+++ /dev/null
@@ -1,1906 +0,0 @@
-/**
- * Copyright (c) F5, Inc.
- *
- * This source code is licensed under the Apache License, Version 2.0 license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-// All the definitions are extracted from the source code
-// Each bit mask describes these behaviors:
-//   - how many arguments the directive can take
-//   - whether or not it is a block directive
-//   - whether this is a flag (takes one argument that's either "on" or "off")
-//   - which contexts it's allowed to be in
-
-package crossplane
-
-//nolint:gochecknoglobals
-var ngxOssLatestDirectives = map[string][]uint{
-	"absolute_redirect": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"accept_mutex": {
-		ngxEventConf | ngxConfFlag,
-	},
-	"accept_mutex_delay": {
-		ngxEventConf | ngxConfTake1,
-	},
-	"access_log": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"add_after_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"add_before_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"add_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23,
-	},
-	"add_trailer": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23,
-	},
-	"addition_types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"aio": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"aio_write": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"alias": {
-		ngxHTTPLocConf | ngxConfTake1,
-	},
-	"allow": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ancient_browser": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"ancient_browser_value": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"auth_basic": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
-	},
-	"auth_basic_user_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
-	},
-	"auth_delay": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"auth_http": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"auth_http_header": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake2,
-	},
-	"auth_http_pass_client_cert": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-	},
-	"auth_http_timeout": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"auth_request": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"auth_request_set": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"autoindex": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"autoindex_exact_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"autoindex_format": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"autoindex_localtime": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"break": {
-		ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfNoArgs,
-	},
-	"charset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"charset_map": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfTake2,
-	},
-	"charset_types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"chunked_transfer_encoding": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"client_body_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"client_body_in_file_only": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"client_body_in_single_buffer": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"client_body_temp_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-	},
-	"client_body_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"client_header_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"client_header_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"client_max_body_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"connection_pool_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"create_full_put_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"daemon": {
-		ngxMainConf | ngxDirectConf | ngxConfFlag,
-	},
-	"dav_access": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"dav_methods": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"debug_connection": {
-		ngxEventConf | ngxConfTake1,
-	},
-	"debug_points": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"default_type": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"deny": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"directio": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"directio_alignment": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"disable_symlinks": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"empty_gif": {
-		ngxHTTPLocConf | ngxConfNoArgs,
-	},
-	"env": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"error_log": {
-		ngxMainConf | ngxConf1More,
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"error_page": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf2More,
-	},
-	"etag": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"events": {
-		ngxMainConf | ngxConfBlock | ngxConfNoArgs,
-	},
-	"expires": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake12,
-	},
-	"fastcgi_bind": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"fastcgi_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"fastcgi_busy_buffers_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache_background_update": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_cache_bypass": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_cache_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache_lock": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_cache_lock_age": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache_lock_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache_max_range_offset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache_methods": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_cache_min_uses": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache_path": {
-		ngxHTTPMainConf | ngxConf2More,
-	},
-	"fastcgi_cache_revalidate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_cache_use_stale": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_cache_valid": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_catch_stderr": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_force_ranges": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_hide_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_ignore_client_abort": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_ignore_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_index": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_intercept_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_keep_conn": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_limit_rate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_max_temp_file_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_next_upstream": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_next_upstream_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_next_upstream_tries": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_no_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_param": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23,
-	},
-	"fastcgi_pass": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"fastcgi_pass_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_pass_request_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_pass_request_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_request_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_send_lowat": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_socket_keepalive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_split_path_info": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_store": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_store_access": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"fastcgi_temp_file_write_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_temp_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-	},
-	"flv": {
-		ngxHTTPLocConf | ngxConfNoArgs,
-	},
-	"geo": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfTake12,
-		ngxStreamMainConf | ngxConfBlock | ngxConfTake12,
-	},
-	"geoip_city": {
-		ngxHTTPMainConf | ngxConfTake12,
-		ngxStreamMainConf | ngxConfTake12,
-	},
-	"geoip_country": {
-		ngxHTTPMainConf | ngxConfTake12,
-		ngxStreamMainConf | ngxConfTake12,
-	},
-	"geoip_org": {
-		ngxHTTPMainConf | ngxConfTake12,
-		ngxStreamMainConf | ngxConfTake12,
-	},
-	"geoip_proxy": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"geoip_proxy_recursive": {
-		ngxHTTPMainConf | ngxConfFlag,
-	},
-	"google_perftools_profiles": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"grpc_bind": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"grpc_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_hide_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ignore_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"grpc_intercept_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"grpc_next_upstream": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"grpc_next_upstream_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_next_upstream_tries": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_pass": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"grpc_pass_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_set_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"grpc_socket_keepalive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"grpc_ssl_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_certificate_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_ciphers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_conf_command": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"grpc_ssl_crl": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_password_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_protocols": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"grpc_ssl_server_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"grpc_ssl_session_reuse": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"grpc_ssl_trusted_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_verify": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"grpc_ssl_verify_depth": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"gunzip": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"gunzip_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"gzip": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"gzip_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"gzip_comp_level": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"gzip_disable": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"gzip_http_version": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"gzip_min_length": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"gzip_proxied": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"gzip_static": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"gzip_types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"gzip_vary": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"hash": {
-		ngxHTTPUpsConf | ngxConfTake12,
-		ngxStreamUpsConf | ngxConfTake12,
-	},
-	"http": {
-		ngxMainConf | ngxConfBlock | ngxConfNoArgs,
-	},
-	"http2": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"http2_body_preread_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_chunk_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"http2_idle_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_max_concurrent_pushes": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_max_concurrent_streams": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_max_field_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_max_header_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_max_requests": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_push": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"http2_push_preload": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"http2_recv_buffer_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"http2_recv_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http3": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"http3_hq": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"http3_max_concurrent_streams": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http3_stream_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"if": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfExpr | ngxConf1More,
-	},
-	"if_modified_since": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"ignore_invalid_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"image_filter": {
-		ngxHTTPLocConf | ngxConfTake123,
-	},
-	"image_filter_buffer": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"image_filter_interlace": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"image_filter_jpeg_quality": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"image_filter_sharpen": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"image_filter_transparency": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"image_filter_webp_quality": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"imap_auth": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-	},
-	"imap_capabilities": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-	},
-	"imap_client_buffer": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"include": {
-		ngxAnyConf | ngxConfTake1,
-	},
-	"index": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"internal": {
-		ngxHTTPLocConf | ngxConfNoArgs,
-	},
-	"ip_hash": {
-		ngxHTTPUpsConf | ngxConfNoArgs,
-	},
-	"keepalive": {
-		ngxHTTPUpsConf | ngxConfTake1,
-	},
-	"keepalive_disable": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"keepalive_requests": {
-		ngxHTTPUpsConf | ngxConfTake1,
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"keepalive_time": {
-		ngxHTTPUpsConf | ngxConfTake1,
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"keepalive_timeout": {
-		ngxHTTPUpsConf | ngxConfTake1,
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"large_client_header_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake2,
-	},
-	"least_conn": {
-		ngxHTTPUpsConf | ngxConfNoArgs,
-		ngxStreamUpsConf | ngxConfNoArgs,
-	},
-	"limit_conn": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
-	},
-	"limit_conn_dry_run": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"limit_conn_log_level": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"limit_conn_status": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"limit_conn_zone": {
-		ngxHTTPMainConf | ngxConfTake2,
-		ngxStreamMainConf | ngxConfTake2,
-	},
-	"limit_except": {
-		ngxHTTPLocConf | ngxConfBlock | ngxConf1More,
-	},
-	"limit_rate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"limit_rate_after": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"limit_req": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"limit_req_dry_run": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"limit_req_log_level": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"limit_req_status": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"limit_req_zone": {
-		ngxHTTPMainConf | ngxConfTake3,
-	},
-	"lingering_close": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"lingering_time": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"lingering_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"listen": {
-		ngxHTTPSrvConf | ngxConf1More,
-		ngxMailSrvConf | ngxConf1More,
-		ngxStreamSrvConf | ngxConf1More,
-	},
-	"load_module": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"location": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfTake12,
-	},
-	"lock_file": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"log_format": {
-		ngxHTTPMainConf | ngxConf2More,
-		ngxStreamMainConf | ngxConf2More,
-	},
-	"log_not_found": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"log_subrequest": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"mail": {
-		ngxMainConf | ngxConfBlock | ngxConfNoArgs,
-	},
-	"map": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfTake2,
-		ngxStreamMainConf | ngxConfBlock | ngxConfTake2,
-	},
-	"map_hash_bucket_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-		ngxStreamMainConf | ngxConfTake1,
-	},
-	"map_hash_max_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-		ngxStreamMainConf | ngxConfTake1,
-	},
-	"master_process": {
-		ngxMainConf | ngxDirectConf | ngxConfFlag,
-	},
-	"max_errors": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"max_ranges": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_bind": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"memcached_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_gzip_flag": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_next_upstream": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"memcached_next_upstream_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_next_upstream_tries": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_pass": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"memcached_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_socket_keepalive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"merge_slashes": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"min_delete_depth": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"mirror": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"mirror_request_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"modern_browser": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"modern_browser_value": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"mp4": {
-		ngxHTTPLocConf | ngxConfNoArgs,
-	},
-	"mp4_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"mp4_max_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"mp4_start_key_frame": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"msie_padding": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"msie_refresh": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"multi_accept": {
-		ngxEventConf | ngxConfFlag,
-	},
-	"open_file_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"open_file_cache_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"open_file_cache_min_uses": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"open_file_cache_valid": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"open_log_file_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1234,
-	},
-	"output_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"override_charset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"pass": {
-		ngxStreamSrvConf | ngxConfTake1,
-	},
-	"pcre_jit": {
-		ngxMainConf | ngxDirectConf | ngxConfFlag,
-	},
-	"perl": {
-		ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
-	},
-	"perl_modules": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"perl_require": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"perl_set": {
-		ngxHTTPMainConf | ngxConfTake2,
-	},
-	"pid": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"pop3_auth": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-	},
-	"pop3_capabilities": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-	},
-	"port_in_redirect": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"postpone_output": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"preread_buffer_size": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"preread_timeout": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"protocol": {
-		ngxMailSrvConf | ngxConfTake1,
-	},
-	"proxy_bind": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12,
-	},
-	"proxy_buffer": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"proxy_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"proxy_busy_buffers_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache_background_update": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_cache_bypass": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"proxy_cache_convert_head": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_cache_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache_lock": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_cache_lock_age": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache_lock_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache_max_range_offset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache_methods": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"proxy_cache_min_uses": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache_path": {
-		ngxHTTPMainConf | ngxConf2More,
-	},
-	"proxy_cache_revalidate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_cache_use_stale": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"proxy_cache_valid": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"proxy_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_cookie_domain": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"proxy_cookie_flags": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-	},
-	"proxy_cookie_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"proxy_download_rate": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_force_ranges": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_half_close": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_headers_hash_bucket_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_headers_hash_max_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_hide_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_http_version": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_ignore_client_abort": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_ignore_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"proxy_intercept_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_limit_rate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_max_temp_file_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_method": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_next_upstream": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_next_upstream_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_next_upstream_tries": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_no_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"proxy_pass": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConfTake1,
-		ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_pass_error_message": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-	},
-	"proxy_pass_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_pass_request_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_pass_request_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_protocol": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_protocol_timeout": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_redirect": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"proxy_request_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_requests": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_responses": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_send_lowat": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_set_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_set_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"proxy_smtp_auth": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-	},
-	"proxy_socket_keepalive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_ssl": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_ssl_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_certificate_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_ciphers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_conf_command": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
-	},
-	"proxy_ssl_crl": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_password_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_protocols": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"proxy_ssl_server_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_ssl_session_reuse": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_ssl_trusted_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_verify": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_ssl_verify_depth": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_store": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_store_access": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"proxy_temp_file_write_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_temp_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-	},
-	"proxy_timeout": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_upload_rate": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"quic_active_connection_id_limit": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"quic_bpf": {
-		ngxMainConf | ngxDirectConf | ngxConfFlag,
-	},
-	"quic_gso": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"quic_host_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"quic_retry": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"random": {
-		ngxHTTPUpsConf | ngxConfNoArgs | ngxConfTake12,
-		ngxStreamUpsConf | ngxConfNoArgs | ngxConfTake12,
-	},
-	"random_index": {
-		ngxHTTPLocConf | ngxConfFlag,
-	},
-	"read_ahead": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"real_ip_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"real_ip_recursive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"recursive_error_pages": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"referer_hash_bucket_size": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"referer_hash_max_size": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"request_pool_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"reset_timedout_connection": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"resolver": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"resolver_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"return": {
-		ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake12,
-		ngxStreamSrvConf | ngxConfTake1,
-	},
-	"rewrite": {
-		ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23,
-	},
-	"rewrite_log": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"root": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"satisfy": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_bind": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"scgi_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"scgi_busy_buffers_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache_background_update": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_cache_bypass": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_cache_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache_lock": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_cache_lock_age": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache_lock_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache_max_range_offset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache_methods": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_cache_min_uses": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache_path": {
-		ngxHTTPMainConf | ngxConf2More,
-	},
-	"scgi_cache_revalidate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_cache_use_stale": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_cache_valid": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_force_ranges": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_hide_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_ignore_client_abort": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_ignore_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_intercept_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_limit_rate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_max_temp_file_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_next_upstream": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_next_upstream_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_next_upstream_tries": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_no_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_param": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23,
-	},
-	"scgi_pass": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"scgi_pass_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_pass_request_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_pass_request_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_request_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_socket_keepalive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_store": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_store_access": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"scgi_temp_file_write_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_temp_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-	},
-	"secure_link": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"secure_link_md5": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"secure_link_secret": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"send_lowat": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"sendfile": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"sendfile_max_chunk": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"server": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfNoArgs,
-		ngxHTTPUpsConf | ngxConf1More,
-		ngxMailMainConf | ngxConfBlock | ngxConfNoArgs,
-		ngxStreamMainConf | ngxConfBlock | ngxConfNoArgs,
-		ngxStreamUpsConf | ngxConf1More,
-	},
-	"server_name": {
-		ngxHTTPSrvConf | ngxConf1More,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamSrvConf | ngxConf1More,
-	},
-	"server_name_in_redirect": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"server_names_hash_bucket_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-		ngxStreamMainConf | ngxConfTake1,
-	},
-	"server_names_hash_max_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-		ngxStreamMainConf | ngxConfTake1,
-	},
-	"server_tokens": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"set": {
-		ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake2,
-		ngxStreamSrvConf | ngxConfTake2,
-	},
-	"set_real_ip_from": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"slice": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"smtp_auth": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-	},
-	"smtp_capabilities": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-	},
-	"smtp_client_buffer": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"smtp_greeting_delay": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"source_charset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"split_clients": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfTake2,
-		ngxStreamMainConf | ngxConfBlock | ngxConfTake2,
-	},
-	"ssi": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"ssi_last_modified": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"ssi_min_file_chunk": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"ssi_silent_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"ssi_types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"ssi_value_length": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"ssl_alpn": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"ssl_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_certificate_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_ciphers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_client_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_conf_command": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake2,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake2,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
-	},
-	"ssl_crl": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_dhparam": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_early_data": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"ssl_ecdh_curve": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_engine": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"ssl_handshake_timeout": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_ocsp": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"ssl_ocsp_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_ocsp_responder": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_password_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_prefer_server_ciphers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"ssl_preread": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"ssl_protocols": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConf1More,
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"ssl_reject_handshake": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"ssl_session_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake12,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake12,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12,
-	},
-	"ssl_session_ticket_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_session_tickets": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"ssl_session_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_stapling": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"ssl_stapling_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_stapling_responder": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_stapling_verify": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"ssl_trusted_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_verify_client": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_verify_depth": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"starttls": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"stream": {
-		ngxMainConf | ngxConfBlock | ngxConfNoArgs,
-	},
-	"stub_status": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfNoArgs | ngxConfTake1,
-	},
-	"sub_filter": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"sub_filter_last_modified": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"sub_filter_once": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"sub_filter_types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"subrequest_output_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"tcp_nodelay": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"tcp_nopush": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"thread_pool": {
-		ngxMainConf | ngxDirectConf | ngxConfTake23,
-	},
-	"timeout": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"timer_resolution": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"try_files": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf2More,
-	},
-	"types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfNoArgs,
-	},
-	"types_hash_bucket_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"types_hash_max_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"underscores_in_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"uninitialized_variable_warn": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"upstream": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfTake1,
-		ngxStreamMainConf | ngxConfBlock | ngxConfTake1,
-	},
-	"use": {
-		ngxEventConf | ngxConfTake1,
-	},
-	"user": {
-		ngxMainConf | ngxDirectConf | ngxConfTake12,
-	},
-	"userid": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_domain": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_expires": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_flags": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"userid_mark": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_p3p": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_service": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_bind": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"uwsgi_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"uwsgi_busy_buffers_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_background_update": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_bypass": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_cache_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_lock": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_cache_lock_age": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_lock_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_max_range_offset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_methods": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_cache_min_uses": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_path": {
-		ngxHTTPMainConf | ngxConf2More,
-	},
-	"uwsgi_cache_revalidate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_cache_use_stale": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_cache_valid": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_force_ranges": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_hide_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ignore_client_abort": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_ignore_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_intercept_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_limit_rate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_max_temp_file_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_modifier1": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_modifier2": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_next_upstream": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_next_upstream_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_next_upstream_tries": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_no_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_param": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23,
-	},
-	"uwsgi_pass": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"uwsgi_pass_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_pass_request_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_pass_request_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_request_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_socket_keepalive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_ssl_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_certificate_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_ciphers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_conf_command": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"uwsgi_ssl_crl": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_password_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_protocols": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_ssl_server_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_ssl_session_reuse": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_ssl_trusted_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_verify": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_ssl_verify_depth": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_store": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_store_access": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"uwsgi_temp_file_write_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_temp_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-	},
-	"valid_referers": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"variables_hash_bucket_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-		ngxStreamMainConf | ngxConfTake1,
-	},
-	"variables_hash_max_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-		ngxStreamMainConf | ngxConfTake1,
-	},
-	"worker_aio_requests": {
-		ngxEventConf | ngxConfTake1,
-	},
-	"worker_connections": {
-		ngxEventConf | ngxConfTake1,
-	},
-	"worker_cpu_affinity": {
-		ngxMainConf | ngxDirectConf | ngxConf1More,
-	},
-	"worker_priority": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"worker_processes": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"worker_rlimit_core": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"worker_rlimit_nofile": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"worker_shutdown_timeout": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"working_directory": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"xclient": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-	},
-	"xml_entities": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"xslt_last_modified": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"xslt_param": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"xslt_string_param": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"xslt_stylesheet": {
-		ngxHTTPLocConf | ngxConf1More,
-	},
-	"xslt_types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"zone": {
-		ngxHTTPUpsConf | ngxConfTake12,
-		ngxStreamUpsConf | ngxConfTake12,
-	},
-}
-
-func OssLatestDirectivesMatchFn(directive string) ([]uint, bool) {
-	masks, matched := ngxOssLatestDirectives[directive]
-	return masks, matched
-}
diff --git a/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_otel_directives.gen.go b/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_otel_directives.gen.go
new file mode 100644
index 0000000000..5047bf39f2
--- /dev/null
+++ b/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_otel_directives.gen.go
@@ -0,0 +1,43 @@
+/**
+ * Copyright (c) F5, Inc.
+ *
+ * This source code is licensed under the Apache License, Version 2.0 license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+// Code generated by generator; DO NOT EDIT.
+// All the definitions are extracted from the source code
+// Each bit mask describes these behaviors:
+//   - how many arguments the directive can take
+//   - whether or not it is a block directive
+//   - whether this is a flag (takes one argument that's either "on" or "off")
+//   - which contexts it's allowed to be in
+
+package crossplane
+
+var otelDirectives = map[string][]uint{
+    "otel_exporter": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfNoArgs,
+    },
+    "otel_service_name": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "otel_span_attr": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "otel_span_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "otel_trace": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "otel_trace_context": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+}
+
+// MatchOtelLatest is a MatchFunc for latest version of otel.
+func MatchOtelLatest(directive string) ([]uint, bool) {
+    m, ok := otelDirectives[directive]
+    return m, ok
+}
diff --git a/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_otel_directives.go b/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_otel_directives.go
deleted file mode 100644
index b597179ff2..0000000000
--- a/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_otel_directives.go
+++ /dev/null
@@ -1,54 +0,0 @@
-/**
- * Copyright (c) F5, Inc.
- *
- * This source code is licensed under the Apache License, Version 2.0 license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-// All the definitions are extracted from the source code
-// Each bit mask describes these behaviors:
-//   - how many arguments the directive can take
-//   - whether or not it is a block directive
-//   - whether this is a flag (takes one argument that's either "on" or "off")
-//   - which contexts it's allowed to be in
-
-package crossplane
-
-//nolint:gochecknoglobals
-var moduleOtelDirectives = map[string][]uint{
-	"batch_count": {
-		ngxConfTake1,
-	},
-	"batch_size": {
-		ngxConfTake1,
-	},
-	"endpoint": {
-		ngxConfTake1,
-	},
-	"interval": {
-		ngxConfTake1,
-	},
-	"otel_exporter": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfNoArgs,
-	},
-	"otel_service_name": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"otel_span_attr": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"otel_span_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"otel_trace": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"otel_trace_context": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-}
-
-func OtelDirectivesMatchFn(directive string) ([]uint, bool) {
-	masks, matched := moduleOtelDirectives[directive]
-	return masks, matched
-}
diff --git a/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/buffer.go b/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/buffer.go
index f43186fcaa..0da6dcac32 100644
--- a/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/buffer.go
+++ b/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/buffer.go
@@ -14,7 +14,7 @@ import (
 
 // Creator abstracts file creation (to write configs to something other than files).
 type Creator interface {
-	Create(string) (io.WriteCloser, error)
+	Create(path string) (io.WriteCloser, error)
 	Reset()
 }
 
diff --git a/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/parse.go b/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/parse.go
index 4d44904709..2f3126f7d5 100644
--- a/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/parse.go
+++ b/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/parse.go
@@ -385,7 +385,6 @@ func (p *parser) parse(parsing *Config, tokens <-chan NgxToken, ctx blockCtx, co
 				// if the file pattern was explicit, nginx will check
 				// that the included file can be opened and read
 				if f, err := p.openFile(pattern); err != nil {
-					defer f.Close()
 					perr := &ParseError{
 						What:      err.Error(),
 						File:      &parsing.File,
@@ -399,6 +398,7 @@ func (p *parser) parse(parsing *Config, tokens <-chan NgxToken, ctx blockCtx, co
 						return nil, perr
 					}
 				} else {
+					defer f.Close()
 					fnames = []string{pattern}
 				}
 			}
diff --git a/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/tools.go b/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/tools.go
index 2114566b8f..ece0bb62e4 100644
--- a/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/tools.go
+++ b/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/tools.go
@@ -4,10 +4,10 @@
 // This file just exists to ensure we download the tools we need for building
 // See https://github.com/golang/go/wiki/Modules#how-can-i-track-tool-dependencies-for-a-module
 
-package tools
+package crossplane
 
 import (
-	_ "github.com/jstemmer/go-junit-report"
-	_ "github.com/maxbrunsfeld/counterfeiter/v6"
-	_ "golang.org/x/tools/cmd/goimports"
+	_ "github.com/jstemmer/go-junit-report/parser"
+	_ "github.com/maxbrunsfeld/counterfeiter/v6/generator"
+	_ "golang.org/x/tools/imports"
 )
diff --git a/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/util.go b/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/util.go
index d2e84adeb9..b7af673bf8 100644
--- a/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/util.go
+++ b/test/performance/vendor/github.com/nginxinc/nginx-go-crossplane/util.go
@@ -64,7 +64,7 @@ func validExpr(d *Directive) bool {
 		strings.HasSuffix(d.Args[e], ")") &&
 		((l == 1 && len(d.Args[b]) > 2) || // empty expression single arg '()'
 			(l == 2 && (len(d.Args[b]) > 1 || len(d.Args[e]) > 1)) || // empty expression two args '(', ')'
-			(l > 2))
+			(l > 2)) //nolint: mnd
 }
 
 // prepareIfArgs removes parentheses from an `if` directive's arguments.
diff --git a/test/performance/vendor/github.com/stretchr/testify/assert/assertion_compare.go b/test/performance/vendor/github.com/stretchr/testify/assert/assertion_compare.go
index 4d4b4aad6f..7e19eba090 100644
--- a/test/performance/vendor/github.com/stretchr/testify/assert/assertion_compare.go
+++ b/test/performance/vendor/github.com/stretchr/testify/assert/assertion_compare.go
@@ -7,10 +7,13 @@ import (
 	"time"
 )
 
-type CompareType int
+// Deprecated: CompareType has only ever been for internal use and has accidentally been published since v1.6.0. Do not use it.
+type CompareType = compareResult
+
+type compareResult int
 
 const (
-	compareLess CompareType = iota - 1
+	compareLess compareResult = iota - 1
 	compareEqual
 	compareGreater
 )
@@ -39,7 +42,7 @@ var (
 	bytesType = reflect.TypeOf([]byte{})
 )
 
-func compare(obj1, obj2 interface{}, kind reflect.Kind) (CompareType, bool) {
+func compare(obj1, obj2 interface{}, kind reflect.Kind) (compareResult, bool) {
 	obj1Value := reflect.ValueOf(obj1)
 	obj2Value := reflect.ValueOf(obj2)
 
@@ -325,7 +328,13 @@ func compare(obj1, obj2 interface{}, kind reflect.Kind) (CompareType, bool) {
 				timeObj2 = obj2Value.Convert(timeType).Interface().(time.Time)
 			}
 
-			return compare(timeObj1.UnixNano(), timeObj2.UnixNano(), reflect.Int64)
+			if timeObj1.Before(timeObj2) {
+				return compareLess, true
+			}
+			if timeObj1.Equal(timeObj2) {
+				return compareEqual, true
+			}
+			return compareGreater, true
 		}
 	case reflect.Slice:
 		{
@@ -345,7 +354,7 @@ func compare(obj1, obj2 interface{}, kind reflect.Kind) (CompareType, bool) {
 				bytesObj2 = obj2Value.Convert(bytesType).Interface().([]byte)
 			}
 
-			return CompareType(bytes.Compare(bytesObj1, bytesObj2)), true
+			return compareResult(bytes.Compare(bytesObj1, bytesObj2)), true
 		}
 	case reflect.Uintptr:
 		{
@@ -381,7 +390,7 @@ func Greater(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
 	}
-	return compareTwoValues(t, e1, e2, []CompareType{compareGreater}, "\"%v\" is not greater than \"%v\"", msgAndArgs...)
+	return compareTwoValues(t, e1, e2, []compareResult{compareGreater}, "\"%v\" is not greater than \"%v\"", msgAndArgs...)
 }
 
 // GreaterOrEqual asserts that the first element is greater than or equal to the second
@@ -394,7 +403,7 @@ func GreaterOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...in
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
 	}
-	return compareTwoValues(t, e1, e2, []CompareType{compareGreater, compareEqual}, "\"%v\" is not greater than or equal to \"%v\"", msgAndArgs...)
+	return compareTwoValues(t, e1, e2, []compareResult{compareGreater, compareEqual}, "\"%v\" is not greater than or equal to \"%v\"", msgAndArgs...)
 }
 
 // Less asserts that the first element is less than the second
@@ -406,7 +415,7 @@ func Less(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{})
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
 	}
-	return compareTwoValues(t, e1, e2, []CompareType{compareLess}, "\"%v\" is not less than \"%v\"", msgAndArgs...)
+	return compareTwoValues(t, e1, e2, []compareResult{compareLess}, "\"%v\" is not less than \"%v\"", msgAndArgs...)
 }
 
 // LessOrEqual asserts that the first element is less than or equal to the second
@@ -419,7 +428,7 @@ func LessOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...inter
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
 	}
-	return compareTwoValues(t, e1, e2, []CompareType{compareLess, compareEqual}, "\"%v\" is not less than or equal to \"%v\"", msgAndArgs...)
+	return compareTwoValues(t, e1, e2, []compareResult{compareLess, compareEqual}, "\"%v\" is not less than or equal to \"%v\"", msgAndArgs...)
 }
 
 // Positive asserts that the specified element is positive
@@ -431,7 +440,7 @@ func Positive(t TestingT, e interface{}, msgAndArgs ...interface{}) bool {
 		h.Helper()
 	}
 	zero := reflect.Zero(reflect.TypeOf(e))
-	return compareTwoValues(t, e, zero.Interface(), []CompareType{compareGreater}, "\"%v\" is not positive", msgAndArgs...)
+	return compareTwoValues(t, e, zero.Interface(), []compareResult{compareGreater}, "\"%v\" is not positive", msgAndArgs...)
 }
 
 // Negative asserts that the specified element is negative
@@ -443,10 +452,10 @@ func Negative(t TestingT, e interface{}, msgAndArgs ...interface{}) bool {
 		h.Helper()
 	}
 	zero := reflect.Zero(reflect.TypeOf(e))
-	return compareTwoValues(t, e, zero.Interface(), []CompareType{compareLess}, "\"%v\" is not negative", msgAndArgs...)
+	return compareTwoValues(t, e, zero.Interface(), []compareResult{compareLess}, "\"%v\" is not negative", msgAndArgs...)
 }
 
-func compareTwoValues(t TestingT, e1 interface{}, e2 interface{}, allowedComparesResults []CompareType, failMessage string, msgAndArgs ...interface{}) bool {
+func compareTwoValues(t TestingT, e1 interface{}, e2 interface{}, allowedComparesResults []compareResult, failMessage string, msgAndArgs ...interface{}) bool {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
 	}
@@ -469,7 +478,7 @@ func compareTwoValues(t TestingT, e1 interface{}, e2 interface{}, allowedCompare
 	return true
 }
 
-func containsValue(values []CompareType, value CompareType) bool {
+func containsValue(values []compareResult, value compareResult) bool {
 	for _, v := range values {
 		if v == value {
 			return true
diff --git a/test/performance/vendor/github.com/stretchr/testify/assert/assertion_format.go b/test/performance/vendor/github.com/stretchr/testify/assert/assertion_format.go
index 3ddab109ad..1906341657 100644
--- a/test/performance/vendor/github.com/stretchr/testify/assert/assertion_format.go
+++ b/test/performance/vendor/github.com/stretchr/testify/assert/assertion_format.go
@@ -104,8 +104,8 @@ func EqualExportedValuesf(t TestingT, expected interface{}, actual interface{},
 	return EqualExportedValues(t, expected, actual, append([]interface{}{msg}, args...)...)
 }
 
-// EqualValuesf asserts that two objects are equal or convertible to the same types
-// and equal.
+// EqualValuesf asserts that two objects are equal or convertible to the larger
+// type and equal.
 //
 //	assert.EqualValuesf(t, uint32(123), int32(123), "error message %s", "formatted")
 func EqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool {
@@ -186,7 +186,7 @@ func Eventuallyf(t TestingT, condition func() bool, waitFor time.Duration, tick
 //	assert.EventuallyWithTf(t, func(c *assert.CollectT, "error message %s", "formatted") {
 //		// add assertions as needed; any assertion failure will fail the current tick
 //		assert.True(c, externalValue, "expected 'externalValue' to be true")
-//	}, 1*time.Second, 10*time.Second, "external state has not changed to 'true'; still false")
+//	}, 10*time.Second, 1*time.Second, "external state has not changed to 'true'; still false")
 func EventuallyWithTf(t TestingT, condition func(collect *CollectT), waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) bool {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -568,6 +568,23 @@ func NotContainsf(t TestingT, s interface{}, contains interface{}, msg string, a
 	return NotContains(t, s, contains, append([]interface{}{msg}, args...)...)
 }
 
+// NotElementsMatchf asserts that the specified listA(array, slice...) is NOT equal to specified
+// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements,
+// the number of appearances of each of them in both lists should not match.
+// This is an inverse of ElementsMatch.
+//
+// assert.NotElementsMatchf(t, [1, 1, 2, 3], [1, 1, 2, 3], "error message %s", "formatted") -> false
+//
+// assert.NotElementsMatchf(t, [1, 1, 2, 3], [1, 2, 3], "error message %s", "formatted") -> true
+//
+// assert.NotElementsMatchf(t, [1, 2, 3], [1, 2, 4], "error message %s", "formatted") -> true
+func NotElementsMatchf(t TestingT, listA interface{}, listB interface{}, msg string, args ...interface{}) bool {
+	if h, ok := t.(tHelper); ok {
+		h.Helper()
+	}
+	return NotElementsMatch(t, listA, listB, append([]interface{}{msg}, args...)...)
+}
+
 // NotEmptyf asserts that the specified object is NOT empty.  I.e. not nil, "", false, 0 or either
 // a slice or a channel with len == 0.
 //
@@ -604,7 +621,16 @@ func NotEqualValuesf(t TestingT, expected interface{}, actual interface{}, msg s
 	return NotEqualValues(t, expected, actual, append([]interface{}{msg}, args...)...)
 }
 
-// NotErrorIsf asserts that at none of the errors in err's chain matches target.
+// NotErrorAsf asserts that none of the errors in err's chain matches target,
+// but if so, sets target to that error value.
+func NotErrorAsf(t TestingT, err error, target interface{}, msg string, args ...interface{}) bool {
+	if h, ok := t.(tHelper); ok {
+		h.Helper()
+	}
+	return NotErrorAs(t, err, target, append([]interface{}{msg}, args...)...)
+}
+
+// NotErrorIsf asserts that none of the errors in err's chain matches target.
 // This is a wrapper for errors.Is.
 func NotErrorIsf(t TestingT, err error, target error, msg string, args ...interface{}) bool {
 	if h, ok := t.(tHelper); ok {
diff --git a/test/performance/vendor/github.com/stretchr/testify/assert/assertion_forward.go b/test/performance/vendor/github.com/stretchr/testify/assert/assertion_forward.go
index a84e09bd40..21629087ba 100644
--- a/test/performance/vendor/github.com/stretchr/testify/assert/assertion_forward.go
+++ b/test/performance/vendor/github.com/stretchr/testify/assert/assertion_forward.go
@@ -186,8 +186,8 @@ func (a *Assertions) EqualExportedValuesf(expected interface{}, actual interface
 	return EqualExportedValuesf(a.t, expected, actual, msg, args...)
 }
 
-// EqualValues asserts that two objects are equal or convertible to the same types
-// and equal.
+// EqualValues asserts that two objects are equal or convertible to the larger
+// type and equal.
 //
 //	a.EqualValues(uint32(123), int32(123))
 func (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool {
@@ -197,8 +197,8 @@ func (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAn
 	return EqualValues(a.t, expected, actual, msgAndArgs...)
 }
 
-// EqualValuesf asserts that two objects are equal or convertible to the same types
-// and equal.
+// EqualValuesf asserts that two objects are equal or convertible to the larger
+// type and equal.
 //
 //	a.EqualValuesf(uint32(123), int32(123), "error message %s", "formatted")
 func (a *Assertions) EqualValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool {
@@ -336,7 +336,7 @@ func (a *Assertions) Eventually(condition func() bool, waitFor time.Duration, ti
 //	a.EventuallyWithT(func(c *assert.CollectT) {
 //		// add assertions as needed; any assertion failure will fail the current tick
 //		assert.True(c, externalValue, "expected 'externalValue' to be true")
-//	}, 1*time.Second, 10*time.Second, "external state has not changed to 'true'; still false")
+//	}, 10*time.Second, 1*time.Second, "external state has not changed to 'true'; still false")
 func (a *Assertions) EventuallyWithT(condition func(collect *CollectT), waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) bool {
 	if h, ok := a.t.(tHelper); ok {
 		h.Helper()
@@ -361,7 +361,7 @@ func (a *Assertions) EventuallyWithT(condition func(collect *CollectT), waitFor
 //	a.EventuallyWithTf(func(c *assert.CollectT, "error message %s", "formatted") {
 //		// add assertions as needed; any assertion failure will fail the current tick
 //		assert.True(c, externalValue, "expected 'externalValue' to be true")
-//	}, 1*time.Second, 10*time.Second, "external state has not changed to 'true'; still false")
+//	}, 10*time.Second, 1*time.Second, "external state has not changed to 'true'; still false")
 func (a *Assertions) EventuallyWithTf(condition func(collect *CollectT), waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) bool {
 	if h, ok := a.t.(tHelper); ok {
 		h.Helper()
@@ -1128,6 +1128,40 @@ func (a *Assertions) NotContainsf(s interface{}, contains interface{}, msg strin
 	return NotContainsf(a.t, s, contains, msg, args...)
 }
 
+// NotElementsMatch asserts that the specified listA(array, slice...) is NOT equal to specified
+// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements,
+// the number of appearances of each of them in both lists should not match.
+// This is an inverse of ElementsMatch.
+//
+// a.NotElementsMatch([1, 1, 2, 3], [1, 1, 2, 3]) -> false
+//
+// a.NotElementsMatch([1, 1, 2, 3], [1, 2, 3]) -> true
+//
+// a.NotElementsMatch([1, 2, 3], [1, 2, 4]) -> true
+func (a *Assertions) NotElementsMatch(listA interface{}, listB interface{}, msgAndArgs ...interface{}) bool {
+	if h, ok := a.t.(tHelper); ok {
+		h.Helper()
+	}
+	return NotElementsMatch(a.t, listA, listB, msgAndArgs...)
+}
+
+// NotElementsMatchf asserts that the specified listA(array, slice...) is NOT equal to specified
+// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements,
+// the number of appearances of each of them in both lists should not match.
+// This is an inverse of ElementsMatch.
+//
+// a.NotElementsMatchf([1, 1, 2, 3], [1, 1, 2, 3], "error message %s", "formatted") -> false
+//
+// a.NotElementsMatchf([1, 1, 2, 3], [1, 2, 3], "error message %s", "formatted") -> true
+//
+// a.NotElementsMatchf([1, 2, 3], [1, 2, 4], "error message %s", "formatted") -> true
+func (a *Assertions) NotElementsMatchf(listA interface{}, listB interface{}, msg string, args ...interface{}) bool {
+	if h, ok := a.t.(tHelper); ok {
+		h.Helper()
+	}
+	return NotElementsMatchf(a.t, listA, listB, msg, args...)
+}
+
 // NotEmpty asserts that the specified object is NOT empty.  I.e. not nil, "", false, 0 or either
 // a slice or a channel with len == 0.
 //
@@ -1200,7 +1234,25 @@ func (a *Assertions) NotEqualf(expected interface{}, actual interface{}, msg str
 	return NotEqualf(a.t, expected, actual, msg, args...)
 }
 
-// NotErrorIs asserts that at none of the errors in err's chain matches target.
+// NotErrorAs asserts that none of the errors in err's chain matches target,
+// but if so, sets target to that error value.
+func (a *Assertions) NotErrorAs(err error, target interface{}, msgAndArgs ...interface{}) bool {
+	if h, ok := a.t.(tHelper); ok {
+		h.Helper()
+	}
+	return NotErrorAs(a.t, err, target, msgAndArgs...)
+}
+
+// NotErrorAsf asserts that none of the errors in err's chain matches target,
+// but if so, sets target to that error value.
+func (a *Assertions) NotErrorAsf(err error, target interface{}, msg string, args ...interface{}) bool {
+	if h, ok := a.t.(tHelper); ok {
+		h.Helper()
+	}
+	return NotErrorAsf(a.t, err, target, msg, args...)
+}
+
+// NotErrorIs asserts that none of the errors in err's chain matches target.
 // This is a wrapper for errors.Is.
 func (a *Assertions) NotErrorIs(err error, target error, msgAndArgs ...interface{}) bool {
 	if h, ok := a.t.(tHelper); ok {
@@ -1209,7 +1261,7 @@ func (a *Assertions) NotErrorIs(err error, target error, msgAndArgs ...interface
 	return NotErrorIs(a.t, err, target, msgAndArgs...)
 }
 
-// NotErrorIsf asserts that at none of the errors in err's chain matches target.
+// NotErrorIsf asserts that none of the errors in err's chain matches target.
 // This is a wrapper for errors.Is.
 func (a *Assertions) NotErrorIsf(err error, target error, msg string, args ...interface{}) bool {
 	if h, ok := a.t.(tHelper); ok {
diff --git a/test/performance/vendor/github.com/stretchr/testify/assert/assertion_order.go b/test/performance/vendor/github.com/stretchr/testify/assert/assertion_order.go
index 00df62a059..1d2f71824a 100644
--- a/test/performance/vendor/github.com/stretchr/testify/assert/assertion_order.go
+++ b/test/performance/vendor/github.com/stretchr/testify/assert/assertion_order.go
@@ -6,7 +6,7 @@ import (
 )
 
 // isOrdered checks that collection contains orderable elements.
-func isOrdered(t TestingT, object interface{}, allowedComparesResults []CompareType, failMessage string, msgAndArgs ...interface{}) bool {
+func isOrdered(t TestingT, object interface{}, allowedComparesResults []compareResult, failMessage string, msgAndArgs ...interface{}) bool {
 	objKind := reflect.TypeOf(object).Kind()
 	if objKind != reflect.Slice && objKind != reflect.Array {
 		return false
@@ -50,7 +50,7 @@ func isOrdered(t TestingT, object interface{}, allowedComparesResults []CompareT
 //	assert.IsIncreasing(t, []float{1, 2})
 //	assert.IsIncreasing(t, []string{"a", "b"})
 func IsIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
-	return isOrdered(t, object, []CompareType{compareLess}, "\"%v\" is not less than \"%v\"", msgAndArgs...)
+	return isOrdered(t, object, []compareResult{compareLess}, "\"%v\" is not less than \"%v\"", msgAndArgs...)
 }
 
 // IsNonIncreasing asserts that the collection is not increasing
@@ -59,7 +59,7 @@ func IsIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) boo
 //	assert.IsNonIncreasing(t, []float{2, 1})
 //	assert.IsNonIncreasing(t, []string{"b", "a"})
 func IsNonIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
-	return isOrdered(t, object, []CompareType{compareEqual, compareGreater}, "\"%v\" is not greater than or equal to \"%v\"", msgAndArgs...)
+	return isOrdered(t, object, []compareResult{compareEqual, compareGreater}, "\"%v\" is not greater than or equal to \"%v\"", msgAndArgs...)
 }
 
 // IsDecreasing asserts that the collection is decreasing
@@ -68,7 +68,7 @@ func IsNonIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{})
 //	assert.IsDecreasing(t, []float{2, 1})
 //	assert.IsDecreasing(t, []string{"b", "a"})
 func IsDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
-	return isOrdered(t, object, []CompareType{compareGreater}, "\"%v\" is not greater than \"%v\"", msgAndArgs...)
+	return isOrdered(t, object, []compareResult{compareGreater}, "\"%v\" is not greater than \"%v\"", msgAndArgs...)
 }
 
 // IsNonDecreasing asserts that the collection is not decreasing
@@ -77,5 +77,5 @@ func IsDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) boo
 //	assert.IsNonDecreasing(t, []float{1, 2})
 //	assert.IsNonDecreasing(t, []string{"a", "b"})
 func IsNonDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
-	return isOrdered(t, object, []CompareType{compareLess, compareEqual}, "\"%v\" is not less than or equal to \"%v\"", msgAndArgs...)
+	return isOrdered(t, object, []compareResult{compareLess, compareEqual}, "\"%v\" is not less than or equal to \"%v\"", msgAndArgs...)
 }
diff --git a/test/performance/vendor/github.com/stretchr/testify/assert/assertions.go b/test/performance/vendor/github.com/stretchr/testify/assert/assertions.go
index 0b7570f21c..4e91332bb5 100644
--- a/test/performance/vendor/github.com/stretchr/testify/assert/assertions.go
+++ b/test/performance/vendor/github.com/stretchr/testify/assert/assertions.go
@@ -19,7 +19,9 @@ import (
 
 	"github.com/davecgh/go-spew/spew"
 	"github.com/pmezard/go-difflib/difflib"
-	"gopkg.in/yaml.v3"
+
+	// Wrapper around gopkg.in/yaml.v3
+	"github.com/stretchr/testify/assert/yaml"
 )
 
 //go:generate sh -c "cd ../_codegen && go build && cd - && ../_codegen/_codegen -output-package=assert -template=assertion_format.go.tmpl"
@@ -45,6 +47,10 @@ type BoolAssertionFunc func(TestingT, bool, ...interface{}) bool
 // for table driven tests.
 type ErrorAssertionFunc func(TestingT, error, ...interface{}) bool
 
+// PanicAssertionFunc is a common function prototype when validating a panic value.  Can be useful
+// for table driven tests.
+type PanicAssertionFunc = func(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool
+
 // Comparison is a custom function that returns true on success and false on failure
 type Comparison func() (success bool)
 
@@ -496,7 +502,13 @@ func Same(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) b
 		h.Helper()
 	}
 
-	if !samePointers(expected, actual) {
+	same, ok := samePointers(expected, actual)
+	if !ok {
+		return Fail(t, "Both arguments must be pointers", msgAndArgs...)
+	}
+
+	if !same {
+		// both are pointers but not the same type & pointing to the same address
 		return Fail(t, fmt.Sprintf("Not same: \n"+
 			"expected: %p %#v\n"+
 			"actual  : %p %#v", expected, expected, actual, actual), msgAndArgs...)
@@ -516,7 +528,13 @@ func NotSame(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}
 		h.Helper()
 	}
 
-	if samePointers(expected, actual) {
+	same, ok := samePointers(expected, actual)
+	if !ok {
+		//fails when the arguments are not pointers
+		return !(Fail(t, "Both arguments must be pointers", msgAndArgs...))
+	}
+
+	if same {
 		return Fail(t, fmt.Sprintf(
 			"Expected and actual point to the same object: %p %#v",
 			expected, expected), msgAndArgs...)
@@ -524,21 +542,23 @@ func NotSame(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}
 	return true
 }
 
-// samePointers compares two generic interface objects and returns whether
-// they point to the same object
-func samePointers(first, second interface{}) bool {
+// samePointers checks if two generic interface objects are pointers of the same
+// type pointing to the same object. It returns two values: same indicating if
+// they are the same type and point to the same object, and ok indicating that
+// both inputs are pointers.
+func samePointers(first, second interface{}) (same bool, ok bool) {
 	firstPtr, secondPtr := reflect.ValueOf(first), reflect.ValueOf(second)
 	if firstPtr.Kind() != reflect.Ptr || secondPtr.Kind() != reflect.Ptr {
-		return false
+		return false, false //not both are pointers
 	}
 
 	firstType, secondType := reflect.TypeOf(first), reflect.TypeOf(second)
 	if firstType != secondType {
-		return false
+		return false, true // both are pointers, but of different types
 	}
 
 	// compare pointer addresses
-	return first == second
+	return first == second, true
 }
 
 // formatUnequalValues takes two values of arbitrary types and returns string
@@ -572,8 +592,8 @@ func truncatingFormat(data interface{}) string {
 	return value
 }
 
-// EqualValues asserts that two objects are equal or convertible to the same types
-// and equal.
+// EqualValues asserts that two objects are equal or convertible to the larger
+// type and equal.
 //
 //	assert.EqualValues(t, uint32(123), int32(123))
 func EqualValues(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool {
@@ -615,21 +635,6 @@ func EqualExportedValues(t TestingT, expected, actual interface{}, msgAndArgs ..
 		return Fail(t, fmt.Sprintf("Types expected to match exactly\n\t%v != %v", aType, bType), msgAndArgs...)
 	}
 
-	if aType.Kind() == reflect.Ptr {
-		aType = aType.Elem()
-	}
-	if bType.Kind() == reflect.Ptr {
-		bType = bType.Elem()
-	}
-
-	if aType.Kind() != reflect.Struct {
-		return Fail(t, fmt.Sprintf("Types expected to both be struct or pointer to struct \n\t%v != %v", aType.Kind(), reflect.Struct), msgAndArgs...)
-	}
-
-	if bType.Kind() != reflect.Struct {
-		return Fail(t, fmt.Sprintf("Types expected to both be struct or pointer to struct \n\t%v != %v", bType.Kind(), reflect.Struct), msgAndArgs...)
-	}
-
 	expected = copyExportedFields(expected)
 	actual = copyExportedFields(actual)
 
@@ -1170,6 +1175,39 @@ func formatListDiff(listA, listB interface{}, extraA, extraB []interface{}) stri
 	return msg.String()
 }
 
+// NotElementsMatch asserts that the specified listA(array, slice...) is NOT equal to specified
+// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements,
+// the number of appearances of each of them in both lists should not match.
+// This is an inverse of ElementsMatch.
+//
+// assert.NotElementsMatch(t, [1, 1, 2, 3], [1, 1, 2, 3]) -> false
+//
+// assert.NotElementsMatch(t, [1, 1, 2, 3], [1, 2, 3]) -> true
+//
+// assert.NotElementsMatch(t, [1, 2, 3], [1, 2, 4]) -> true
+func NotElementsMatch(t TestingT, listA, listB interface{}, msgAndArgs ...interface{}) (ok bool) {
+	if h, ok := t.(tHelper); ok {
+		h.Helper()
+	}
+	if isEmpty(listA) && isEmpty(listB) {
+		return Fail(t, "listA and listB contain the same elements", msgAndArgs)
+	}
+
+	if !isList(t, listA, msgAndArgs...) {
+		return Fail(t, "listA is not a list type", msgAndArgs...)
+	}
+	if !isList(t, listB, msgAndArgs...) {
+		return Fail(t, "listB is not a list type", msgAndArgs...)
+	}
+
+	extraA, extraB := diffLists(listA, listB)
+	if len(extraA) == 0 && len(extraB) == 0 {
+		return Fail(t, "listA and listB contain the same elements", msgAndArgs)
+	}
+
+	return true
+}
+
 // Condition uses a Comparison to assert a complex condition.
 func Condition(t TestingT, comp Comparison, msgAndArgs ...interface{}) bool {
 	if h, ok := t.(tHelper); ok {
@@ -1488,6 +1526,9 @@ func InEpsilon(t TestingT, expected, actual interface{}, epsilon float64, msgAnd
 	if err != nil {
 		return Fail(t, err.Error(), msgAndArgs...)
 	}
+	if math.IsNaN(actualEpsilon) {
+		return Fail(t, "relative error is NaN", msgAndArgs...)
+	}
 	if actualEpsilon > epsilon {
 		return Fail(t, fmt.Sprintf("Relative error is too high: %#v (expected)\n"+
 			"        < %#v (actual)", epsilon, actualEpsilon), msgAndArgs...)
@@ -1611,7 +1652,6 @@ func ErrorContains(t TestingT, theError error, contains string, msgAndArgs ...in
 
 // matchRegexp return true if a specified regexp matches a string.
 func matchRegexp(rx interface{}, str interface{}) bool {
-
 	var r *regexp.Regexp
 	if rr, ok := rx.(*regexp.Regexp); ok {
 		r = rr
@@ -1619,7 +1659,14 @@ func matchRegexp(rx interface{}, str interface{}) bool {
 		r = regexp.MustCompile(fmt.Sprint(rx))
 	}
 
-	return (r.FindStringIndex(fmt.Sprint(str)) != nil)
+	switch v := str.(type) {
+	case []byte:
+		return r.Match(v)
+	case string:
+		return r.MatchString(v)
+	default:
+		return r.MatchString(fmt.Sprint(v))
+	}
 
 }
 
@@ -1872,7 +1919,7 @@ var spewConfigStringerEnabled = spew.ConfigState{
 	MaxDepth:                10,
 }
 
-type tHelper interface {
+type tHelper = interface {
 	Helper()
 }
 
@@ -1911,6 +1958,9 @@ func Eventually(t TestingT, condition func() bool, waitFor time.Duration, tick t
 
 // CollectT implements the TestingT interface and collects all errors.
 type CollectT struct {
+	// A slice of errors. Non-nil slice denotes a failure.
+	// If it's non-nil but len(c.errors) == 0, this is also a failure
+	// obtained by direct c.FailNow() call.
 	errors []error
 }
 
@@ -1919,9 +1969,10 @@ func (c *CollectT) Errorf(format string, args ...interface{}) {
 	c.errors = append(c.errors, fmt.Errorf(format, args...))
 }
 
-// FailNow panics.
-func (*CollectT) FailNow() {
-	panic("Assertion failed")
+// FailNow stops execution by calling runtime.Goexit.
+func (c *CollectT) FailNow() {
+	c.fail()
+	runtime.Goexit()
 }
 
 // Deprecated: That was a method for internal usage that should not have been published. Now just panics.
@@ -1934,6 +1985,16 @@ func (*CollectT) Copy(TestingT) {
 	panic("Copy() is deprecated")
 }
 
+func (c *CollectT) fail() {
+	if !c.failed() {
+		c.errors = []error{} // Make it non-nil to mark a failure.
+	}
+}
+
+func (c *CollectT) failed() bool {
+	return c.errors != nil
+}
+
 // EventuallyWithT asserts that given condition will be met in waitFor time,
 // periodically checking target function each tick. In contrast to Eventually,
 // it supplies a CollectT to the condition function, so that the condition
@@ -1951,14 +2012,14 @@ func (*CollectT) Copy(TestingT) {
 //	assert.EventuallyWithT(t, func(c *assert.CollectT) {
 //		// add assertions as needed; any assertion failure will fail the current tick
 //		assert.True(c, externalValue, "expected 'externalValue' to be true")
-//	}, 1*time.Second, 10*time.Second, "external state has not changed to 'true'; still false")
+//	}, 10*time.Second, 1*time.Second, "external state has not changed to 'true'; still false")
 func EventuallyWithT(t TestingT, condition func(collect *CollectT), waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) bool {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
 	}
 
 	var lastFinishedTickErrs []error
-	ch := make(chan []error, 1)
+	ch := make(chan *CollectT, 1)
 
 	timer := time.NewTimer(waitFor)
 	defer timer.Stop()
@@ -1978,16 +2039,16 @@ func EventuallyWithT(t TestingT, condition func(collect *CollectT), waitFor time
 			go func() {
 				collect := new(CollectT)
 				defer func() {
-					ch <- collect.errors
+					ch <- collect
 				}()
 				condition(collect)
 			}()
-		case errs := <-ch:
-			if len(errs) == 0 {
+		case collect := <-ch:
+			if !collect.failed() {
 				return true
 			}
 			// Keep the errors from the last ended condition, so that they can be copied to t if timeout is reached.
-			lastFinishedTickErrs = errs
+			lastFinishedTickErrs = collect.errors
 			tick = ticker.C
 		}
 	}
@@ -2049,7 +2110,7 @@ func ErrorIs(t TestingT, err, target error, msgAndArgs ...interface{}) bool {
 	), msgAndArgs...)
 }
 
-// NotErrorIs asserts that at none of the errors in err's chain matches target.
+// NotErrorIs asserts that none of the errors in err's chain matches target.
 // This is a wrapper for errors.Is.
 func NotErrorIs(t TestingT, err, target error, msgAndArgs ...interface{}) bool {
 	if h, ok := t.(tHelper); ok {
@@ -2090,6 +2151,24 @@ func ErrorAs(t TestingT, err error, target interface{}, msgAndArgs ...interface{
 	), msgAndArgs...)
 }
 
+// NotErrorAs asserts that none of the errors in err's chain matches target,
+// but if so, sets target to that error value.
+func NotErrorAs(t TestingT, err error, target interface{}, msgAndArgs ...interface{}) bool {
+	if h, ok := t.(tHelper); ok {
+		h.Helper()
+	}
+	if !errors.As(err, target) {
+		return true
+	}
+
+	chain := buildErrorChainString(err)
+
+	return Fail(t, fmt.Sprintf("Target error should not be in err chain:\n"+
+		"found: %q\n"+
+		"in chain: %s", target, chain,
+	), msgAndArgs...)
+}
+
 func buildErrorChainString(err error) string {
 	if err == nil {
 		return ""
diff --git a/test/performance/vendor/github.com/stretchr/testify/assert/yaml/yaml_custom.go b/test/performance/vendor/github.com/stretchr/testify/assert/yaml/yaml_custom.go
new file mode 100644
index 0000000000..baa0cc7d7f
--- /dev/null
+++ b/test/performance/vendor/github.com/stretchr/testify/assert/yaml/yaml_custom.go
@@ -0,0 +1,25 @@
+//go:build testify_yaml_custom && !testify_yaml_fail && !testify_yaml_default
+// +build testify_yaml_custom,!testify_yaml_fail,!testify_yaml_default
+
+// Package yaml is an implementation of YAML functions that calls a pluggable implementation.
+//
+// This implementation is selected with the testify_yaml_custom build tag.
+//
+//	go test -tags testify_yaml_custom
+//
+// This implementation can be used at build time to replace the default implementation
+// to avoid linking with [gopkg.in/yaml.v3].
+//
+// In your test package:
+//
+//		import assertYaml "github.com/stretchr/testify/assert/yaml"
+//
+//		func init() {
+//			assertYaml.Unmarshal = func (in []byte, out interface{}) error {
+//				// ...
+//	     			return nil
+//			}
+//		}
+package yaml
+
+var Unmarshal func(in []byte, out interface{}) error
diff --git a/test/performance/vendor/github.com/stretchr/testify/assert/yaml/yaml_default.go b/test/performance/vendor/github.com/stretchr/testify/assert/yaml/yaml_default.go
new file mode 100644
index 0000000000..b83c6cf64c
--- /dev/null
+++ b/test/performance/vendor/github.com/stretchr/testify/assert/yaml/yaml_default.go
@@ -0,0 +1,37 @@
+//go:build !testify_yaml_fail && !testify_yaml_custom
+// +build !testify_yaml_fail,!testify_yaml_custom
+
+// Package yaml is just an indirection to handle YAML deserialization.
+//
+// This package is just an indirection that allows the builder to override the
+// indirection with an alternative implementation of this package that uses
+// another implementation of YAML deserialization. This allows to not either not
+// use YAML deserialization at all, or to use another implementation than
+// [gopkg.in/yaml.v3] (for example for license compatibility reasons, see [PR #1120]).
+//
+// Alternative implementations are selected using build tags:
+//
+//   - testify_yaml_fail: [Unmarshal] always fails with an error
+//   - testify_yaml_custom: [Unmarshal] is a variable. Caller must initialize it
+//     before calling any of [github.com/stretchr/testify/assert.YAMLEq] or
+//     [github.com/stretchr/testify/assert.YAMLEqf].
+//
+// Usage:
+//
+//	go test -tags testify_yaml_fail
+//
+// You can check with "go list" which implementation is linked:
+//
+//	go list -f '{{.Imports}}' github.com/stretchr/testify/assert/yaml
+//	go list -tags testify_yaml_fail -f '{{.Imports}}' github.com/stretchr/testify/assert/yaml
+//	go list -tags testify_yaml_custom -f '{{.Imports}}' github.com/stretchr/testify/assert/yaml
+//
+// [PR #1120]: https://github.com/stretchr/testify/pull/1120
+package yaml
+
+import goyaml "gopkg.in/yaml.v3"
+
+// Unmarshal is just a wrapper of [gopkg.in/yaml.v3.Unmarshal].
+func Unmarshal(in []byte, out interface{}) error {
+	return goyaml.Unmarshal(in, out)
+}
diff --git a/test/performance/vendor/github.com/stretchr/testify/assert/yaml/yaml_fail.go b/test/performance/vendor/github.com/stretchr/testify/assert/yaml/yaml_fail.go
new file mode 100644
index 0000000000..e78f7dfe69
--- /dev/null
+++ b/test/performance/vendor/github.com/stretchr/testify/assert/yaml/yaml_fail.go
@@ -0,0 +1,18 @@
+//go:build testify_yaml_fail && !testify_yaml_custom && !testify_yaml_default
+// +build testify_yaml_fail,!testify_yaml_custom,!testify_yaml_default
+
+// Package yaml is an implementation of YAML functions that always fail.
+//
+// This implementation can be used at build time to replace the default implementation
+// to avoid linking with [gopkg.in/yaml.v3]:
+//
+//	go test -tags testify_yaml_fail
+package yaml
+
+import "errors"
+
+var errNotImplemented = errors.New("YAML functions are not available (see https://pkg.go.dev/github.com/stretchr/testify/assert/yaml)")
+
+func Unmarshal([]byte, interface{}) error {
+	return errNotImplemented
+}
diff --git a/test/performance/vendor/github.com/stretchr/testify/mock/mock.go b/test/performance/vendor/github.com/stretchr/testify/mock/mock.go
index 213bde2ea6..eb5682df97 100644
--- a/test/performance/vendor/github.com/stretchr/testify/mock/mock.go
+++ b/test/performance/vendor/github.com/stretchr/testify/mock/mock.go
@@ -80,12 +80,12 @@ type Call struct {
 	requires []*Call
 }
 
-func newCall(parent *Mock, methodName string, callerInfo []string, methodArguments ...interface{}) *Call {
+func newCall(parent *Mock, methodName string, callerInfo []string, methodArguments Arguments, returnArguments Arguments) *Call {
 	return &Call{
 		Parent:          parent,
 		Method:          methodName,
 		Arguments:       methodArguments,
-		ReturnArguments: make([]interface{}, 0),
+		ReturnArguments: returnArguments,
 		callerInfo:      callerInfo,
 		Repeatability:   0,
 		WaitFor:         nil,
@@ -256,7 +256,7 @@ func (c *Call) Unset() *Call {
 // calls have been called as expected. The referenced calls may be from the
 // same mock instance and/or other mock instances.
 //
-//	Mock.On("Do").Return(nil).Notbefore(
+//	Mock.On("Do").Return(nil).NotBefore(
 //	    Mock.On("Init").Return(nil)
 //	)
 func (c *Call) NotBefore(calls ...*Call) *Call {
@@ -273,6 +273,20 @@ func (c *Call) NotBefore(calls ...*Call) *Call {
 	return c
 }
 
+// InOrder defines the order in which the calls should be made
+//
+//	For example:
+//
+//	InOrder(
+//		Mock.On("init").Return(nil),
+//		Mock.On("Do").Return(nil),
+//	)
+func InOrder(calls ...*Call) {
+	for i := 1; i < len(calls); i++ {
+		calls[i].NotBefore(calls[i-1])
+	}
+}
+
 // Mock is the workhorse used to track activity on another object.
 // For an example of its usage, refer to the "Example Usage" section at the top
 // of this document.
@@ -351,7 +365,8 @@ func (m *Mock) On(methodName string, arguments ...interface{}) *Call {
 
 	m.mutex.Lock()
 	defer m.mutex.Unlock()
-	c := newCall(m, methodName, assert.CallerInfo(), arguments...)
+
+	c := newCall(m, methodName, assert.CallerInfo(), arguments, make([]interface{}, 0))
 	m.ExpectedCalls = append(m.ExpectedCalls, c)
 	return c
 }
@@ -491,11 +506,12 @@ func (m *Mock) MethodCalled(methodName string, arguments ...interface{}) Argumen
 		m.mutex.Unlock()
 
 		if closestCall != nil {
-			m.fail("\n\nmock: Unexpected Method Call\n-----------------------------\n\n%s\n\nThe closest call I have is: \n\n%s\n\n%s\nDiff: %s",
+			m.fail("\n\nmock: Unexpected Method Call\n-----------------------------\n\n%s\n\nThe closest call I have is: \n\n%s\n\n%s\nDiff: %s\nat: %s\n",
 				callString(methodName, arguments, true),
 				callString(methodName, closestCall.Arguments, true),
 				diffArguments(closestCall.Arguments, arguments),
 				strings.TrimSpace(mismatch),
+				assert.CallerInfo(),
 			)
 		} else {
 			m.fail("\nassert: mock: I don't know what to return because the method call was unexpected.\n\tEither do Mock.On(\"%s\").Return(...) first, or remove the %s() call.\n\tThis method was unexpected:\n\t\t%s\n\tat: %s", methodName, methodName, callString(methodName, arguments, true), assert.CallerInfo())
@@ -529,7 +545,7 @@ func (m *Mock) MethodCalled(methodName string, arguments ...interface{}) Argumen
 	call.totalCalls++
 
 	// add the call
-	m.Calls = append(m.Calls, *newCall(m, methodName, assert.CallerInfo(), arguments...))
+	m.Calls = append(m.Calls, *newCall(m, methodName, assert.CallerInfo(), arguments, call.ReturnArguments))
 	m.mutex.Unlock()
 
 	// block if specified
@@ -764,9 +780,17 @@ const (
 )
 
 // AnythingOfTypeArgument contains the type of an argument
-// for use when type checking.  Used in Diff and Assert.
+// for use when type checking.  Used in [Arguments.Diff] and [Arguments.Assert].
 //
-// Deprecated: this is an implementation detail that must not be used. Use [AnythingOfType] instead.
+// Deprecated: this is an implementation detail that must not be used. Use the [AnythingOfType] constructor instead, example:
+//
+//	m.On("Do", mock.AnythingOfType("string"))
+//
+// All explicit type declarations can be replaced with interface{} as is expected by [Mock.On], example:
+//
+//	func anyString interface{} {
+//		return mock.AnythingOfType("string")
+//	}
 type AnythingOfTypeArgument = anythingOfTypeArgument
 
 // anythingOfTypeArgument is a string that contains the type of an argument
@@ -780,53 +804,54 @@ type anythingOfTypeArgument string
 //
 // For example:
 //
-//	Assert(t, AnythingOfType("string"), AnythingOfType("int"))
+//	args.Assert(t, AnythingOfType("string"), AnythingOfType("int"))
 func AnythingOfType(t string) AnythingOfTypeArgument {
 	return anythingOfTypeArgument(t)
 }
 
 // IsTypeArgument is a struct that contains the type of an argument
-// for use when type checking.  This is an alternative to AnythingOfType.
-// Used in Diff and Assert.
+// for use when type checking.  This is an alternative to [AnythingOfType].
+// Used in [Arguments.Diff] and [Arguments.Assert].
 type IsTypeArgument struct {
 	t reflect.Type
 }
 
 // IsType returns an IsTypeArgument object containing the type to check for.
 // You can provide a zero-value of the type to check.  This is an
-// alternative to AnythingOfType.  Used in Diff and Assert.
+// alternative to [AnythingOfType].  Used in [Arguments.Diff] and [Arguments.Assert].
 //
 // For example:
-// Assert(t, IsType(""), IsType(0))
+//
+//	args.Assert(t, IsType(""), IsType(0))
 func IsType(t interface{}) *IsTypeArgument {
 	return &IsTypeArgument{t: reflect.TypeOf(t)}
 }
 
-// FunctionalOptionsArgument is a struct that contains the type and value of an functional option argument
-// for use when type checking.
+// FunctionalOptionsArgument contains a list of functional options arguments
+// expected for use when matching a list of arguments.
 type FunctionalOptionsArgument struct {
-	value interface{}
+	values []interface{}
 }
 
 // String returns the string representation of FunctionalOptionsArgument
 func (f *FunctionalOptionsArgument) String() string {
 	var name string
-	tValue := reflect.ValueOf(f.value)
-	if tValue.Len() > 0 {
-		name = "[]" + reflect.TypeOf(tValue.Index(0).Interface()).String()
+	if len(f.values) > 0 {
+		name = "[]" + reflect.TypeOf(f.values[0]).String()
 	}
 
-	return strings.Replace(fmt.Sprintf("%#v", f.value), "[]interface {}", name, 1)
+	return strings.Replace(fmt.Sprintf("%#v", f.values), "[]interface {}", name, 1)
 }
 
-// FunctionalOptions returns an FunctionalOptionsArgument object containing the functional option type
-// and the values to check of
+// FunctionalOptions returns an [FunctionalOptionsArgument] object containing
+// the expected functional-options to check for.
 //
 // For example:
-// Assert(t, FunctionalOptions("[]foo.FunctionalOption", foo.Opt1(), foo.Opt2()))
-func FunctionalOptions(value ...interface{}) *FunctionalOptionsArgument {
+//
+//	args.Assert(t, FunctionalOptions(foo.Opt1("strValue"), foo.Opt2(613)))
+func FunctionalOptions(values ...interface{}) *FunctionalOptionsArgument {
 	return &FunctionalOptionsArgument{
-		value: value,
+		values: values,
 	}
 }
 
@@ -873,10 +898,11 @@ func (f argumentMatcher) String() string {
 // and false otherwise.
 //
 // Example:
-// m.On("Do", MatchedBy(func(req *http.Request) bool { return req.Host == "example.com" }))
 //
-// |fn|, must be a function accepting a single argument (of the expected type)
-// which returns a bool. If |fn| doesn't match the required signature,
+//	m.On("Do", MatchedBy(func(req *http.Request) bool { return req.Host == "example.com" }))
+//
+// fn must be a function accepting a single argument (of the expected type)
+// which returns a bool. If fn doesn't match the required signature,
 // MatchedBy() panics.
 func MatchedBy(fn interface{}) argumentMatcher {
 	fnType := reflect.TypeOf(fn)
@@ -979,20 +1005,17 @@ func (args Arguments) Diff(objects []interface{}) (string, int) {
 					output = fmt.Sprintf("%s\t%d: FAIL:  type %s != type %s - %s\n", output, i, expected.t.Name(), actualT.Name(), actualFmt)
 				}
 			case *FunctionalOptionsArgument:
-				t := expected.value
-
 				var name string
-				tValue := reflect.ValueOf(t)
-				if tValue.Len() > 0 {
-					name = "[]" + reflect.TypeOf(tValue.Index(0).Interface()).String()
+				if len(expected.values) > 0 {
+					name = "[]" + reflect.TypeOf(expected.values[0]).String()
 				}
 
-				tName := reflect.TypeOf(t).Name()
-				if name != reflect.TypeOf(actual).String() && tValue.Len() != 0 {
+				const tName = "[]interface{}"
+				if name != reflect.TypeOf(actual).String() && len(expected.values) != 0 {
 					differences++
 					output = fmt.Sprintf("%s\t%d: FAIL:  type %s != type %s - %s\n", output, i, tName, reflect.TypeOf(actual).Name(), actualFmt)
 				} else {
-					if ef, af := assertOpts(t, actual); ef == "" && af == "" {
+					if ef, af := assertOpts(expected.values, actual); ef == "" && af == "" {
 						// match
 						output = fmt.Sprintf("%s\t%d: PASS:  %s == %s\n", output, i, tName, tName)
 					} else {
@@ -1092,7 +1115,7 @@ func (args Arguments) Error(index int) error {
 		return nil
 	}
 	if s, ok = obj.(error); !ok {
-		panic(fmt.Sprintf("assert: arguments: Error(%d) failed because object wasn't correct type: %v", index, args.Get(index)))
+		panic(fmt.Sprintf("assert: arguments: Error(%d) failed because object wasn't correct type: %v", index, obj))
 	}
 	return s
 }
@@ -1181,32 +1204,38 @@ type tHelper interface {
 func assertOpts(expected, actual interface{}) (expectedFmt, actualFmt string) {
 	expectedOpts := reflect.ValueOf(expected)
 	actualOpts := reflect.ValueOf(actual)
+
+	var expectedFuncs []*runtime.Func
 	var expectedNames []string
 	for i := 0; i < expectedOpts.Len(); i++ {
-		expectedNames = append(expectedNames, funcName(expectedOpts.Index(i).Interface()))
+		f := runtimeFunc(expectedOpts.Index(i).Interface())
+		expectedFuncs = append(expectedFuncs, f)
+		expectedNames = append(expectedNames, funcName(f))
 	}
+	var actualFuncs []*runtime.Func
 	var actualNames []string
 	for i := 0; i < actualOpts.Len(); i++ {
-		actualNames = append(actualNames, funcName(actualOpts.Index(i).Interface()))
+		f := runtimeFunc(actualOpts.Index(i).Interface())
+		actualFuncs = append(actualFuncs, f)
+		actualNames = append(actualNames, funcName(f))
 	}
-	if !assert.ObjectsAreEqual(expectedNames, actualNames) {
+
+	if expectedOpts.Len() != actualOpts.Len() {
 		expectedFmt = fmt.Sprintf("%v", expectedNames)
 		actualFmt = fmt.Sprintf("%v", actualNames)
 		return
 	}
 
 	for i := 0; i < expectedOpts.Len(); i++ {
-		expectedOpt := expectedOpts.Index(i).Interface()
-		actualOpt := actualOpts.Index(i).Interface()
-
-		expectedFunc := expectedNames[i]
-		actualFunc := actualNames[i]
-		if expectedFunc != actualFunc {
-			expectedFmt = expectedFunc
-			actualFmt = actualFunc
+		if !isFuncSame(expectedFuncs[i], actualFuncs[i]) {
+			expectedFmt = expectedNames[i]
+			actualFmt = actualNames[i]
 			return
 		}
 
+		expectedOpt := expectedOpts.Index(i).Interface()
+		actualOpt := actualOpts.Index(i).Interface()
+
 		ot := reflect.TypeOf(expectedOpt)
 		var expectedValues []reflect.Value
 		var actualValues []reflect.Value
@@ -1224,9 +1253,9 @@ func assertOpts(expected, actual interface{}) (expectedFmt, actualFmt string) {
 		reflect.ValueOf(actualOpt).Call(actualValues)
 
 		for i := 0; i < ot.NumIn(); i++ {
-			if !assert.ObjectsAreEqual(expectedValues[i].Interface(), actualValues[i].Interface()) {
-				expectedFmt = fmt.Sprintf("%s %+v", expectedNames[i], expectedValues[i].Interface())
-				actualFmt = fmt.Sprintf("%s %+v", expectedNames[i], actualValues[i].Interface())
+			if expectedArg, actualArg := expectedValues[i].Interface(), actualValues[i].Interface(); !assert.ObjectsAreEqual(expectedArg, actualArg) {
+				expectedFmt = fmt.Sprintf("%s(%T) -> %#v", expectedNames[i], expectedArg, expectedArg)
+				actualFmt = fmt.Sprintf("%s(%T) -> %#v", expectedNames[i], actualArg, actualArg)
 				return
 			}
 		}
@@ -1235,7 +1264,25 @@ func assertOpts(expected, actual interface{}) (expectedFmt, actualFmt string) {
 	return "", ""
 }
 
-func funcName(opt interface{}) string {
-	n := runtime.FuncForPC(reflect.ValueOf(opt).Pointer()).Name()
-	return strings.TrimSuffix(path.Base(n), path.Ext(n))
+func runtimeFunc(opt interface{}) *runtime.Func {
+	return runtime.FuncForPC(reflect.ValueOf(opt).Pointer())
+}
+
+func funcName(f *runtime.Func) string {
+	name := f.Name()
+	trimmed := strings.TrimSuffix(path.Base(name), path.Ext(name))
+	splitted := strings.Split(trimmed, ".")
+
+	if len(splitted) == 0 {
+		return trimmed
+	}
+
+	return splitted[len(splitted)-1]
+}
+
+func isFuncSame(f1, f2 *runtime.Func) bool {
+	f1File, f1Loc := f1.FileLine(f1.Entry())
+	f2File, f2Loc := f2.FileLine(f2.Entry())
+
+	return f1File == f2File && f1Loc == f2Loc
 }
diff --git a/test/performance/vendor/github.com/stretchr/testify/require/require.go b/test/performance/vendor/github.com/stretchr/testify/require/require.go
index 506a82f807..d8921950d7 100644
--- a/test/performance/vendor/github.com/stretchr/testify/require/require.go
+++ b/test/performance/vendor/github.com/stretchr/testify/require/require.go
@@ -34,9 +34,9 @@ func Conditionf(t TestingT, comp assert.Comparison, msg string, args ...interfac
 // Contains asserts that the specified string, list(array, slice...) or map contains the
 // specified substring or element.
 //
-//	assert.Contains(t, "Hello World", "World")
-//	assert.Contains(t, ["Hello", "World"], "World")
-//	assert.Contains(t, {"Hello": "World"}, "Hello")
+//	require.Contains(t, "Hello World", "World")
+//	require.Contains(t, ["Hello", "World"], "World")
+//	require.Contains(t, {"Hello": "World"}, "Hello")
 func Contains(t TestingT, s interface{}, contains interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -50,9 +50,9 @@ func Contains(t TestingT, s interface{}, contains interface{}, msgAndArgs ...int
 // Containsf asserts that the specified string, list(array, slice...) or map contains the
 // specified substring or element.
 //
-//	assert.Containsf(t, "Hello World", "World", "error message %s", "formatted")
-//	assert.Containsf(t, ["Hello", "World"], "World", "error message %s", "formatted")
-//	assert.Containsf(t, {"Hello": "World"}, "Hello", "error message %s", "formatted")
+//	require.Containsf(t, "Hello World", "World", "error message %s", "formatted")
+//	require.Containsf(t, ["Hello", "World"], "World", "error message %s", "formatted")
+//	require.Containsf(t, {"Hello": "World"}, "Hello", "error message %s", "formatted")
 func Containsf(t TestingT, s interface{}, contains interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -91,7 +91,7 @@ func DirExistsf(t TestingT, path string, msg string, args ...interface{}) {
 // listB(array, slice...) ignoring the order of the elements. If there are duplicate elements,
 // the number of appearances of each of them in both lists should match.
 //
-// assert.ElementsMatch(t, [1, 3, 2, 3], [1, 3, 3, 2])
+// require.ElementsMatch(t, [1, 3, 2, 3], [1, 3, 3, 2])
 func ElementsMatch(t TestingT, listA interface{}, listB interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -106,7 +106,7 @@ func ElementsMatch(t TestingT, listA interface{}, listB interface{}, msgAndArgs
 // listB(array, slice...) ignoring the order of the elements. If there are duplicate elements,
 // the number of appearances of each of them in both lists should match.
 //
-// assert.ElementsMatchf(t, [1, 3, 2, 3], [1, 3, 3, 2], "error message %s", "formatted")
+// require.ElementsMatchf(t, [1, 3, 2, 3], [1, 3, 3, 2], "error message %s", "formatted")
 func ElementsMatchf(t TestingT, listA interface{}, listB interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -120,7 +120,7 @@ func ElementsMatchf(t TestingT, listA interface{}, listB interface{}, msg string
 // Empty asserts that the specified object is empty.  I.e. nil, "", false, 0 or either
 // a slice or a channel with len == 0.
 //
-//	assert.Empty(t, obj)
+//	require.Empty(t, obj)
 func Empty(t TestingT, object interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -134,7 +134,7 @@ func Empty(t TestingT, object interface{}, msgAndArgs ...interface{}) {
 // Emptyf asserts that the specified object is empty.  I.e. nil, "", false, 0 or either
 // a slice or a channel with len == 0.
 //
-//	assert.Emptyf(t, obj, "error message %s", "formatted")
+//	require.Emptyf(t, obj, "error message %s", "formatted")
 func Emptyf(t TestingT, object interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -147,7 +147,7 @@ func Emptyf(t TestingT, object interface{}, msg string, args ...interface{}) {
 
 // Equal asserts that two objects are equal.
 //
-//	assert.Equal(t, 123, 123)
+//	require.Equal(t, 123, 123)
 //
 // Pointer variable equality is determined based on the equality of the
 // referenced values (as opposed to the memory addresses). Function equality
@@ -166,7 +166,7 @@ func Equal(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...i
 // and that it is equal to the provided error.
 //
 //	actualObj, err := SomeFunction()
-//	assert.EqualError(t, err,  expectedErrorString)
+//	require.EqualError(t, err,  expectedErrorString)
 func EqualError(t TestingT, theError error, errString string, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -181,7 +181,7 @@ func EqualError(t TestingT, theError error, errString string, msgAndArgs ...inte
 // and that it is equal to the provided error.
 //
 //	actualObj, err := SomeFunction()
-//	assert.EqualErrorf(t, err,  expectedErrorString, "error message %s", "formatted")
+//	require.EqualErrorf(t, err,  expectedErrorString, "error message %s", "formatted")
 func EqualErrorf(t TestingT, theError error, errString string, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -200,8 +200,8 @@ func EqualErrorf(t TestingT, theError error, errString string, msg string, args
 //		Exported     	int
 //		notExported   	int
 //	 }
-//	 assert.EqualExportedValues(t, S{1, 2}, S{1, 3}) => true
-//	 assert.EqualExportedValues(t, S{1, 2}, S{2, 3}) => false
+//	 require.EqualExportedValues(t, S{1, 2}, S{1, 3}) => true
+//	 require.EqualExportedValues(t, S{1, 2}, S{2, 3}) => false
 func EqualExportedValues(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -220,8 +220,8 @@ func EqualExportedValues(t TestingT, expected interface{}, actual interface{}, m
 //		Exported     	int
 //		notExported   	int
 //	 }
-//	 assert.EqualExportedValuesf(t, S{1, 2}, S{1, 3}, "error message %s", "formatted") => true
-//	 assert.EqualExportedValuesf(t, S{1, 2}, S{2, 3}, "error message %s", "formatted") => false
+//	 require.EqualExportedValuesf(t, S{1, 2}, S{1, 3}, "error message %s", "formatted") => true
+//	 require.EqualExportedValuesf(t, S{1, 2}, S{2, 3}, "error message %s", "formatted") => false
 func EqualExportedValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -232,10 +232,10 @@ func EqualExportedValuesf(t TestingT, expected interface{}, actual interface{},
 	t.FailNow()
 }
 
-// EqualValues asserts that two objects are equal or convertible to the same types
-// and equal.
+// EqualValues asserts that two objects are equal or convertible to the larger
+// type and equal.
 //
-//	assert.EqualValues(t, uint32(123), int32(123))
+//	require.EqualValues(t, uint32(123), int32(123))
 func EqualValues(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -246,10 +246,10 @@ func EqualValues(t TestingT, expected interface{}, actual interface{}, msgAndArg
 	t.FailNow()
 }
 
-// EqualValuesf asserts that two objects are equal or convertible to the same types
-// and equal.
+// EqualValuesf asserts that two objects are equal or convertible to the larger
+// type and equal.
 //
-//	assert.EqualValuesf(t, uint32(123), int32(123), "error message %s", "formatted")
+//	require.EqualValuesf(t, uint32(123), int32(123), "error message %s", "formatted")
 func EqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -262,7 +262,7 @@ func EqualValuesf(t TestingT, expected interface{}, actual interface{}, msg stri
 
 // Equalf asserts that two objects are equal.
 //
-//	assert.Equalf(t, 123, 123, "error message %s", "formatted")
+//	require.Equalf(t, 123, 123, "error message %s", "formatted")
 //
 // Pointer variable equality is determined based on the equality of the
 // referenced values (as opposed to the memory addresses). Function equality
@@ -280,8 +280,8 @@ func Equalf(t TestingT, expected interface{}, actual interface{}, msg string, ar
 // Error asserts that a function returned an error (i.e. not `nil`).
 //
 //	  actualObj, err := SomeFunction()
-//	  if assert.Error(t, err) {
-//		   assert.Equal(t, expectedError, err)
+//	  if require.Error(t, err) {
+//		   require.Equal(t, expectedError, err)
 //	  }
 func Error(t TestingT, err error, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
@@ -321,7 +321,7 @@ func ErrorAsf(t TestingT, err error, target interface{}, msg string, args ...int
 // and that the error contains the specified substring.
 //
 //	actualObj, err := SomeFunction()
-//	assert.ErrorContains(t, err,  expectedErrorSubString)
+//	require.ErrorContains(t, err,  expectedErrorSubString)
 func ErrorContains(t TestingT, theError error, contains string, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -336,7 +336,7 @@ func ErrorContains(t TestingT, theError error, contains string, msgAndArgs ...in
 // and that the error contains the specified substring.
 //
 //	actualObj, err := SomeFunction()
-//	assert.ErrorContainsf(t, err,  expectedErrorSubString, "error message %s", "formatted")
+//	require.ErrorContainsf(t, err,  expectedErrorSubString, "error message %s", "formatted")
 func ErrorContainsf(t TestingT, theError error, contains string, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -374,8 +374,8 @@ func ErrorIsf(t TestingT, err error, target error, msg string, args ...interface
 // Errorf asserts that a function returned an error (i.e. not `nil`).
 //
 //	  actualObj, err := SomeFunction()
-//	  if assert.Errorf(t, err, "error message %s", "formatted") {
-//		   assert.Equal(t, expectedErrorf, err)
+//	  if require.Errorf(t, err, "error message %s", "formatted") {
+//		   require.Equal(t, expectedErrorf, err)
 //	  }
 func Errorf(t TestingT, err error, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
@@ -390,7 +390,7 @@ func Errorf(t TestingT, err error, msg string, args ...interface{}) {
 // Eventually asserts that given condition will be met in waitFor time,
 // periodically checking target function each tick.
 //
-//	assert.Eventually(t, func() bool { return true; }, time.Second, 10*time.Millisecond)
+//	require.Eventually(t, func() bool { return true; }, time.Second, 10*time.Millisecond)
 func Eventually(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -415,10 +415,10 @@ func Eventually(t TestingT, condition func() bool, waitFor time.Duration, tick t
 //		time.Sleep(8*time.Second)
 //		externalValue = true
 //	}()
-//	assert.EventuallyWithT(t, func(c *assert.CollectT) {
+//	require.EventuallyWithT(t, func(c *require.CollectT) {
 //		// add assertions as needed; any assertion failure will fail the current tick
-//		assert.True(c, externalValue, "expected 'externalValue' to be true")
-//	}, 1*time.Second, 10*time.Second, "external state has not changed to 'true'; still false")
+//		require.True(c, externalValue, "expected 'externalValue' to be true")
+//	}, 10*time.Second, 1*time.Second, "external state has not changed to 'true'; still false")
 func EventuallyWithT(t TestingT, condition func(collect *assert.CollectT), waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -443,10 +443,10 @@ func EventuallyWithT(t TestingT, condition func(collect *assert.CollectT), waitF
 //		time.Sleep(8*time.Second)
 //		externalValue = true
 //	}()
-//	assert.EventuallyWithTf(t, func(c *assert.CollectT, "error message %s", "formatted") {
+//	require.EventuallyWithTf(t, func(c *require.CollectT, "error message %s", "formatted") {
 //		// add assertions as needed; any assertion failure will fail the current tick
-//		assert.True(c, externalValue, "expected 'externalValue' to be true")
-//	}, 1*time.Second, 10*time.Second, "external state has not changed to 'true'; still false")
+//		require.True(c, externalValue, "expected 'externalValue' to be true")
+//	}, 10*time.Second, 1*time.Second, "external state has not changed to 'true'; still false")
 func EventuallyWithTf(t TestingT, condition func(collect *assert.CollectT), waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -460,7 +460,7 @@ func EventuallyWithTf(t TestingT, condition func(collect *assert.CollectT), wait
 // Eventuallyf asserts that given condition will be met in waitFor time,
 // periodically checking target function each tick.
 //
-//	assert.Eventuallyf(t, func() bool { return true; }, time.Second, 10*time.Millisecond, "error message %s", "formatted")
+//	require.Eventuallyf(t, func() bool { return true; }, time.Second, 10*time.Millisecond, "error message %s", "formatted")
 func Eventuallyf(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -473,7 +473,7 @@ func Eventuallyf(t TestingT, condition func() bool, waitFor time.Duration, tick
 
 // Exactly asserts that two objects are equal in value and type.
 //
-//	assert.Exactly(t, int32(123), int64(123))
+//	require.Exactly(t, int32(123), int64(123))
 func Exactly(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -486,7 +486,7 @@ func Exactly(t TestingT, expected interface{}, actual interface{}, msgAndArgs ..
 
 // Exactlyf asserts that two objects are equal in value and type.
 //
-//	assert.Exactlyf(t, int32(123), int64(123), "error message %s", "formatted")
+//	require.Exactlyf(t, int32(123), int64(123), "error message %s", "formatted")
 func Exactlyf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -543,7 +543,7 @@ func Failf(t TestingT, failureMessage string, msg string, args ...interface{}) {
 
 // False asserts that the specified value is false.
 //
-//	assert.False(t, myBool)
+//	require.False(t, myBool)
 func False(t TestingT, value bool, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -556,7 +556,7 @@ func False(t TestingT, value bool, msgAndArgs ...interface{}) {
 
 // Falsef asserts that the specified value is false.
 //
-//	assert.Falsef(t, myBool, "error message %s", "formatted")
+//	require.Falsef(t, myBool, "error message %s", "formatted")
 func Falsef(t TestingT, value bool, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -593,9 +593,9 @@ func FileExistsf(t TestingT, path string, msg string, args ...interface{}) {
 
 // Greater asserts that the first element is greater than the second
 //
-//	assert.Greater(t, 2, 1)
-//	assert.Greater(t, float64(2), float64(1))
-//	assert.Greater(t, "b", "a")
+//	require.Greater(t, 2, 1)
+//	require.Greater(t, float64(2), float64(1))
+//	require.Greater(t, "b", "a")
 func Greater(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -608,10 +608,10 @@ func Greater(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface
 
 // GreaterOrEqual asserts that the first element is greater than or equal to the second
 //
-//	assert.GreaterOrEqual(t, 2, 1)
-//	assert.GreaterOrEqual(t, 2, 2)
-//	assert.GreaterOrEqual(t, "b", "a")
-//	assert.GreaterOrEqual(t, "b", "b")
+//	require.GreaterOrEqual(t, 2, 1)
+//	require.GreaterOrEqual(t, 2, 2)
+//	require.GreaterOrEqual(t, "b", "a")
+//	require.GreaterOrEqual(t, "b", "b")
 func GreaterOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -624,10 +624,10 @@ func GreaterOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...in
 
 // GreaterOrEqualf asserts that the first element is greater than or equal to the second
 //
-//	assert.GreaterOrEqualf(t, 2, 1, "error message %s", "formatted")
-//	assert.GreaterOrEqualf(t, 2, 2, "error message %s", "formatted")
-//	assert.GreaterOrEqualf(t, "b", "a", "error message %s", "formatted")
-//	assert.GreaterOrEqualf(t, "b", "b", "error message %s", "formatted")
+//	require.GreaterOrEqualf(t, 2, 1, "error message %s", "formatted")
+//	require.GreaterOrEqualf(t, 2, 2, "error message %s", "formatted")
+//	require.GreaterOrEqualf(t, "b", "a", "error message %s", "formatted")
+//	require.GreaterOrEqualf(t, "b", "b", "error message %s", "formatted")
 func GreaterOrEqualf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -640,9 +640,9 @@ func GreaterOrEqualf(t TestingT, e1 interface{}, e2 interface{}, msg string, arg
 
 // Greaterf asserts that the first element is greater than the second
 //
-//	assert.Greaterf(t, 2, 1, "error message %s", "formatted")
-//	assert.Greaterf(t, float64(2), float64(1), "error message %s", "formatted")
-//	assert.Greaterf(t, "b", "a", "error message %s", "formatted")
+//	require.Greaterf(t, 2, 1, "error message %s", "formatted")
+//	require.Greaterf(t, float64(2), float64(1), "error message %s", "formatted")
+//	require.Greaterf(t, "b", "a", "error message %s", "formatted")
 func Greaterf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -656,7 +656,7 @@ func Greaterf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...in
 // HTTPBodyContains asserts that a specified handler returns a
 // body that contains a string.
 //
-//	assert.HTTPBodyContains(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky")
+//	require.HTTPBodyContains(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky")
 //
 // Returns whether the assertion was successful (true) or not (false).
 func HTTPBodyContains(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) {
@@ -672,7 +672,7 @@ func HTTPBodyContains(t TestingT, handler http.HandlerFunc, method string, url s
 // HTTPBodyContainsf asserts that a specified handler returns a
 // body that contains a string.
 //
-//	assert.HTTPBodyContainsf(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted")
+//	require.HTTPBodyContainsf(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted")
 //
 // Returns whether the assertion was successful (true) or not (false).
 func HTTPBodyContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) {
@@ -688,7 +688,7 @@ func HTTPBodyContainsf(t TestingT, handler http.HandlerFunc, method string, url
 // HTTPBodyNotContains asserts that a specified handler returns a
 // body that does not contain a string.
 //
-//	assert.HTTPBodyNotContains(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky")
+//	require.HTTPBodyNotContains(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky")
 //
 // Returns whether the assertion was successful (true) or not (false).
 func HTTPBodyNotContains(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) {
@@ -704,7 +704,7 @@ func HTTPBodyNotContains(t TestingT, handler http.HandlerFunc, method string, ur
 // HTTPBodyNotContainsf asserts that a specified handler returns a
 // body that does not contain a string.
 //
-//	assert.HTTPBodyNotContainsf(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted")
+//	require.HTTPBodyNotContainsf(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted")
 //
 // Returns whether the assertion was successful (true) or not (false).
 func HTTPBodyNotContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) {
@@ -719,7 +719,7 @@ func HTTPBodyNotContainsf(t TestingT, handler http.HandlerFunc, method string, u
 
 // HTTPError asserts that a specified handler returns an error status code.
 //
-//	assert.HTTPError(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}}
+//	require.HTTPError(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}}
 //
 // Returns whether the assertion was successful (true) or not (false).
 func HTTPError(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) {
@@ -734,7 +734,7 @@ func HTTPError(t TestingT, handler http.HandlerFunc, method string, url string,
 
 // HTTPErrorf asserts that a specified handler returns an error status code.
 //
-//	assert.HTTPErrorf(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}}
+//	require.HTTPErrorf(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}}
 //
 // Returns whether the assertion was successful (true) or not (false).
 func HTTPErrorf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) {
@@ -749,7 +749,7 @@ func HTTPErrorf(t TestingT, handler http.HandlerFunc, method string, url string,
 
 // HTTPRedirect asserts that a specified handler returns a redirect status code.
 //
-//	assert.HTTPRedirect(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}}
+//	require.HTTPRedirect(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}}
 //
 // Returns whether the assertion was successful (true) or not (false).
 func HTTPRedirect(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) {
@@ -764,7 +764,7 @@ func HTTPRedirect(t TestingT, handler http.HandlerFunc, method string, url strin
 
 // HTTPRedirectf asserts that a specified handler returns a redirect status code.
 //
-//	assert.HTTPRedirectf(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}}
+//	require.HTTPRedirectf(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}}
 //
 // Returns whether the assertion was successful (true) or not (false).
 func HTTPRedirectf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) {
@@ -779,7 +779,7 @@ func HTTPRedirectf(t TestingT, handler http.HandlerFunc, method string, url stri
 
 // HTTPStatusCode asserts that a specified handler returns a specified status code.
 //
-//	assert.HTTPStatusCode(t, myHandler, "GET", "/notImplemented", nil, 501)
+//	require.HTTPStatusCode(t, myHandler, "GET", "/notImplemented", nil, 501)
 //
 // Returns whether the assertion was successful (true) or not (false).
 func HTTPStatusCode(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, statuscode int, msgAndArgs ...interface{}) {
@@ -794,7 +794,7 @@ func HTTPStatusCode(t TestingT, handler http.HandlerFunc, method string, url str
 
 // HTTPStatusCodef asserts that a specified handler returns a specified status code.
 //
-//	assert.HTTPStatusCodef(t, myHandler, "GET", "/notImplemented", nil, 501, "error message %s", "formatted")
+//	require.HTTPStatusCodef(t, myHandler, "GET", "/notImplemented", nil, 501, "error message %s", "formatted")
 //
 // Returns whether the assertion was successful (true) or not (false).
 func HTTPStatusCodef(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, statuscode int, msg string, args ...interface{}) {
@@ -809,7 +809,7 @@ func HTTPStatusCodef(t TestingT, handler http.HandlerFunc, method string, url st
 
 // HTTPSuccess asserts that a specified handler returns a success status code.
 //
-//	assert.HTTPSuccess(t, myHandler, "POST", "http://www.google.com", nil)
+//	require.HTTPSuccess(t, myHandler, "POST", "http://www.google.com", nil)
 //
 // Returns whether the assertion was successful (true) or not (false).
 func HTTPSuccess(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) {
@@ -824,7 +824,7 @@ func HTTPSuccess(t TestingT, handler http.HandlerFunc, method string, url string
 
 // HTTPSuccessf asserts that a specified handler returns a success status code.
 //
-//	assert.HTTPSuccessf(t, myHandler, "POST", "http://www.google.com", nil, "error message %s", "formatted")
+//	require.HTTPSuccessf(t, myHandler, "POST", "http://www.google.com", nil, "error message %s", "formatted")
 //
 // Returns whether the assertion was successful (true) or not (false).
 func HTTPSuccessf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) {
@@ -839,7 +839,7 @@ func HTTPSuccessf(t TestingT, handler http.HandlerFunc, method string, url strin
 
 // Implements asserts that an object is implemented by the specified interface.
 //
-//	assert.Implements(t, (*MyInterface)(nil), new(MyObject))
+//	require.Implements(t, (*MyInterface)(nil), new(MyObject))
 func Implements(t TestingT, interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -852,7 +852,7 @@ func Implements(t TestingT, interfaceObject interface{}, object interface{}, msg
 
 // Implementsf asserts that an object is implemented by the specified interface.
 //
-//	assert.Implementsf(t, (*MyInterface)(nil), new(MyObject), "error message %s", "formatted")
+//	require.Implementsf(t, (*MyInterface)(nil), new(MyObject), "error message %s", "formatted")
 func Implementsf(t TestingT, interfaceObject interface{}, object interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -865,7 +865,7 @@ func Implementsf(t TestingT, interfaceObject interface{}, object interface{}, ms
 
 // InDelta asserts that the two numerals are within delta of each other.
 //
-//	assert.InDelta(t, math.Pi, 22/7.0, 0.01)
+//	require.InDelta(t, math.Pi, 22/7.0, 0.01)
 func InDelta(t TestingT, expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -922,7 +922,7 @@ func InDeltaSlicef(t TestingT, expected interface{}, actual interface{}, delta f
 
 // InDeltaf asserts that the two numerals are within delta of each other.
 //
-//	assert.InDeltaf(t, math.Pi, 22/7.0, 0.01, "error message %s", "formatted")
+//	require.InDeltaf(t, math.Pi, 22/7.0, 0.01, "error message %s", "formatted")
 func InDeltaf(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -979,9 +979,9 @@ func InEpsilonf(t TestingT, expected interface{}, actual interface{}, epsilon fl
 
 // IsDecreasing asserts that the collection is decreasing
 //
-//	assert.IsDecreasing(t, []int{2, 1, 0})
-//	assert.IsDecreasing(t, []float{2, 1})
-//	assert.IsDecreasing(t, []string{"b", "a"})
+//	require.IsDecreasing(t, []int{2, 1, 0})
+//	require.IsDecreasing(t, []float{2, 1})
+//	require.IsDecreasing(t, []string{"b", "a"})
 func IsDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -994,9 +994,9 @@ func IsDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) {
 
 // IsDecreasingf asserts that the collection is decreasing
 //
-//	assert.IsDecreasingf(t, []int{2, 1, 0}, "error message %s", "formatted")
-//	assert.IsDecreasingf(t, []float{2, 1}, "error message %s", "formatted")
-//	assert.IsDecreasingf(t, []string{"b", "a"}, "error message %s", "formatted")
+//	require.IsDecreasingf(t, []int{2, 1, 0}, "error message %s", "formatted")
+//	require.IsDecreasingf(t, []float{2, 1}, "error message %s", "formatted")
+//	require.IsDecreasingf(t, []string{"b", "a"}, "error message %s", "formatted")
 func IsDecreasingf(t TestingT, object interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1009,9 +1009,9 @@ func IsDecreasingf(t TestingT, object interface{}, msg string, args ...interface
 
 // IsIncreasing asserts that the collection is increasing
 //
-//	assert.IsIncreasing(t, []int{1, 2, 3})
-//	assert.IsIncreasing(t, []float{1, 2})
-//	assert.IsIncreasing(t, []string{"a", "b"})
+//	require.IsIncreasing(t, []int{1, 2, 3})
+//	require.IsIncreasing(t, []float{1, 2})
+//	require.IsIncreasing(t, []string{"a", "b"})
 func IsIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1024,9 +1024,9 @@ func IsIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) {
 
 // IsIncreasingf asserts that the collection is increasing
 //
-//	assert.IsIncreasingf(t, []int{1, 2, 3}, "error message %s", "formatted")
-//	assert.IsIncreasingf(t, []float{1, 2}, "error message %s", "formatted")
-//	assert.IsIncreasingf(t, []string{"a", "b"}, "error message %s", "formatted")
+//	require.IsIncreasingf(t, []int{1, 2, 3}, "error message %s", "formatted")
+//	require.IsIncreasingf(t, []float{1, 2}, "error message %s", "formatted")
+//	require.IsIncreasingf(t, []string{"a", "b"}, "error message %s", "formatted")
 func IsIncreasingf(t TestingT, object interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1039,9 +1039,9 @@ func IsIncreasingf(t TestingT, object interface{}, msg string, args ...interface
 
 // IsNonDecreasing asserts that the collection is not decreasing
 //
-//	assert.IsNonDecreasing(t, []int{1, 1, 2})
-//	assert.IsNonDecreasing(t, []float{1, 2})
-//	assert.IsNonDecreasing(t, []string{"a", "b"})
+//	require.IsNonDecreasing(t, []int{1, 1, 2})
+//	require.IsNonDecreasing(t, []float{1, 2})
+//	require.IsNonDecreasing(t, []string{"a", "b"})
 func IsNonDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1054,9 +1054,9 @@ func IsNonDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{})
 
 // IsNonDecreasingf asserts that the collection is not decreasing
 //
-//	assert.IsNonDecreasingf(t, []int{1, 1, 2}, "error message %s", "formatted")
-//	assert.IsNonDecreasingf(t, []float{1, 2}, "error message %s", "formatted")
-//	assert.IsNonDecreasingf(t, []string{"a", "b"}, "error message %s", "formatted")
+//	require.IsNonDecreasingf(t, []int{1, 1, 2}, "error message %s", "formatted")
+//	require.IsNonDecreasingf(t, []float{1, 2}, "error message %s", "formatted")
+//	require.IsNonDecreasingf(t, []string{"a", "b"}, "error message %s", "formatted")
 func IsNonDecreasingf(t TestingT, object interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1069,9 +1069,9 @@ func IsNonDecreasingf(t TestingT, object interface{}, msg string, args ...interf
 
 // IsNonIncreasing asserts that the collection is not increasing
 //
-//	assert.IsNonIncreasing(t, []int{2, 1, 1})
-//	assert.IsNonIncreasing(t, []float{2, 1})
-//	assert.IsNonIncreasing(t, []string{"b", "a"})
+//	require.IsNonIncreasing(t, []int{2, 1, 1})
+//	require.IsNonIncreasing(t, []float{2, 1})
+//	require.IsNonIncreasing(t, []string{"b", "a"})
 func IsNonIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1084,9 +1084,9 @@ func IsNonIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{})
 
 // IsNonIncreasingf asserts that the collection is not increasing
 //
-//	assert.IsNonIncreasingf(t, []int{2, 1, 1}, "error message %s", "formatted")
-//	assert.IsNonIncreasingf(t, []float{2, 1}, "error message %s", "formatted")
-//	assert.IsNonIncreasingf(t, []string{"b", "a"}, "error message %s", "formatted")
+//	require.IsNonIncreasingf(t, []int{2, 1, 1}, "error message %s", "formatted")
+//	require.IsNonIncreasingf(t, []float{2, 1}, "error message %s", "formatted")
+//	require.IsNonIncreasingf(t, []string{"b", "a"}, "error message %s", "formatted")
 func IsNonIncreasingf(t TestingT, object interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1121,7 +1121,7 @@ func IsTypef(t TestingT, expectedType interface{}, object interface{}, msg strin
 
 // JSONEq asserts that two JSON strings are equivalent.
 //
-//	assert.JSONEq(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`)
+//	require.JSONEq(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`)
 func JSONEq(t TestingT, expected string, actual string, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1134,7 +1134,7 @@ func JSONEq(t TestingT, expected string, actual string, msgAndArgs ...interface{
 
 // JSONEqf asserts that two JSON strings are equivalent.
 //
-//	assert.JSONEqf(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`, "error message %s", "formatted")
+//	require.JSONEqf(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`, "error message %s", "formatted")
 func JSONEqf(t TestingT, expected string, actual string, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1148,7 +1148,7 @@ func JSONEqf(t TestingT, expected string, actual string, msg string, args ...int
 // Len asserts that the specified object has specific length.
 // Len also fails if the object has a type that len() not accept.
 //
-//	assert.Len(t, mySlice, 3)
+//	require.Len(t, mySlice, 3)
 func Len(t TestingT, object interface{}, length int, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1162,7 +1162,7 @@ func Len(t TestingT, object interface{}, length int, msgAndArgs ...interface{})
 // Lenf asserts that the specified object has specific length.
 // Lenf also fails if the object has a type that len() not accept.
 //
-//	assert.Lenf(t, mySlice, 3, "error message %s", "formatted")
+//	require.Lenf(t, mySlice, 3, "error message %s", "formatted")
 func Lenf(t TestingT, object interface{}, length int, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1175,9 +1175,9 @@ func Lenf(t TestingT, object interface{}, length int, msg string, args ...interf
 
 // Less asserts that the first element is less than the second
 //
-//	assert.Less(t, 1, 2)
-//	assert.Less(t, float64(1), float64(2))
-//	assert.Less(t, "a", "b")
+//	require.Less(t, 1, 2)
+//	require.Less(t, float64(1), float64(2))
+//	require.Less(t, "a", "b")
 func Less(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1190,10 +1190,10 @@ func Less(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{})
 
 // LessOrEqual asserts that the first element is less than or equal to the second
 //
-//	assert.LessOrEqual(t, 1, 2)
-//	assert.LessOrEqual(t, 2, 2)
-//	assert.LessOrEqual(t, "a", "b")
-//	assert.LessOrEqual(t, "b", "b")
+//	require.LessOrEqual(t, 1, 2)
+//	require.LessOrEqual(t, 2, 2)
+//	require.LessOrEqual(t, "a", "b")
+//	require.LessOrEqual(t, "b", "b")
 func LessOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1206,10 +1206,10 @@ func LessOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...inter
 
 // LessOrEqualf asserts that the first element is less than or equal to the second
 //
-//	assert.LessOrEqualf(t, 1, 2, "error message %s", "formatted")
-//	assert.LessOrEqualf(t, 2, 2, "error message %s", "formatted")
-//	assert.LessOrEqualf(t, "a", "b", "error message %s", "formatted")
-//	assert.LessOrEqualf(t, "b", "b", "error message %s", "formatted")
+//	require.LessOrEqualf(t, 1, 2, "error message %s", "formatted")
+//	require.LessOrEqualf(t, 2, 2, "error message %s", "formatted")
+//	require.LessOrEqualf(t, "a", "b", "error message %s", "formatted")
+//	require.LessOrEqualf(t, "b", "b", "error message %s", "formatted")
 func LessOrEqualf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1222,9 +1222,9 @@ func LessOrEqualf(t TestingT, e1 interface{}, e2 interface{}, msg string, args .
 
 // Lessf asserts that the first element is less than the second
 //
-//	assert.Lessf(t, 1, 2, "error message %s", "formatted")
-//	assert.Lessf(t, float64(1), float64(2), "error message %s", "formatted")
-//	assert.Lessf(t, "a", "b", "error message %s", "formatted")
+//	require.Lessf(t, 1, 2, "error message %s", "formatted")
+//	require.Lessf(t, float64(1), float64(2), "error message %s", "formatted")
+//	require.Lessf(t, "a", "b", "error message %s", "formatted")
 func Lessf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1237,8 +1237,8 @@ func Lessf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...inter
 
 // Negative asserts that the specified element is negative
 //
-//	assert.Negative(t, -1)
-//	assert.Negative(t, -1.23)
+//	require.Negative(t, -1)
+//	require.Negative(t, -1.23)
 func Negative(t TestingT, e interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1251,8 +1251,8 @@ func Negative(t TestingT, e interface{}, msgAndArgs ...interface{}) {
 
 // Negativef asserts that the specified element is negative
 //
-//	assert.Negativef(t, -1, "error message %s", "formatted")
-//	assert.Negativef(t, -1.23, "error message %s", "formatted")
+//	require.Negativef(t, -1, "error message %s", "formatted")
+//	require.Negativef(t, -1.23, "error message %s", "formatted")
 func Negativef(t TestingT, e interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1266,7 +1266,7 @@ func Negativef(t TestingT, e interface{}, msg string, args ...interface{}) {
 // Never asserts that the given condition doesn't satisfy in waitFor time,
 // periodically checking the target function each tick.
 //
-//	assert.Never(t, func() bool { return false; }, time.Second, 10*time.Millisecond)
+//	require.Never(t, func() bool { return false; }, time.Second, 10*time.Millisecond)
 func Never(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1280,7 +1280,7 @@ func Never(t TestingT, condition func() bool, waitFor time.Duration, tick time.D
 // Neverf asserts that the given condition doesn't satisfy in waitFor time,
 // periodically checking the target function each tick.
 //
-//	assert.Neverf(t, func() bool { return false; }, time.Second, 10*time.Millisecond, "error message %s", "formatted")
+//	require.Neverf(t, func() bool { return false; }, time.Second, 10*time.Millisecond, "error message %s", "formatted")
 func Neverf(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1293,7 +1293,7 @@ func Neverf(t TestingT, condition func() bool, waitFor time.Duration, tick time.
 
 // Nil asserts that the specified object is nil.
 //
-//	assert.Nil(t, err)
+//	require.Nil(t, err)
 func Nil(t TestingT, object interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1306,7 +1306,7 @@ func Nil(t TestingT, object interface{}, msgAndArgs ...interface{}) {
 
 // Nilf asserts that the specified object is nil.
 //
-//	assert.Nilf(t, err, "error message %s", "formatted")
+//	require.Nilf(t, err, "error message %s", "formatted")
 func Nilf(t TestingT, object interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1344,8 +1344,8 @@ func NoDirExistsf(t TestingT, path string, msg string, args ...interface{}) {
 // NoError asserts that a function returned no error (i.e. `nil`).
 //
 //	  actualObj, err := SomeFunction()
-//	  if assert.NoError(t, err) {
-//		   assert.Equal(t, expectedObj, actualObj)
+//	  if require.NoError(t, err) {
+//		   require.Equal(t, expectedObj, actualObj)
 //	  }
 func NoError(t TestingT, err error, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
@@ -1360,8 +1360,8 @@ func NoError(t TestingT, err error, msgAndArgs ...interface{}) {
 // NoErrorf asserts that a function returned no error (i.e. `nil`).
 //
 //	  actualObj, err := SomeFunction()
-//	  if assert.NoErrorf(t, err, "error message %s", "formatted") {
-//		   assert.Equal(t, expectedObj, actualObj)
+//	  if require.NoErrorf(t, err, "error message %s", "formatted") {
+//		   require.Equal(t, expectedObj, actualObj)
 //	  }
 func NoErrorf(t TestingT, err error, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
@@ -1400,9 +1400,9 @@ func NoFileExistsf(t TestingT, path string, msg string, args ...interface{}) {
 // NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the
 // specified substring or element.
 //
-//	assert.NotContains(t, "Hello World", "Earth")
-//	assert.NotContains(t, ["Hello", "World"], "Earth")
-//	assert.NotContains(t, {"Hello": "World"}, "Earth")
+//	require.NotContains(t, "Hello World", "Earth")
+//	require.NotContains(t, ["Hello", "World"], "Earth")
+//	require.NotContains(t, {"Hello": "World"}, "Earth")
 func NotContains(t TestingT, s interface{}, contains interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1416,9 +1416,9 @@ func NotContains(t TestingT, s interface{}, contains interface{}, msgAndArgs ...
 // NotContainsf asserts that the specified string, list(array, slice...) or map does NOT contain the
 // specified substring or element.
 //
-//	assert.NotContainsf(t, "Hello World", "Earth", "error message %s", "formatted")
-//	assert.NotContainsf(t, ["Hello", "World"], "Earth", "error message %s", "formatted")
-//	assert.NotContainsf(t, {"Hello": "World"}, "Earth", "error message %s", "formatted")
+//	require.NotContainsf(t, "Hello World", "Earth", "error message %s", "formatted")
+//	require.NotContainsf(t, ["Hello", "World"], "Earth", "error message %s", "formatted")
+//	require.NotContainsf(t, {"Hello": "World"}, "Earth", "error message %s", "formatted")
 func NotContainsf(t TestingT, s interface{}, contains interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1429,11 +1429,51 @@ func NotContainsf(t TestingT, s interface{}, contains interface{}, msg string, a
 	t.FailNow()
 }
 
+// NotElementsMatch asserts that the specified listA(array, slice...) is NOT equal to specified
+// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements,
+// the number of appearances of each of them in both lists should not match.
+// This is an inverse of ElementsMatch.
+//
+// require.NotElementsMatch(t, [1, 1, 2, 3], [1, 1, 2, 3]) -> false
+//
+// require.NotElementsMatch(t, [1, 1, 2, 3], [1, 2, 3]) -> true
+//
+// require.NotElementsMatch(t, [1, 2, 3], [1, 2, 4]) -> true
+func NotElementsMatch(t TestingT, listA interface{}, listB interface{}, msgAndArgs ...interface{}) {
+	if h, ok := t.(tHelper); ok {
+		h.Helper()
+	}
+	if assert.NotElementsMatch(t, listA, listB, msgAndArgs...) {
+		return
+	}
+	t.FailNow()
+}
+
+// NotElementsMatchf asserts that the specified listA(array, slice...) is NOT equal to specified
+// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements,
+// the number of appearances of each of them in both lists should not match.
+// This is an inverse of ElementsMatch.
+//
+// require.NotElementsMatchf(t, [1, 1, 2, 3], [1, 1, 2, 3], "error message %s", "formatted") -> false
+//
+// require.NotElementsMatchf(t, [1, 1, 2, 3], [1, 2, 3], "error message %s", "formatted") -> true
+//
+// require.NotElementsMatchf(t, [1, 2, 3], [1, 2, 4], "error message %s", "formatted") -> true
+func NotElementsMatchf(t TestingT, listA interface{}, listB interface{}, msg string, args ...interface{}) {
+	if h, ok := t.(tHelper); ok {
+		h.Helper()
+	}
+	if assert.NotElementsMatchf(t, listA, listB, msg, args...) {
+		return
+	}
+	t.FailNow()
+}
+
 // NotEmpty asserts that the specified object is NOT empty.  I.e. not nil, "", false, 0 or either
 // a slice or a channel with len == 0.
 //
-//	if assert.NotEmpty(t, obj) {
-//	  assert.Equal(t, "two", obj[1])
+//	if require.NotEmpty(t, obj) {
+//	  require.Equal(t, "two", obj[1])
 //	}
 func NotEmpty(t TestingT, object interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
@@ -1448,8 +1488,8 @@ func NotEmpty(t TestingT, object interface{}, msgAndArgs ...interface{}) {
 // NotEmptyf asserts that the specified object is NOT empty.  I.e. not nil, "", false, 0 or either
 // a slice or a channel with len == 0.
 //
-//	if assert.NotEmptyf(t, obj, "error message %s", "formatted") {
-//	  assert.Equal(t, "two", obj[1])
+//	if require.NotEmptyf(t, obj, "error message %s", "formatted") {
+//	  require.Equal(t, "two", obj[1])
 //	}
 func NotEmptyf(t TestingT, object interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
@@ -1463,7 +1503,7 @@ func NotEmptyf(t TestingT, object interface{}, msg string, args ...interface{})
 
 // NotEqual asserts that the specified values are NOT equal.
 //
-//	assert.NotEqual(t, obj1, obj2)
+//	require.NotEqual(t, obj1, obj2)
 //
 // Pointer variable equality is determined based on the equality of the
 // referenced values (as opposed to the memory addresses).
@@ -1479,7 +1519,7 @@ func NotEqual(t TestingT, expected interface{}, actual interface{}, msgAndArgs .
 
 // NotEqualValues asserts that two objects are not equal even when converted to the same type
 //
-//	assert.NotEqualValues(t, obj1, obj2)
+//	require.NotEqualValues(t, obj1, obj2)
 func NotEqualValues(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1492,7 +1532,7 @@ func NotEqualValues(t TestingT, expected interface{}, actual interface{}, msgAnd
 
 // NotEqualValuesf asserts that two objects are not equal even when converted to the same type
 //
-//	assert.NotEqualValuesf(t, obj1, obj2, "error message %s", "formatted")
+//	require.NotEqualValuesf(t, obj1, obj2, "error message %s", "formatted")
 func NotEqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1505,7 +1545,7 @@ func NotEqualValuesf(t TestingT, expected interface{}, actual interface{}, msg s
 
 // NotEqualf asserts that the specified values are NOT equal.
 //
-//	assert.NotEqualf(t, obj1, obj2, "error message %s", "formatted")
+//	require.NotEqualf(t, obj1, obj2, "error message %s", "formatted")
 //
 // Pointer variable equality is determined based on the equality of the
 // referenced values (as opposed to the memory addresses).
@@ -1519,7 +1559,31 @@ func NotEqualf(t TestingT, expected interface{}, actual interface{}, msg string,
 	t.FailNow()
 }
 
-// NotErrorIs asserts that at none of the errors in err's chain matches target.
+// NotErrorAs asserts that none of the errors in err's chain matches target,
+// but if so, sets target to that error value.
+func NotErrorAs(t TestingT, err error, target interface{}, msgAndArgs ...interface{}) {
+	if h, ok := t.(tHelper); ok {
+		h.Helper()
+	}
+	if assert.NotErrorAs(t, err, target, msgAndArgs...) {
+		return
+	}
+	t.FailNow()
+}
+
+// NotErrorAsf asserts that none of the errors in err's chain matches target,
+// but if so, sets target to that error value.
+func NotErrorAsf(t TestingT, err error, target interface{}, msg string, args ...interface{}) {
+	if h, ok := t.(tHelper); ok {
+		h.Helper()
+	}
+	if assert.NotErrorAsf(t, err, target, msg, args...) {
+		return
+	}
+	t.FailNow()
+}
+
+// NotErrorIs asserts that none of the errors in err's chain matches target.
 // This is a wrapper for errors.Is.
 func NotErrorIs(t TestingT, err error, target error, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
@@ -1531,7 +1595,7 @@ func NotErrorIs(t TestingT, err error, target error, msgAndArgs ...interface{})
 	t.FailNow()
 }
 
-// NotErrorIsf asserts that at none of the errors in err's chain matches target.
+// NotErrorIsf asserts that none of the errors in err's chain matches target.
 // This is a wrapper for errors.Is.
 func NotErrorIsf(t TestingT, err error, target error, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
@@ -1545,7 +1609,7 @@ func NotErrorIsf(t TestingT, err error, target error, msg string, args ...interf
 
 // NotImplements asserts that an object does not implement the specified interface.
 //
-//	assert.NotImplements(t, (*MyInterface)(nil), new(MyObject))
+//	require.NotImplements(t, (*MyInterface)(nil), new(MyObject))
 func NotImplements(t TestingT, interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1558,7 +1622,7 @@ func NotImplements(t TestingT, interfaceObject interface{}, object interface{},
 
 // NotImplementsf asserts that an object does not implement the specified interface.
 //
-//	assert.NotImplementsf(t, (*MyInterface)(nil), new(MyObject), "error message %s", "formatted")
+//	require.NotImplementsf(t, (*MyInterface)(nil), new(MyObject), "error message %s", "formatted")
 func NotImplementsf(t TestingT, interfaceObject interface{}, object interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1571,7 +1635,7 @@ func NotImplementsf(t TestingT, interfaceObject interface{}, object interface{},
 
 // NotNil asserts that the specified object is not nil.
 //
-//	assert.NotNil(t, err)
+//	require.NotNil(t, err)
 func NotNil(t TestingT, object interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1584,7 +1648,7 @@ func NotNil(t TestingT, object interface{}, msgAndArgs ...interface{}) {
 
 // NotNilf asserts that the specified object is not nil.
 //
-//	assert.NotNilf(t, err, "error message %s", "formatted")
+//	require.NotNilf(t, err, "error message %s", "formatted")
 func NotNilf(t TestingT, object interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1597,7 +1661,7 @@ func NotNilf(t TestingT, object interface{}, msg string, args ...interface{}) {
 
 // NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic.
 //
-//	assert.NotPanics(t, func(){ RemainCalm() })
+//	require.NotPanics(t, func(){ RemainCalm() })
 func NotPanics(t TestingT, f assert.PanicTestFunc, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1610,7 +1674,7 @@ func NotPanics(t TestingT, f assert.PanicTestFunc, msgAndArgs ...interface{}) {
 
 // NotPanicsf asserts that the code inside the specified PanicTestFunc does NOT panic.
 //
-//	assert.NotPanicsf(t, func(){ RemainCalm() }, "error message %s", "formatted")
+//	require.NotPanicsf(t, func(){ RemainCalm() }, "error message %s", "formatted")
 func NotPanicsf(t TestingT, f assert.PanicTestFunc, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1623,8 +1687,8 @@ func NotPanicsf(t TestingT, f assert.PanicTestFunc, msg string, args ...interfac
 
 // NotRegexp asserts that a specified regexp does not match a string.
 //
-//	assert.NotRegexp(t, regexp.MustCompile("starts"), "it's starting")
-//	assert.NotRegexp(t, "^start", "it's not starting")
+//	require.NotRegexp(t, regexp.MustCompile("starts"), "it's starting")
+//	require.NotRegexp(t, "^start", "it's not starting")
 func NotRegexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1637,8 +1701,8 @@ func NotRegexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interf
 
 // NotRegexpf asserts that a specified regexp does not match a string.
 //
-//	assert.NotRegexpf(t, regexp.MustCompile("starts"), "it's starting", "error message %s", "formatted")
-//	assert.NotRegexpf(t, "^start", "it's not starting", "error message %s", "formatted")
+//	require.NotRegexpf(t, regexp.MustCompile("starts"), "it's starting", "error message %s", "formatted")
+//	require.NotRegexpf(t, "^start", "it's not starting", "error message %s", "formatted")
 func NotRegexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1651,7 +1715,7 @@ func NotRegexpf(t TestingT, rx interface{}, str interface{}, msg string, args ..
 
 // NotSame asserts that two pointers do not reference the same object.
 //
-//	assert.NotSame(t, ptr1, ptr2)
+//	require.NotSame(t, ptr1, ptr2)
 //
 // Both arguments must be pointer variables. Pointer variable sameness is
 // determined based on the equality of both type and value.
@@ -1667,7 +1731,7 @@ func NotSame(t TestingT, expected interface{}, actual interface{}, msgAndArgs ..
 
 // NotSamef asserts that two pointers do not reference the same object.
 //
-//	assert.NotSamef(t, ptr1, ptr2, "error message %s", "formatted")
+//	require.NotSamef(t, ptr1, ptr2, "error message %s", "formatted")
 //
 // Both arguments must be pointer variables. Pointer variable sameness is
 // determined based on the equality of both type and value.
@@ -1685,8 +1749,8 @@ func NotSamef(t TestingT, expected interface{}, actual interface{}, msg string,
 // contain all elements given in the specified subset list(array, slice...) or
 // map.
 //
-//	assert.NotSubset(t, [1, 3, 4], [1, 2])
-//	assert.NotSubset(t, {"x": 1, "y": 2}, {"z": 3})
+//	require.NotSubset(t, [1, 3, 4], [1, 2])
+//	require.NotSubset(t, {"x": 1, "y": 2}, {"z": 3})
 func NotSubset(t TestingT, list interface{}, subset interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1701,8 +1765,8 @@ func NotSubset(t TestingT, list interface{}, subset interface{}, msgAndArgs ...i
 // contain all elements given in the specified subset list(array, slice...) or
 // map.
 //
-//	assert.NotSubsetf(t, [1, 3, 4], [1, 2], "error message %s", "formatted")
-//	assert.NotSubsetf(t, {"x": 1, "y": 2}, {"z": 3}, "error message %s", "formatted")
+//	require.NotSubsetf(t, [1, 3, 4], [1, 2], "error message %s", "formatted")
+//	require.NotSubsetf(t, {"x": 1, "y": 2}, {"z": 3}, "error message %s", "formatted")
 func NotSubsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1737,7 +1801,7 @@ func NotZerof(t TestingT, i interface{}, msg string, args ...interface{}) {
 
 // Panics asserts that the code inside the specified PanicTestFunc panics.
 //
-//	assert.Panics(t, func(){ GoCrazy() })
+//	require.Panics(t, func(){ GoCrazy() })
 func Panics(t TestingT, f assert.PanicTestFunc, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1752,7 +1816,7 @@ func Panics(t TestingT, f assert.PanicTestFunc, msgAndArgs ...interface{}) {
 // panics, and that the recovered panic value is an error that satisfies the
 // EqualError comparison.
 //
-//	assert.PanicsWithError(t, "crazy error", func(){ GoCrazy() })
+//	require.PanicsWithError(t, "crazy error", func(){ GoCrazy() })
 func PanicsWithError(t TestingT, errString string, f assert.PanicTestFunc, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1767,7 +1831,7 @@ func PanicsWithError(t TestingT, errString string, f assert.PanicTestFunc, msgAn
 // panics, and that the recovered panic value is an error that satisfies the
 // EqualError comparison.
 //
-//	assert.PanicsWithErrorf(t, "crazy error", func(){ GoCrazy() }, "error message %s", "formatted")
+//	require.PanicsWithErrorf(t, "crazy error", func(){ GoCrazy() }, "error message %s", "formatted")
 func PanicsWithErrorf(t TestingT, errString string, f assert.PanicTestFunc, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1781,7 +1845,7 @@ func PanicsWithErrorf(t TestingT, errString string, f assert.PanicTestFunc, msg
 // PanicsWithValue asserts that the code inside the specified PanicTestFunc panics, and that
 // the recovered panic value equals the expected panic value.
 //
-//	assert.PanicsWithValue(t, "crazy error", func(){ GoCrazy() })
+//	require.PanicsWithValue(t, "crazy error", func(){ GoCrazy() })
 func PanicsWithValue(t TestingT, expected interface{}, f assert.PanicTestFunc, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1795,7 +1859,7 @@ func PanicsWithValue(t TestingT, expected interface{}, f assert.PanicTestFunc, m
 // PanicsWithValuef asserts that the code inside the specified PanicTestFunc panics, and that
 // the recovered panic value equals the expected panic value.
 //
-//	assert.PanicsWithValuef(t, "crazy error", func(){ GoCrazy() }, "error message %s", "formatted")
+//	require.PanicsWithValuef(t, "crazy error", func(){ GoCrazy() }, "error message %s", "formatted")
 func PanicsWithValuef(t TestingT, expected interface{}, f assert.PanicTestFunc, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1808,7 +1872,7 @@ func PanicsWithValuef(t TestingT, expected interface{}, f assert.PanicTestFunc,
 
 // Panicsf asserts that the code inside the specified PanicTestFunc panics.
 //
-//	assert.Panicsf(t, func(){ GoCrazy() }, "error message %s", "formatted")
+//	require.Panicsf(t, func(){ GoCrazy() }, "error message %s", "formatted")
 func Panicsf(t TestingT, f assert.PanicTestFunc, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1821,8 +1885,8 @@ func Panicsf(t TestingT, f assert.PanicTestFunc, msg string, args ...interface{}
 
 // Positive asserts that the specified element is positive
 //
-//	assert.Positive(t, 1)
-//	assert.Positive(t, 1.23)
+//	require.Positive(t, 1)
+//	require.Positive(t, 1.23)
 func Positive(t TestingT, e interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1835,8 +1899,8 @@ func Positive(t TestingT, e interface{}, msgAndArgs ...interface{}) {
 
 // Positivef asserts that the specified element is positive
 //
-//	assert.Positivef(t, 1, "error message %s", "formatted")
-//	assert.Positivef(t, 1.23, "error message %s", "formatted")
+//	require.Positivef(t, 1, "error message %s", "formatted")
+//	require.Positivef(t, 1.23, "error message %s", "formatted")
 func Positivef(t TestingT, e interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1849,8 +1913,8 @@ func Positivef(t TestingT, e interface{}, msg string, args ...interface{}) {
 
 // Regexp asserts that a specified regexp matches a string.
 //
-//	assert.Regexp(t, regexp.MustCompile("start"), "it's starting")
-//	assert.Regexp(t, "start...$", "it's not starting")
+//	require.Regexp(t, regexp.MustCompile("start"), "it's starting")
+//	require.Regexp(t, "start...$", "it's not starting")
 func Regexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1863,8 +1927,8 @@ func Regexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface
 
 // Regexpf asserts that a specified regexp matches a string.
 //
-//	assert.Regexpf(t, regexp.MustCompile("start"), "it's starting", "error message %s", "formatted")
-//	assert.Regexpf(t, "start...$", "it's not starting", "error message %s", "formatted")
+//	require.Regexpf(t, regexp.MustCompile("start"), "it's starting", "error message %s", "formatted")
+//	require.Regexpf(t, "start...$", "it's not starting", "error message %s", "formatted")
 func Regexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1877,7 +1941,7 @@ func Regexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...in
 
 // Same asserts that two pointers reference the same object.
 //
-//	assert.Same(t, ptr1, ptr2)
+//	require.Same(t, ptr1, ptr2)
 //
 // Both arguments must be pointer variables. Pointer variable sameness is
 // determined based on the equality of both type and value.
@@ -1893,7 +1957,7 @@ func Same(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...in
 
 // Samef asserts that two pointers reference the same object.
 //
-//	assert.Samef(t, ptr1, ptr2, "error message %s", "formatted")
+//	require.Samef(t, ptr1, ptr2, "error message %s", "formatted")
 //
 // Both arguments must be pointer variables. Pointer variable sameness is
 // determined based on the equality of both type and value.
@@ -1910,8 +1974,8 @@ func Samef(t TestingT, expected interface{}, actual interface{}, msg string, arg
 // Subset asserts that the specified list(array, slice...) or map contains all
 // elements given in the specified subset list(array, slice...) or map.
 //
-//	assert.Subset(t, [1, 2, 3], [1, 2])
-//	assert.Subset(t, {"x": 1, "y": 2}, {"x": 1})
+//	require.Subset(t, [1, 2, 3], [1, 2])
+//	require.Subset(t, {"x": 1, "y": 2}, {"x": 1})
 func Subset(t TestingT, list interface{}, subset interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1925,8 +1989,8 @@ func Subset(t TestingT, list interface{}, subset interface{}, msgAndArgs ...inte
 // Subsetf asserts that the specified list(array, slice...) or map contains all
 // elements given in the specified subset list(array, slice...) or map.
 //
-//	assert.Subsetf(t, [1, 2, 3], [1, 2], "error message %s", "formatted")
-//	assert.Subsetf(t, {"x": 1, "y": 2}, {"x": 1}, "error message %s", "formatted")
+//	require.Subsetf(t, [1, 2, 3], [1, 2], "error message %s", "formatted")
+//	require.Subsetf(t, {"x": 1, "y": 2}, {"x": 1}, "error message %s", "formatted")
 func Subsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1939,7 +2003,7 @@ func Subsetf(t TestingT, list interface{}, subset interface{}, msg string, args
 
 // True asserts that the specified value is true.
 //
-//	assert.True(t, myBool)
+//	require.True(t, myBool)
 func True(t TestingT, value bool, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1952,7 +2016,7 @@ func True(t TestingT, value bool, msgAndArgs ...interface{}) {
 
 // Truef asserts that the specified value is true.
 //
-//	assert.Truef(t, myBool, "error message %s", "formatted")
+//	require.Truef(t, myBool, "error message %s", "formatted")
 func Truef(t TestingT, value bool, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1965,7 +2029,7 @@ func Truef(t TestingT, value bool, msg string, args ...interface{}) {
 
 // WithinDuration asserts that the two times are within duration delta of each other.
 //
-//	assert.WithinDuration(t, time.Now(), time.Now(), 10*time.Second)
+//	require.WithinDuration(t, time.Now(), time.Now(), 10*time.Second)
 func WithinDuration(t TestingT, expected time.Time, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1978,7 +2042,7 @@ func WithinDuration(t TestingT, expected time.Time, actual time.Time, delta time
 
 // WithinDurationf asserts that the two times are within duration delta of each other.
 //
-//	assert.WithinDurationf(t, time.Now(), time.Now(), 10*time.Second, "error message %s", "formatted")
+//	require.WithinDurationf(t, time.Now(), time.Now(), 10*time.Second, "error message %s", "formatted")
 func WithinDurationf(t TestingT, expected time.Time, actual time.Time, delta time.Duration, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1991,7 +2055,7 @@ func WithinDurationf(t TestingT, expected time.Time, actual time.Time, delta tim
 
 // WithinRange asserts that a time is within a time range (inclusive).
 //
-//	assert.WithinRange(t, time.Now(), time.Now().Add(-time.Second), time.Now().Add(time.Second))
+//	require.WithinRange(t, time.Now(), time.Now().Add(-time.Second), time.Now().Add(time.Second))
 func WithinRange(t TestingT, actual time.Time, start time.Time, end time.Time, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -2004,7 +2068,7 @@ func WithinRange(t TestingT, actual time.Time, start time.Time, end time.Time, m
 
 // WithinRangef asserts that a time is within a time range (inclusive).
 //
-//	assert.WithinRangef(t, time.Now(), time.Now().Add(-time.Second), time.Now().Add(time.Second), "error message %s", "formatted")
+//	require.WithinRangef(t, time.Now(), time.Now().Add(-time.Second), time.Now().Add(time.Second), "error message %s", "formatted")
 func WithinRangef(t TestingT, actual time.Time, start time.Time, end time.Time, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
diff --git a/test/performance/vendor/github.com/stretchr/testify/require/require.go.tmpl b/test/performance/vendor/github.com/stretchr/testify/require/require.go.tmpl
index 55e42ddebd..8b32836850 100644
--- a/test/performance/vendor/github.com/stretchr/testify/require/require.go.tmpl
+++ b/test/performance/vendor/github.com/stretchr/testify/require/require.go.tmpl
@@ -1,4 +1,4 @@
-{{.Comment}}
+{{ replace .Comment "assert." "require."}}
 func {{.DocInfo.Name}}(t TestingT, {{.Params}}) {
 	if h, ok := t.(tHelper); ok { h.Helper() }
 	if assert.{{.DocInfo.Name}}(t, {{.ForwardedParams}}) { return }
diff --git a/test/performance/vendor/github.com/stretchr/testify/require/require_forward.go b/test/performance/vendor/github.com/stretchr/testify/require/require_forward.go
index eee8310a5f..1bd87304f4 100644
--- a/test/performance/vendor/github.com/stretchr/testify/require/require_forward.go
+++ b/test/performance/vendor/github.com/stretchr/testify/require/require_forward.go
@@ -187,8 +187,8 @@ func (a *Assertions) EqualExportedValuesf(expected interface{}, actual interface
 	EqualExportedValuesf(a.t, expected, actual, msg, args...)
 }
 
-// EqualValues asserts that two objects are equal or convertible to the same types
-// and equal.
+// EqualValues asserts that two objects are equal or convertible to the larger
+// type and equal.
 //
 //	a.EqualValues(uint32(123), int32(123))
 func (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) {
@@ -198,8 +198,8 @@ func (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAn
 	EqualValues(a.t, expected, actual, msgAndArgs...)
 }
 
-// EqualValuesf asserts that two objects are equal or convertible to the same types
-// and equal.
+// EqualValuesf asserts that two objects are equal or convertible to the larger
+// type and equal.
 //
 //	a.EqualValuesf(uint32(123), int32(123), "error message %s", "formatted")
 func (a *Assertions) EqualValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) {
@@ -337,7 +337,7 @@ func (a *Assertions) Eventually(condition func() bool, waitFor time.Duration, ti
 //	a.EventuallyWithT(func(c *assert.CollectT) {
 //		// add assertions as needed; any assertion failure will fail the current tick
 //		assert.True(c, externalValue, "expected 'externalValue' to be true")
-//	}, 1*time.Second, 10*time.Second, "external state has not changed to 'true'; still false")
+//	}, 10*time.Second, 1*time.Second, "external state has not changed to 'true'; still false")
 func (a *Assertions) EventuallyWithT(condition func(collect *assert.CollectT), waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) {
 	if h, ok := a.t.(tHelper); ok {
 		h.Helper()
@@ -362,7 +362,7 @@ func (a *Assertions) EventuallyWithT(condition func(collect *assert.CollectT), w
 //	a.EventuallyWithTf(func(c *assert.CollectT, "error message %s", "formatted") {
 //		// add assertions as needed; any assertion failure will fail the current tick
 //		assert.True(c, externalValue, "expected 'externalValue' to be true")
-//	}, 1*time.Second, 10*time.Second, "external state has not changed to 'true'; still false")
+//	}, 10*time.Second, 1*time.Second, "external state has not changed to 'true'; still false")
 func (a *Assertions) EventuallyWithTf(condition func(collect *assert.CollectT), waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) {
 	if h, ok := a.t.(tHelper); ok {
 		h.Helper()
@@ -1129,6 +1129,40 @@ func (a *Assertions) NotContainsf(s interface{}, contains interface{}, msg strin
 	NotContainsf(a.t, s, contains, msg, args...)
 }
 
+// NotElementsMatch asserts that the specified listA(array, slice...) is NOT equal to specified
+// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements,
+// the number of appearances of each of them in both lists should not match.
+// This is an inverse of ElementsMatch.
+//
+// a.NotElementsMatch([1, 1, 2, 3], [1, 1, 2, 3]) -> false
+//
+// a.NotElementsMatch([1, 1, 2, 3], [1, 2, 3]) -> true
+//
+// a.NotElementsMatch([1, 2, 3], [1, 2, 4]) -> true
+func (a *Assertions) NotElementsMatch(listA interface{}, listB interface{}, msgAndArgs ...interface{}) {
+	if h, ok := a.t.(tHelper); ok {
+		h.Helper()
+	}
+	NotElementsMatch(a.t, listA, listB, msgAndArgs...)
+}
+
+// NotElementsMatchf asserts that the specified listA(array, slice...) is NOT equal to specified
+// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements,
+// the number of appearances of each of them in both lists should not match.
+// This is an inverse of ElementsMatch.
+//
+// a.NotElementsMatchf([1, 1, 2, 3], [1, 1, 2, 3], "error message %s", "formatted") -> false
+//
+// a.NotElementsMatchf([1, 1, 2, 3], [1, 2, 3], "error message %s", "formatted") -> true
+//
+// a.NotElementsMatchf([1, 2, 3], [1, 2, 4], "error message %s", "formatted") -> true
+func (a *Assertions) NotElementsMatchf(listA interface{}, listB interface{}, msg string, args ...interface{}) {
+	if h, ok := a.t.(tHelper); ok {
+		h.Helper()
+	}
+	NotElementsMatchf(a.t, listA, listB, msg, args...)
+}
+
 // NotEmpty asserts that the specified object is NOT empty.  I.e. not nil, "", false, 0 or either
 // a slice or a channel with len == 0.
 //
@@ -1201,7 +1235,25 @@ func (a *Assertions) NotEqualf(expected interface{}, actual interface{}, msg str
 	NotEqualf(a.t, expected, actual, msg, args...)
 }
 
-// NotErrorIs asserts that at none of the errors in err's chain matches target.
+// NotErrorAs asserts that none of the errors in err's chain matches target,
+// but if so, sets target to that error value.
+func (a *Assertions) NotErrorAs(err error, target interface{}, msgAndArgs ...interface{}) {
+	if h, ok := a.t.(tHelper); ok {
+		h.Helper()
+	}
+	NotErrorAs(a.t, err, target, msgAndArgs...)
+}
+
+// NotErrorAsf asserts that none of the errors in err's chain matches target,
+// but if so, sets target to that error value.
+func (a *Assertions) NotErrorAsf(err error, target interface{}, msg string, args ...interface{}) {
+	if h, ok := a.t.(tHelper); ok {
+		h.Helper()
+	}
+	NotErrorAsf(a.t, err, target, msg, args...)
+}
+
+// NotErrorIs asserts that none of the errors in err's chain matches target.
 // This is a wrapper for errors.Is.
 func (a *Assertions) NotErrorIs(err error, target error, msgAndArgs ...interface{}) {
 	if h, ok := a.t.(tHelper); ok {
@@ -1210,7 +1262,7 @@ func (a *Assertions) NotErrorIs(err error, target error, msgAndArgs ...interface
 	NotErrorIs(a.t, err, target, msgAndArgs...)
 }
 
-// NotErrorIsf asserts that at none of the errors in err's chain matches target.
+// NotErrorIsf asserts that none of the errors in err's chain matches target.
 // This is a wrapper for errors.Is.
 func (a *Assertions) NotErrorIsf(err error, target error, msg string, args ...interface{}) {
 	if h, ok := a.t.(tHelper); ok {
diff --git a/test/performance/vendor/github.com/stretchr/testify/require/requirements.go b/test/performance/vendor/github.com/stretchr/testify/require/requirements.go
index 91772dfeb9..6b7ce929eb 100644
--- a/test/performance/vendor/github.com/stretchr/testify/require/requirements.go
+++ b/test/performance/vendor/github.com/stretchr/testify/require/requirements.go
@@ -6,7 +6,7 @@ type TestingT interface {
 	FailNow()
 }
 
-type tHelper interface {
+type tHelper = interface {
 	Helper()
 }
 
diff --git a/test/performance/vendor/golang.org/x/net/http2/config.go b/test/performance/vendor/golang.org/x/net/http2/config.go
index de58dfb8dc..ca645d9a1a 100644
--- a/test/performance/vendor/golang.org/x/net/http2/config.go
+++ b/test/performance/vendor/golang.org/x/net/http2/config.go
@@ -60,7 +60,7 @@ func configFromServer(h1 *http.Server, h2 *Server) http2Config {
 	return conf
 }
 
-// configFromServer merges configuration settings from h2 and h2.t1.HTTP2
+// configFromTransport merges configuration settings from h2 and h2.t1.HTTP2
 // (the net/http Transport).
 func configFromTransport(h2 *Transport) http2Config {
 	conf := http2Config{
diff --git a/test/performance/vendor/golang.org/x/net/http2/config_go124.go b/test/performance/vendor/golang.org/x/net/http2/config_go124.go
index e3784123c8..5b516c55ff 100644
--- a/test/performance/vendor/golang.org/x/net/http2/config_go124.go
+++ b/test/performance/vendor/golang.org/x/net/http2/config_go124.go
@@ -13,7 +13,7 @@ func fillNetHTTPServerConfig(conf *http2Config, srv *http.Server) {
 	fillNetHTTPConfig(conf, srv.HTTP2)
 }
 
-// fillNetHTTPServerConfig sets fields in conf from tr.HTTP2.
+// fillNetHTTPTransportConfig sets fields in conf from tr.HTTP2.
 func fillNetHTTPTransportConfig(conf *http2Config, tr *http.Transport) {
 	fillNetHTTPConfig(conf, tr.HTTP2)
 }
diff --git a/test/performance/vendor/golang.org/x/net/http2/transport.go b/test/performance/vendor/golang.org/x/net/http2/transport.go
index 090d0e1bdb..b2e2ed3373 100644
--- a/test/performance/vendor/golang.org/x/net/http2/transport.go
+++ b/test/performance/vendor/golang.org/x/net/http2/transport.go
@@ -375,6 +375,7 @@ type ClientConn struct {
 	doNotReuse       bool       // whether conn is marked to not be reused for any future requests
 	closing          bool
 	closed           bool
+	closedOnIdle     bool                     // true if conn was closed for idleness
 	seenSettings     bool                     // true if we've seen a settings frame, false otherwise
 	seenSettingsChan chan struct{}            // closed when seenSettings is true or frame reading fails
 	wantSettingsAck  bool                     // we sent a SETTINGS frame and haven't heard back
@@ -1089,10 +1090,12 @@ func (cc *ClientConn) idleStateLocked() (st clientConnIdleState) {
 
 	// If this connection has never been used for a request and is closed,
 	// then let it take a request (which will fail).
+	// If the conn was closed for idleness, we're racing the idle timer;
+	// don't try to use the conn. (Issue #70515.)
 	//
 	// This avoids a situation where an error early in a connection's lifetime
 	// goes unreported.
-	if cc.nextStreamID == 1 && cc.streamsReserved == 0 && cc.closed {
+	if cc.nextStreamID == 1 && cc.streamsReserved == 0 && cc.closed && !cc.closedOnIdle {
 		st.canTakeNewRequest = true
 	}
 
@@ -1155,6 +1158,7 @@ func (cc *ClientConn) closeIfIdle() {
 		return
 	}
 	cc.closed = true
+	cc.closedOnIdle = true
 	nextID := cc.nextStreamID
 	// TODO: do clients send GOAWAY too? maybe? Just Close:
 	cc.mu.Unlock()
@@ -2434,9 +2438,12 @@ func (rl *clientConnReadLoop) cleanup() {
 	// This avoids a situation where new connections are constantly created,
 	// added to the pool, fail, and are removed from the pool, without any error
 	// being surfaced to the user.
-	const unusedWaitTime = 5 * time.Second
+	unusedWaitTime := 5 * time.Second
+	if cc.idleTimeout > 0 && unusedWaitTime > cc.idleTimeout {
+		unusedWaitTime = cc.idleTimeout
+	}
 	idleTime := cc.t.now().Sub(cc.lastActive)
-	if atomic.LoadUint32(&cc.atomicReused) == 0 && idleTime < unusedWaitTime {
+	if atomic.LoadUint32(&cc.atomicReused) == 0 && idleTime < unusedWaitTime && !cc.closedOnIdle {
 		cc.idleTimer = cc.t.afterFunc(unusedWaitTime-idleTime, func() {
 			cc.t.connPool().MarkDead(cc)
 		})
diff --git a/test/performance/vendor/golang.org/x/sys/unix/syscall_dragonfly.go b/test/performance/vendor/golang.org/x/sys/unix/syscall_dragonfly.go
index 97cb916f2c..be8c002070 100644
--- a/test/performance/vendor/golang.org/x/sys/unix/syscall_dragonfly.go
+++ b/test/performance/vendor/golang.org/x/sys/unix/syscall_dragonfly.go
@@ -246,6 +246,18 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e
 	return sendfile(outfd, infd, offset, count)
 }
 
+func Dup3(oldfd, newfd, flags int) error {
+	if oldfd == newfd || flags&^O_CLOEXEC != 0 {
+		return EINVAL
+	}
+	how := F_DUP2FD
+	if flags&O_CLOEXEC != 0 {
+		how = F_DUP2FD_CLOEXEC
+	}
+	_, err := fcntl(oldfd, how, newfd)
+	return err
+}
+
 /*
  * Exposed directly
  */
diff --git a/test/performance/vendor/golang.org/x/sys/windows/dll_windows.go b/test/performance/vendor/golang.org/x/sys/windows/dll_windows.go
index 4e613cf633..3ca814f54d 100644
--- a/test/performance/vendor/golang.org/x/sys/windows/dll_windows.go
+++ b/test/performance/vendor/golang.org/x/sys/windows/dll_windows.go
@@ -43,8 +43,8 @@ type DLL struct {
 // LoadDLL loads DLL file into memory.
 //
 // Warning: using LoadDLL without an absolute path name is subject to
-// DLL preloading attacks. To safely load a system DLL, use LazyDLL
-// with System set to true, or use LoadLibraryEx directly.
+// DLL preloading attacks. To safely load a system DLL, use [NewLazySystemDLL],
+// or use [LoadLibraryEx] directly.
 func LoadDLL(name string) (dll *DLL, err error) {
 	namep, err := UTF16PtrFromString(name)
 	if err != nil {
@@ -271,6 +271,9 @@ func (d *LazyDLL) NewProc(name string) *LazyProc {
 }
 
 // NewLazyDLL creates new LazyDLL associated with DLL file.
+//
+// Warning: using NewLazyDLL without an absolute path name is subject to
+// DLL preloading attacks. To safely load a system DLL, use [NewLazySystemDLL].
 func NewLazyDLL(name string) *LazyDLL {
 	return &LazyDLL{Name: name}
 }
@@ -410,7 +413,3 @@ func loadLibraryEx(name string, system bool) (*DLL, error) {
 	}
 	return &DLL{Name: name, Handle: h}, nil
 }
-
-type errString string
-
-func (s errString) Error() string { return string(s) }
diff --git a/test/performance/vendor/golang.org/x/tools/cmd/goimports/doc.go b/test/performance/vendor/golang.org/x/tools/cmd/goimports/doc.go
deleted file mode 100644
index 18a3ad448e..0000000000
--- a/test/performance/vendor/golang.org/x/tools/cmd/goimports/doc.go
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2013 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.
-
-/*
-Command goimports updates your Go import lines,
-adding missing ones and removing unreferenced ones.
-
-	$ go install golang.org/x/tools/cmd/goimports@latest
-
-In addition to fixing imports, goimports also formats
-your code in the same style as gofmt so it can be used
-as a replacement for your editor's gofmt-on-save hook.
-
-For emacs, make sure you have the latest go-mode.el:
-
-	https://github.com/dominikh/go-mode.el
-
-Then in your .emacs file:
-
-	(setq gofmt-command "goimports")
-	(add-hook 'before-save-hook 'gofmt-before-save)
-
-For vim, set "gofmt_command" to "goimports":
-
-	https://golang.org/change/39c724dd7f252
-	https://golang.org/wiki/IDEsAndTextEditorPlugins
-	etc
-
-For GoSublime, follow the steps described here:
-
-	http://michaelwhatcott.com/gosublime-goimports/
-
-For other editors, you probably know what to do.
-
-To exclude directories in your $GOPATH from being scanned for Go
-files, goimports respects a configuration file at
-$GOPATH/src/.goimportsignore which may contain blank lines, comment
-lines (beginning with '#'), or lines naming a directory relative to
-the configuration file to ignore when scanning. No globbing or regex
-patterns are allowed. Use the "-v" verbose flag to verify it's
-working and see what goimports is doing.
-
-File bugs or feature requests at:
-
-	https://golang.org/issues/new?title=x/tools/cmd/goimports:+
-
-Happy hacking!
-*/
-package main // import "golang.org/x/tools/cmd/goimports"
diff --git a/test/performance/vendor/golang.org/x/tools/cmd/goimports/goimports.go b/test/performance/vendor/golang.org/x/tools/cmd/goimports/goimports.go
deleted file mode 100644
index dcb5023a2e..0000000000
--- a/test/performance/vendor/golang.org/x/tools/cmd/goimports/goimports.go
+++ /dev/null
@@ -1,379 +0,0 @@
-// Copyright 2013 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 (
-	"bufio"
-	"bytes"
-	"errors"
-	"flag"
-	"fmt"
-	"go/scanner"
-	"io"
-	"log"
-	"os"
-	"os/exec"
-	"path/filepath"
-	"runtime"
-	"runtime/pprof"
-	"strings"
-
-	"golang.org/x/tools/internal/gocommand"
-	"golang.org/x/tools/internal/imports"
-)
-
-var (
-	// main operation modes
-	list   = flag.Bool("l", false, "list files whose formatting differs from goimport's")
-	write  = flag.Bool("w", false, "write result to (source) file instead of stdout")
-	doDiff = flag.Bool("d", false, "display diffs instead of rewriting files")
-	srcdir = flag.String("srcdir", "", "choose imports as if source code is from `dir`. When operating on a single file, dir may instead be the complete file name.")
-
-	verbose bool // verbose logging
-
-	cpuProfile     = flag.String("cpuprofile", "", "CPU profile output")
-	memProfile     = flag.String("memprofile", "", "memory profile output")
-	memProfileRate = flag.Int("memrate", 0, "if > 0, sets runtime.MemProfileRate")
-
-	options = &imports.Options{
-		TabWidth:  8,
-		TabIndent: true,
-		Comments:  true,
-		Fragment:  true,
-		Env: &imports.ProcessEnv{
-			GocmdRunner: &gocommand.Runner{},
-		},
-	}
-	exitCode = 0
-)
-
-func init() {
-	flag.BoolVar(&options.AllErrors, "e", false, "report all errors (not just the first 10 on different lines)")
-	flag.StringVar(&options.LocalPrefix, "local", "", "put imports beginning with this string after 3rd-party packages; comma-separated list")
-	flag.BoolVar(&options.FormatOnly, "format-only", false, "if true, don't fix imports and only format. In this mode, goimports is effectively gofmt, with the addition that imports are grouped into sections.")
-}
-
-func report(err error) {
-	scanner.PrintError(os.Stderr, err)
-	exitCode = 2
-}
-
-func usage() {
-	fmt.Fprintf(os.Stderr, "usage: goimports [flags] [path ...]\n")
-	flag.PrintDefaults()
-	os.Exit(2)
-}
-
-func isGoFile(f os.FileInfo) bool {
-	// ignore non-Go files
-	name := f.Name()
-	return !f.IsDir() && !strings.HasPrefix(name, ".") && strings.HasSuffix(name, ".go")
-}
-
-// argumentType is which mode goimports was invoked as.
-type argumentType int
-
-const (
-	// fromStdin means the user is piping their source into goimports.
-	fromStdin argumentType = iota
-
-	// singleArg is the common case from editors, when goimports is run on
-	// a single file.
-	singleArg
-
-	// multipleArg is when the user ran "goimports file1.go file2.go"
-	// or ran goimports on a directory tree.
-	multipleArg
-)
-
-func processFile(filename string, in io.Reader, out io.Writer, argType argumentType) error {
-	opt := options
-	if argType == fromStdin {
-		nopt := *options
-		nopt.Fragment = true
-		opt = &nopt
-	}
-
-	if in == nil {
-		f, err := os.Open(filename)
-		if err != nil {
-			return err
-		}
-		defer f.Close()
-		in = f
-	}
-
-	src, err := io.ReadAll(in)
-	if err != nil {
-		return err
-	}
-
-	target := filename
-	if *srcdir != "" {
-		// Determine whether the provided -srcdirc is a directory or file
-		// and then use it to override the target.
-		//
-		// See https://github.com/dominikh/go-mode.el/issues/146
-		if isFile(*srcdir) {
-			if argType == multipleArg {
-				return errors.New("-srcdir value can't be a file when passing multiple arguments or when walking directories")
-			}
-			target = *srcdir
-		} else if argType == singleArg && strings.HasSuffix(*srcdir, ".go") && !isDir(*srcdir) {
-			// For a file which doesn't exist on disk yet, but might shortly.
-			// e.g. user in editor opens $DIR/newfile.go and newfile.go doesn't yet exist on disk.
-			// The goimports on-save hook writes the buffer to a temp file
-			// first and runs goimports before the actual save to newfile.go.
-			// The editor's buffer is named "newfile.go" so that is passed to goimports as:
-			//      goimports -srcdir=/gopath/src/pkg/newfile.go /tmp/gofmtXXXXXXXX.go
-			// and then the editor reloads the result from the tmp file and writes
-			// it to newfile.go.
-			target = *srcdir
-		} else {
-			// Pretend that file is from *srcdir in order to decide
-			// visible imports correctly.
-			target = filepath.Join(*srcdir, filepath.Base(filename))
-		}
-	}
-
-	res, err := imports.Process(target, src, opt)
-	if err != nil {
-		return err
-	}
-
-	if !bytes.Equal(src, res) {
-		// formatting has changed
-		if *list {
-			fmt.Fprintln(out, filename)
-		}
-		if *write {
-			if argType == fromStdin {
-				// filename is ""
-				return errors.New("can't use -w on stdin")
-			}
-			// On Windows, we need to re-set the permissions from the file. See golang/go#38225.
-			var perms os.FileMode
-			if fi, err := os.Stat(filename); err == nil {
-				perms = fi.Mode() & os.ModePerm
-			}
-			err = os.WriteFile(filename, res, perms)
-			if err != nil {
-				return err
-			}
-		}
-		if *doDiff {
-			if argType == fromStdin {
-				filename = "stdin.go" // because .orig looks silly
-			}
-			data, err := diff(src, res, filename)
-			if err != nil {
-				return fmt.Errorf("computing diff: %s", err)
-			}
-			fmt.Printf("diff -u %s %s\n", filepath.ToSlash(filename+".orig"), filepath.ToSlash(filename))
-			out.Write(data)
-		}
-	}
-
-	if !*list && !*write && !*doDiff {
-		_, err = out.Write(res)
-	}
-
-	return err
-}
-
-func visitFile(path string, f os.FileInfo, err error) error {
-	if err == nil && isGoFile(f) {
-		err = processFile(path, nil, os.Stdout, multipleArg)
-	}
-	if err != nil {
-		report(err)
-	}
-	return nil
-}
-
-func walkDir(path string) {
-	filepath.Walk(path, visitFile)
-}
-
-func main() {
-	runtime.GOMAXPROCS(runtime.NumCPU())
-
-	// call gofmtMain in a separate function
-	// so that it can use defer and have them
-	// run before the exit.
-	gofmtMain()
-	os.Exit(exitCode)
-}
-
-// parseFlags parses command line flags and returns the paths to process.
-// It's a var so that custom implementations can replace it in other files.
-var parseFlags = func() []string {
-	flag.BoolVar(&verbose, "v", false, "verbose logging")
-
-	flag.Parse()
-	return flag.Args()
-}
-
-func bufferedFileWriter(dest string) (w io.Writer, close func()) {
-	f, err := os.Create(dest)
-	if err != nil {
-		log.Fatal(err)
-	}
-	bw := bufio.NewWriter(f)
-	return bw, func() {
-		if err := bw.Flush(); err != nil {
-			log.Fatalf("error flushing %v: %v", dest, err)
-		}
-		if err := f.Close(); err != nil {
-			log.Fatal(err)
-		}
-	}
-}
-
-func gofmtMain() {
-	flag.Usage = usage
-	paths := parseFlags()
-
-	if *cpuProfile != "" {
-		bw, flush := bufferedFileWriter(*cpuProfile)
-		pprof.StartCPUProfile(bw)
-		defer flush()
-		defer pprof.StopCPUProfile()
-	}
-	// doTrace is a conditionally compiled wrapper around runtime/trace. It is
-	// used to allow goimports to compile under gccgo, which does not support
-	// runtime/trace. See https://golang.org/issue/15544.
-	defer doTrace()()
-	if *memProfileRate > 0 {
-		runtime.MemProfileRate = *memProfileRate
-		bw, flush := bufferedFileWriter(*memProfile)
-		defer func() {
-			runtime.GC() // materialize all statistics
-			if err := pprof.WriteHeapProfile(bw); err != nil {
-				log.Fatal(err)
-			}
-			flush()
-		}()
-	}
-
-	if verbose {
-		log.SetFlags(log.LstdFlags | log.Lmicroseconds)
-		options.Env.Logf = log.Printf
-	}
-	if options.TabWidth < 0 {
-		fmt.Fprintf(os.Stderr, "negative tabwidth %d\n", options.TabWidth)
-		exitCode = 2
-		return
-	}
-
-	if len(paths) == 0 {
-		if err := processFile("", os.Stdin, os.Stdout, fromStdin); err != nil {
-			report(err)
-		}
-		return
-	}
-
-	argType := singleArg
-	if len(paths) > 1 {
-		argType = multipleArg
-	}
-
-	for _, path := range paths {
-		switch dir, err := os.Stat(path); {
-		case err != nil:
-			report(err)
-		case dir.IsDir():
-			walkDir(path)
-		default:
-			if err := processFile(path, nil, os.Stdout, argType); err != nil {
-				report(err)
-			}
-		}
-	}
-}
-
-func writeTempFile(dir, prefix string, data []byte) (string, error) {
-	file, err := os.CreateTemp(dir, prefix)
-	if err != nil {
-		return "", err
-	}
-	_, err = file.Write(data)
-	if err1 := file.Close(); err == nil {
-		err = err1
-	}
-	if err != nil {
-		os.Remove(file.Name())
-		return "", err
-	}
-	return file.Name(), nil
-}
-
-func diff(b1, b2 []byte, filename string) (data []byte, err error) {
-	f1, err := writeTempFile("", "gofmt", b1)
-	if err != nil {
-		return
-	}
-	defer os.Remove(f1)
-
-	f2, err := writeTempFile("", "gofmt", b2)
-	if err != nil {
-		return
-	}
-	defer os.Remove(f2)
-
-	cmd := "diff"
-	if runtime.GOOS == "plan9" {
-		cmd = "/bin/ape/diff"
-	}
-
-	data, err = exec.Command(cmd, "-u", f1, f2).CombinedOutput()
-	if len(data) > 0 {
-		// diff exits with a non-zero status when the files don't match.
-		// Ignore that failure as long as we get output.
-		return replaceTempFilename(data, filename)
-	}
-	return
-}
-
-// replaceTempFilename replaces temporary filenames in diff with actual one.
-//
-// --- /tmp/gofmt316145376	2017-02-03 19:13:00.280468375 -0500
-// +++ /tmp/gofmt617882815	2017-02-03 19:13:00.280468375 -0500
-// ...
-// ->
-// --- path/to/file.go.orig	2017-02-03 19:13:00.280468375 -0500
-// +++ path/to/file.go	2017-02-03 19:13:00.280468375 -0500
-// ...
-func replaceTempFilename(diff []byte, filename string) ([]byte, error) {
-	bs := bytes.SplitN(diff, []byte{'\n'}, 3)
-	if len(bs) < 3 {
-		return nil, fmt.Errorf("got unexpected diff for %s", filename)
-	}
-	// Preserve timestamps.
-	var t0, t1 []byte
-	if i := bytes.LastIndexByte(bs[0], '\t'); i != -1 {
-		t0 = bs[0][i:]
-	}
-	if i := bytes.LastIndexByte(bs[1], '\t'); i != -1 {
-		t1 = bs[1][i:]
-	}
-	// Always print filepath with slash separator.
-	f := filepath.ToSlash(filename)
-	bs[0] = []byte(fmt.Sprintf("--- %s%s", f+".orig", t0))
-	bs[1] = []byte(fmt.Sprintf("+++ %s%s", f, t1))
-	return bytes.Join(bs, []byte{'\n'}), nil
-}
-
-// isFile reports whether name is a file.
-func isFile(name string) bool {
-	fi, err := os.Stat(name)
-	return err == nil && fi.Mode().IsRegular()
-}
-
-// isDir reports whether name is a directory.
-func isDir(name string) bool {
-	fi, err := os.Stat(name)
-	return err == nil && fi.IsDir()
-}
diff --git a/test/performance/vendor/golang.org/x/tools/cmd/goimports/goimports_gc.go b/test/performance/vendor/golang.org/x/tools/cmd/goimports/goimports_gc.go
deleted file mode 100644
index 3326646d03..0000000000
--- a/test/performance/vendor/golang.org/x/tools/cmd/goimports/goimports_gc.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2016 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 gc
-// +build gc
-
-package main
-
-import (
-	"flag"
-	"runtime/trace"
-)
-
-var traceProfile = flag.String("trace", "", "trace profile output")
-
-func doTrace() func() {
-	if *traceProfile != "" {
-		bw, flush := bufferedFileWriter(*traceProfile)
-		trace.Start(bw)
-		return func() {
-			trace.Stop()
-			flush()
-		}
-	}
-	return func() {}
-}
diff --git a/test/performance/vendor/golang.org/x/tools/cmd/goimports/goimports_not_gc.go b/test/performance/vendor/golang.org/x/tools/cmd/goimports/goimports_not_gc.go
deleted file mode 100644
index 344fe7576b..0000000000
--- a/test/performance/vendor/golang.org/x/tools/cmd/goimports/goimports_not_gc.go
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2016 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 !gc
-// +build !gc
-
-package main
-
-func doTrace() func() {
-	return func() {}
-}
diff --git a/test/performance/vendor/golang.org/x/tools/go/ast/astutil/imports.go b/test/performance/vendor/golang.org/x/tools/go/ast/astutil/imports.go
index 18d1adb05d..a6b5ed0a89 100644
--- a/test/performance/vendor/golang.org/x/tools/go/ast/astutil/imports.go
+++ b/test/performance/vendor/golang.org/x/tools/go/ast/astutil/imports.go
@@ -344,7 +344,12 @@ func RewriteImport(fset *token.FileSet, f *ast.File, oldPath, newPath string) (r
 }
 
 // UsesImport reports whether a given import is used.
+// The provided File must have been parsed with syntactic object resolution
+// (not using go/parser.SkipObjectResolution).
 func UsesImport(f *ast.File, path string) (used bool) {
+	if f.Scope == nil {
+		panic("file f was not parsed with syntactic object resolution")
+	}
 	spec := importSpec(f, path)
 	if spec == nil {
 		return
diff --git a/test/performance/vendor/golang.org/x/tools/go/ast/astutil/util.go b/test/performance/vendor/golang.org/x/tools/go/ast/astutil/util.go
index 6bdcf70ac2..ca71e3e105 100644
--- a/test/performance/vendor/golang.org/x/tools/go/ast/astutil/util.go
+++ b/test/performance/vendor/golang.org/x/tools/go/ast/astutil/util.go
@@ -7,13 +7,5 @@ package astutil
 import "go/ast"
 
 // Unparen returns e with any enclosing parentheses stripped.
-// TODO(adonovan): use go1.22's ast.Unparen.
-func Unparen(e ast.Expr) ast.Expr {
-	for {
-		p, ok := e.(*ast.ParenExpr)
-		if !ok {
-			return e
-		}
-		e = p.X
-	}
-}
+// Deprecated: use [ast.Unparen].
+func Unparen(e ast.Expr) ast.Expr { return ast.Unparen(e) }
diff --git a/test/performance/vendor/golang.org/x/tools/go/gcexportdata/gcexportdata.go b/test/performance/vendor/golang.org/x/tools/go/gcexportdata/gcexportdata.go
index 137cc8df1d..65fe2628e9 100644
--- a/test/performance/vendor/golang.org/x/tools/go/gcexportdata/gcexportdata.go
+++ b/test/performance/vendor/golang.org/x/tools/go/gcexportdata/gcexportdata.go
@@ -2,22 +2,64 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// Package gcexportdata provides functions for locating, reading, and
-// writing export data files containing type information produced by the
-// gc compiler.  This package supports go1.7 export data format and all
-// later versions.
-//
-// Although it might seem convenient for this package to live alongside
-// go/types in the standard library, this would cause version skew
-// problems for developer tools that use it, since they must be able to
-// consume the outputs of the gc compiler both before and after a Go
-// update such as from Go 1.7 to Go 1.8.  Because this package lives in
-// golang.org/x/tools, sites can update their version of this repo some
-// time before the Go 1.8 release and rebuild and redeploy their
-// developer tools, which will then be able to consume both Go 1.7 and
-// Go 1.8 export data files, so they will work before and after the
-// Go update. (See discussion at https://golang.org/issue/15651.)
-package gcexportdata // import "golang.org/x/tools/go/gcexportdata"
+// Package gcexportdata provides functions for reading and writing
+// export data, which is a serialized description of the API of a Go
+// package including the names, kinds, types, and locations of all
+// exported declarations.
+//
+// The standard Go compiler (cmd/compile) writes an export data file
+// for each package it compiles, which it later reads when compiling
+// packages that import the earlier one. The compiler must thus
+// contain logic to both write and read export data.
+// (See the "Export" section in the cmd/compile/README file.)
+//
+// The [Read] function in this package can read files produced by the
+// compiler, producing [go/types] data structures. As a matter of
+// policy, Read supports export data files produced by only the last
+// two Go releases plus tip; see https://go.dev/issue/68898. The
+// export data files produced by the compiler contain additional
+// details related to generics, inlining, and other optimizations that
+// cannot be decoded by the [Read] function.
+//
+// In files written by the compiler, the export data is not at the
+// start of the file. Before calling Read, use [NewReader] to locate
+// the desired portion of the file.
+//
+// The [Write] function in this package encodes the exported API of a
+// Go package ([types.Package]) as a file. Such files can be later
+// decoded by Read, but cannot be consumed by the compiler.
+//
+// # Future changes
+//
+// Although Read supports the formats written by both Write and the
+// compiler, the two are quite different, and there is an open
+// proposal (https://go.dev/issue/69491) to separate these APIs.
+//
+// Under that proposal, this package would ultimately provide only the
+// Read operation for compiler export data, which must be defined in
+// this module (golang.org/x/tools), not in the standard library, to
+// avoid version skew for developer tools that need to read compiler
+// export data both before and after a Go release, such as from Go
+// 1.23 to Go 1.24. Because this package lives in the tools module,
+// clients can update their version of the module some time before the
+// Go 1.24 release and rebuild and redeploy their tools, which will
+// then be able to consume both Go 1.23 and Go 1.24 export data files,
+// so they will work before and after the Go update. (See discussion
+// at https://go.dev/issue/15651.)
+//
+// The operations to import and export [go/types] data structures
+// would be defined in the go/types package as Import and Export.
+// [Write] would (eventually) delegate to Export,
+// and [Read], when it detects a file produced by Export,
+// would delegate to Import.
+//
+// # Deprecations
+//
+// The [NewImporter] and [Find] functions are deprecated and should
+// not be used in new code. The [WriteBundle] and [ReadBundle]
+// functions are experimental, and there is an open proposal to
+// deprecate them (https://go.dev/issue/69573).
+package gcexportdata
 
 import (
 	"bufio"
@@ -64,24 +106,18 @@ func Find(importPath, srcDir string) (filename, path string) {
 // additional trailing data beyond the end of the export data.
 func NewReader(r io.Reader) (io.Reader, error) {
 	buf := bufio.NewReader(r)
-	_, size, err := gcimporter.FindExportData(buf)
+	size, err := gcimporter.FindExportData(buf)
 	if err != nil {
 		return nil, err
 	}
 
-	if size >= 0 {
-		// We were given an archive and found the __.PKGDEF in it.
-		// This tells us the size of the export data, and we don't
-		// need to return the entire file.
-		return &io.LimitedReader{
-			R: buf,
-			N: size,
-		}, nil
-	} else {
-		// We were given an object file. As such, we don't know how large
-		// the export data is and must return the entire file.
-		return buf, nil
-	}
+	// We were given an archive and found the __.PKGDEF in it.
+	// This tells us the size of the export data, and we don't
+	// need to return the entire file.
+	return &io.LimitedReader{
+		R: buf,
+		N: size,
+	}, nil
 }
 
 // readAll works the same way as io.ReadAll, but avoids allocations and copies
@@ -100,6 +136,11 @@ func readAll(r io.Reader) ([]byte, error) {
 // Read reads export data from in, decodes it, and returns type
 // information for the package.
 //
+// Read is capable of reading export data produced by [Write] at the
+// same source code version, or by the last two Go releases (plus tip)
+// of the standard Go compiler. Reading files from older compilers may
+// produce an error.
+//
 // The package path (effectively its linker symbol prefix) is
 // specified by path, since unlike the package name, this information
 // may not be recorded in the export data.
@@ -128,14 +169,26 @@ func Read(in io.Reader, fset *token.FileSet, imports map[string]*types.Package,
 	// (from "version"). Select appropriate importer.
 	if len(data) > 0 {
 		switch data[0] {
-		case 'v', 'c', 'd': // binary, till go1.10
+		case 'v', 'c', 'd':
+			// binary, produced by cmd/compile till go1.10
 			return nil, fmt.Errorf("binary (%c) import format is no longer supported", data[0])
 
-		case 'i': // indexed, till go1.19
+		case 'i':
+			// indexed, produced by cmd/compile till go1.19,
+			// and also by [Write].
+			//
+			// If proposal #69491 is accepted, go/types
+			// serialization will be implemented by
+			// types.Export, to which Write would eventually
+			// delegate (explicitly dropping any pretence at
+			// inter-version Write-Read compatibility).
+			// This [Read] function would delegate to types.Import
+			// when it detects that the file was produced by Export.
 			_, pkg, err := gcimporter.IImportData(fset, imports, data[1:], path)
 			return pkg, err
 
-		case 'u': // unified, from go1.20
+		case 'u':
+			// unified, produced by cmd/compile since go1.20
 			_, pkg, err := gcimporter.UImportData(fset, imports, data[1:], path)
 			return pkg, err
 
diff --git a/test/performance/vendor/golang.org/x/tools/go/packages/doc.go b/test/performance/vendor/golang.org/x/tools/go/packages/doc.go
index 3531ac8f5f..f1931d10ee 100644
--- a/test/performance/vendor/golang.org/x/tools/go/packages/doc.go
+++ b/test/performance/vendor/golang.org/x/tools/go/packages/doc.go
@@ -64,7 +64,7 @@ graph using the Imports fields.
 
 The Load function can be configured by passing a pointer to a Config as
 the first argument. A nil Config is equivalent to the zero Config, which
-causes Load to run in LoadFiles mode, collecting minimal information.
+causes Load to run in [LoadFiles] mode, collecting minimal information.
 See the documentation for type Config for details.
 
 As noted earlier, the Config.Mode controls the amount of detail
@@ -72,14 +72,14 @@ reported about the loaded packages. See the documentation for type LoadMode
 for details.
 
 Most tools should pass their command-line arguments (after any flags)
-uninterpreted to [Load], so that it can interpret them
+uninterpreted to Load, so that it can interpret them
 according to the conventions of the underlying build system.
 
 See the Example function for typical usage.
 
 # The driver protocol
 
-[Load] may be used to load Go packages even in Go projects that use
+Load may be used to load Go packages even in Go projects that use
 alternative build systems, by installing an appropriate "driver"
 program for the build system and specifying its location in the
 GOPACKAGESDRIVER environment variable.
@@ -97,6 +97,15 @@ JSON-encoded [DriverRequest] message providing additional information
 is written to the driver's standard input. The driver must write a
 JSON-encoded [DriverResponse] message to its standard output. (This
 message differs from the JSON schema produced by 'go list'.)
+
+The value of the PWD environment variable seen by the driver process
+is the preferred name of its working directory. (The working directory
+may have other aliases due to symbolic links; see the comment on the
+Dir field of [exec.Cmd] for related information.)
+When the driver process emits in its response the name of a file
+that is a descendant of this directory, it must use an absolute path
+that has the value of PWD as a prefix, to ensure that the returned
+filenames satisfy the original query.
 */
 package packages // import "golang.org/x/tools/go/packages"
 
diff --git a/test/performance/vendor/golang.org/x/tools/go/packages/external.go b/test/performance/vendor/golang.org/x/tools/go/packages/external.go
index 8f7afcb5df..91bd62e83b 100644
--- a/test/performance/vendor/golang.org/x/tools/go/packages/external.go
+++ b/test/performance/vendor/golang.org/x/tools/go/packages/external.go
@@ -13,6 +13,7 @@ import (
 	"fmt"
 	"os"
 	"os/exec"
+	"slices"
 	"strings"
 )
 
@@ -79,7 +80,7 @@ type DriverResponse struct {
 
 // driver is the type for functions that query the build system for the
 // packages named by the patterns.
-type driver func(cfg *Config, patterns ...string) (*DriverResponse, error)
+type driver func(cfg *Config, patterns []string) (*DriverResponse, error)
 
 // findExternalDriver returns the file path of a tool that supplies
 // the build system package structure, or "" if not found.
@@ -103,7 +104,7 @@ func findExternalDriver(cfg *Config) driver {
 			return nil
 		}
 	}
-	return func(cfg *Config, words ...string) (*DriverResponse, error) {
+	return func(cfg *Config, patterns []string) (*DriverResponse, error) {
 		req, err := json.Marshal(DriverRequest{
 			Mode:       cfg.Mode,
 			Env:        cfg.Env,
@@ -117,7 +118,7 @@ func findExternalDriver(cfg *Config) driver {
 
 		buf := new(bytes.Buffer)
 		stderr := new(bytes.Buffer)
-		cmd := exec.CommandContext(cfg.Context, tool, words...)
+		cmd := exec.CommandContext(cfg.Context, tool, patterns...)
 		cmd.Dir = cfg.Dir
 		// The cwd gets resolved to the real path. On Darwin, where
 		// /tmp is a symlink, this breaks anything that expects the
@@ -131,7 +132,7 @@ func findExternalDriver(cfg *Config) driver {
 		// command.
 		//
 		// (See similar trick in Invocation.run in ../../internal/gocommand/invoke.go)
-		cmd.Env = append(slicesClip(cfg.Env), "PWD="+cfg.Dir)
+		cmd.Env = append(slices.Clip(cfg.Env), "PWD="+cfg.Dir)
 		cmd.Stdin = bytes.NewReader(req)
 		cmd.Stdout = buf
 		cmd.Stderr = stderr
@@ -150,7 +151,3 @@ func findExternalDriver(cfg *Config) driver {
 		return &response, nil
 	}
 }
-
-// slicesClip removes unused capacity from the slice, returning s[:len(s):len(s)].
-// TODO(adonovan): use go1.21 slices.Clip.
-func slicesClip[S ~[]E, E any](s S) S { return s[:len(s):len(s)] }
diff --git a/test/performance/vendor/golang.org/x/tools/go/packages/golist.go b/test/performance/vendor/golang.org/x/tools/go/packages/golist.go
index 1a3a5b44f5..0458b4f9c4 100644
--- a/test/performance/vendor/golang.org/x/tools/go/packages/golist.go
+++ b/test/performance/vendor/golang.org/x/tools/go/packages/golist.go
@@ -80,6 +80,12 @@ type golistState struct {
 	cfg *Config
 	ctx context.Context
 
+	runner *gocommand.Runner
+
+	// overlay is the JSON file that encodes the Config.Overlay
+	// mapping, used by 'go list -overlay=...'.
+	overlay string
+
 	envOnce    sync.Once
 	goEnvError error
 	goEnv      map[string]string
@@ -127,7 +133,10 @@ func (state *golistState) mustGetEnv() map[string]string {
 // goListDriver uses the go list command to interpret the patterns and produce
 // the build system package structure.
 // See driver for more details.
-func goListDriver(cfg *Config, patterns ...string) (_ *DriverResponse, err error) {
+//
+// overlay is the JSON file that encodes the cfg.Overlay
+// mapping, used by 'go list -overlay=...'
+func goListDriver(cfg *Config, runner *gocommand.Runner, overlay string, patterns []string) (_ *DriverResponse, err error) {
 	// Make sure that any asynchronous go commands are killed when we return.
 	parentCtx := cfg.Context
 	if parentCtx == nil {
@@ -142,13 +151,15 @@ func goListDriver(cfg *Config, patterns ...string) (_ *DriverResponse, err error
 		cfg:        cfg,
 		ctx:        ctx,
 		vendorDirs: map[string]bool{},
+		overlay:    overlay,
+		runner:     runner,
 	}
 
 	// Fill in response.Sizes asynchronously if necessary.
-	if cfg.Mode&NeedTypesSizes != 0 || cfg.Mode&NeedTypes != 0 {
+	if cfg.Mode&NeedTypesSizes != 0 || cfg.Mode&(NeedTypes|NeedTypesInfo) != 0 {
 		errCh := make(chan error)
 		go func() {
-			compiler, arch, err := getSizesForArgs(ctx, state.cfgInvocation(), cfg.gocmdRunner)
+			compiler, arch, err := getSizesForArgs(ctx, state.cfgInvocation(), runner)
 			response.dr.Compiler = compiler
 			response.dr.Arch = arch
 			errCh <- err
@@ -311,6 +322,7 @@ type jsonPackage struct {
 	ImportPath        string
 	Dir               string
 	Name              string
+	Target            string
 	Export            string
 	GoFiles           []string
 	CompiledGoFiles   []string
@@ -494,13 +506,15 @@ func (state *golistState) createDriverResponse(words ...string) (*DriverResponse
 		pkg := &Package{
 			Name:            p.Name,
 			ID:              p.ImportPath,
+			Dir:             p.Dir,
+			Target:          p.Target,
 			GoFiles:         absJoin(p.Dir, p.GoFiles, p.CgoFiles),
 			CompiledGoFiles: absJoin(p.Dir, p.CompiledGoFiles),
 			OtherFiles:      absJoin(p.Dir, otherFiles(p)...),
 			EmbedFiles:      absJoin(p.Dir, p.EmbedFiles),
 			EmbedPatterns:   absJoin(p.Dir, p.EmbedPatterns),
 			IgnoredFiles:    absJoin(p.Dir, p.IgnoredGoFiles, p.IgnoredOtherFiles),
-			forTest:         p.ForTest,
+			ForTest:         p.ForTest,
 			depsErrors:      p.DepsErrors,
 			Module:          p.Module,
 		}
@@ -681,7 +695,7 @@ func (state *golistState) shouldAddFilenameFromError(p *jsonPackage) bool {
 // getGoVersion returns the effective minor version of the go command.
 func (state *golistState) getGoVersion() (int, error) {
 	state.goVersionOnce.Do(func() {
-		state.goVersion, state.goVersionError = gocommand.GoVersion(state.ctx, state.cfgInvocation(), state.cfg.gocmdRunner)
+		state.goVersion, state.goVersionError = gocommand.GoVersion(state.ctx, state.cfgInvocation(), state.runner)
 	})
 	return state.goVersion, state.goVersionError
 }
@@ -751,7 +765,7 @@ func jsonFlag(cfg *Config, goVersion int) string {
 		}
 	}
 	addFields("Name", "ImportPath", "Error") // These fields are always needed
-	if cfg.Mode&NeedFiles != 0 || cfg.Mode&NeedTypes != 0 {
+	if cfg.Mode&NeedFiles != 0 || cfg.Mode&(NeedTypes|NeedTypesInfo) != 0 {
 		addFields("Dir", "GoFiles", "IgnoredGoFiles", "IgnoredOtherFiles", "CFiles",
 			"CgoFiles", "CXXFiles", "MFiles", "HFiles", "FFiles", "SFiles",
 			"SwigFiles", "SwigCXXFiles", "SysoFiles")
@@ -759,7 +773,7 @@ func jsonFlag(cfg *Config, goVersion int) string {
 			addFields("TestGoFiles", "XTestGoFiles")
 		}
 	}
-	if cfg.Mode&NeedTypes != 0 {
+	if cfg.Mode&(NeedTypes|NeedTypesInfo) != 0 {
 		// CompiledGoFiles seems to be required for the test case TestCgoNoSyntax,
 		// even when -compiled isn't passed in.
 		// TODO(#52435): Should we make the test ask for -compiled, or automatically
@@ -784,7 +798,7 @@ func jsonFlag(cfg *Config, goVersion int) string {
 		// Request Dir in the unlikely case Export is not absolute.
 		addFields("Dir", "Export")
 	}
-	if cfg.Mode&needInternalForTest != 0 {
+	if cfg.Mode&NeedForTest != 0 {
 		addFields("ForTest")
 	}
 	if cfg.Mode&needInternalDepsErrors != 0 {
@@ -799,6 +813,9 @@ func jsonFlag(cfg *Config, goVersion int) string {
 	if cfg.Mode&NeedEmbedPatterns != 0 {
 		addFields("EmbedPatterns")
 	}
+	if cfg.Mode&NeedTarget != 0 {
+		addFields("Target")
+	}
 	return "-json=" + strings.Join(fields, ",")
 }
 
@@ -840,7 +857,7 @@ func (state *golistState) cfgInvocation() gocommand.Invocation {
 		Env:        cfg.Env,
 		Logf:       cfg.Logf,
 		WorkingDir: cfg.Dir,
-		Overlay:    cfg.goListOverlayFile,
+		Overlay:    state.overlay,
 	}
 }
 
@@ -851,11 +868,8 @@ func (state *golistState) invokeGo(verb string, args ...string) (*bytes.Buffer,
 	inv := state.cfgInvocation()
 	inv.Verb = verb
 	inv.Args = args
-	gocmdRunner := cfg.gocmdRunner
-	if gocmdRunner == nil {
-		gocmdRunner = &gocommand.Runner{}
-	}
-	stdout, stderr, friendlyErr, err := gocmdRunner.RunRaw(cfg.Context, inv)
+
+	stdout, stderr, friendlyErr, err := state.runner.RunRaw(cfg.Context, inv)
 	if err != nil {
 		// Check for 'go' executable not being found.
 		if ee, ok := err.(*exec.Error); ok && ee.Err == exec.ErrNotFound {
@@ -879,6 +893,12 @@ func (state *golistState) invokeGo(verb string, args ...string) (*bytes.Buffer,
 			return nil, friendlyErr
 		}
 
+		// Return an error if 'go list' failed due to missing tools in
+		// $GOROOT/pkg/tool/$GOOS_$GOARCH (#69606).
+		if len(stderr.String()) > 0 && strings.Contains(stderr.String(), `go: no such tool`) {
+			return nil, friendlyErr
+		}
+
 		// Is there an error running the C compiler in cgo? This will be reported in the "Error" field
 		// and should be suppressed by go list -e.
 		//
diff --git a/test/performance/vendor/golang.org/x/tools/go/packages/loadmode_string.go b/test/performance/vendor/golang.org/x/tools/go/packages/loadmode_string.go
index 5c080d21b5..69eec9f44d 100644
--- a/test/performance/vendor/golang.org/x/tools/go/packages/loadmode_string.go
+++ b/test/performance/vendor/golang.org/x/tools/go/packages/loadmode_string.go
@@ -9,49 +9,48 @@ import (
 	"strings"
 )
 
-var allModes = []LoadMode{
-	NeedName,
-	NeedFiles,
-	NeedCompiledGoFiles,
-	NeedImports,
-	NeedDeps,
-	NeedExportFile,
-	NeedTypes,
-	NeedSyntax,
-	NeedTypesInfo,
-	NeedTypesSizes,
+var modes = [...]struct {
+	mode LoadMode
+	name string
+}{
+	{NeedName, "NeedName"},
+	{NeedFiles, "NeedFiles"},
+	{NeedCompiledGoFiles, "NeedCompiledGoFiles"},
+	{NeedImports, "NeedImports"},
+	{NeedDeps, "NeedDeps"},
+	{NeedExportFile, "NeedExportFile"},
+	{NeedTypes, "NeedTypes"},
+	{NeedSyntax, "NeedSyntax"},
+	{NeedTypesInfo, "NeedTypesInfo"},
+	{NeedTypesSizes, "NeedTypesSizes"},
+	{NeedForTest, "NeedForTest"},
+	{NeedModule, "NeedModule"},
+	{NeedEmbedFiles, "NeedEmbedFiles"},
+	{NeedEmbedPatterns, "NeedEmbedPatterns"},
+	{NeedTarget, "NeedTarget"},
 }
 
-var modeStrings = []string{
-	"NeedName",
-	"NeedFiles",
-	"NeedCompiledGoFiles",
-	"NeedImports",
-	"NeedDeps",
-	"NeedExportFile",
-	"NeedTypes",
-	"NeedSyntax",
-	"NeedTypesInfo",
-	"NeedTypesSizes",
-}
-
-func (mod LoadMode) String() string {
-	m := mod
-	if m == 0 {
+func (mode LoadMode) String() string {
+	if mode == 0 {
 		return "LoadMode(0)"
 	}
 	var out []string
-	for i, x := range allModes {
-		if x > m {
-			break
+	// named bits
+	for _, item := range modes {
+		if (mode & item.mode) != 0 {
+			mode ^= item.mode
+			out = append(out, item.name)
 		}
-		if (m & x) != 0 {
-			out = append(out, modeStrings[i])
-			m = m ^ x
+	}
+	// unnamed residue
+	if mode != 0 {
+		if out == nil {
+			return fmt.Sprintf("LoadMode(%#x)", int(mode))
 		}
+		out = append(out, fmt.Sprintf("%#x", int(mode)))
 	}
-	if m != 0 {
-		out = append(out, "Unknown")
+	if len(out) == 1 {
+		return out[0]
 	}
-	return fmt.Sprintf("LoadMode(%s)", strings.Join(out, "|"))
+	return "(" + strings.Join(out, "|") + ")"
 }
diff --git a/test/performance/vendor/golang.org/x/tools/go/packages/packages.go b/test/performance/vendor/golang.org/x/tools/go/packages/packages.go
index 0b6bfaff80..0147d9080a 100644
--- a/test/performance/vendor/golang.org/x/tools/go/packages/packages.go
+++ b/test/performance/vendor/golang.org/x/tools/go/packages/packages.go
@@ -16,13 +16,13 @@ import (
 	"go/scanner"
 	"go/token"
 	"go/types"
-	"io"
 	"log"
 	"os"
 	"path/filepath"
 	"runtime"
 	"strings"
 	"sync"
+	"sync/atomic"
 	"time"
 
 	"golang.org/x/sync/errgroup"
@@ -31,7 +31,6 @@ import (
 	"golang.org/x/tools/internal/gocommand"
 	"golang.org/x/tools/internal/packagesinternal"
 	"golang.org/x/tools/internal/typesinternal"
-	"golang.org/x/tools/internal/versions"
 )
 
 // A LoadMode controls the amount of detail to return when loading.
@@ -44,19 +43,33 @@ import (
 // ID and Errors (if present) will always be filled.
 // [Load] may return more information than requested.
 //
+// The Mode flag is a union of several bits named NeedName,
+// NeedFiles, and so on, each of which determines whether
+// a given field of Package (Name, Files, etc) should be
+// populated.
+//
+// For convenience, we provide named constants for the most
+// common combinations of Need flags:
+//
+//	[LoadFiles]     lists of files in each package
+//	[LoadImports]   ... plus imports
+//	[LoadTypes]     ... plus type information
+//	[LoadSyntax]    ... plus type-annotated syntax
+//	[LoadAllSyntax] ... for all dependencies
+//
 // Unfortunately there are a number of open bugs related to
 // interactions among the LoadMode bits:
-// - https://github.com/golang/go/issues/56633
-// - https://github.com/golang/go/issues/56677
-// - https://github.com/golang/go/issues/58726
-// - https://github.com/golang/go/issues/63517
+//   - https://github.com/golang/go/issues/56633
+//   - https://github.com/golang/go/issues/56677
+//   - https://github.com/golang/go/issues/58726
+//   - https://github.com/golang/go/issues/63517
 type LoadMode int
 
 const (
 	// NeedName adds Name and PkgPath.
 	NeedName LoadMode = 1 << iota
 
-	// NeedFiles adds GoFiles and OtherFiles.
+	// NeedFiles adds Dir, GoFiles, OtherFiles, and IgnoredFiles
 	NeedFiles
 
 	// NeedCompiledGoFiles adds CompiledGoFiles.
@@ -78,7 +91,7 @@ const (
 	// NeedSyntax adds Syntax and Fset.
 	NeedSyntax
 
-	// NeedTypesInfo adds TypesInfo.
+	// NeedTypesInfo adds TypesInfo and Fset.
 	NeedTypesInfo
 
 	// NeedTypesSizes adds TypesSizes.
@@ -87,9 +100,10 @@ const (
 	// needInternalDepsErrors adds the internal deps errors field for use by gopls.
 	needInternalDepsErrors
 
-	// needInternalForTest adds the internal forTest field.
+	// NeedForTest adds ForTest.
+	//
 	// Tests must also be set on the context for this field to be populated.
-	needInternalForTest
+	NeedForTest
 
 	// typecheckCgo enables full support for type checking cgo. Requires Go 1.15+.
 	// Modifies CompiledGoFiles and Types, and has no effect on its own.
@@ -103,27 +117,27 @@ const (
 
 	// NeedEmbedPatterns adds EmbedPatterns.
 	NeedEmbedPatterns
+
+	// NeedTarget adds Target.
+	NeedTarget
+
+	// Be sure to update loadmode_string.go when adding new items!
 )
 
 const (
-	// Deprecated: LoadFiles exists for historical compatibility
-	// and should not be used. Please directly specify the needed fields using the Need values.
+	// LoadFiles loads the name and file names for the initial packages.
 	LoadFiles = NeedName | NeedFiles | NeedCompiledGoFiles
 
-	// Deprecated: LoadImports exists for historical compatibility
-	// and should not be used. Please directly specify the needed fields using the Need values.
+	// LoadImports loads the name, file names, and import mapping for the initial packages.
 	LoadImports = LoadFiles | NeedImports
 
-	// Deprecated: LoadTypes exists for historical compatibility
-	// and should not be used. Please directly specify the needed fields using the Need values.
+	// LoadTypes loads exported type information for the initial packages.
 	LoadTypes = LoadImports | NeedTypes | NeedTypesSizes
 
-	// Deprecated: LoadSyntax exists for historical compatibility
-	// and should not be used. Please directly specify the needed fields using the Need values.
+	// LoadSyntax loads typed syntax for the initial packages.
 	LoadSyntax = LoadTypes | NeedSyntax | NeedTypesInfo
 
-	// Deprecated: LoadAllSyntax exists for historical compatibility
-	// and should not be used. Please directly specify the needed fields using the Need values.
+	// LoadAllSyntax loads typed syntax for the initial packages and all dependencies.
 	LoadAllSyntax = LoadSyntax | NeedDeps
 
 	// Deprecated: NeedExportsFile is a historical misspelling of NeedExportFile.
@@ -133,13 +147,7 @@ const (
 // A Config specifies details about how packages should be loaded.
 // The zero value is a valid configuration.
 //
-// Calls to Load do not modify this struct.
-//
-// TODO(adonovan): #67702: this is currently false: in fact,
-// calls to [Load] do not modify the public fields of this struct, but
-// may modify hidden fields, so concurrent calls to [Load] must not
-// use the same Config. But perhaps we should reestablish the
-// documented invariant.
+// Calls to [Load] do not modify this struct.
 type Config struct {
 	// Mode controls the level of information returned for each package.
 	Mode LoadMode
@@ -170,19 +178,10 @@ type Config struct {
 	//
 	Env []string
 
-	// gocmdRunner guards go command calls from concurrency errors.
-	gocmdRunner *gocommand.Runner
-
 	// BuildFlags is a list of command-line flags to be passed through to
 	// the build system's query tool.
 	BuildFlags []string
 
-	// modFile will be used for -modfile in go command invocations.
-	modFile string
-
-	// modFlag will be used for -modfile in go command invocations.
-	modFlag string
-
 	// Fset provides source position information for syntax trees and types.
 	// If Fset is nil, Load will use a new fileset, but preserve Fset's value.
 	Fset *token.FileSet
@@ -229,21 +228,24 @@ type Config struct {
 	// drivers may vary in their level of support for overlays.
 	Overlay map[string][]byte
 
-	// goListOverlayFile is the JSON file that encodes the Overlay
-	// mapping, used by 'go list -overlay=...'
-	goListOverlayFile string
+	// -- Hidden configuration fields only for use in x/tools --
+
+	// modFile will be used for -modfile in go command invocations.
+	modFile string
+
+	// modFlag will be used for -modfile in go command invocations.
+	modFlag string
 }
 
 // Load loads and returns the Go packages named by the given patterns.
 //
-// Config specifies loading options;
-// nil behaves the same as an empty Config.
+// The cfg parameter specifies loading options; nil behaves the same as an empty [Config].
 //
 // The [Config.Mode] field is a set of bits that determine what kinds
 // of information should be computed and returned. Modes that require
 // more information tend to be slower. See [LoadMode] for details
 // and important caveats. Its zero value is equivalent to
-// NeedName | NeedFiles | NeedCompiledGoFiles.
+// [NeedName] | [NeedFiles] | [NeedCompiledGoFiles].
 //
 // Each call to Load returns a new set of [Package] instances.
 // The Packages and their Imports form a directed acyclic graph.
@@ -260,7 +262,7 @@ type Config struct {
 // Errors associated with a particular package are recorded in the
 // corresponding Package's Errors list, and do not cause Load to
 // return an error. Clients may need to handle such errors before
-// proceeding with further analysis. The PrintErrors function is
+// proceeding with further analysis. The [PrintErrors] function is
 // provided for convenient display of all errors.
 func Load(cfg *Config, patterns ...string) ([]*Package, error) {
 	ld := newLoader(cfg)
@@ -323,21 +325,24 @@ func defaultDriver(cfg *Config, patterns ...string) (*DriverResponse, bool, erro
 		} else if !response.NotHandled {
 			return response, true, nil
 		}
-		// (fall through)
+		// not handled: fall through
 	}
 
 	// go list fallback
-	//
+
 	// Write overlays once, as there are many calls
 	// to 'go list' (one per chunk plus others too).
-	overlay, cleanupOverlay, err := gocommand.WriteOverlays(cfg.Overlay)
+	overlayFile, cleanupOverlay, err := gocommand.WriteOverlays(cfg.Overlay)
 	if err != nil {
 		return nil, false, err
 	}
 	defer cleanupOverlay()
-	cfg.goListOverlayFile = overlay
 
-	response, err := callDriverOnChunks(goListDriver, cfg, chunks)
+	var runner gocommand.Runner // (shared across many 'go list' calls)
+	driver := func(cfg *Config, patterns []string) (*DriverResponse, error) {
+		return goListDriver(cfg, &runner, overlayFile, patterns)
+	}
+	response, err := callDriverOnChunks(driver, cfg, chunks)
 	if err != nil {
 		return nil, false, err
 	}
@@ -375,16 +380,14 @@ func splitIntoChunks(patterns []string, argMax int) ([][]string, error) {
 
 func callDriverOnChunks(driver driver, cfg *Config, chunks [][]string) (*DriverResponse, error) {
 	if len(chunks) == 0 {
-		return driver(cfg)
+		return driver(cfg, nil)
 	}
 	responses := make([]*DriverResponse, len(chunks))
 	errNotHandled := errors.New("driver returned NotHandled")
 	var g errgroup.Group
 	for i, chunk := range chunks {
-		i := i
-		chunk := chunk
 		g.Go(func() (err error) {
-			responses[i], err = driver(cfg, chunk...)
+			responses[i], err = driver(cfg, chunk)
 			if responses[i] != nil && responses[i].NotHandled {
 				err = errNotHandled
 			}
@@ -434,6 +437,12 @@ type Package struct {
 	// PkgPath is the package path as used by the go/types package.
 	PkgPath string
 
+	// Dir is the directory associated with the package, if it exists.
+	//
+	// For packages listed by the go command, this is the directory containing
+	// the package files.
+	Dir string
+
 	// Errors contains any errors encountered querying the metadata
 	// of the package, or while parsing or type-checking its files.
 	Errors []Error
@@ -473,6 +482,10 @@ type Package struct {
 	// information for the package as provided by the build system.
 	ExportFile string
 
+	// Target is the absolute install path of the .a file, for libraries,
+	// and of the executable file, for binaries.
+	Target string
+
 	// Imports maps import paths appearing in the package's Go source files
 	// to corresponding loaded Packages.
 	Imports map[string]*Package
@@ -521,8 +534,8 @@ type Package struct {
 
 	// -- internal --
 
-	// forTest is the package under test, if any.
-	forTest string
+	// ForTest is the package under test, if any.
+	ForTest string
 
 	// depsErrors is the DepsErrors field from the go list response, if any.
 	depsErrors []*packagesinternal.PackageError
@@ -551,9 +564,6 @@ type ModuleError struct {
 }
 
 func init() {
-	packagesinternal.GetForTest = func(p interface{}) string {
-		return p.(*Package).forTest
-	}
 	packagesinternal.GetDepsErrors = func(p interface{}) []*packagesinternal.PackageError {
 		return p.(*Package).depsErrors
 	}
@@ -565,7 +575,6 @@ func init() {
 	}
 	packagesinternal.TypecheckCgo = int(typecheckCgo)
 	packagesinternal.DepsErrors = int(needInternalDepsErrors)
-	packagesinternal.ForTest = int(needInternalForTest)
 }
 
 // An Error describes a problem with a package's metadata, syntax, or types.
@@ -681,18 +690,19 @@ func (p *Package) String() string { return p.ID }
 // loaderPackage augments Package with state used during the loading phase
 type loaderPackage struct {
 	*Package
-	importErrors map[string]error // maps each bad import to its error
-	loadOnce     sync.Once
-	color        uint8 // for cycle detection
-	needsrc      bool  // load from source (Mode >= LoadTypes)
-	needtypes    bool  // type information is either requested or depended on
-	initial      bool  // package was matched by a pattern
-	goVersion    int   // minor version number of go command on PATH
+	importErrors    map[string]error // maps each bad import to its error
+	preds           []*loaderPackage // packages that import this one
+	unfinishedSuccs atomic.Int32     // number of direct imports not yet loaded
+	color           uint8            // for cycle detection
+	needsrc         bool             // load from source (Mode >= LoadTypes)
+	needtypes       bool             // type information is either requested or depended on
+	initial         bool             // package was matched by a pattern
+	goVersion       int              // minor version number of go command on PATH
 }
 
 // loader holds the working state of a single call to load.
 type loader struct {
-	pkgs map[string]*loaderPackage
+	pkgs map[string]*loaderPackage // keyed by Package.ID
 	Config
 	sizes        types.Sizes // non-nil if needed by mode
 	parseCache   map[string]*parseValue
@@ -738,9 +748,6 @@ func newLoader(cfg *Config) *loader {
 	if ld.Config.Env == nil {
 		ld.Config.Env = os.Environ()
 	}
-	if ld.Config.gocmdRunner == nil {
-		ld.Config.gocmdRunner = &gocommand.Runner{}
-	}
 	if ld.Context == nil {
 		ld.Context = context.Background()
 	}
@@ -754,7 +761,7 @@ func newLoader(cfg *Config) *loader {
 	ld.requestedMode = ld.Mode
 	ld.Mode = impliedLoadMode(ld.Mode)
 
-	if ld.Mode&NeedTypes != 0 || ld.Mode&NeedSyntax != 0 {
+	if ld.Mode&(NeedSyntax|NeedTypes|NeedTypesInfo) != 0 {
 		if ld.Fset == nil {
 			ld.Fset = token.NewFileSet()
 		}
@@ -763,6 +770,7 @@ func newLoader(cfg *Config) *loader {
 		// because we load source if export data is missing.
 		if ld.ParseFile == nil {
 			ld.ParseFile = func(fset *token.FileSet, filename string, src []byte) (*ast.File, error) {
+				// We implicitly promise to keep doing ast.Object resolution. :(
 				const mode = parser.AllErrors | parser.ParseComments
 				return parser.ParseFile(fset, filename, src, mode)
 			}
@@ -794,7 +802,7 @@ func (ld *loader) refine(response *DriverResponse) ([]*Package, error) {
 		exportDataInvalid := len(ld.Overlay) > 0 || pkg.ExportFile == "" && pkg.PkgPath != "unsafe"
 		// This package needs type information if the caller requested types and the package is
 		// either a root, or it's a non-root and the user requested dependencies ...
-		needtypes := (ld.Mode&NeedTypes|NeedTypesInfo != 0 && (rootIndex >= 0 || ld.Mode&NeedDeps != 0))
+		needtypes := (ld.Mode&(NeedTypes|NeedTypesInfo) != 0 && (rootIndex >= 0 || ld.Mode&NeedDeps != 0))
 		// This package needs source if the call requested source (or types info, which implies source)
 		// and the package is either a root, or itas a non- root and the user requested dependencies...
 		needsrc := ((ld.Mode&(NeedSyntax|NeedTypesInfo) != 0 && (rootIndex >= 0 || ld.Mode&NeedDeps != 0)) ||
@@ -819,9 +827,10 @@ func (ld *loader) refine(response *DriverResponse) ([]*Package, error) {
 		}
 	}
 
-	if ld.Mode&NeedImports != 0 {
-		// Materialize the import graph.
-
+	// Materialize the import graph if it is needed (NeedImports),
+	// or if we'll be using loadPackages (Need{Syntax|Types|TypesInfo}).
+	var leaves []*loaderPackage // packages with no unfinished successors
+	if ld.Mode&(NeedImports|NeedSyntax|NeedTypes|NeedTypesInfo) != 0 {
 		const (
 			white = 0 // new
 			grey  = 1 // in progress
@@ -840,63 +849,76 @@ func (ld *loader) refine(response *DriverResponse) ([]*Package, error) {
 		// dependency on a package that does. These are the only packages
 		// for which we load source code.
 		var stack []*loaderPackage
-		var visit func(lpkg *loaderPackage) bool
-		visit = func(lpkg *loaderPackage) bool {
-			switch lpkg.color {
-			case black:
-				return lpkg.needsrc
-			case grey:
+		var visit func(from, lpkg *loaderPackage) bool
+		visit = func(from, lpkg *loaderPackage) bool {
+			if lpkg.color == grey {
 				panic("internal error: grey node")
 			}
-			lpkg.color = grey
-			stack = append(stack, lpkg) // push
-			stubs := lpkg.Imports       // the structure form has only stubs with the ID in the Imports
-			lpkg.Imports = make(map[string]*Package, len(stubs))
-			for importPath, ipkg := range stubs {
-				var importErr error
-				imp := ld.pkgs[ipkg.ID]
-				if imp == nil {
-					// (includes package "C" when DisableCgo)
-					importErr = fmt.Errorf("missing package: %q", ipkg.ID)
-				} else if imp.color == grey {
-					importErr = fmt.Errorf("import cycle: %s", stack)
+			if lpkg.color == white {
+				lpkg.color = grey
+				stack = append(stack, lpkg) // push
+				stubs := lpkg.Imports       // the structure form has only stubs with the ID in the Imports
+				lpkg.Imports = make(map[string]*Package, len(stubs))
+				for importPath, ipkg := range stubs {
+					var importErr error
+					imp := ld.pkgs[ipkg.ID]
+					if imp == nil {
+						// (includes package "C" when DisableCgo)
+						importErr = fmt.Errorf("missing package: %q", ipkg.ID)
+					} else if imp.color == grey {
+						importErr = fmt.Errorf("import cycle: %s", stack)
+					}
+					if importErr != nil {
+						if lpkg.importErrors == nil {
+							lpkg.importErrors = make(map[string]error)
+						}
+						lpkg.importErrors[importPath] = importErr
+						continue
+					}
+
+					if visit(lpkg, imp) {
+						lpkg.needsrc = true
+					}
+					lpkg.Imports[importPath] = imp.Package
 				}
-				if importErr != nil {
-					if lpkg.importErrors == nil {
-						lpkg.importErrors = make(map[string]error)
+
+				// -- postorder --
+
+				// Complete type information is required for the
+				// immediate dependencies of each source package.
+				if lpkg.needsrc && ld.Mode&NeedTypes != 0 {
+					for _, ipkg := range lpkg.Imports {
+						ld.pkgs[ipkg.ID].needtypes = true
 					}
-					lpkg.importErrors[importPath] = importErr
-					continue
 				}
 
-				if visit(imp) {
-					lpkg.needsrc = true
+				// NeedTypeSizes causes TypeSizes to be set even
+				// on packages for which types aren't needed.
+				if ld.Mode&NeedTypesSizes != 0 {
+					lpkg.TypesSizes = ld.sizes
 				}
-				lpkg.Imports[importPath] = imp.Package
-			}
 
-			// Complete type information is required for the
-			// immediate dependencies of each source package.
-			if lpkg.needsrc && ld.Mode&NeedTypes != 0 {
-				for _, ipkg := range lpkg.Imports {
-					ld.pkgs[ipkg.ID].needtypes = true
+				// Add packages with no imports directly to the queue of leaves.
+				if len(lpkg.Imports) == 0 {
+					leaves = append(leaves, lpkg)
 				}
+
+				stack = stack[:len(stack)-1] // pop
+				lpkg.color = black
 			}
 
-			// NeedTypeSizes causes TypeSizes to be set even
-			// on packages for which types aren't needed.
-			if ld.Mode&NeedTypesSizes != 0 {
-				lpkg.TypesSizes = ld.sizes
+			// Add edge from predecessor.
+			if from != nil {
+				from.unfinishedSuccs.Add(+1) // incref
+				lpkg.preds = append(lpkg.preds, from)
 			}
-			stack = stack[:len(stack)-1] // pop
-			lpkg.color = black
 
 			return lpkg.needsrc
 		}
 
 		// For each initial package, create its import DAG.
 		for _, lpkg := range initial {
-			visit(lpkg)
+			visit(nil, lpkg)
 		}
 
 	} else {
@@ -909,16 +931,45 @@ func (ld *loader) refine(response *DriverResponse) ([]*Package, error) {
 
 	// Load type data and syntax if needed, starting at
 	// the initial packages (roots of the import DAG).
-	if ld.Mode&NeedTypes != 0 || ld.Mode&NeedSyntax != 0 {
-		var wg sync.WaitGroup
-		for _, lpkg := range initial {
-			wg.Add(1)
-			go func(lpkg *loaderPackage) {
-				ld.loadRecursive(lpkg)
-				wg.Done()
-			}(lpkg)
+	if ld.Mode&(NeedSyntax|NeedTypes|NeedTypesInfo) != 0 {
+
+		// We avoid using g.SetLimit to limit concurrency as
+		// it makes g.Go stop accepting work, which prevents
+		// workers from enqeuing, and thus finishing, and thus
+		// allowing the group to make progress: deadlock.
+		//
+		// Instead we use the ioLimit and cpuLimit semaphores.
+		g, _ := errgroup.WithContext(ld.Context)
+
+		// enqueues adds a package to the type-checking queue.
+		// It must have no unfinished successors.
+		var enqueue func(*loaderPackage)
+		enqueue = func(lpkg *loaderPackage) {
+			g.Go(func() error {
+				// Parse and type-check.
+				ld.loadPackage(lpkg)
+
+				// Notify each waiting predecessor,
+				// and enqueue it when it becomes a leaf.
+				for _, pred := range lpkg.preds {
+					if pred.unfinishedSuccs.Add(-1) == 0 { // decref
+						enqueue(pred)
+					}
+				}
+
+				return nil
+			})
+		}
+
+		// Load leaves first, adding new packages
+		// to the queue as they become leaves.
+		for _, leaf := range leaves {
+			enqueue(leaf)
+		}
+
+		if err := g.Wait(); err != nil {
+			return nil, err // cancelled
 		}
-		wg.Wait()
 	}
 
 	// If the context is done, return its error and
@@ -965,7 +1016,7 @@ func (ld *loader) refine(response *DriverResponse) ([]*Package, error) {
 		if ld.requestedMode&NeedSyntax == 0 {
 			ld.pkgs[i].Syntax = nil
 		}
-		if ld.requestedMode&NeedTypes == 0 && ld.requestedMode&NeedSyntax == 0 {
+		if ld.requestedMode&(NeedSyntax|NeedTypes|NeedTypesInfo) == 0 {
 			ld.pkgs[i].Fset = nil
 		}
 		if ld.requestedMode&NeedTypesInfo == 0 {
@@ -982,31 +1033,10 @@ func (ld *loader) refine(response *DriverResponse) ([]*Package, error) {
 	return result, nil
 }
 
-// loadRecursive loads the specified package and its dependencies,
-// recursively, in parallel, in topological order.
-// It is atomic and idempotent.
-// Precondition: ld.Mode&NeedTypes.
-func (ld *loader) loadRecursive(lpkg *loaderPackage) {
-	lpkg.loadOnce.Do(func() {
-		// Load the direct dependencies, in parallel.
-		var wg sync.WaitGroup
-		for _, ipkg := range lpkg.Imports {
-			imp := ld.pkgs[ipkg.ID]
-			wg.Add(1)
-			go func(imp *loaderPackage) {
-				ld.loadRecursive(imp)
-				wg.Done()
-			}(imp)
-		}
-		wg.Wait()
-		ld.loadPackage(lpkg)
-	})
-}
-
-// loadPackage loads the specified package.
+// loadPackage loads/parses/typechecks the specified package.
 // It must be called only once per Package,
 // after immediate dependencies are loaded.
-// Precondition: ld.Mode & NeedTypes.
+// Precondition: ld.Mode&(NeedSyntax|NeedTypes|NeedTypesInfo) != 0.
 func (ld *loader) loadPackage(lpkg *loaderPackage) {
 	if lpkg.PkgPath == "unsafe" {
 		// Fill in the blanks to avoid surprises.
@@ -1042,6 +1072,10 @@ func (ld *loader) loadPackage(lpkg *loaderPackage) {
 	if !lpkg.needtypes && !lpkg.needsrc {
 		return
 	}
+
+	// TODO(adonovan): this condition looks wrong:
+	// I think it should be lpkg.needtypes && !lpg.needsrc,
+	// so that NeedSyntax without NeedTypes can be satisfied by export data.
 	if !lpkg.needsrc {
 		if err := ld.loadFromExportData(lpkg); err != nil {
 			lpkg.Errors = append(lpkg.Errors, Error{
@@ -1147,7 +1181,7 @@ func (ld *loader) loadPackage(lpkg *loaderPackage) {
 	}
 
 	lpkg.Syntax = files
-	if ld.Config.Mode&NeedTypes == 0 {
+	if ld.Config.Mode&(NeedTypes|NeedTypesInfo) == 0 {
 		return
 	}
 
@@ -1158,16 +1192,20 @@ func (ld *loader) loadPackage(lpkg *loaderPackage) {
 		return
 	}
 
-	lpkg.TypesInfo = &types.Info{
-		Types:      make(map[ast.Expr]types.TypeAndValue),
-		Defs:       make(map[*ast.Ident]types.Object),
-		Uses:       make(map[*ast.Ident]types.Object),
-		Implicits:  make(map[ast.Node]types.Object),
-		Instances:  make(map[*ast.Ident]types.Instance),
-		Scopes:     make(map[ast.Node]*types.Scope),
-		Selections: make(map[*ast.SelectorExpr]*types.Selection),
+	// Populate TypesInfo only if needed, as it
+	// causes the type checker to work much harder.
+	if ld.Config.Mode&NeedTypesInfo != 0 {
+		lpkg.TypesInfo = &types.Info{
+			Types:        make(map[ast.Expr]types.TypeAndValue),
+			Defs:         make(map[*ast.Ident]types.Object),
+			Uses:         make(map[*ast.Ident]types.Object),
+			Implicits:    make(map[ast.Node]types.Object),
+			Instances:    make(map[*ast.Ident]types.Instance),
+			Scopes:       make(map[ast.Node]*types.Scope),
+			Selections:   make(map[*ast.SelectorExpr]*types.Selection),
+			FileVersions: make(map[*ast.File]string),
+		}
 	}
-	versions.InitFileVersions(lpkg.TypesInfo)
 	lpkg.TypesSizes = ld.sizes
 
 	importer := importerFunc(func(path string) (*types.Package, error) {
@@ -1220,6 +1258,10 @@ func (ld *loader) loadPackage(lpkg *loaderPackage) {
 		}
 	}
 
+	// Type-checking is CPU intensive.
+	cpuLimit <- unit{}            // acquire a token
+	defer func() { <-cpuLimit }() // release a token
+
 	typErr := types.NewChecker(tc, ld.Fset, lpkg.Types, lpkg.TypesInfo).Files(lpkg.Syntax)
 	lpkg.importErrors = nil // no longer needed
 
@@ -1284,8 +1326,11 @@ type importerFunc func(path string) (*types.Package, error)
 func (f importerFunc) Import(path string) (*types.Package, error) { return f(path) }
 
 // We use a counting semaphore to limit
-// the number of parallel I/O calls per process.
-var ioLimit = make(chan bool, 20)
+// the number of parallel I/O calls or CPU threads per process.
+var (
+	ioLimit  = make(chan unit, 20)
+	cpuLimit = make(chan unit, runtime.GOMAXPROCS(0))
+)
 
 func (ld *loader) parseFile(filename string) (*ast.File, error) {
 	ld.parseCacheMu.Lock()
@@ -1302,20 +1347,28 @@ func (ld *loader) parseFile(filename string) (*ast.File, error) {
 
 		var src []byte
 		for f, contents := range ld.Config.Overlay {
+			// TODO(adonovan): Inefficient for large overlays.
+			// Do an exact name-based map lookup
+			// (for nonexistent files) followed by a
+			// FileID-based map lookup (for existing ones).
 			if sameFile(f, filename) {
 				src = contents
+				break
 			}
 		}
 		var err error
 		if src == nil {
-			ioLimit <- true // wait
+			ioLimit <- unit{} // acquire a token
 			src, err = os.ReadFile(filename)
-			<-ioLimit // signal
+			<-ioLimit // release a token
 		}
 		if err != nil {
 			v.err = err
 		} else {
+			// Parsing is CPU intensive.
+			cpuLimit <- unit{} // acquire a token
 			v.f, v.err = ld.ParseFile(ld.Fset, filename, src)
+			<-cpuLimit // release a token
 		}
 
 		close(v.ready)
@@ -1330,18 +1383,21 @@ func (ld *loader) parseFile(filename string) (*ast.File, error) {
 // Because files are scanned in parallel, the token.Pos
 // positions of the resulting ast.Files are not ordered.
 func (ld *loader) parseFiles(filenames []string) ([]*ast.File, []error) {
-	var wg sync.WaitGroup
-	n := len(filenames)
-	parsed := make([]*ast.File, n)
-	errors := make([]error, n)
-	for i, file := range filenames {
-		wg.Add(1)
-		go func(i int, filename string) {
+	var (
+		n      = len(filenames)
+		parsed = make([]*ast.File, n)
+		errors = make([]error, n)
+	)
+	var g errgroup.Group
+	for i, filename := range filenames {
+		// This creates goroutines unnecessarily in the
+		// cache-hit case, but that case is uncommon.
+		g.Go(func() error {
 			parsed[i], errors[i] = ld.parseFile(filename)
-			wg.Done()
-		}(i, file)
+			return nil
+		})
 	}
-	wg.Wait()
+	g.Wait()
 
 	// Eliminate nils, preserving order.
 	var o int
@@ -1512,4 +1568,4 @@ func usesExportData(cfg *Config) bool {
 	return cfg.Mode&NeedExportFile != 0 || cfg.Mode&NeedTypes != 0 && cfg.Mode&NeedDeps == 0
 }
 
-var _ interface{} = io.Discard // assert build toolchain is go1.16 or later
+type unit struct{}
diff --git a/test/performance/vendor/golang.org/x/tools/go/types/objectpath/objectpath.go b/test/performance/vendor/golang.org/x/tools/go/types/objectpath/objectpath.go
index 9ada177758..16ed3c1780 100644
--- a/test/performance/vendor/golang.org/x/tools/go/types/objectpath/objectpath.go
+++ b/test/performance/vendor/golang.org/x/tools/go/types/objectpath/objectpath.go
@@ -228,7 +228,7 @@ func (enc *Encoder) For(obj types.Object) (Path, error) {
 	//    Reject obviously non-viable cases.
 	switch obj := obj.(type) {
 	case *types.TypeName:
-		if _, ok := aliases.Unalias(obj.Type()).(*types.TypeParam); !ok {
+		if _, ok := types.Unalias(obj.Type()).(*types.TypeParam); !ok {
 			// With the exception of type parameters, only package-level type names
 			// have a path.
 			return "", fmt.Errorf("no path for %v", obj)
@@ -280,26 +280,26 @@ func (enc *Encoder) For(obj types.Object) (Path, error) {
 		path = append(path, opType)
 
 		T := o.Type()
-		if alias, ok := T.(*aliases.Alias); ok {
-			if r := findTypeParam(obj, aliases.TypeParams(alias), path, opTypeParam, nil); r != nil {
+		if alias, ok := T.(*types.Alias); ok {
+			if r := findTypeParam(obj, aliases.TypeParams(alias), path, opTypeParam); r != nil {
 				return Path(r), nil
 			}
-			if r := find(obj, aliases.Rhs(alias), append(path, opRhs), nil); r != nil {
+			if r := find(obj, aliases.Rhs(alias), append(path, opRhs)); r != nil {
 				return Path(r), nil
 			}
 
 		} else if tname.IsAlias() {
 			// legacy alias
-			if r := find(obj, T, path, nil); r != nil {
+			if r := find(obj, T, path); r != nil {
 				return Path(r), nil
 			}
 
 		} else if named, ok := T.(*types.Named); ok {
 			// defined (named) type
-			if r := findTypeParam(obj, named.TypeParams(), path, opTypeParam, nil); r != nil {
+			if r := findTypeParam(obj, named.TypeParams(), path, opTypeParam); r != nil {
 				return Path(r), nil
 			}
-			if r := find(obj, named.Underlying(), append(path, opUnderlying), nil); r != nil {
+			if r := find(obj, named.Underlying(), append(path, opUnderlying)); r != nil {
 				return Path(r), nil
 			}
 		}
@@ -312,7 +312,7 @@ func (enc *Encoder) For(obj types.Object) (Path, error) {
 		if _, ok := o.(*types.TypeName); !ok {
 			if o.Exported() {
 				// exported non-type (const, var, func)
-				if r := find(obj, o.Type(), append(path, opType), nil); r != nil {
+				if r := find(obj, o.Type(), append(path, opType)); r != nil {
 					return Path(r), nil
 				}
 			}
@@ -320,7 +320,7 @@ func (enc *Encoder) For(obj types.Object) (Path, error) {
 		}
 
 		// Inspect declared methods of defined types.
-		if T, ok := aliases.Unalias(o.Type()).(*types.Named); ok {
+		if T, ok := types.Unalias(o.Type()).(*types.Named); ok {
 			path = append(path, opType)
 			// The method index here is always with respect
 			// to the underlying go/types data structures,
@@ -332,7 +332,7 @@ func (enc *Encoder) For(obj types.Object) (Path, error) {
 				if m == obj {
 					return Path(path2), nil // found declared method
 				}
-				if r := find(obj, m.Type(), append(path2, opType), nil); r != nil {
+				if r := find(obj, m.Type(), append(path2, opType)); r != nil {
 					return Path(r), nil
 				}
 			}
@@ -447,46 +447,64 @@ func (enc *Encoder) concreteMethod(meth *types.Func) (Path, bool) {
 //
 // The seen map is used to short circuit cycles through type parameters. If
 // nil, it will be allocated as necessary.
-func find(obj types.Object, T types.Type, path []byte, seen map[*types.TypeName]bool) []byte {
+//
+// The seenMethods map is used internally to short circuit cycles through
+// interface methods, such as occur in the following example:
+//
+//	type I interface { f() interface{I} }
+//
+// See golang/go#68046 for details.
+func find(obj types.Object, T types.Type, path []byte) []byte {
+	return (&finder{obj: obj}).find(T, path)
+}
+
+// finder closes over search state for a call to find.
+type finder struct {
+	obj             types.Object             // the sought object
+	seenTParamNames map[*types.TypeName]bool // for cycle breaking through type parameters
+	seenMethods     map[*types.Func]bool     // for cycle breaking through recursive interfaces
+}
+
+func (f *finder) find(T types.Type, path []byte) []byte {
 	switch T := T.(type) {
-	case *aliases.Alias:
-		return find(obj, aliases.Unalias(T), path, seen)
+	case *types.Alias:
+		return f.find(types.Unalias(T), path)
 	case *types.Basic, *types.Named:
 		// Named types belonging to pkg were handled already,
 		// so T must belong to another package. No path.
 		return nil
 	case *types.Pointer:
-		return find(obj, T.Elem(), append(path, opElem), seen)
+		return f.find(T.Elem(), append(path, opElem))
 	case *types.Slice:
-		return find(obj, T.Elem(), append(path, opElem), seen)
+		return f.find(T.Elem(), append(path, opElem))
 	case *types.Array:
-		return find(obj, T.Elem(), append(path, opElem), seen)
+		return f.find(T.Elem(), append(path, opElem))
 	case *types.Chan:
-		return find(obj, T.Elem(), append(path, opElem), seen)
+		return f.find(T.Elem(), append(path, opElem))
 	case *types.Map:
-		if r := find(obj, T.Key(), append(path, opKey), seen); r != nil {
+		if r := f.find(T.Key(), append(path, opKey)); r != nil {
 			return r
 		}
-		return find(obj, T.Elem(), append(path, opElem), seen)
+		return f.find(T.Elem(), append(path, opElem))
 	case *types.Signature:
-		if r := findTypeParam(obj, T.RecvTypeParams(), path, opRecvTypeParam, nil); r != nil {
+		if r := f.findTypeParam(T.RecvTypeParams(), path, opRecvTypeParam); r != nil {
 			return r
 		}
-		if r := findTypeParam(obj, T.TypeParams(), path, opTypeParam, seen); r != nil {
+		if r := f.findTypeParam(T.TypeParams(), path, opTypeParam); r != nil {
 			return r
 		}
-		if r := find(obj, T.Params(), append(path, opParams), seen); r != nil {
+		if r := f.find(T.Params(), append(path, opParams)); r != nil {
 			return r
 		}
-		return find(obj, T.Results(), append(path, opResults), seen)
+		return f.find(T.Results(), append(path, opResults))
 	case *types.Struct:
 		for i := 0; i < T.NumFields(); i++ {
 			fld := T.Field(i)
 			path2 := appendOpArg(path, opField, i)
-			if fld == obj {
+			if fld == f.obj {
 				return path2 // found field var
 			}
-			if r := find(obj, fld.Type(), append(path2, opType), seen); r != nil {
+			if r := f.find(fld.Type(), append(path2, opType)); r != nil {
 				return r
 			}
 		}
@@ -495,10 +513,10 @@ func find(obj types.Object, T types.Type, path []byte, seen map[*types.TypeName]
 		for i := 0; i < T.Len(); i++ {
 			v := T.At(i)
 			path2 := appendOpArg(path, opAt, i)
-			if v == obj {
+			if v == f.obj {
 				return path2 // found param/result var
 			}
-			if r := find(obj, v.Type(), append(path2, opType), seen); r != nil {
+			if r := f.find(v.Type(), append(path2, opType)); r != nil {
 				return r
 			}
 		}
@@ -506,28 +524,35 @@ func find(obj types.Object, T types.Type, path []byte, seen map[*types.TypeName]
 	case *types.Interface:
 		for i := 0; i < T.NumMethods(); i++ {
 			m := T.Method(i)
+			if f.seenMethods[m] {
+				return nil
+			}
 			path2 := appendOpArg(path, opMethod, i)
-			if m == obj {
+			if m == f.obj {
 				return path2 // found interface method
 			}
-			if r := find(obj, m.Type(), append(path2, opType), seen); r != nil {
+			if f.seenMethods == nil {
+				f.seenMethods = make(map[*types.Func]bool)
+			}
+			f.seenMethods[m] = true
+			if r := f.find(m.Type(), append(path2, opType)); r != nil {
 				return r
 			}
 		}
 		return nil
 	case *types.TypeParam:
 		name := T.Obj()
-		if name == obj {
-			return append(path, opObj)
-		}
-		if seen[name] {
+		if f.seenTParamNames[name] {
 			return nil
 		}
-		if seen == nil {
-			seen = make(map[*types.TypeName]bool)
+		if name == f.obj {
+			return append(path, opObj)
 		}
-		seen[name] = true
-		if r := find(obj, T.Constraint(), append(path, opConstraint), seen); r != nil {
+		if f.seenTParamNames == nil {
+			f.seenTParamNames = make(map[*types.TypeName]bool)
+		}
+		f.seenTParamNames[name] = true
+		if r := f.find(T.Constraint(), append(path, opConstraint)); r != nil {
 			return r
 		}
 		return nil
@@ -535,11 +560,15 @@ func find(obj types.Object, T types.Type, path []byte, seen map[*types.TypeName]
 	panic(T)
 }
 
-func findTypeParam(obj types.Object, list *types.TypeParamList, path []byte, op byte, seen map[*types.TypeName]bool) []byte {
+func findTypeParam(obj types.Object, list *types.TypeParamList, path []byte, op byte) []byte {
+	return (&finder{obj: obj}).findTypeParam(list, path, op)
+}
+
+func (f *finder) findTypeParam(list *types.TypeParamList, path []byte, op byte) []byte {
 	for i := 0; i < list.Len(); i++ {
 		tparam := list.At(i)
 		path2 := appendOpArg(path, op, i)
-		if r := find(obj, tparam, path2, seen); r != nil {
+		if r := f.find(tparam, path2); r != nil {
 			return r
 		}
 	}
@@ -626,7 +655,7 @@ func Object(pkg *types.Package, p Path) (types.Object, error) {
 
 		// Inv: t != nil, obj == nil
 
-		t = aliases.Unalias(t)
+		t = types.Unalias(t)
 		switch code {
 		case opElem:
 			hasElem, ok := t.(hasElem) // Pointer, Slice, Array, Chan, Map
@@ -664,7 +693,7 @@ func Object(pkg *types.Package, p Path) (types.Object, error) {
 			t = named.Underlying()
 
 		case opRhs:
-			if alias, ok := t.(*aliases.Alias); ok {
+			if alias, ok := t.(*types.Alias); ok {
 				t = aliases.Rhs(alias)
 			} else if false && aliases.Enabled() {
 				// The Enabled check is too expensive, so for now we
diff --git a/test/performance/vendor/golang.org/x/tools/go/types/typeutil/callee.go b/test/performance/vendor/golang.org/x/tools/go/types/typeutil/callee.go
index 90dc541adf..754380351e 100644
--- a/test/performance/vendor/golang.org/x/tools/go/types/typeutil/callee.go
+++ b/test/performance/vendor/golang.org/x/tools/go/types/typeutil/callee.go
@@ -8,7 +8,6 @@ import (
 	"go/ast"
 	"go/types"
 
-	"golang.org/x/tools/go/ast/astutil"
 	"golang.org/x/tools/internal/typeparams"
 )
 
@@ -17,7 +16,7 @@ import (
 //
 // Functions and methods may potentially have type parameters.
 func Callee(info *types.Info, call *ast.CallExpr) types.Object {
-	fun := astutil.Unparen(call.Fun)
+	fun := ast.Unparen(call.Fun)
 
 	// Look through type instantiation if necessary.
 	isInstance := false
diff --git a/test/performance/vendor/golang.org/x/tools/go/types/typeutil/map.go b/test/performance/vendor/golang.org/x/tools/go/types/typeutil/map.go
index a92f80dd2d..93b3090c68 100644
--- a/test/performance/vendor/golang.org/x/tools/go/types/typeutil/map.go
+++ b/test/performance/vendor/golang.org/x/tools/go/types/typeutil/map.go
@@ -2,31 +2,35 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// Package typeutil defines various utilities for types, such as Map,
-// a mapping from types.Type to any values.
-package typeutil // import "golang.org/x/tools/go/types/typeutil"
+// Package typeutil defines various utilities for types, such as [Map],
+// a hash table that maps [types.Type] to any value.
+package typeutil
 
 import (
 	"bytes"
 	"fmt"
 	"go/types"
-	"reflect"
+	"hash/maphash"
+	"unsafe"
 
-	"golang.org/x/tools/internal/aliases"
 	"golang.org/x/tools/internal/typeparams"
 )
 
 // Map is a hash-table-based mapping from types (types.Type) to
-// arbitrary any values.  The concrete types that implement
+// arbitrary values.  The concrete types that implement
 // the Type interface are pointers.  Since they are not canonicalized,
 // == cannot be used to check for equivalence, and thus we cannot
 // simply use a Go map.
 //
 // Just as with map[K]V, a nil *Map is a valid empty map.
 //
-// Not thread-safe.
+// Read-only map operations ([Map.At], [Map.Len], and so on) may
+// safely be called concurrently.
+//
+// TODO(adonovan): deprecate in favor of https://go.dev/issues/69420
+// and 69559, if the latter proposals for a generic hash-map type and
+// a types.Hash function are accepted.
 type Map struct {
-	hasher Hasher             // shared by many Maps
 	table  map[uint32][]entry // maps hash to bucket; entry.key==nil means unused
 	length int                // number of map entries
 }
@@ -37,35 +41,17 @@ type entry struct {
 	value any
 }
 
-// SetHasher sets the hasher used by Map.
-//
-// All Hashers are functionally equivalent but contain internal state
-// used to cache the results of hashing previously seen types.
-//
-// A single Hasher created by MakeHasher() may be shared among many
-// Maps.  This is recommended if the instances have many keys in
-// common, as it will amortize the cost of hash computation.
-//
-// A Hasher may grow without bound as new types are seen.  Even when a
-// type is deleted from the map, the Hasher never shrinks, since other
-// types in the map may reference the deleted type indirectly.
+// SetHasher has no effect.
 //
-// Hashers are not thread-safe, and read-only operations such as
-// Map.Lookup require updates to the hasher, so a full Mutex lock (not a
-// read-lock) is require around all Map operations if a shared
-// hasher is accessed from multiple threads.
-//
-// If SetHasher is not called, the Map will create a private hasher at
-// the first call to Insert.
-func (m *Map) SetHasher(hasher Hasher) {
-	m.hasher = hasher
-}
+// It is a relic of an optimization that is no longer profitable. Do
+// not use [Hasher], [MakeHasher], or [SetHasher] in new code.
+func (m *Map) SetHasher(Hasher) {}
 
 // Delete removes the entry with the given key, if any.
 // It returns true if the entry was found.
 func (m *Map) Delete(key types.Type) bool {
 	if m != nil && m.table != nil {
-		hash := m.hasher.Hash(key)
+		hash := hash(key)
 		bucket := m.table[hash]
 		for i, e := range bucket {
 			if e.key != nil && types.Identical(key, e.key) {
@@ -84,7 +70,7 @@ func (m *Map) Delete(key types.Type) bool {
 // The result is nil if the entry is not present.
 func (m *Map) At(key types.Type) any {
 	if m != nil && m.table != nil {
-		for _, e := range m.table[m.hasher.Hash(key)] {
+		for _, e := range m.table[hash(key)] {
 			if e.key != nil && types.Identical(key, e.key) {
 				return e.value
 			}
@@ -97,7 +83,7 @@ func (m *Map) At(key types.Type) any {
 // and returns the previous entry, if any.
 func (m *Map) Set(key types.Type, value any) (prev any) {
 	if m.table != nil {
-		hash := m.hasher.Hash(key)
+		hash := hash(key)
 		bucket := m.table[hash]
 		var hole *entry
 		for i, e := range bucket {
@@ -116,10 +102,7 @@ func (m *Map) Set(key types.Type, value any) (prev any) {
 			m.table[hash] = append(bucket, entry{key, value})
 		}
 	} else {
-		if m.hasher.memo == nil {
-			m.hasher = MakeHasher()
-		}
-		hash := m.hasher.Hash(key)
+		hash := hash(key)
 		m.table = map[uint32][]entry{hash: {entry{key, value}}}
 	}
 
@@ -196,53 +179,35 @@ func (m *Map) KeysString() string {
 	return m.toString(false)
 }
 
-////////////////////////////////////////////////////////////////////////
-// Hasher
-
-// A Hasher maps each type to its hash value.
-// For efficiency, a hasher uses memoization; thus its memory
-// footprint grows monotonically over time.
-// Hashers are not thread-safe.
-// Hashers have reference semantics.
-// Call MakeHasher to create a Hasher.
-type Hasher struct {
-	memo map[types.Type]uint32
-
-	// ptrMap records pointer identity.
-	ptrMap map[any]uint32
-
-	// sigTParams holds type parameters from the signature being hashed.
-	// Signatures are considered identical modulo renaming of type parameters, so
-	// within the scope of a signature type the identity of the signature's type
-	// parameters is just their index.
-	//
-	// Since the language does not currently support referring to uninstantiated
-	// generic types or functions, and instantiated signatures do not have type
-	// parameter lists, we should never encounter a second non-empty type
-	// parameter list when hashing a generic signature.
-	sigTParams *types.TypeParamList
-}
+// -- Hasher --
 
-// MakeHasher returns a new Hasher instance.
-func MakeHasher() Hasher {
-	return Hasher{
-		memo:       make(map[types.Type]uint32),
-		ptrMap:     make(map[any]uint32),
-		sigTParams: nil,
-	}
+// hash returns the hash of type t.
+// TODO(adonovan): replace by types.Hash when Go proposal #69420 is accepted.
+func hash(t types.Type) uint32 {
+	return theHasher.Hash(t)
 }
 
+// A Hasher provides a [Hasher.Hash] method to map a type to its hash value.
+// Hashers are stateless, and all are equivalent.
+type Hasher struct{}
+
+var theHasher Hasher
+
+// MakeHasher returns Hasher{}.
+// Hashers are stateless; all are equivalent.
+func MakeHasher() Hasher { return theHasher }
+
 // Hash computes a hash value for the given type t such that
 // Identical(t, t') => Hash(t) == Hash(t').
 func (h Hasher) Hash(t types.Type) uint32 {
-	hash, ok := h.memo[t]
-	if !ok {
-		hash = h.hashFor(t)
-		h.memo[t] = hash
-	}
-	return hash
+	return hasher{inGenericSig: false}.hash(t)
 }
 
+// hasher holds the state of a single Hash traversal: whether we are
+// inside the signature of a generic function; this is used to
+// optimize [hasher.hashTypeParam].
+type hasher struct{ inGenericSig bool }
+
 // hashString computes the Fowler–Noll–Vo hash of s.
 func hashString(s string) uint32 {
 	var h uint32
@@ -253,21 +218,21 @@ func hashString(s string) uint32 {
 	return h
 }
 
-// hashFor computes the hash of t.
-func (h Hasher) hashFor(t types.Type) uint32 {
+// hash computes the hash of t.
+func (h hasher) hash(t types.Type) uint32 {
 	// See Identical for rationale.
 	switch t := t.(type) {
 	case *types.Basic:
 		return uint32(t.Kind())
 
-	case *aliases.Alias:
-		return h.Hash(aliases.Unalias(t))
+	case *types.Alias:
+		return h.hash(types.Unalias(t))
 
 	case *types.Array:
-		return 9043 + 2*uint32(t.Len()) + 3*h.Hash(t.Elem())
+		return 9043 + 2*uint32(t.Len()) + 3*h.hash(t.Elem())
 
 	case *types.Slice:
-		return 9049 + 2*h.Hash(t.Elem())
+		return 9049 + 2*h.hash(t.Elem())
 
 	case *types.Struct:
 		var hash uint32 = 9059
@@ -278,12 +243,12 @@ func (h Hasher) hashFor(t types.Type) uint32 {
 			}
 			hash += hashString(t.Tag(i))
 			hash += hashString(f.Name()) // (ignore f.Pkg)
-			hash += h.Hash(f.Type())
+			hash += h.hash(f.Type())
 		}
 		return hash
 
 	case *types.Pointer:
-		return 9067 + 2*h.Hash(t.Elem())
+		return 9067 + 2*h.hash(t.Elem())
 
 	case *types.Signature:
 		var hash uint32 = 9091
@@ -291,33 +256,11 @@ func (h Hasher) hashFor(t types.Type) uint32 {
 			hash *= 8863
 		}
 
-		// Use a separate hasher for types inside of the signature, where type
-		// parameter identity is modified to be (index, constraint). We must use a
-		// new memo for this hasher as type identity may be affected by this
-		// masking. For example, in func[T any](*T), the identity of *T depends on
-		// whether we are mapping the argument in isolation, or recursively as part
-		// of hashing the signature.
-		//
-		// We should never encounter a generic signature while hashing another
-		// generic signature, but defensively set sigTParams only if h.mask is
-		// unset.
 		tparams := t.TypeParams()
-		if h.sigTParams == nil && tparams.Len() != 0 {
-			h = Hasher{
-				// There may be something more efficient than discarding the existing
-				// memo, but it would require detecting whether types are 'tainted' by
-				// references to type parameters.
-				memo: make(map[types.Type]uint32),
-				// Re-using ptrMap ensures that pointer identity is preserved in this
-				// hasher.
-				ptrMap:     h.ptrMap,
-				sigTParams: tparams,
-			}
-		}
-
-		for i := 0; i < tparams.Len(); i++ {
+		for i := range tparams.Len() {
+			h.inGenericSig = true
 			tparam := tparams.At(i)
-			hash += 7 * h.Hash(tparam.Constraint())
+			hash += 7 * h.hash(tparam.Constraint())
 		}
 
 		return hash + 3*h.hashTuple(t.Params()) + 5*h.hashTuple(t.Results())
@@ -351,17 +294,17 @@ func (h Hasher) hashFor(t types.Type) uint32 {
 		return hash
 
 	case *types.Map:
-		return 9109 + 2*h.Hash(t.Key()) + 3*h.Hash(t.Elem())
+		return 9109 + 2*h.hash(t.Key()) + 3*h.hash(t.Elem())
 
 	case *types.Chan:
-		return 9127 + 2*uint32(t.Dir()) + 3*h.Hash(t.Elem())
+		return 9127 + 2*uint32(t.Dir()) + 3*h.hash(t.Elem())
 
 	case *types.Named:
-		hash := h.hashPtr(t.Obj())
+		hash := h.hashTypeName(t.Obj())
 		targs := t.TypeArgs()
 		for i := 0; i < targs.Len(); i++ {
 			targ := targs.At(i)
-			hash += 2 * h.Hash(targ)
+			hash += 2 * h.hash(targ)
 		}
 		return hash
 
@@ -375,17 +318,17 @@ func (h Hasher) hashFor(t types.Type) uint32 {
 	panic(fmt.Sprintf("%T: %v", t, t))
 }
 
-func (h Hasher) hashTuple(tuple *types.Tuple) uint32 {
+func (h hasher) hashTuple(tuple *types.Tuple) uint32 {
 	// See go/types.identicalTypes for rationale.
 	n := tuple.Len()
 	hash := 9137 + 2*uint32(n)
-	for i := 0; i < n; i++ {
-		hash += 3 * h.Hash(tuple.At(i).Type())
+	for i := range n {
+		hash += 3 * h.hash(tuple.At(i).Type())
 	}
 	return hash
 }
 
-func (h Hasher) hashUnion(t *types.Union) uint32 {
+func (h hasher) hashUnion(t *types.Union) uint32 {
 	// Hash type restrictions.
 	terms, err := typeparams.UnionTermSet(t)
 	// if err != nil t has invalid type restrictions. Fall back on a non-zero
@@ -396,11 +339,11 @@ func (h Hasher) hashUnion(t *types.Union) uint32 {
 	return h.hashTermSet(terms)
 }
 
-func (h Hasher) hashTermSet(terms []*types.Term) uint32 {
+func (h hasher) hashTermSet(terms []*types.Term) uint32 {
 	hash := 9157 + 2*uint32(len(terms))
 	for _, term := range terms {
 		// term order is not significant.
-		termHash := h.Hash(term.Type())
+		termHash := h.hash(term.Type())
 		if term.Tilde() {
 			termHash *= 9161
 		}
@@ -409,36 +352,42 @@ func (h Hasher) hashTermSet(terms []*types.Term) uint32 {
 	return hash
 }
 
-// hashTypeParam returns a hash of the type parameter t, with a hash value
-// depending on whether t is contained in h.sigTParams.
-//
-// If h.sigTParams is set and contains t, then we are in the process of hashing
-// a signature, and the hash value of t must depend only on t's index and
-// constraint: signatures are considered identical modulo type parameter
-// renaming. To avoid infinite recursion, we only hash the type parameter
-// index, and rely on types.Identical to handle signatures where constraints
-// are not identical.
-//
-// Otherwise the hash of t depends only on t's pointer identity.
-func (h Hasher) hashTypeParam(t *types.TypeParam) uint32 {
-	if h.sigTParams != nil {
-		i := t.Index()
-		if i >= 0 && i < h.sigTParams.Len() && t == h.sigTParams.At(i) {
-			return 9173 + 3*uint32(i)
-		}
+// hashTypeParam returns the hash of a type parameter.
+func (h hasher) hashTypeParam(t *types.TypeParam) uint32 {
+	// Within the signature of a generic function, TypeParams are
+	// identical if they have the same index and constraint, so we
+	// hash them based on index.
+	//
+	// When we are outside a generic function, free TypeParams are
+	// identical iff they are the same object, so we can use a
+	// more discriminating hash consistent with object identity.
+	// This optimization saves [Map] about 4% when hashing all the
+	// types.Info.Types in the forward closure of net/http.
+	if !h.inGenericSig {
+		// Optimization: outside a generic function signature,
+		// use a more discrimating hash consistent with object identity.
+		return h.hashTypeName(t.Obj())
 	}
-	return h.hashPtr(t.Obj())
+	return 9173 + 3*uint32(t.Index())
 }
 
-// hashPtr hashes the pointer identity of ptr. It uses h.ptrMap to ensure that
-// pointers values are not dependent on the GC.
-func (h Hasher) hashPtr(ptr any) uint32 {
-	if hash, ok := h.ptrMap[ptr]; ok {
-		return hash
-	}
-	hash := uint32(reflect.ValueOf(ptr).Pointer())
-	h.ptrMap[ptr] = hash
-	return hash
+var theSeed = maphash.MakeSeed()
+
+// hashTypeName hashes the pointer of tname.
+func (hasher) hashTypeName(tname *types.TypeName) uint32 {
+	// Since types.Identical uses == to compare TypeNames,
+	// the Hash function uses maphash.Comparable.
+	// TODO(adonovan): or will, when it becomes available in go1.24.
+	// In the meantime we use the pointer's numeric value.
+	//
+	//   hash := maphash.Comparable(theSeed, tname)
+	//
+	// (Another approach would be to hash the name and package
+	// path, and whether or not it is a package-level typename. It
+	// is rare for a package to define multiple local types with
+	// the same name.)
+	hash := uintptr(unsafe.Pointer(tname))
+	return uint32(hash ^ (hash >> 32))
 }
 
 // shallowHash computes a hash of t without looking at any of its
@@ -455,14 +404,14 @@ func (h Hasher) hashPtr(ptr any) uint32 {
 // include m itself; there is no mention of the named type X that
 // might help us break the cycle.
 // (See comment in go/types.identical, case *Interface, for more.)
-func (h Hasher) shallowHash(t types.Type) uint32 {
+func (h hasher) shallowHash(t types.Type) uint32 {
 	// t is the type of an interface method (Signature),
 	// its params or results (Tuples), or their immediate
 	// elements (mostly Slice, Pointer, Basic, Named),
 	// so there's no need to optimize anything else.
 	switch t := t.(type) {
-	case *aliases.Alias:
-		return h.shallowHash(aliases.Unalias(t))
+	case *types.Alias:
+		return h.shallowHash(types.Unalias(t))
 
 	case *types.Signature:
 		var hash uint32 = 604171
@@ -476,7 +425,7 @@ func (h Hasher) shallowHash(t types.Type) uint32 {
 	case *types.Tuple:
 		n := t.Len()
 		hash := 9137 + 2*uint32(n)
-		for i := 0; i < n; i++ {
+		for i := range n {
 			hash += 53471161 * h.shallowHash(t.At(i).Type())
 		}
 		return hash
@@ -509,10 +458,10 @@ func (h Hasher) shallowHash(t types.Type) uint32 {
 		return 9127
 
 	case *types.Named:
-		return h.hashPtr(t.Obj())
+		return h.hashTypeName(t.Obj())
 
 	case *types.TypeParam:
-		return h.hashPtr(t.Obj())
+		return h.hashTypeParam(t)
 	}
 	panic(fmt.Sprintf("shallowHash: %T: %v", t, t))
 }
diff --git a/test/performance/vendor/golang.org/x/tools/go/types/typeutil/methodsetcache.go b/test/performance/vendor/golang.org/x/tools/go/types/typeutil/methodsetcache.go
index bd71aafaaa..f7666028fe 100644
--- a/test/performance/vendor/golang.org/x/tools/go/types/typeutil/methodsetcache.go
+++ b/test/performance/vendor/golang.org/x/tools/go/types/typeutil/methodsetcache.go
@@ -9,8 +9,6 @@ package typeutil
 import (
 	"go/types"
 	"sync"
-
-	"golang.org/x/tools/internal/aliases"
 )
 
 // A MethodSetCache records the method set of each type T for which
@@ -34,12 +32,12 @@ func (cache *MethodSetCache) MethodSet(T types.Type) *types.MethodSet {
 	cache.mu.Lock()
 	defer cache.mu.Unlock()
 
-	switch T := aliases.Unalias(T).(type) {
+	switch T := types.Unalias(T).(type) {
 	case *types.Named:
 		return cache.lookupNamed(T).value
 
 	case *types.Pointer:
-		if N, ok := aliases.Unalias(T.Elem()).(*types.Named); ok {
+		if N, ok := types.Unalias(T.Elem()).(*types.Named); ok {
 			return cache.lookupNamed(N).pointer
 		}
 	}
diff --git a/test/performance/vendor/golang.org/x/tools/go/types/typeutil/ui.go b/test/performance/vendor/golang.org/x/tools/go/types/typeutil/ui.go
index a0c1a60ac0..9dda6a25df 100644
--- a/test/performance/vendor/golang.org/x/tools/go/types/typeutil/ui.go
+++ b/test/performance/vendor/golang.org/x/tools/go/types/typeutil/ui.go
@@ -8,8 +8,6 @@ package typeutil
 
 import (
 	"go/types"
-
-	"golang.org/x/tools/internal/aliases"
 )
 
 // IntuitiveMethodSet returns the intuitive method set of a type T,
@@ -28,7 +26,7 @@ import (
 // The order of the result is as for types.MethodSet(T).
 func IntuitiveMethodSet(T types.Type, msets *MethodSetCache) []*types.Selection {
 	isPointerToConcrete := func(T types.Type) bool {
-		ptr, ok := aliases.Unalias(T).(*types.Pointer)
+		ptr, ok := types.Unalias(T).(*types.Pointer)
 		return ok && !types.IsInterface(ptr.Elem())
 	}
 
diff --git a/test/performance/vendor/golang.org/x/tools/internal/aliases/aliases.go b/test/performance/vendor/golang.org/x/tools/internal/aliases/aliases.go
index f7798e3354..b9425f5a20 100644
--- a/test/performance/vendor/golang.org/x/tools/internal/aliases/aliases.go
+++ b/test/performance/vendor/golang.org/x/tools/internal/aliases/aliases.go
@@ -28,7 +28,7 @@ import (
 func NewAlias(enabled bool, pos token.Pos, pkg *types.Package, name string, rhs types.Type, tparams []*types.TypeParam) *types.TypeName {
 	if enabled {
 		tname := types.NewTypeName(pos, pkg, name, nil)
-		newAlias(tname, rhs, tparams)
+		SetTypeParams(types.NewAlias(tname, rhs), tparams)
 		return tname
 	}
 	if len(tparams) > 0 {
diff --git a/test/performance/vendor/golang.org/x/tools/internal/aliases/aliases_go121.go b/test/performance/vendor/golang.org/x/tools/internal/aliases/aliases_go121.go
deleted file mode 100644
index a775fcc4be..0000000000
--- a/test/performance/vendor/golang.org/x/tools/internal/aliases/aliases_go121.go
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2024 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 !go1.22
-// +build !go1.22
-
-package aliases
-
-import (
-	"go/types"
-)
-
-// Alias is a placeholder for a go/types.Alias for <=1.21.
-// It will never be created by go/types.
-type Alias struct{}
-
-func (*Alias) String() string                                { panic("unreachable") }
-func (*Alias) Underlying() types.Type                        { panic("unreachable") }
-func (*Alias) Obj() *types.TypeName                          { panic("unreachable") }
-func Rhs(alias *Alias) types.Type                            { panic("unreachable") }
-func TypeParams(alias *Alias) *types.TypeParamList           { panic("unreachable") }
-func SetTypeParams(alias *Alias, tparams []*types.TypeParam) { panic("unreachable") }
-func TypeArgs(alias *Alias) *types.TypeList                  { panic("unreachable") }
-func Origin(alias *Alias) *Alias                             { panic("unreachable") }
-
-// Unalias returns the type t for go <=1.21.
-func Unalias(t types.Type) types.Type { return t }
-
-func newAlias(name *types.TypeName, rhs types.Type, tparams []*types.TypeParam) *Alias {
-	panic("unreachable")
-}
-
-// Enabled reports whether [NewAlias] should create [types.Alias] types.
-//
-// Before go1.22, this function always returns false.
-func Enabled() bool { return false }
diff --git a/test/performance/vendor/golang.org/x/tools/internal/aliases/aliases_go122.go b/test/performance/vendor/golang.org/x/tools/internal/aliases/aliases_go122.go
index 31c159e42e..7716a3331d 100644
--- a/test/performance/vendor/golang.org/x/tools/internal/aliases/aliases_go122.go
+++ b/test/performance/vendor/golang.org/x/tools/internal/aliases/aliases_go122.go
@@ -2,9 +2,6 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build go1.22
-// +build go1.22
-
 package aliases
 
 import (
@@ -14,22 +11,19 @@ import (
 	"go/types"
 )
 
-// Alias is an alias of types.Alias.
-type Alias = types.Alias
-
 // Rhs returns the type on the right-hand side of the alias declaration.
-func Rhs(alias *Alias) types.Type {
+func Rhs(alias *types.Alias) types.Type {
 	if alias, ok := any(alias).(interface{ Rhs() types.Type }); ok {
 		return alias.Rhs() // go1.23+
 	}
 
 	// go1.22's Alias didn't have the Rhs method,
 	// so Unalias is the best we can do.
-	return Unalias(alias)
+	return types.Unalias(alias)
 }
 
 // TypeParams returns the type parameter list of the alias.
-func TypeParams(alias *Alias) *types.TypeParamList {
+func TypeParams(alias *types.Alias) *types.TypeParamList {
 	if alias, ok := any(alias).(interface{ TypeParams() *types.TypeParamList }); ok {
 		return alias.TypeParams() // go1.23+
 	}
@@ -37,7 +31,7 @@ func TypeParams(alias *Alias) *types.TypeParamList {
 }
 
 // SetTypeParams sets the type parameters of the alias type.
-func SetTypeParams(alias *Alias, tparams []*types.TypeParam) {
+func SetTypeParams(alias *types.Alias, tparams []*types.TypeParam) {
 	if alias, ok := any(alias).(interface {
 		SetTypeParams(tparams []*types.TypeParam)
 	}); ok {
@@ -48,7 +42,7 @@ func SetTypeParams(alias *Alias, tparams []*types.TypeParam) {
 }
 
 // TypeArgs returns the type arguments used to instantiate the Alias type.
-func TypeArgs(alias *Alias) *types.TypeList {
+func TypeArgs(alias *types.Alias) *types.TypeList {
 	if alias, ok := any(alias).(interface{ TypeArgs() *types.TypeList }); ok {
 		return alias.TypeArgs() // go1.23+
 	}
@@ -57,25 +51,13 @@ func TypeArgs(alias *Alias) *types.TypeList {
 
 // Origin returns the generic Alias type of which alias is an instance.
 // If alias is not an instance of a generic alias, Origin returns alias.
-func Origin(alias *Alias) *Alias {
+func Origin(alias *types.Alias) *types.Alias {
 	if alias, ok := any(alias).(interface{ Origin() *types.Alias }); ok {
 		return alias.Origin() // go1.23+
 	}
 	return alias // not an instance of a generic alias (go1.22)
 }
 
-// Unalias is a wrapper of types.Unalias.
-func Unalias(t types.Type) types.Type { return types.Unalias(t) }
-
-// newAlias is an internal alias around types.NewAlias.
-// Direct usage is discouraged as the moment.
-// Try to use NewAlias instead.
-func newAlias(tname *types.TypeName, rhs types.Type, tparams []*types.TypeParam) *Alias {
-	a := types.NewAlias(tname, rhs)
-	SetTypeParams(a, tparams)
-	return a
-}
-
 // Enabled reports whether [NewAlias] should create [types.Alias] types.
 //
 // This function is expensive! Call it sparingly.
@@ -91,7 +73,7 @@ func Enabled() bool {
 	//     many tests. Therefore any attempt to cache the result
 	//     is just incorrect.
 	fset := token.NewFileSet()
-	f, _ := parser.ParseFile(fset, "a.go", "package p; type A = int", 0)
+	f, _ := parser.ParseFile(fset, "a.go", "package p; type A = int", parser.SkipObjectResolution)
 	pkg, _ := new(types.Config).Check("p", fset, []*ast.File{f}, nil)
 	_, enabled := pkg.Scope().Lookup("A").Type().(*types.Alias)
 	return enabled
diff --git a/test/performance/vendor/golang.org/x/tools/internal/gcimporter/bimport.go b/test/performance/vendor/golang.org/x/tools/internal/gcimporter/bimport.go
index d98b0db2a9..d79a605ed1 100644
--- a/test/performance/vendor/golang.org/x/tools/internal/gcimporter/bimport.go
+++ b/test/performance/vendor/golang.org/x/tools/internal/gcimporter/bimport.go
@@ -87,64 +87,3 @@ func chanDir(d int) types.ChanDir {
 		return 0
 	}
 }
-
-var predeclOnce sync.Once
-var predecl []types.Type // initialized lazily
-
-func predeclared() []types.Type {
-	predeclOnce.Do(func() {
-		// initialize lazily to be sure that all
-		// elements have been initialized before
-		predecl = []types.Type{ // basic types
-			types.Typ[types.Bool],
-			types.Typ[types.Int],
-			types.Typ[types.Int8],
-			types.Typ[types.Int16],
-			types.Typ[types.Int32],
-			types.Typ[types.Int64],
-			types.Typ[types.Uint],
-			types.Typ[types.Uint8],
-			types.Typ[types.Uint16],
-			types.Typ[types.Uint32],
-			types.Typ[types.Uint64],
-			types.Typ[types.Uintptr],
-			types.Typ[types.Float32],
-			types.Typ[types.Float64],
-			types.Typ[types.Complex64],
-			types.Typ[types.Complex128],
-			types.Typ[types.String],
-
-			// basic type aliases
-			types.Universe.Lookup("byte").Type(),
-			types.Universe.Lookup("rune").Type(),
-
-			// error
-			types.Universe.Lookup("error").Type(),
-
-			// untyped types
-			types.Typ[types.UntypedBool],
-			types.Typ[types.UntypedInt],
-			types.Typ[types.UntypedRune],
-			types.Typ[types.UntypedFloat],
-			types.Typ[types.UntypedComplex],
-			types.Typ[types.UntypedString],
-			types.Typ[types.UntypedNil],
-
-			// package unsafe
-			types.Typ[types.UnsafePointer],
-
-			// invalid type
-			types.Typ[types.Invalid], // only appears in packages with errors
-
-			// used internally by gc; never used by this package or in .a files
-			anyType{},
-		}
-		predecl = append(predecl, additionalPredeclared()...)
-	})
-	return predecl
-}
-
-type anyType struct{}
-
-func (t anyType) Underlying() types.Type { return t }
-func (t anyType) String() string         { return "any" }
diff --git a/test/performance/vendor/golang.org/x/tools/internal/gcimporter/exportdata.go b/test/performance/vendor/golang.org/x/tools/internal/gcimporter/exportdata.go
index f6437feb1c..5662a311da 100644
--- a/test/performance/vendor/golang.org/x/tools/internal/gcimporter/exportdata.go
+++ b/test/performance/vendor/golang.org/x/tools/internal/gcimporter/exportdata.go
@@ -2,49 +2,183 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// This file is a copy of $GOROOT/src/go/internal/gcimporter/exportdata.go.
-
-// This file implements FindExportData.
+// This file should be kept in sync with $GOROOT/src/internal/exportdata/exportdata.go.
+// This file also additionally implements FindExportData for gcexportdata.NewReader.
 
 package gcimporter
 
 import (
 	"bufio"
+	"bytes"
+	"errors"
 	"fmt"
+	"go/build"
 	"io"
-	"strconv"
+	"os"
+	"os/exec"
+	"path/filepath"
 	"strings"
+	"sync"
 )
 
-func readGopackHeader(r *bufio.Reader) (name string, size int64, err error) {
-	// See $GOROOT/include/ar.h.
-	hdr := make([]byte, 16+12+6+6+8+10+2)
-	_, err = io.ReadFull(r, hdr)
+// FindExportData positions the reader r at the beginning of the
+// export data section of an underlying cmd/compile created archive
+// file by reading from it. The reader must be positioned at the
+// start of the file before calling this function.
+// This returns the length of the export data in bytes.
+//
+// This function is needed by [gcexportdata.Read], which must
+// accept inputs produced by the last two releases of cmd/compile,
+// plus tip.
+func FindExportData(r *bufio.Reader) (size int64, err error) {
+	arsize, err := FindPackageDefinition(r)
+	if err != nil {
+		return
+	}
+	size = int64(arsize)
+
+	objapi, headers, err := ReadObjectHeaders(r)
 	if err != nil {
 		return
 	}
-	// leave for debugging
-	if false {
-		fmt.Printf("header: %s", hdr)
+	size -= int64(len(objapi))
+	for _, h := range headers {
+		size -= int64(len(h))
+	}
+
+	// Check for the binary export data section header "$$B\n".
+	// TODO(taking): Unify with ReadExportDataHeader so that it stops at the 'u' instead of reading
+	line, err := r.ReadSlice('\n')
+	if err != nil {
+		return
+	}
+	hdr := string(line)
+	if hdr != "$$B\n" {
+		err = fmt.Errorf("unknown export data header: %q", hdr)
+		return
 	}
-	s := strings.TrimSpace(string(hdr[16+12+6+6+8:][:10]))
-	length, err := strconv.Atoi(s)
-	size = int64(length)
-	if err != nil || hdr[len(hdr)-2] != '`' || hdr[len(hdr)-1] != '\n' {
-		err = fmt.Errorf("invalid archive header")
+	size -= int64(len(hdr))
+
+	// For files with a binary export data header "$$B\n",
+	// these are always terminated by an end-of-section marker "\n$$\n".
+	// So the last bytes must always be this constant.
+	//
+	// The end-of-section marker is not a part of the export data itself.
+	// Do not include these in size.
+	//
+	// It would be nice to have sanity check that the final bytes after
+	// the export data are indeed the end-of-section marker. The split
+	// of gcexportdata.NewReader and gcexportdata.Read make checking this
+	// ugly so gcimporter gives up enforcing this. The compiler and go/types
+	// importer do enforce this, which seems good enough.
+	const endofsection = "\n$$\n"
+	size -= int64(len(endofsection))
+
+	if size < 0 {
+		err = fmt.Errorf("invalid size (%d) in the archive file: %d bytes remain without section headers (recompile package)", arsize, size)
 		return
 	}
-	name = strings.TrimSpace(string(hdr[:16]))
+
 	return
 }
 
-// FindExportData positions the reader r at the beginning of the
-// export data section of an underlying GC-created object/archive
-// file by reading from it. The reader must be positioned at the
-// start of the file before calling this function. The hdr result
-// is the string before the export data, either "$$" or "$$B".
-// The size result is the length of the export data in bytes, or -1 if not known.
-func FindExportData(r *bufio.Reader) (hdr string, size int64, err error) {
+// ReadUnified reads the contents of the unified export data from a reader r
+// that contains the contents of a GC-created archive file.
+//
+// On success, the reader will be positioned after the end-of-section marker "\n$$\n".
+//
+// Supported GC-created archive files have 4 layers of nesting:
+//   - An archive file containing a package definition file.
+//   - The package definition file contains headers followed by a data section.
+//     Headers are lines (≤ 4kb) that do not start with "$$".
+//   - The data section starts with "$$B\n" followed by export data followed
+//     by an end of section marker "\n$$\n". (The section start "$$\n" is no
+//     longer supported.)
+//   - The export data starts with a format byte ('u') followed by the  in
+//     the given format. (See ReadExportDataHeader for older formats.)
+//
+// Putting this together, the bytes in a GC-created archive files are expected
+// to look like the following.
+// See cmd/internal/archive for more details on ar file headers.
+//
+// | \n             | ar file signature
+// | __.PKGDEF...size...\n | ar header for __.PKGDEF including size.
+// | go object <...>\n     | objabi header
+// | \n  | other headers such as build id
+// | $$B\n                 | binary format marker
+// | u\n             | unified export 
+// | $$\n                  | end-of-section marker
+// | [optional padding]    | padding byte (0x0A) if size is odd
+// | [ar file header]      | other ar files
+// | [ar file data]        |
+func ReadUnified(r *bufio.Reader) (data []byte, err error) {
+	// We historically guaranteed headers at the default buffer size (4096) work.
+	// This ensures we can use ReadSlice throughout.
+	const minBufferSize = 4096
+	r = bufio.NewReaderSize(r, minBufferSize)
+
+	size, err := FindPackageDefinition(r)
+	if err != nil {
+		return
+	}
+	n := size
+
+	objapi, headers, err := ReadObjectHeaders(r)
+	if err != nil {
+		return
+	}
+	n -= len(objapi)
+	for _, h := range headers {
+		n -= len(h)
+	}
+
+	hdrlen, err := ReadExportDataHeader(r)
+	if err != nil {
+		return
+	}
+	n -= hdrlen
+
+	// size also includes the end of section marker. Remove that many bytes from the end.
+	const marker = "\n$$\n"
+	n -= len(marker)
+
+	if n < 0 {
+		err = fmt.Errorf("invalid size (%d) in the archive file: %d bytes remain without section headers (recompile package)", size, n)
+		return
+	}
+
+	// Read n bytes from buf.
+	data = make([]byte, n)
+	_, err = io.ReadFull(r, data)
+	if err != nil {
+		return
+	}
+
+	// Check for marker at the end.
+	var suffix [len(marker)]byte
+	_, err = io.ReadFull(r, suffix[:])
+	if err != nil {
+		return
+	}
+	if s := string(suffix[:]); s != marker {
+		err = fmt.Errorf("read %q instead of end-of-section marker (%q)", s, marker)
+		return
+	}
+
+	return
+}
+
+// FindPackageDefinition positions the reader r at the beginning of a package
+// definition file ("__.PKGDEF") within a GC-created archive by reading
+// from it, and returns the size of the package definition file in the archive.
+//
+// The reader must be positioned at the start of the archive file before calling
+// this function, and "__.PKGDEF" is assumed to be the first file in the archive.
+//
+// See cmd/internal/archive for details on the archive format.
+func FindPackageDefinition(r *bufio.Reader) (size int, err error) {
+	// Uses ReadSlice to limit risk of malformed inputs.
+
 	// Read first line to make sure this is an object file.
 	line, err := r.ReadSlice('\n')
 	if err != nil {
@@ -52,48 +186,236 @@ func FindExportData(r *bufio.Reader) (hdr string, size int64, err error) {
 		return
 	}
 
-	if string(line) == "!\n" {
-		// Archive file. Scan to __.PKGDEF.
-		var name string
-		if name, size, err = readGopackHeader(r); err != nil {
-			return
-		}
+	// Is the first line an archive file signature?
+	if string(line) != "!\n" {
+		err = fmt.Errorf("not the start of an archive file (%q)", line)
+		return
+	}
+
+	// package export block should be first
+	size = readArchiveHeader(r, "__.PKGDEF")
+	if size <= 0 {
+		err = fmt.Errorf("not a package file")
+		return
+	}
+
+	return
+}
 
-		// First entry should be __.PKGDEF.
-		if name != "__.PKGDEF" {
-			err = fmt.Errorf("go archive is missing __.PKGDEF")
+// ReadObjectHeaders reads object headers from the reader. Object headers are
+// lines that do not start with an end-of-section marker "$$". The first header
+// is the objabi header. On success, the reader will be positioned at the beginning
+// of the end-of-section marker.
+//
+// It returns an error if any header does not fit in r.Size() bytes.
+func ReadObjectHeaders(r *bufio.Reader) (objapi string, headers []string, err error) {
+	// line is a temporary buffer for headers.
+	// Use bounded reads (ReadSlice, Peek) to limit risk of malformed inputs.
+	var line []byte
+
+	// objapi header should be the first line
+	if line, err = r.ReadSlice('\n'); err != nil {
+		err = fmt.Errorf("can't find export data (%v)", err)
+		return
+	}
+	objapi = string(line)
+
+	// objapi header begins with "go object ".
+	if !strings.HasPrefix(objapi, "go object ") {
+		err = fmt.Errorf("not a go object file: %s", objapi)
+		return
+	}
+
+	// process remaining object header lines
+	for {
+		// check for an end of section marker "$$"
+		line, err = r.Peek(2)
+		if err != nil {
 			return
 		}
+		if string(line) == "$$" {
+			return // stop
+		}
 
-		// Read first line of __.PKGDEF data, so that line
-		// is once again the first line of the input.
-		if line, err = r.ReadSlice('\n'); err != nil {
-			err = fmt.Errorf("can't find export data (%v)", err)
+		// read next header
+		line, err = r.ReadSlice('\n')
+		if err != nil {
 			return
 		}
-		size -= int64(len(line))
+		headers = append(headers, string(line))
 	}
+}
 
-	// Now at __.PKGDEF in archive or still at beginning of file.
-	// Either way, line should begin with "go object ".
-	if !strings.HasPrefix(string(line), "go object ") {
-		err = fmt.Errorf("not a Go object file")
+// ReadExportDataHeader reads the export data header and format from r.
+// It returns the number of bytes read, or an error if the format is no longer
+// supported or it failed to read.
+//
+// The only currently supported format is binary export data in the
+// unified export format.
+func ReadExportDataHeader(r *bufio.Reader) (n int, err error) {
+	// Read export data header.
+	line, err := r.ReadSlice('\n')
+	if err != nil {
 		return
 	}
 
-	// Skip over object header to export data.
-	// Begins after first line starting with $$.
-	for line[0] != '$' {
-		if line, err = r.ReadSlice('\n'); err != nil {
-			err = fmt.Errorf("can't find export data (%v)", err)
+	hdr := string(line)
+	switch hdr {
+	case "$$\n":
+		err = fmt.Errorf("old textual export format no longer supported (recompile package)")
+		return
+
+	case "$$B\n":
+		var format byte
+		format, err = r.ReadByte()
+		if err != nil {
 			return
 		}
-		size -= int64(len(line))
-	}
-	hdr = string(line)
-	if size < 0 {
-		size = -1
+		// The unified export format starts with a 'u'.
+		switch format {
+		case 'u':
+		default:
+			// Older no longer supported export formats include:
+			// indexed export format which started with an 'i'; and
+			// the older binary export format which started with a 'c',
+			// 'd', or 'v' (from "version").
+			err = fmt.Errorf("binary export format %q is no longer supported (recompile package)", format)
+			return
+		}
+
+	default:
+		err = fmt.Errorf("unknown export data header: %q", hdr)
+		return
 	}
 
+	n = len(hdr) + 1 // + 1 is for 'u'
 	return
 }
+
+// FindPkg returns the filename and unique package id for an import
+// path based on package information provided by build.Import (using
+// the build.Default build.Context). A relative srcDir is interpreted
+// relative to the current working directory.
+//
+// FindPkg is only used in tests within x/tools.
+func FindPkg(path, srcDir string) (filename, id string, err error) {
+	// TODO(taking): Move internal/exportdata.FindPkg into its own file,
+	// and then this copy into a _test package.
+	if path == "" {
+		return "", "", errors.New("path is empty")
+	}
+
+	var noext string
+	switch {
+	default:
+		// "x" -> "$GOPATH/pkg/$GOOS_$GOARCH/x.ext", "x"
+		// Don't require the source files to be present.
+		if abs, err := filepath.Abs(srcDir); err == nil { // see issue 14282
+			srcDir = abs
+		}
+		var bp *build.Package
+		bp, err = build.Import(path, srcDir, build.FindOnly|build.AllowBinary)
+		if bp.PkgObj == "" {
+			if bp.Goroot && bp.Dir != "" {
+				filename, err = lookupGorootExport(bp.Dir)
+				if err == nil {
+					_, err = os.Stat(filename)
+				}
+				if err == nil {
+					return filename, bp.ImportPath, nil
+				}
+			}
+			goto notfound
+		} else {
+			noext = strings.TrimSuffix(bp.PkgObj, ".a")
+		}
+		id = bp.ImportPath
+
+	case build.IsLocalImport(path):
+		// "./x" -> "/this/directory/x.ext", "/this/directory/x"
+		noext = filepath.Join(srcDir, path)
+		id = noext
+
+	case filepath.IsAbs(path):
+		// for completeness only - go/build.Import
+		// does not support absolute imports
+		// "/x" -> "/x.ext", "/x"
+		noext = path
+		id = path
+	}
+
+	if false { // for debugging
+		if path != id {
+			fmt.Printf("%s -> %s\n", path, id)
+		}
+	}
+
+	// try extensions
+	for _, ext := range pkgExts {
+		filename = noext + ext
+		f, statErr := os.Stat(filename)
+		if statErr == nil && !f.IsDir() {
+			return filename, id, nil
+		}
+		if err == nil {
+			err = statErr
+		}
+	}
+
+notfound:
+	if err == nil {
+		return "", path, fmt.Errorf("can't find import: %q", path)
+	}
+	return "", path, fmt.Errorf("can't find import: %q: %w", path, err)
+}
+
+var pkgExts = [...]string{".a", ".o"} // a file from the build cache will have no extension
+
+var exportMap sync.Map // package dir → func() (string, error)
+
+// lookupGorootExport returns the location of the export data
+// (normally found in the build cache, but located in GOROOT/pkg
+// in prior Go releases) for the package located in pkgDir.
+//
+// (We use the package's directory instead of its import path
+// mainly to simplify handling of the packages in src/vendor
+// and cmd/vendor.)
+//
+// lookupGorootExport is only used in tests within x/tools.
+func lookupGorootExport(pkgDir string) (string, error) {
+	f, ok := exportMap.Load(pkgDir)
+	if !ok {
+		var (
+			listOnce   sync.Once
+			exportPath string
+			err        error
+		)
+		f, _ = exportMap.LoadOrStore(pkgDir, func() (string, error) {
+			listOnce.Do(func() {
+				cmd := exec.Command(filepath.Join(build.Default.GOROOT, "bin", "go"), "list", "-export", "-f", "{{.Export}}", pkgDir)
+				cmd.Dir = build.Default.GOROOT
+				cmd.Env = append(os.Environ(), "PWD="+cmd.Dir, "GOROOT="+build.Default.GOROOT)
+				var output []byte
+				output, err = cmd.Output()
+				if err != nil {
+					if ee, ok := err.(*exec.ExitError); ok && len(ee.Stderr) > 0 {
+						err = errors.New(string(ee.Stderr))
+					}
+					return
+				}
+
+				exports := strings.Split(string(bytes.TrimSpace(output)), "\n")
+				if len(exports) != 1 {
+					err = fmt.Errorf("go list reported %d exports; expected 1", len(exports))
+					return
+				}
+
+				exportPath = exports[0]
+			})
+
+			return exportPath, err
+		})
+	}
+
+	return f.(func() (string, error))()
+}
diff --git a/test/performance/vendor/golang.org/x/tools/internal/gcimporter/gcimporter.go b/test/performance/vendor/golang.org/x/tools/internal/gcimporter/gcimporter.go
index 39df91124a..3dbd21d1b9 100644
--- a/test/performance/vendor/golang.org/x/tools/internal/gcimporter/gcimporter.go
+++ b/test/performance/vendor/golang.org/x/tools/internal/gcimporter/gcimporter.go
@@ -23,17 +23,11 @@ package gcimporter // import "golang.org/x/tools/internal/gcimporter"
 
 import (
 	"bufio"
-	"bytes"
 	"fmt"
-	"go/build"
 	"go/token"
 	"go/types"
 	"io"
 	"os"
-	"os/exec"
-	"path/filepath"
-	"strings"
-	"sync"
 )
 
 const (
@@ -45,125 +39,14 @@ const (
 	trace = false
 )
 
-var exportMap sync.Map // package dir → func() (string, bool)
-
-// lookupGorootExport returns the location of the export data
-// (normally found in the build cache, but located in GOROOT/pkg
-// in prior Go releases) for the package located in pkgDir.
-//
-// (We use the package's directory instead of its import path
-// mainly to simplify handling of the packages in src/vendor
-// and cmd/vendor.)
-func lookupGorootExport(pkgDir string) (string, bool) {
-	f, ok := exportMap.Load(pkgDir)
-	if !ok {
-		var (
-			listOnce   sync.Once
-			exportPath string
-		)
-		f, _ = exportMap.LoadOrStore(pkgDir, func() (string, bool) {
-			listOnce.Do(func() {
-				cmd := exec.Command("go", "list", "-export", "-f", "{{.Export}}", pkgDir)
-				cmd.Dir = build.Default.GOROOT
-				var output []byte
-				output, err := cmd.Output()
-				if err != nil {
-					return
-				}
-
-				exports := strings.Split(string(bytes.TrimSpace(output)), "\n")
-				if len(exports) != 1 {
-					return
-				}
-
-				exportPath = exports[0]
-			})
-
-			return exportPath, exportPath != ""
-		})
-	}
-
-	return f.(func() (string, bool))()
-}
-
-var pkgExts = [...]string{".a", ".o"}
-
-// FindPkg returns the filename and unique package id for an import
-// path based on package information provided by build.Import (using
-// the build.Default build.Context). A relative srcDir is interpreted
-// relative to the current working directory.
-// If no file was found, an empty filename is returned.
-func FindPkg(path, srcDir string) (filename, id string) {
-	if path == "" {
-		return
-	}
-
-	var noext string
-	switch {
-	default:
-		// "x" -> "$GOPATH/pkg/$GOOS_$GOARCH/x.ext", "x"
-		// Don't require the source files to be present.
-		if abs, err := filepath.Abs(srcDir); err == nil { // see issue 14282
-			srcDir = abs
-		}
-		bp, _ := build.Import(path, srcDir, build.FindOnly|build.AllowBinary)
-		if bp.PkgObj == "" {
-			var ok bool
-			if bp.Goroot && bp.Dir != "" {
-				filename, ok = lookupGorootExport(bp.Dir)
-			}
-			if !ok {
-				id = path // make sure we have an id to print in error message
-				return
-			}
-		} else {
-			noext = strings.TrimSuffix(bp.PkgObj, ".a")
-			id = bp.ImportPath
-		}
-
-	case build.IsLocalImport(path):
-		// "./x" -> "/this/directory/x.ext", "/this/directory/x"
-		noext = filepath.Join(srcDir, path)
-		id = noext
-
-	case filepath.IsAbs(path):
-		// for completeness only - go/build.Import
-		// does not support absolute imports
-		// "/x" -> "/x.ext", "/x"
-		noext = path
-		id = path
-	}
-
-	if false { // for debugging
-		if path != id {
-			fmt.Printf("%s -> %s\n", path, id)
-		}
-	}
-
-	if filename != "" {
-		if f, err := os.Stat(filename); err == nil && !f.IsDir() {
-			return
-		}
-	}
-
-	// try extensions
-	for _, ext := range pkgExts {
-		filename = noext + ext
-		if f, err := os.Stat(filename); err == nil && !f.IsDir() {
-			return
-		}
-	}
-
-	filename = "" // not found
-	return
-}
-
 // Import imports a gc-generated package given its import path and srcDir, adds
 // the corresponding package object to the packages map, and returns the object.
 // The packages map must contain all packages already imported.
-func Import(packages map[string]*types.Package, path, srcDir string, lookup func(path string) (io.ReadCloser, error)) (pkg *types.Package, err error) {
+//
+// Import is only used in tests.
+func Import(fset *token.FileSet, packages map[string]*types.Package, path, srcDir string, lookup func(path string) (io.ReadCloser, error)) (pkg *types.Package, err error) {
 	var rc io.ReadCloser
-	var filename, id string
+	var id string
 	if lookup != nil {
 		// With custom lookup specified, assume that caller has
 		// converted path to a canonical import path for use in the map.
@@ -182,12 +65,13 @@ func Import(packages map[string]*types.Package, path, srcDir string, lookup func
 		}
 		rc = f
 	} else {
-		filename, id = FindPkg(path, srcDir)
+		var filename string
+		filename, id, err = FindPkg(path, srcDir)
 		if filename == "" {
 			if path == "unsafe" {
 				return types.Unsafe, nil
 			}
-			return nil, fmt.Errorf("can't find import: %q", id)
+			return nil, err
 		}
 
 		// no need to re-import if the package was imported completely before
@@ -210,57 +94,15 @@ func Import(packages map[string]*types.Package, path, srcDir string, lookup func
 	}
 	defer rc.Close()
 
-	var hdr string
-	var size int64
 	buf := bufio.NewReader(rc)
-	if hdr, size, err = FindExportData(buf); err != nil {
+	data, err := ReadUnified(buf)
+	if err != nil {
+		err = fmt.Errorf("import %q: %v", path, err)
 		return
 	}
 
-	switch hdr {
-	case "$$B\n":
-		var data []byte
-		data, err = io.ReadAll(buf)
-		if err != nil {
-			break
-		}
-
-		// TODO(gri): allow clients of go/importer to provide a FileSet.
-		// Or, define a new standard go/types/gcexportdata package.
-		fset := token.NewFileSet()
-
-		// Select appropriate importer.
-		if len(data) > 0 {
-			switch data[0] {
-			case 'v', 'c', 'd': // binary, till go1.10
-				return nil, fmt.Errorf("binary (%c) import format is no longer supported", data[0])
-
-			case 'i': // indexed, till go1.19
-				_, pkg, err := IImportData(fset, packages, data[1:], id)
-				return pkg, err
-
-			case 'u': // unified, from go1.20
-				_, pkg, err := UImportData(fset, packages, data[1:size], id)
-				return pkg, err
-
-			default:
-				l := len(data)
-				if l > 10 {
-					l = 10
-				}
-				return nil, fmt.Errorf("unexpected export data with prefix %q for path %s", string(data[:l]), id)
-			}
-		}
-
-	default:
-		err = fmt.Errorf("unknown export data header: %q", hdr)
-	}
+	// unified: emitted by cmd/compile since go1.20.
+	_, pkg, err = UImportData(fset, packages, data, id)
 
 	return
 }
-
-type byPath []*types.Package
-
-func (a byPath) Len() int           { return len(a) }
-func (a byPath) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
-func (a byPath) Less(i, j int) bool { return a[i].Path() < a[j].Path() }
diff --git a/test/performance/vendor/golang.org/x/tools/internal/gcimporter/iexport.go b/test/performance/vendor/golang.org/x/tools/internal/gcimporter/iexport.go
index 5f283281a2..7dfc31a37d 100644
--- a/test/performance/vendor/golang.org/x/tools/internal/gcimporter/iexport.go
+++ b/test/performance/vendor/golang.org/x/tools/internal/gcimporter/iexport.go
@@ -242,11 +242,30 @@ import (
 
 	"golang.org/x/tools/go/types/objectpath"
 	"golang.org/x/tools/internal/aliases"
-	"golang.org/x/tools/internal/tokeninternal"
 )
 
 // IExportShallow encodes "shallow" export data for the specified package.
 //
+// For types, we use "shallow" export data. Historically, the Go
+// compiler always produced a summary of the types for a given package
+// that included types from other packages that it indirectly
+// referenced: "deep" export data. This had the advantage that the
+// compiler (and analogous tools such as gopls) need only load one
+// file per direct import.  However, it meant that the files tended to
+// get larger based on the level of the package in the import
+// graph. For example, higher-level packages in the kubernetes module
+// have over 1MB of "deep" export data, even when they have almost no
+// content of their own, merely because they mention a major type that
+// references many others. In pathological cases the export data was
+// 300x larger than the source for a package due to this quadratic
+// growth.
+//
+// "Shallow" export data means that the serialized types describe only
+// a single package. If those types mention types from other packages,
+// the type checker may need to request additional packages beyond
+// just the direct imports. Type information for the entire transitive
+// closure of imports is provided (lazily) by the DAG.
+//
 // No promises are made about the encoding other than that it can be decoded by
 // the same version of IIExportShallow. If you plan to save export data in the
 // file system, be sure to include a cryptographic digest of the executable in
@@ -269,8 +288,8 @@ func IExportShallow(fset *token.FileSet, pkg *types.Package, reportf ReportFunc)
 }
 
 // IImportShallow decodes "shallow" types.Package data encoded by
-// IExportShallow in the same executable. This function cannot import data from
-// cmd/compile or gcexportdata.Write.
+// [IExportShallow] in the same executable. This function cannot import data
+// from cmd/compile or gcexportdata.Write.
 //
 // The importer calls getPackages to obtain package symbols for all
 // packages mentioned in the export data, including the one being
@@ -441,7 +460,7 @@ func (p *iexporter) encodeFile(w *intWriter, file *token.File, needed []uint64)
 	// Sort the set of needed offsets. Duplicates are harmless.
 	sort.Slice(needed, func(i, j int) bool { return needed[i] < needed[j] })
 
-	lines := tokeninternal.GetLines(file) // byte offset of each line start
+	lines := file.Lines() // byte offset of each line start
 	w.uint64(uint64(len(lines)))
 
 	// Rather than record the entire array of line start offsets,
@@ -725,13 +744,13 @@ func (p *iexporter) doDecl(obj types.Object) {
 	case *types.TypeName:
 		t := obj.Type()
 
-		if tparam, ok := aliases.Unalias(t).(*types.TypeParam); ok {
+		if tparam, ok := types.Unalias(t).(*types.TypeParam); ok {
 			w.tag(typeParamTag)
 			w.pos(obj.Pos())
 			constraint := tparam.Constraint()
 			if p.version >= iexportVersionGo1_18 {
 				implicit := false
-				if iface, _ := aliases.Unalias(constraint).(*types.Interface); iface != nil {
+				if iface, _ := types.Unalias(constraint).(*types.Interface); iface != nil {
 					implicit = iface.IsImplicit()
 				}
 				w.bool(implicit)
@@ -741,7 +760,7 @@ func (p *iexporter) doDecl(obj types.Object) {
 		}
 
 		if obj.IsAlias() {
-			alias, materialized := t.(*aliases.Alias) // may fail when aliases are not enabled
+			alias, materialized := t.(*types.Alias) // may fail when aliases are not enabled
 
 			var tparams *types.TypeParamList
 			if materialized {
@@ -975,7 +994,7 @@ func (w *exportWriter) doTyp(t types.Type, pkg *types.Package) {
 		}()
 	}
 	switch t := t.(type) {
-	case *aliases.Alias:
+	case *types.Alias:
 		if targs := aliases.TypeArgs(t); targs.Len() > 0 {
 			w.startType(instanceType)
 			w.pos(t.Obj().Pos())
@@ -1091,7 +1110,7 @@ func (w *exportWriter) doTyp(t types.Type, pkg *types.Package) {
 		for i := 0; i < n; i++ {
 			ft := t.EmbeddedType(i)
 			tPkg := pkg
-			if named, _ := aliases.Unalias(ft).(*types.Named); named != nil {
+			if named, _ := types.Unalias(ft).(*types.Named); named != nil {
 				w.pos(named.Obj().Pos())
 			} else {
 				w.pos(token.NoPos)
diff --git a/test/performance/vendor/golang.org/x/tools/internal/gcimporter/iimport.go b/test/performance/vendor/golang.org/x/tools/internal/gcimporter/iimport.go
index ed2d562959..69b1d697cb 100644
--- a/test/performance/vendor/golang.org/x/tools/internal/gcimporter/iimport.go
+++ b/test/performance/vendor/golang.org/x/tools/internal/gcimporter/iimport.go
@@ -5,8 +5,6 @@
 // Indexed package import.
 // See iexport.go for the export data format.
 
-// This file is a copy of $GOROOT/src/go/internal/gcimporter/iimport.go.
-
 package gcimporter
 
 import (
@@ -53,6 +51,7 @@ const (
 	iexportVersionPosCol   = 1
 	iexportVersionGo1_18   = 2
 	iexportVersionGenerics = 2
+	iexportVersion         = iexportVersionGenerics
 
 	iexportVersionCurrent = 2
 )
@@ -540,7 +539,7 @@ func canReuse(def *types.Named, rhs types.Type) bool {
 	if def == nil {
 		return true
 	}
-	iface, _ := aliases.Unalias(rhs).(*types.Interface)
+	iface, _ := types.Unalias(rhs).(*types.Interface)
 	if iface == nil {
 		return true
 	}
@@ -557,6 +556,14 @@ type importReader struct {
 	prevColumn int64
 }
 
+// markBlack is redefined in iimport_go123.go, to work around golang/go#69912.
+//
+// If TypeNames are not marked black (in the sense of go/types cycle
+// detection), they may be mutated when dot-imported. Fix this by punching a
+// hole through the type, when compiling with Go 1.23. (The bug has been fixed
+// for 1.24, but the fix was not worth back-porting).
+var markBlack = func(name *types.TypeName) {}
+
 func (r *importReader) obj(name string) {
 	tag := r.byte()
 	pos := r.pos()
@@ -569,6 +576,7 @@ func (r *importReader) obj(name string) {
 		}
 		typ := r.typ()
 		obj := aliases.NewAlias(r.p.aliases, pos, r.currPkg, name, typ, tparams)
+		markBlack(obj) // workaround for golang/go#69912
 		r.declare(obj)
 
 	case constTag:
@@ -589,6 +597,9 @@ func (r *importReader) obj(name string) {
 		// declaration before recursing.
 		obj := types.NewTypeName(pos, r.currPkg, name, nil)
 		named := types.NewNamed(obj, nil, nil)
+
+		markBlack(obj) // workaround for golang/go#69912
+
 		// Declare obj before calling r.tparamList, so the new type name is recognized
 		// if used in the constraint of one of its own typeparams (see #48280).
 		r.declare(obj)
@@ -615,7 +626,7 @@ func (r *importReader) obj(name string) {
 				if targs.Len() > 0 {
 					rparams = make([]*types.TypeParam, targs.Len())
 					for i := range rparams {
-						rparams[i] = aliases.Unalias(targs.At(i)).(*types.TypeParam)
+						rparams[i] = types.Unalias(targs.At(i)).(*types.TypeParam)
 					}
 				}
 				msig := r.signature(recv, rparams, nil)
@@ -645,7 +656,7 @@ func (r *importReader) obj(name string) {
 		}
 		constraint := r.typ()
 		if implicit {
-			iface, _ := aliases.Unalias(constraint).(*types.Interface)
+			iface, _ := types.Unalias(constraint).(*types.Interface)
 			if iface == nil {
 				errorf("non-interface constraint marked implicit")
 			}
@@ -852,7 +863,7 @@ func (r *importReader) typ() types.Type {
 }
 
 func isInterface(t types.Type) bool {
-	_, ok := aliases.Unalias(t).(*types.Interface)
+	_, ok := types.Unalias(t).(*types.Interface)
 	return ok
 }
 
@@ -959,7 +970,7 @@ func (r *importReader) doType(base *types.Named) (res types.Type) {
 			methods[i] = method
 		}
 
-		typ := newInterface(methods, embeddeds)
+		typ := types.NewInterfaceType(methods, embeddeds)
 		r.p.interfaceList = append(r.p.interfaceList, typ)
 		return typ
 
@@ -1051,7 +1062,7 @@ func (r *importReader) tparamList() []*types.TypeParam {
 	for i := range xs {
 		// Note: the standard library importer is tolerant of nil types here,
 		// though would panic in SetTypeParams.
-		xs[i] = aliases.Unalias(r.typ()).(*types.TypeParam)
+		xs[i] = types.Unalias(r.typ()).(*types.TypeParam)
 	}
 	return xs
 }
@@ -1098,3 +1109,9 @@ func (r *importReader) byte() byte {
 	}
 	return x
 }
+
+type byPath []*types.Package
+
+func (a byPath) Len() int           { return len(a) }
+func (a byPath) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
+func (a byPath) Less(i, j int) bool { return a[i].Path() < a[j].Path() }
diff --git a/test/performance/vendor/golang.org/x/tools/internal/gcimporter/iimport_go122.go b/test/performance/vendor/golang.org/x/tools/internal/gcimporter/iimport_go122.go
new file mode 100644
index 0000000000..7586bfaca6
--- /dev/null
+++ b/test/performance/vendor/golang.org/x/tools/internal/gcimporter/iimport_go122.go
@@ -0,0 +1,53 @@
+// Copyright 2024 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 go1.22 && !go1.24
+
+package gcimporter
+
+import (
+	"go/token"
+	"go/types"
+	"unsafe"
+)
+
+// TODO(rfindley): delete this workaround once go1.24 is assured.
+
+func init() {
+	// Update markBlack so that it correctly sets the color
+	// of imported TypeNames.
+	//
+	// See the doc comment for markBlack for details.
+
+	type color uint32
+	const (
+		white color = iota
+		black
+		grey
+	)
+	type object struct {
+		_      *types.Scope
+		_      token.Pos
+		_      *types.Package
+		_      string
+		_      types.Type
+		_      uint32
+		color_ color
+		_      token.Pos
+	}
+	type typeName struct {
+		object
+	}
+
+	// If the size of types.TypeName changes, this will fail to compile.
+	const delta = int64(unsafe.Sizeof(typeName{})) - int64(unsafe.Sizeof(types.TypeName{}))
+	var _ [-delta * delta]int
+
+	markBlack = func(obj *types.TypeName) {
+		type uP = unsafe.Pointer
+		var ptr *typeName
+		*(*uP)(uP(&ptr)) = uP(obj)
+		ptr.color_ = black
+	}
+}
diff --git a/test/performance/vendor/golang.org/x/tools/internal/gcimporter/newInterface10.go b/test/performance/vendor/golang.org/x/tools/internal/gcimporter/newInterface10.go
deleted file mode 100644
index 8b163e3d05..0000000000
--- a/test/performance/vendor/golang.org/x/tools/internal/gcimporter/newInterface10.go
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2018 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 !go1.11
-// +build !go1.11
-
-package gcimporter
-
-import "go/types"
-
-func newInterface(methods []*types.Func, embeddeds []types.Type) *types.Interface {
-	named := make([]*types.Named, len(embeddeds))
-	for i, e := range embeddeds {
-		var ok bool
-		named[i], ok = e.(*types.Named)
-		if !ok {
-			panic("embedding of non-defined interfaces in interfaces is not supported before Go 1.11")
-		}
-	}
-	return types.NewInterface(methods, named)
-}
diff --git a/test/performance/vendor/golang.org/x/tools/internal/gcimporter/newInterface11.go b/test/performance/vendor/golang.org/x/tools/internal/gcimporter/newInterface11.go
deleted file mode 100644
index 49984f40fd..0000000000
--- a/test/performance/vendor/golang.org/x/tools/internal/gcimporter/newInterface11.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2018 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 go1.11
-// +build go1.11
-
-package gcimporter
-
-import "go/types"
-
-func newInterface(methods []*types.Func, embeddeds []types.Type) *types.Interface {
-	return types.NewInterfaceType(methods, embeddeds)
-}
diff --git a/test/performance/vendor/golang.org/x/tools/internal/gcimporter/predeclared.go b/test/performance/vendor/golang.org/x/tools/internal/gcimporter/predeclared.go
new file mode 100644
index 0000000000..907c8557a5
--- /dev/null
+++ b/test/performance/vendor/golang.org/x/tools/internal/gcimporter/predeclared.go
@@ -0,0 +1,91 @@
+// Copyright 2024 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 gcimporter
+
+import (
+	"go/types"
+	"sync"
+)
+
+// predecl is a cache for the predeclared types in types.Universe.
+//
+// Cache a distinct result based on the runtime value of any.
+// The pointer value of the any type varies based on GODEBUG settings.
+var predeclMu sync.Mutex
+var predecl map[types.Type][]types.Type
+
+func predeclared() []types.Type {
+	anyt := types.Universe.Lookup("any").Type()
+
+	predeclMu.Lock()
+	defer predeclMu.Unlock()
+
+	if pre, ok := predecl[anyt]; ok {
+		return pre
+	}
+
+	if predecl == nil {
+		predecl = make(map[types.Type][]types.Type)
+	}
+
+	decls := []types.Type{ // basic types
+		types.Typ[types.Bool],
+		types.Typ[types.Int],
+		types.Typ[types.Int8],
+		types.Typ[types.Int16],
+		types.Typ[types.Int32],
+		types.Typ[types.Int64],
+		types.Typ[types.Uint],
+		types.Typ[types.Uint8],
+		types.Typ[types.Uint16],
+		types.Typ[types.Uint32],
+		types.Typ[types.Uint64],
+		types.Typ[types.Uintptr],
+		types.Typ[types.Float32],
+		types.Typ[types.Float64],
+		types.Typ[types.Complex64],
+		types.Typ[types.Complex128],
+		types.Typ[types.String],
+
+		// basic type aliases
+		types.Universe.Lookup("byte").Type(),
+		types.Universe.Lookup("rune").Type(),
+
+		// error
+		types.Universe.Lookup("error").Type(),
+
+		// untyped types
+		types.Typ[types.UntypedBool],
+		types.Typ[types.UntypedInt],
+		types.Typ[types.UntypedRune],
+		types.Typ[types.UntypedFloat],
+		types.Typ[types.UntypedComplex],
+		types.Typ[types.UntypedString],
+		types.Typ[types.UntypedNil],
+
+		// package unsafe
+		types.Typ[types.UnsafePointer],
+
+		// invalid type
+		types.Typ[types.Invalid], // only appears in packages with errors
+
+		// used internally by gc; never used by this package or in .a files
+		anyType{},
+
+		// comparable
+		types.Universe.Lookup("comparable").Type(),
+
+		// any
+		anyt,
+	}
+
+	predecl[anyt] = decls
+	return decls
+}
+
+type anyType struct{}
+
+func (t anyType) Underlying() types.Type { return t }
+func (t anyType) String() string         { return "any" }
diff --git a/test/performance/vendor/golang.org/x/tools/internal/gcimporter/support.go b/test/performance/vendor/golang.org/x/tools/internal/gcimporter/support.go
new file mode 100644
index 0000000000..4af810dc41
--- /dev/null
+++ b/test/performance/vendor/golang.org/x/tools/internal/gcimporter/support.go
@@ -0,0 +1,30 @@
+// Copyright 2024 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 gcimporter
+
+import (
+	"bufio"
+	"io"
+	"strconv"
+	"strings"
+)
+
+// Copy of $GOROOT/src/cmd/internal/archive.ReadHeader.
+func readArchiveHeader(b *bufio.Reader, name string) int {
+	// architecture-independent object file output
+	const HeaderSize = 60
+
+	var buf [HeaderSize]byte
+	if _, err := io.ReadFull(b, buf[:]); err != nil {
+		return -1
+	}
+	aname := strings.Trim(string(buf[0:16]), " ")
+	if !strings.HasPrefix(aname, name) {
+		return -1
+	}
+	asize := strings.Trim(string(buf[48:58]), " ")
+	i, _ := strconv.Atoi(asize)
+	return i
+}
diff --git a/test/performance/vendor/golang.org/x/tools/internal/gcimporter/support_go118.go b/test/performance/vendor/golang.org/x/tools/internal/gcimporter/support_go118.go
deleted file mode 100644
index 0cd3b91b65..0000000000
--- a/test/performance/vendor/golang.org/x/tools/internal/gcimporter/support_go118.go
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2021 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 gcimporter
-
-import "go/types"
-
-const iexportVersion = iexportVersionGenerics
-
-// additionalPredeclared returns additional predeclared types in go.1.18.
-func additionalPredeclared() []types.Type {
-	return []types.Type{
-		// comparable
-		types.Universe.Lookup("comparable").Type(),
-
-		// any
-		types.Universe.Lookup("any").Type(),
-	}
-}
-
-// See cmd/compile/internal/types.SplitVargenSuffix.
-func splitVargenSuffix(name string) (base, suffix string) {
-	i := len(name)
-	for i > 0 && name[i-1] >= '0' && name[i-1] <= '9' {
-		i--
-	}
-	const dot = "·"
-	if i >= len(dot) && name[i-len(dot):i] == dot {
-		i -= len(dot)
-		return name[:i], name[i:]
-	}
-	return name, ""
-}
diff --git a/test/performance/vendor/golang.org/x/tools/internal/gcimporter/unified_no.go b/test/performance/vendor/golang.org/x/tools/internal/gcimporter/unified_no.go
deleted file mode 100644
index 38b624cada..0000000000
--- a/test/performance/vendor/golang.org/x/tools/internal/gcimporter/unified_no.go
+++ /dev/null
@@ -1,10 +0,0 @@
-// 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 !goexperiment.unified
-// +build !goexperiment.unified
-
-package gcimporter
-
-const unifiedIR = false
diff --git a/test/performance/vendor/golang.org/x/tools/internal/gcimporter/unified_yes.go b/test/performance/vendor/golang.org/x/tools/internal/gcimporter/unified_yes.go
deleted file mode 100644
index b5118d0b3a..0000000000
--- a/test/performance/vendor/golang.org/x/tools/internal/gcimporter/unified_yes.go
+++ /dev/null
@@ -1,10 +0,0 @@
-// 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 goexperiment.unified
-// +build goexperiment.unified
-
-package gcimporter
-
-const unifiedIR = true
diff --git a/test/performance/vendor/golang.org/x/tools/internal/gcimporter/ureader_yes.go b/test/performance/vendor/golang.org/x/tools/internal/gcimporter/ureader_yes.go
index f0742f5404..6cdab448ec 100644
--- a/test/performance/vendor/golang.org/x/tools/internal/gcimporter/ureader_yes.go
+++ b/test/performance/vendor/golang.org/x/tools/internal/gcimporter/ureader_yes.go
@@ -11,7 +11,6 @@ import (
 	"go/token"
 	"go/types"
 	"sort"
-	"strings"
 
 	"golang.org/x/tools/internal/aliases"
 	"golang.org/x/tools/internal/pkgbits"
@@ -71,7 +70,6 @@ func UImportData(fset *token.FileSet, imports map[string]*types.Package, data []
 	}
 
 	s := string(data)
-	s = s[:strings.LastIndex(s, "\n$$\n")]
 	input := pkgbits.NewPkgDecoder(path, s)
 	pkg = readUnifiedPackage(fset, nil, imports, input)
 	return
@@ -266,7 +264,12 @@ func (pr *pkgReader) pkgIdx(idx pkgbits.Index) *types.Package {
 func (r *reader) doPkg() *types.Package {
 	path := r.String()
 	switch path {
-	case "":
+	// cmd/compile emits path="main" for main packages because
+	// that's the linker symbol prefix it used; but we need
+	// the package's path as it would be reported by go list,
+	// hence "main" below.
+	// See test at go/packages.TestMainPackagePathInModeTypes.
+	case "", "main":
 		path = r.p.PkgPath()
 	case "builtin":
 		return nil // universe
@@ -562,7 +565,7 @@ func (pr *pkgReader) objIdx(idx pkgbits.Index) (*types.Package, string) {
 				// If the underlying type is an interface, we need to
 				// duplicate its methods so we can replace the receiver
 				// parameter's type (#49906).
-				if iface, ok := aliases.Unalias(underlying).(*types.Interface); ok && iface.NumExplicitMethods() != 0 {
+				if iface, ok := types.Unalias(underlying).(*types.Interface); ok && iface.NumExplicitMethods() != 0 {
 					methods := make([]*types.Func, iface.NumExplicitMethods())
 					for i := range methods {
 						fn := iface.ExplicitMethod(i)
@@ -738,3 +741,17 @@ func pkgScope(pkg *types.Package) *types.Scope {
 	}
 	return types.Universe
 }
+
+// See cmd/compile/internal/types.SplitVargenSuffix.
+func splitVargenSuffix(name string) (base, suffix string) {
+	i := len(name)
+	for i > 0 && name[i-1] >= '0' && name[i-1] <= '9' {
+		i--
+	}
+	const dot = "·"
+	if i >= len(dot) && name[i-len(dot):i] == dot {
+		i -= len(dot)
+		return name[:i], name[i:]
+	}
+	return name, ""
+}
diff --git a/test/performance/vendor/golang.org/x/tools/internal/gocommand/invoke.go b/test/performance/vendor/golang.org/x/tools/internal/gocommand/invoke.go
index 2e59ff8558..e333efc87f 100644
--- a/test/performance/vendor/golang.org/x/tools/internal/gocommand/invoke.go
+++ b/test/performance/vendor/golang.org/x/tools/internal/gocommand/invoke.go
@@ -16,7 +16,6 @@ import (
 	"os"
 	"os/exec"
 	"path/filepath"
-	"reflect"
 	"regexp"
 	"runtime"
 	"strconv"
@@ -250,16 +249,13 @@ func (i *Invocation) run(ctx context.Context, stdout, stderr io.Writer) error {
 	cmd.Stdout = stdout
 	cmd.Stderr = stderr
 
-	// cmd.WaitDelay was added only in go1.20 (see #50436).
-	if waitDelay := reflect.ValueOf(cmd).Elem().FieldByName("WaitDelay"); waitDelay.IsValid() {
-		// https://go.dev/issue/59541: don't wait forever copying stderr
-		// after the command has exited.
-		// After CL 484741 we copy stdout manually, so we we'll stop reading that as
-		// soon as ctx is done. However, we also don't want to wait around forever
-		// for stderr. Give a much-longer-than-reasonable delay and then assume that
-		// something has wedged in the kernel or runtime.
-		waitDelay.Set(reflect.ValueOf(30 * time.Second))
-	}
+	// https://go.dev/issue/59541: don't wait forever copying stderr
+	// after the command has exited.
+	// After CL 484741 we copy stdout manually, so we we'll stop reading that as
+	// soon as ctx is done. However, we also don't want to wait around forever
+	// for stderr. Give a much-longer-than-reasonable delay and then assume that
+	// something has wedged in the kernel or runtime.
+	cmd.WaitDelay = 30 * time.Second
 
 	// The cwd gets resolved to the real path. On Darwin, where
 	// /tmp is a symlink, this breaks anything that expects the
diff --git a/test/performance/vendor/golang.org/x/tools/internal/imports/fix.go b/test/performance/vendor/golang.org/x/tools/internal/imports/fix.go
index dc7d50a7a4..5ae576977a 100644
--- a/test/performance/vendor/golang.org/x/tools/internal/imports/fix.go
+++ b/test/performance/vendor/golang.org/x/tools/internal/imports/fix.go
@@ -27,7 +27,6 @@ import (
 	"unicode"
 	"unicode/utf8"
 
-	"golang.org/x/sync/errgroup"
 	"golang.org/x/tools/go/ast/astutil"
 	"golang.org/x/tools/internal/event"
 	"golang.org/x/tools/internal/gocommand"
@@ -91,18 +90,6 @@ type ImportFix struct {
 	Relevance float64 // see pkg
 }
 
-// An ImportInfo represents a single import statement.
-type ImportInfo struct {
-	ImportPath string // import path, e.g. "crypto/rand".
-	Name       string // import name, e.g. "crand", or "" if none.
-}
-
-// A packageInfo represents what's known about a package.
-type packageInfo struct {
-	name    string          // real package name, if known.
-	exports map[string]bool // known exports.
-}
-
 // parseOtherFiles parses all the Go files in srcDir except filename, including
 // test files if filename looks like a test.
 //
@@ -131,7 +118,7 @@ func parseOtherFiles(ctx context.Context, fset *token.FileSet, srcDir, filename
 			continue
 		}
 
-		f, err := parser.ParseFile(fset, filepath.Join(srcDir, fi.Name()), nil, 0)
+		f, err := parser.ParseFile(fset, filepath.Join(srcDir, fi.Name()), nil, parser.SkipObjectResolution)
 		if err != nil {
 			continue
 		}
@@ -162,8 +149,8 @@ func addGlobals(f *ast.File, globals map[string]bool) {
 
 // collectReferences builds a map of selector expressions, from
 // left hand side (X) to a set of right hand sides (Sel).
-func collectReferences(f *ast.File) references {
-	refs := references{}
+func collectReferences(f *ast.File) References {
+	refs := References{}
 
 	var visitor visitFn
 	visitor = func(node ast.Node) ast.Visitor {
@@ -233,7 +220,7 @@ func (p *pass) findMissingImport(pkg string, syms map[string]bool) *ImportInfo {
 
 		allFound := true
 		for right := range syms {
-			if !pkgInfo.exports[right] {
+			if !pkgInfo.Exports[right] {
 				allFound = false
 				break
 			}
@@ -246,11 +233,6 @@ func (p *pass) findMissingImport(pkg string, syms map[string]bool) *ImportInfo {
 	return nil
 }
 
-// references is set of references found in a Go file. The first map key is the
-// left hand side of a selector expression, the second key is the right hand
-// side, and the value should always be true.
-type references map[string]map[string]bool
-
 // A pass contains all the inputs and state necessary to fix a file's imports.
 // It can be modified in some ways during use; see comments below.
 type pass struct {
@@ -258,27 +240,29 @@ type pass struct {
 	fset                 *token.FileSet // fset used to parse f and its siblings.
 	f                    *ast.File      // the file being fixed.
 	srcDir               string         // the directory containing f.
-	env                  *ProcessEnv    // the environment to use for go commands, etc.
-	loadRealPackageNames bool           // if true, load package names from disk rather than guessing them.
-	otherFiles           []*ast.File    // sibling files.
+	logf                 func(string, ...any)
+	source               Source      // the environment to use for go commands, etc.
+	loadRealPackageNames bool        // if true, load package names from disk rather than guessing them.
+	otherFiles           []*ast.File // sibling files.
+	goroot               string
 
 	// Intermediate state, generated by load.
 	existingImports map[string][]*ImportInfo
-	allRefs         references
-	missingRefs     references
+	allRefs         References
+	missingRefs     References
 
 	// Inputs to fix. These can be augmented between successive fix calls.
 	lastTry       bool                    // indicates that this is the last call and fix should clean up as best it can.
 	candidates    []*ImportInfo           // candidate imports in priority order.
-	knownPackages map[string]*packageInfo // information about all known packages.
+	knownPackages map[string]*PackageInfo // information about all known packages.
 }
 
 // loadPackageNames saves the package names for everything referenced by imports.
-func (p *pass) loadPackageNames(imports []*ImportInfo) error {
-	if p.env.Logf != nil {
-		p.env.Logf("loading package names for %v packages", len(imports))
+func (p *pass) loadPackageNames(ctx context.Context, imports []*ImportInfo) error {
+	if p.logf != nil {
+		p.logf("loading package names for %v packages", len(imports))
 		defer func() {
-			p.env.Logf("done loading package names for %v packages", len(imports))
+			p.logf("done loading package names for %v packages", len(imports))
 		}()
 	}
 	var unknown []string
@@ -289,20 +273,17 @@ func (p *pass) loadPackageNames(imports []*ImportInfo) error {
 		unknown = append(unknown, imp.ImportPath)
 	}
 
-	resolver, err := p.env.GetResolver()
-	if err != nil {
-		return err
-	}
-
-	names, err := resolver.loadPackageNames(unknown, p.srcDir)
+	names, err := p.source.LoadPackageNames(ctx, p.srcDir, unknown)
 	if err != nil {
 		return err
 	}
 
+	// TODO(rfindley): revisit this. Why do we need to store known packages with
+	// no exports? The inconsistent data is confusing.
 	for path, name := range names {
-		p.knownPackages[path] = &packageInfo{
-			name:    name,
-			exports: map[string]bool{},
+		p.knownPackages[path] = &PackageInfo{
+			Name:    name,
+			Exports: map[string]bool{},
 		}
 	}
 	return nil
@@ -330,8 +311,8 @@ func (p *pass) importIdentifier(imp *ImportInfo) string {
 		return imp.Name
 	}
 	known := p.knownPackages[imp.ImportPath]
-	if known != nil && known.name != "" {
-		return withoutVersion(known.name)
+	if known != nil && known.Name != "" {
+		return withoutVersion(known.Name)
 	}
 	return ImportPathToAssumedName(imp.ImportPath)
 }
@@ -339,9 +320,9 @@ func (p *pass) importIdentifier(imp *ImportInfo) string {
 // load reads in everything necessary to run a pass, and reports whether the
 // file already has all the imports it needs. It fills in p.missingRefs with the
 // file's missing symbols, if any, or removes unused imports if not.
-func (p *pass) load() ([]*ImportFix, bool) {
-	p.knownPackages = map[string]*packageInfo{}
-	p.missingRefs = references{}
+func (p *pass) load(ctx context.Context) ([]*ImportFix, bool) {
+	p.knownPackages = map[string]*PackageInfo{}
+	p.missingRefs = References{}
 	p.existingImports = map[string][]*ImportInfo{}
 
 	// Load basic information about the file in question.
@@ -364,9 +345,11 @@ func (p *pass) load() ([]*ImportFix, bool) {
 	// f's imports by the identifier they introduce.
 	imports := collectImports(p.f)
 	if p.loadRealPackageNames {
-		err := p.loadPackageNames(append(imports, p.candidates...))
+		err := p.loadPackageNames(ctx, append(imports, p.candidates...))
 		if err != nil {
-			p.env.logf("loading package names: %v", err)
+			if p.logf != nil {
+				p.logf("loading package names: %v", err)
+			}
 			return nil, false
 		}
 	}
@@ -535,9 +518,10 @@ func (p *pass) assumeSiblingImportsValid() {
 					// We have the stdlib in memory; no need to guess.
 					rights = symbolNameSet(m)
 				}
-				p.addCandidate(imp, &packageInfo{
+				// TODO(rfindley): we should set package name here, for consistency.
+				p.addCandidate(imp, &PackageInfo{
 					// no name; we already know it.
-					exports: rights,
+					Exports: rights,
 				})
 			}
 		}
@@ -546,14 +530,14 @@ func (p *pass) assumeSiblingImportsValid() {
 
 // addCandidate adds a candidate import to p, and merges in the information
 // in pkg.
-func (p *pass) addCandidate(imp *ImportInfo, pkg *packageInfo) {
+func (p *pass) addCandidate(imp *ImportInfo, pkg *PackageInfo) {
 	p.candidates = append(p.candidates, imp)
 	if existing, ok := p.knownPackages[imp.ImportPath]; ok {
-		if existing.name == "" {
-			existing.name = pkg.name
+		if existing.Name == "" {
+			existing.Name = pkg.Name
 		}
-		for export := range pkg.exports {
-			existing.exports[export] = true
+		for export := range pkg.Exports {
+			existing.Exports[export] = true
 		}
 	} else {
 		p.knownPackages[imp.ImportPath] = pkg
@@ -581,19 +565,42 @@ func fixImportsDefault(fset *token.FileSet, f *ast.File, filename string, env *P
 // getFixes gets the import fixes that need to be made to f in order to fix the imports.
 // It does not modify the ast.
 func getFixes(ctx context.Context, fset *token.FileSet, f *ast.File, filename string, env *ProcessEnv) ([]*ImportFix, error) {
+	source, err := NewProcessEnvSource(env, filename, f.Name.Name)
+	if err != nil {
+		return nil, err
+	}
+	goEnv, err := env.goEnv()
+	if err != nil {
+		return nil, err
+	}
+	return getFixesWithSource(ctx, fset, f, filename, goEnv["GOROOT"], env.logf, source)
+}
+
+func getFixesWithSource(ctx context.Context, fset *token.FileSet, f *ast.File, filename string, goroot string, logf func(string, ...any), source Source) ([]*ImportFix, error) {
+	// This logic is defensively duplicated from getFixes.
 	abs, err := filepath.Abs(filename)
 	if err != nil {
 		return nil, err
 	}
 	srcDir := filepath.Dir(abs)
-	env.logf("fixImports(filename=%q), abs=%q, srcDir=%q ...", filename, abs, srcDir)
+
+	if logf != nil {
+		logf("fixImports(filename=%q), srcDir=%q ...", filename, abs, srcDir)
+	}
 
 	// First pass: looking only at f, and using the naive algorithm to
 	// derive package names from import paths, see if the file is already
 	// complete. We can't add any imports yet, because we don't know
 	// if missing references are actually package vars.
-	p := &pass{fset: fset, f: f, srcDir: srcDir, env: env}
-	if fixes, done := p.load(); done {
+	p := &pass{
+		fset:   fset,
+		f:      f,
+		srcDir: srcDir,
+		logf:   logf,
+		goroot: goroot,
+		source: source,
+	}
+	if fixes, done := p.load(ctx); done {
 		return fixes, nil
 	}
 
@@ -605,7 +612,7 @@ func getFixes(ctx context.Context, fset *token.FileSet, f *ast.File, filename st
 	// Second pass: add information from other files in the same package,
 	// like their package vars and imports.
 	p.otherFiles = otherFiles
-	if fixes, done := p.load(); done {
+	if fixes, done := p.load(ctx); done {
 		return fixes, nil
 	}
 
@@ -618,10 +625,17 @@ func getFixes(ctx context.Context, fset *token.FileSet, f *ast.File, filename st
 
 	// Third pass: get real package names where we had previously used
 	// the naive algorithm.
-	p = &pass{fset: fset, f: f, srcDir: srcDir, env: env}
+	p = &pass{
+		fset:   fset,
+		f:      f,
+		srcDir: srcDir,
+		logf:   logf,
+		goroot: goroot,
+		source: p.source, // safe to reuse, as it's just a wrapper around env
+	}
 	p.loadRealPackageNames = true
 	p.otherFiles = otherFiles
-	if fixes, done := p.load(); done {
+	if fixes, done := p.load(ctx); done {
 		return fixes, nil
 	}
 
@@ -835,7 +849,7 @@ func GetPackageExports(ctx context.Context, wrapped func(PackageExport), searchP
 			return true
 		},
 		dirFound: func(pkg *pkg) bool {
-			return pkgIsCandidate(filename, references{searchPkg: nil}, pkg)
+			return pkgIsCandidate(filename, References{searchPkg: nil}, pkg)
 		},
 		packageNameLoaded: func(pkg *pkg) bool {
 			return pkg.packageName == searchPkg
@@ -1086,11 +1100,7 @@ func (e *ProcessEnv) invokeGo(ctx context.Context, verb string, args ...string)
 	return e.GocmdRunner.Run(ctx, inv)
 }
 
-func addStdlibCandidates(pass *pass, refs references) error {
-	goenv, err := pass.env.goEnv()
-	if err != nil {
-		return err
-	}
+func addStdlibCandidates(pass *pass, refs References) error {
 	localbase := func(nm string) string {
 		ans := path.Base(nm)
 		if ans[0] == 'v' {
@@ -1105,13 +1115,13 @@ func addStdlibCandidates(pass *pass, refs references) error {
 	}
 	add := func(pkg string) {
 		// Prevent self-imports.
-		if path.Base(pkg) == pass.f.Name.Name && filepath.Join(goenv["GOROOT"], "src", pkg) == pass.srcDir {
+		if path.Base(pkg) == pass.f.Name.Name && filepath.Join(pass.goroot, "src", pkg) == pass.srcDir {
 			return
 		}
 		exports := symbolNameSet(stdlib.PackageSymbols[pkg])
 		pass.addCandidate(
 			&ImportInfo{ImportPath: pkg},
-			&packageInfo{name: localbase(pkg), exports: exports})
+			&PackageInfo{Name: localbase(pkg), Exports: exports})
 	}
 	for left := range refs {
 		if left == "rand" {
@@ -1175,91 +1185,14 @@ type scanCallback struct {
 	exportsLoaded func(pkg *pkg, exports []stdlib.Symbol)
 }
 
-func addExternalCandidates(ctx context.Context, pass *pass, refs references, filename string) error {
+func addExternalCandidates(ctx context.Context, pass *pass, refs References, filename string) error {
 	ctx, done := event.Start(ctx, "imports.addExternalCandidates")
 	defer done()
 
-	var mu sync.Mutex
-	found := make(map[string][]pkgDistance)
-	callback := &scanCallback{
-		rootFound: func(gopathwalk.Root) bool {
-			return true // We want everything.
-		},
-		dirFound: func(pkg *pkg) bool {
-			return pkgIsCandidate(filename, refs, pkg)
-		},
-		packageNameLoaded: func(pkg *pkg) bool {
-			if _, want := refs[pkg.packageName]; !want {
-				return false
-			}
-			if pkg.dir == pass.srcDir && pass.f.Name.Name == pkg.packageName {
-				// The candidate is in the same directory and has the
-				// same package name. Don't try to import ourselves.
-				return false
-			}
-			if !canUse(filename, pkg.dir) {
-				return false
-			}
-			mu.Lock()
-			defer mu.Unlock()
-			found[pkg.packageName] = append(found[pkg.packageName], pkgDistance{pkg, distance(pass.srcDir, pkg.dir)})
-			return false // We'll do our own loading after we sort.
-		},
-	}
-	resolver, err := pass.env.GetResolver()
+	results, err := pass.source.ResolveReferences(ctx, filename, refs)
 	if err != nil {
 		return err
 	}
-	if err = resolver.scan(ctx, callback); err != nil {
-		return err
-	}
-
-	// Search for imports matching potential package references.
-	type result struct {
-		imp *ImportInfo
-		pkg *packageInfo
-	}
-	results := make([]*result, len(refs))
-
-	g, ctx := errgroup.WithContext(ctx)
-
-	searcher := symbolSearcher{
-		logf:        pass.env.logf,
-		srcDir:      pass.srcDir,
-		xtest:       strings.HasSuffix(pass.f.Name.Name, "_test"),
-		loadExports: resolver.loadExports,
-	}
-
-	i := 0
-	for pkgName, symbols := range refs {
-		index := i // claim an index in results
-		i++
-		pkgName := pkgName
-		symbols := symbols
-
-		g.Go(func() error {
-			found, err := searcher.search(ctx, found[pkgName], pkgName, symbols)
-			if err != nil {
-				return err
-			}
-			if found == nil {
-				return nil // No matching package.
-			}
-
-			imp := &ImportInfo{
-				ImportPath: found.importPathShort,
-			}
-			pkg := &packageInfo{
-				name:    pkgName,
-				exports: symbols,
-			}
-			results[index] = &result{imp, pkg}
-			return nil
-		})
-	}
-	if err := g.Wait(); err != nil {
-		return err
-	}
 
 	for _, result := range results {
 		if result == nil {
@@ -1267,7 +1200,7 @@ func addExternalCandidates(ctx context.Context, pass *pass, refs references, fil
 		}
 		// Don't offer completions that would shadow predeclared
 		// names, such as github.com/coreos/etcd/error.
-		if types.Universe.Lookup(result.pkg.name) != nil { // predeclared
+		if types.Universe.Lookup(result.Package.Name) != nil { // predeclared
 			// Ideally we would skip this candidate only
 			// if the predeclared name is actually
 			// referenced by the file, but that's a lot
@@ -1276,7 +1209,7 @@ func addExternalCandidates(ctx context.Context, pass *pass, refs references, fil
 			// user before long.
 			continue
 		}
-		pass.addCandidate(result.imp, result.pkg)
+		pass.addCandidate(result.Import, result.Package)
 	}
 	return nil
 }
@@ -1620,6 +1553,7 @@ func loadExportsFromFiles(ctx context.Context, env *ProcessEnv, dir string, incl
 		}
 
 		fullFile := filepath.Join(dir, fi.Name())
+		// Legacy ast.Object resolution is needed here.
 		f, err := parser.ParseFile(fset, fullFile, nil, 0)
 		if err != nil {
 			env.logf("error parsing %v: %v", fullFile, err)
@@ -1800,7 +1734,7 @@ func (s *symbolSearcher) searchOne(ctx context.Context, c pkgDistance, symbols m
 // filename is the file being formatted.
 // pkgIdent is the package being searched for, like "client" (if
 // searching for "client.New")
-func pkgIsCandidate(filename string, refs references, pkg *pkg) bool {
+func pkgIsCandidate(filename string, refs References, pkg *pkg) bool {
 	// Check "internal" and "vendor" visibility:
 	if !canUse(filename, pkg.dir) {
 		return false
diff --git a/test/performance/vendor/golang.org/x/tools/internal/imports/imports.go b/test/performance/vendor/golang.org/x/tools/internal/imports/imports.go
index f83465520a..2215a12880 100644
--- a/test/performance/vendor/golang.org/x/tools/internal/imports/imports.go
+++ b/test/performance/vendor/golang.org/x/tools/internal/imports/imports.go
@@ -47,7 +47,14 @@ type Options struct {
 // Process implements golang.org/x/tools/imports.Process with explicit context in opt.Env.
 func Process(filename string, src []byte, opt *Options) (formatted []byte, err error) {
 	fileSet := token.NewFileSet()
-	file, adjust, err := parse(fileSet, filename, src, opt)
+	var parserMode parser.Mode
+	if opt.Comments {
+		parserMode |= parser.ParseComments
+	}
+	if opt.AllErrors {
+		parserMode |= parser.AllErrors
+	}
+	file, adjust, err := parse(fileSet, filename, src, parserMode, opt.Fragment)
 	if err != nil {
 		return nil, err
 	}
@@ -66,17 +73,19 @@ func Process(filename string, src []byte, opt *Options) (formatted []byte, err e
 //
 // Note that filename's directory influences which imports can be chosen,
 // so it is important that filename be accurate.
-func FixImports(ctx context.Context, filename string, src []byte, opt *Options) (fixes []*ImportFix, err error) {
+func FixImports(ctx context.Context, filename string, src []byte, goroot string, logf func(string, ...any), source Source) (fixes []*ImportFix, err error) {
 	ctx, done := event.Start(ctx, "imports.FixImports")
 	defer done()
 
 	fileSet := token.NewFileSet()
-	file, _, err := parse(fileSet, filename, src, opt)
+	// TODO(rfindley): these default values for ParseComments and AllErrors were
+	// extracted from gopls, but are they even needed?
+	file, _, err := parse(fileSet, filename, src, parser.ParseComments|parser.AllErrors, true)
 	if err != nil {
 		return nil, err
 	}
 
-	return getFixes(ctx, fileSet, file, filename, opt.Env)
+	return getFixesWithSource(ctx, fileSet, file, filename, goroot, logf, source)
 }
 
 // ApplyFixes applies all of the fixes to the file and formats it. extraMode
@@ -86,7 +95,7 @@ func ApplyFixes(fixes []*ImportFix, filename string, src []byte, opt *Options, e
 	// Don't use parse() -- we don't care about fragments or statement lists
 	// here, and we need to work with unparseable files.
 	fileSet := token.NewFileSet()
-	parserMode := parser.Mode(0)
+	parserMode := parser.SkipObjectResolution
 	if opt.Comments {
 		parserMode |= parser.ParseComments
 	}
@@ -114,7 +123,7 @@ func ApplyFixes(fixes []*ImportFix, filename string, src []byte, opt *Options, e
 // formatted file, and returns the postpocessed result.
 func formatFile(fset *token.FileSet, file *ast.File, src []byte, adjust func(orig []byte, src []byte) []byte, opt *Options) ([]byte, error) {
 	mergeImports(file)
-	sortImports(opt.LocalPrefix, fset.File(file.Pos()), file)
+	sortImports(opt.LocalPrefix, fset.File(file.FileStart), file)
 	var spacesBefore []string // import paths we need spaces before
 	for _, impSection := range astutil.Imports(fset, file) {
 		// Within each block of contiguous imports, see if any
@@ -164,13 +173,9 @@ func formatFile(fset *token.FileSet, file *ast.File, src []byte, adjust func(ori
 
 // parse parses src, which was read from filename,
 // as a Go source file or statement list.
-func parse(fset *token.FileSet, filename string, src []byte, opt *Options) (*ast.File, func(orig, src []byte) []byte, error) {
-	parserMode := parser.Mode(0)
-	if opt.Comments {
-		parserMode |= parser.ParseComments
-	}
-	if opt.AllErrors {
-		parserMode |= parser.AllErrors
+func parse(fset *token.FileSet, filename string, src []byte, parserMode parser.Mode, fragment bool) (*ast.File, func(orig, src []byte) []byte, error) {
+	if parserMode&parser.SkipObjectResolution != 0 {
+		panic("legacy ast.Object resolution is required")
 	}
 
 	// Try as whole source file.
@@ -181,7 +186,7 @@ func parse(fset *token.FileSet, filename string, src []byte, opt *Options) (*ast
 	// If the error is that the source file didn't begin with a
 	// package line and we accept fragmented input, fall through to
 	// try as a source fragment.  Stop and return on any other error.
-	if !opt.Fragment || !strings.Contains(err.Error(), "expected 'package'") {
+	if !fragment || !strings.Contains(err.Error(), "expected 'package'") {
 		return nil, nil, err
 	}
 
diff --git a/test/performance/vendor/golang.org/x/tools/internal/imports/source.go b/test/performance/vendor/golang.org/x/tools/internal/imports/source.go
new file mode 100644
index 0000000000..cbe4f3c5ba
--- /dev/null
+++ b/test/performance/vendor/golang.org/x/tools/internal/imports/source.go
@@ -0,0 +1,63 @@
+// Copyright 2024 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 imports
+
+import "context"
+
+// These types document the APIs below.
+//
+// TODO(rfindley): consider making these defined types rather than aliases.
+type (
+	ImportPath  = string
+	PackageName = string
+	Symbol      = string
+
+	// References is set of References found in a Go file. The first map key is the
+	// left hand side of a selector expression, the second key is the right hand
+	// side, and the value should always be true.
+	References = map[PackageName]map[Symbol]bool
+)
+
+// A Result satisfies a missing import.
+//
+// The Import field describes the missing import spec, and the Package field
+// summarizes the package exports.
+type Result struct {
+	Import  *ImportInfo
+	Package *PackageInfo
+}
+
+// An ImportInfo represents a single import statement.
+type ImportInfo struct {
+	ImportPath string // import path, e.g. "crypto/rand".
+	Name       string // import name, e.g. "crand", or "" if none.
+}
+
+// A PackageInfo represents what's known about a package.
+type PackageInfo struct {
+	Name    string          // package name in the package declaration, if known
+	Exports map[string]bool // set of names of known package level sortSymbols
+}
+
+// A Source provides imports to satisfy unresolved references in the file being
+// fixed.
+type Source interface {
+	// LoadPackageNames queries PackageName information for the requested import
+	// paths, when operating from the provided srcDir.
+	//
+	// TODO(rfindley): try to refactor to remove this operation.
+	LoadPackageNames(ctx context.Context, srcDir string, paths []ImportPath) (map[ImportPath]PackageName, error)
+
+	// ResolveReferences asks the Source for the best package name to satisfy
+	// each of the missing references, in the context of fixing the given
+	// filename.
+	//
+	// Returns a map from package name to a [Result] for that package name that
+	// provides the required symbols. Keys may be omitted in the map if no
+	// candidates satisfy all missing references for that package name. It is up
+	// to each data source to select the best result for each entry in the
+	// missing map.
+	ResolveReferences(ctx context.Context, filename string, missing References) ([]*Result, error)
+}
diff --git a/test/performance/vendor/golang.org/x/tools/internal/imports/source_env.go b/test/performance/vendor/golang.org/x/tools/internal/imports/source_env.go
new file mode 100644
index 0000000000..d14abaa319
--- /dev/null
+++ b/test/performance/vendor/golang.org/x/tools/internal/imports/source_env.go
@@ -0,0 +1,129 @@
+// Copyright 2024 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 imports
+
+import (
+	"context"
+	"path/filepath"
+	"strings"
+	"sync"
+
+	"golang.org/x/sync/errgroup"
+	"golang.org/x/tools/internal/gopathwalk"
+)
+
+// ProcessEnvSource implements the [Source] interface using the legacy
+// [ProcessEnv] abstraction.
+type ProcessEnvSource struct {
+	env      *ProcessEnv
+	srcDir   string
+	filename string
+	pkgName  string
+}
+
+// NewProcessEnvSource returns a [ProcessEnvSource] wrapping the given
+// env, to be used for fixing imports in the file with name filename in package
+// named pkgName.
+func NewProcessEnvSource(env *ProcessEnv, filename, pkgName string) (*ProcessEnvSource, error) {
+	abs, err := filepath.Abs(filename)
+	if err != nil {
+		return nil, err
+	}
+	srcDir := filepath.Dir(abs)
+	return &ProcessEnvSource{
+		env:      env,
+		srcDir:   srcDir,
+		filename: filename,
+		pkgName:  pkgName,
+	}, nil
+}
+
+func (s *ProcessEnvSource) LoadPackageNames(ctx context.Context, srcDir string, unknown []string) (map[string]string, error) {
+	r, err := s.env.GetResolver()
+	if err != nil {
+		return nil, err
+	}
+	return r.loadPackageNames(unknown, srcDir)
+}
+
+func (s *ProcessEnvSource) ResolveReferences(ctx context.Context, filename string, refs map[string]map[string]bool) ([]*Result, error) {
+	var mu sync.Mutex
+	found := make(map[string][]pkgDistance)
+	callback := &scanCallback{
+		rootFound: func(gopathwalk.Root) bool {
+			return true // We want everything.
+		},
+		dirFound: func(pkg *pkg) bool {
+			return pkgIsCandidate(filename, refs, pkg)
+		},
+		packageNameLoaded: func(pkg *pkg) bool {
+			if _, want := refs[pkg.packageName]; !want {
+				return false
+			}
+			if pkg.dir == s.srcDir && s.pkgName == pkg.packageName {
+				// The candidate is in the same directory and has the
+				// same package name. Don't try to import ourselves.
+				return false
+			}
+			if !canUse(filename, pkg.dir) {
+				return false
+			}
+			mu.Lock()
+			defer mu.Unlock()
+			found[pkg.packageName] = append(found[pkg.packageName], pkgDistance{pkg, distance(s.srcDir, pkg.dir)})
+			return false // We'll do our own loading after we sort.
+		},
+	}
+	resolver, err := s.env.GetResolver()
+	if err != nil {
+		return nil, err
+	}
+	if err := resolver.scan(ctx, callback); err != nil {
+		return nil, err
+	}
+
+	g, ctx := errgroup.WithContext(ctx)
+
+	searcher := symbolSearcher{
+		logf:        s.env.logf,
+		srcDir:      s.srcDir,
+		xtest:       strings.HasSuffix(s.pkgName, "_test"),
+		loadExports: resolver.loadExports,
+	}
+
+	var resultMu sync.Mutex
+	results := make(map[string]*Result, len(refs))
+	for pkgName, symbols := range refs {
+		g.Go(func() error {
+			found, err := searcher.search(ctx, found[pkgName], pkgName, symbols)
+			if err != nil {
+				return err
+			}
+			if found == nil {
+				return nil // No matching package.
+			}
+
+			imp := &ImportInfo{
+				ImportPath: found.importPathShort,
+			}
+			pkg := &PackageInfo{
+				Name:    pkgName,
+				Exports: symbols,
+			}
+			resultMu.Lock()
+			results[pkgName] = &Result{Import: imp, Package: pkg}
+			resultMu.Unlock()
+			return nil
+		})
+	}
+	if err := g.Wait(); err != nil {
+		return nil, err
+	}
+	var ans []*Result
+	for _, x := range results {
+		ans = append(ans, x)
+	}
+	return ans, nil
+}
diff --git a/test/performance/vendor/golang.org/x/tools/internal/imports/source_modindex.go b/test/performance/vendor/golang.org/x/tools/internal/imports/source_modindex.go
new file mode 100644
index 0000000000..05229f06ce
--- /dev/null
+++ b/test/performance/vendor/golang.org/x/tools/internal/imports/source_modindex.go
@@ -0,0 +1,103 @@
+// Copyright 2024 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 imports
+
+import (
+	"context"
+	"sync"
+	"time"
+
+	"golang.org/x/tools/internal/modindex"
+)
+
+// This code is here rather than in the modindex package
+// to avoid import loops
+
+// implements Source using modindex, so only for module cache.
+//
+// this is perhaps over-engineered. A new Index is read at first use.
+// And then Update is called after every 15 minutes, and a new Index
+// is read if the index changed. It is not clear the Mutex is needed.
+type IndexSource struct {
+	modcachedir string
+	mutex       sync.Mutex
+	ix          *modindex.Index
+	expires     time.Time
+}
+
+// create a new Source. Called from NewView in cache/session.go.
+func NewIndexSource(cachedir string) *IndexSource {
+	return &IndexSource{modcachedir: cachedir}
+}
+
+func (s *IndexSource) LoadPackageNames(ctx context.Context, srcDir string, paths []ImportPath) (map[ImportPath]PackageName, error) {
+	/// This is used by goimports to resolve the package names of imports of the
+	// current package, which is irrelevant for the module cache.
+	return nil, nil
+}
+
+func (s *IndexSource) ResolveReferences(ctx context.Context, filename string, missing References) ([]*Result, error) {
+	if err := s.maybeReadIndex(); err != nil {
+		return nil, err
+	}
+	var cs []modindex.Candidate
+	for pkg, nms := range missing {
+		for nm := range nms {
+			x := s.ix.Lookup(pkg, nm, false)
+			cs = append(cs, x...)
+		}
+	}
+	found := make(map[string]*Result)
+	for _, c := range cs {
+		var x *Result
+		if x = found[c.ImportPath]; x == nil {
+			x = &Result{
+				Import: &ImportInfo{
+					ImportPath: c.ImportPath,
+					Name:       "",
+				},
+				Package: &PackageInfo{
+					Name:    c.PkgName,
+					Exports: make(map[string]bool),
+				},
+			}
+			found[c.ImportPath] = x
+		}
+		x.Package.Exports[c.Name] = true
+	}
+	var ans []*Result
+	for _, x := range found {
+		ans = append(ans, x)
+	}
+	return ans, nil
+}
+
+func (s *IndexSource) maybeReadIndex() error {
+	s.mutex.Lock()
+	defer s.mutex.Unlock()
+
+	var readIndex bool
+	if time.Now().After(s.expires) {
+		ok, err := modindex.Update(s.modcachedir)
+		if err != nil {
+			return err
+		}
+		if ok {
+			readIndex = true
+		}
+	}
+
+	if readIndex || s.ix == nil {
+		ix, err := modindex.ReadIndex(s.modcachedir)
+		if err != nil {
+			return err
+		}
+		s.ix = ix
+		// for now refresh every 15 minutes
+		s.expires = time.Now().Add(time.Minute * 15)
+	}
+
+	return nil
+}
diff --git a/test/performance/vendor/golang.org/x/tools/internal/modindex/directories.go b/test/performance/vendor/golang.org/x/tools/internal/modindex/directories.go
new file mode 100644
index 0000000000..1e1a02f239
--- /dev/null
+++ b/test/performance/vendor/golang.org/x/tools/internal/modindex/directories.go
@@ -0,0 +1,135 @@
+// Copyright 2024 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 modindex
+
+import (
+	"fmt"
+	"log"
+	"os"
+	"path/filepath"
+	"regexp"
+	"slices"
+	"strings"
+	"sync"
+	"time"
+
+	"golang.org/x/mod/semver"
+	"golang.org/x/tools/internal/gopathwalk"
+)
+
+type directory struct {
+	path       Relpath
+	importPath string
+	version    string // semantic version
+	syms       []symbol
+}
+
+// filterDirs groups the directories by import path,
+// sorting the ones with the same import path by semantic version,
+// most recent first.
+func byImportPath(dirs []Relpath) (map[string][]*directory, error) {
+	ans := make(map[string][]*directory) // key is import path
+	for _, d := range dirs {
+		ip, sv, err := DirToImportPathVersion(d)
+		if err != nil {
+			return nil, err
+		}
+		ans[ip] = append(ans[ip], &directory{
+			path:       d,
+			importPath: ip,
+			version:    sv,
+		})
+	}
+	for k, v := range ans {
+		semanticSort(v)
+		ans[k] = v
+	}
+	return ans, nil
+}
+
+// sort the directories by semantic version, latest first
+func semanticSort(v []*directory) {
+	slices.SortFunc(v, func(l, r *directory) int {
+		if n := semver.Compare(l.version, r.version); n != 0 {
+			return -n // latest first
+		}
+		return strings.Compare(string(l.path), string(r.path))
+	})
+}
+
+// modCacheRegexp splits a relpathpath into module, module version, and package.
+var modCacheRegexp = regexp.MustCompile(`(.*)@([^/\\]*)(.*)`)
+
+// DirToImportPathVersion computes import path and semantic version
+func DirToImportPathVersion(dir Relpath) (string, string, error) {
+	m := modCacheRegexp.FindStringSubmatch(string(dir))
+	// m[1] is the module path
+	// m[2] is the version major.minor.patch(-
 1 && flds[1][1] == 'D',
+			}
+			if px.Type == Func {
+				n, err := strconv.Atoi(flds[2])
+				if err != nil {
+					continue // should never happen
+				}
+				px.Results = int16(n)
+				if len(flds) >= 4 {
+					sig := strings.Split(flds[3], " ")
+					for i := 0; i < len(sig); i++ {
+						// $ cannot otherwise occur. removing the spaces
+						// almost works, but for chan struct{}, e.g.
+						sig[i] = strings.Replace(sig[i], "$", " ", -1)
+					}
+					px.Sig = toFields(sig)
+				}
+			}
+			ans = append(ans, px)
+		}
+	}
+	return ans
+}
+
+func toFields(sig []string) []Field {
+	ans := make([]Field, len(sig)/2)
+	for i := 0; i < len(ans); i++ {
+		ans[i] = Field{Arg: sig[2*i], Type: sig[2*i+1]}
+	}
+	return ans
+}
+
+// benchmarks show this is measurably better than strings.Split
+// split into first 4 fields separated by single space
+func fastSplit(x string) []string {
+	ans := make([]string, 0, 4)
+	nxt := 0
+	start := 0
+	for i := 0; i < len(x); i++ {
+		if x[i] != ' ' {
+			continue
+		}
+		ans = append(ans, x[start:i])
+		nxt++
+		start = i + 1
+		if nxt >= 3 {
+			break
+		}
+	}
+	ans = append(ans, x[start:])
+	return ans
+}
+
+func asLexType(c byte) LexType {
+	switch c {
+	case 'C':
+		return Const
+	case 'V':
+		return Var
+	case 'T':
+		return Type
+	case 'F':
+		return Func
+	}
+	return -1
+}
diff --git a/test/performance/vendor/golang.org/x/tools/internal/modindex/modindex.go b/test/performance/vendor/golang.org/x/tools/internal/modindex/modindex.go
new file mode 100644
index 0000000000..355a53e71a
--- /dev/null
+++ b/test/performance/vendor/golang.org/x/tools/internal/modindex/modindex.go
@@ -0,0 +1,164 @@
+// Copyright 2024 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 modindex contains code for building and searching an index to
+// the Go module cache. The directory containing the index, returned by
+// IndexDir(), contains a file index-name- that contains the name
+// of the current index. We believe writing that short file is atomic.
+// ReadIndex reads that file to get the file name of the index.
+// WriteIndex writes an index with a unique name and then
+// writes that name into a new version of index-name-.
+// ( stands for the CurrentVersion of the index format.)
+package modindex
+
+import (
+	"path/filepath"
+	"slices"
+	"strings"
+	"time"
+
+	"golang.org/x/mod/semver"
+)
+
+// Create always creates a new index for the go module cache that is in cachedir.
+func Create(cachedir string) error {
+	_, err := indexModCache(cachedir, true)
+	return err
+}
+
+// Update the index for the go module cache that is in cachedir,
+// If there is no existing index it will build one.
+// If there are changed directories since the last index, it will
+// write a new one and return true. Otherwise it returns false.
+func Update(cachedir string) (bool, error) {
+	return indexModCache(cachedir, false)
+}
+
+// indexModCache writes an index current as of when it is called.
+// If clear is true the index is constructed from all of GOMODCACHE
+// otherwise the index is constructed from the last previous index
+// and the updates to the cache. It returns true if it wrote an index,
+// false otherwise.
+func indexModCache(cachedir string, clear bool) (bool, error) {
+	cachedir, err := filepath.Abs(cachedir)
+	if err != nil {
+		return false, err
+	}
+	cd := Abspath(cachedir)
+	future := time.Now().Add(24 * time.Hour) // safely in the future
+	ok, err := modindexTimed(future, cd, clear)
+	if err != nil {
+		return false, err
+	}
+	return ok, nil
+}
+
+// modindexTimed writes an index current as of onlyBefore.
+// If clear is true the index is constructed from all of GOMODCACHE
+// otherwise the index is constructed from the last previous index
+// and all the updates to the cache before onlyBefore.
+// It returns true if it wrote a new index, false if it wrote nothing.
+func modindexTimed(onlyBefore time.Time, cachedir Abspath, clear bool) (bool, error) {
+	var curIndex *Index
+	if !clear {
+		var err error
+		curIndex, err = ReadIndex(string(cachedir))
+		if clear && err != nil {
+			return false, err
+		}
+		// TODO(pjw): check that most of those directories still exist
+	}
+	cfg := &work{
+		onlyBefore: onlyBefore,
+		oldIndex:   curIndex,
+		cacheDir:   cachedir,
+	}
+	if curIndex != nil {
+		cfg.onlyAfter = curIndex.Changed
+	}
+	if err := cfg.buildIndex(); err != nil {
+		return false, err
+	}
+	if len(cfg.newIndex.Entries) == 0 && curIndex != nil {
+		// no changes from existing curIndex, don't write a new index
+		return false, nil
+	}
+	if err := cfg.writeIndex(); err != nil {
+		return false, err
+	}
+	return true, nil
+}
+
+type work struct {
+	onlyBefore time.Time // do not use directories later than this
+	onlyAfter  time.Time // only interested in directories after this
+	// directories from before onlyAfter come from oldIndex
+	oldIndex *Index
+	newIndex *Index
+	cacheDir Abspath
+}
+
+func (w *work) buildIndex() error {
+	// The effective date of the new index should be at least
+	// slightly earlier than when the directories are scanned
+	// so set it now.
+	w.newIndex = &Index{Changed: time.Now(), Cachedir: w.cacheDir}
+	dirs := findDirs(string(w.cacheDir), w.onlyAfter, w.onlyBefore)
+	if len(dirs) == 0 {
+		return nil
+	}
+	newdirs, err := byImportPath(dirs)
+	if err != nil {
+		return err
+	}
+	// for each import path it might occur only in newdirs,
+	// only in w.oldIndex, or in both.
+	// If it occurs in both, use the semantically later one
+	if w.oldIndex != nil {
+		for _, e := range w.oldIndex.Entries {
+			found, ok := newdirs[e.ImportPath]
+			if !ok {
+				w.newIndex.Entries = append(w.newIndex.Entries, e)
+				continue // use this one, there is no new one
+			}
+			if semver.Compare(found[0].version, e.Version) > 0 {
+				// use the new one
+			} else {
+				// use the old one, forget the new one
+				w.newIndex.Entries = append(w.newIndex.Entries, e)
+				delete(newdirs, e.ImportPath)
+			}
+		}
+	}
+	// get symbol information for all the new diredtories
+	getSymbols(w.cacheDir, newdirs)
+	// assemble the new index entries
+	for k, v := range newdirs {
+		d := v[0]
+		pkg, names := processSyms(d.syms)
+		if pkg == "" {
+			continue // PJW: does this ever happen?
+		}
+		entry := Entry{
+			PkgName:    pkg,
+			Dir:        d.path,
+			ImportPath: k,
+			Version:    d.version,
+			Names:      names,
+		}
+		w.newIndex.Entries = append(w.newIndex.Entries, entry)
+	}
+	// sort the entries in the new index
+	slices.SortFunc(w.newIndex.Entries, func(l, r Entry) int {
+		if n := strings.Compare(l.PkgName, r.PkgName); n != 0 {
+			return n
+		}
+		return strings.Compare(l.ImportPath, r.ImportPath)
+	})
+	return nil
+}
+
+func (w *work) writeIndex() error {
+	return writeIndex(w.cacheDir, w.newIndex)
+}
diff --git a/test/performance/vendor/golang.org/x/tools/internal/modindex/symbols.go b/test/performance/vendor/golang.org/x/tools/internal/modindex/symbols.go
new file mode 100644
index 0000000000..33bf2641f7
--- /dev/null
+++ b/test/performance/vendor/golang.org/x/tools/internal/modindex/symbols.go
@@ -0,0 +1,217 @@
+// Copyright 2024 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 modindex
+
+import (
+	"fmt"
+	"go/ast"
+	"go/parser"
+	"go/token"
+	"go/types"
+	"os"
+	"path/filepath"
+	"slices"
+	"strings"
+
+	"golang.org/x/sync/errgroup"
+)
+
+// The name of a symbol contains information about the symbol:
+//  T for types, TD if the type is deprecated
+//  C for consts, CD if the const is deprecated
+//  V for vars, VD if the var is deprecated
+// and for funcs:  F  ( )*
+// any spaces in  are replaced by $s so that the fields
+// of the name are space separated. F is replaced by FD if the func
+// is deprecated.
+type symbol struct {
+	pkg  string // name of the symbols's package
+	name string // declared name
+	kind string // T, C, V, or F
+	sig  string // signature information, for F
+}
+
+// find the symbols for the best directories
+func getSymbols(cd Abspath, dirs map[string][]*directory) {
+	var g errgroup.Group
+	g.SetLimit(-1) // maybe throttle this some day
+	for _, vv := range dirs {
+		// throttling some day?
+		d := vv[0]
+		g.Go(func() error {
+			thedir := filepath.Join(string(cd), string(d.path))
+			mode := parser.SkipObjectResolution | parser.ParseComments
+
+			fi, err := os.ReadDir(thedir)
+			if err != nil {
+				return nil // log this someday?
+			}
+			for _, fx := range fi {
+				if !strings.HasSuffix(fx.Name(), ".go") || strings.HasSuffix(fx.Name(), "_test.go") {
+					continue
+				}
+				fname := filepath.Join(thedir, fx.Name())
+				tr, err := parser.ParseFile(token.NewFileSet(), fname, nil, mode)
+				if err != nil {
+					continue // ignore errors, someday log them?
+				}
+				d.syms = append(d.syms, getFileExports(tr)...)
+			}
+			return nil
+		})
+	}
+	g.Wait()
+}
+
+func getFileExports(f *ast.File) []symbol {
+	pkg := f.Name.Name
+	if pkg == "main" {
+		return nil
+	}
+	var ans []symbol
+	// should we look for //go:build ignore?
+	for _, decl := range f.Decls {
+		switch decl := decl.(type) {
+		case *ast.FuncDecl:
+			if decl.Recv != nil {
+				// ignore methods, as we are completing package selections
+				continue
+			}
+			name := decl.Name.Name
+			dtype := decl.Type
+			// not looking at dtype.TypeParams. That is, treating
+			// generic functions just like non-generic ones.
+			sig := dtype.Params
+			kind := "F"
+			if isDeprecated(decl.Doc) {
+				kind += "D"
+			}
+			result := []string{fmt.Sprintf("%d", dtype.Results.NumFields())}
+			for _, x := range sig.List {
+				// This code creates a string representing the type.
+				// TODO(pjw): it may be fragile:
+				// 1. x.Type could be nil, perhaps in ill-formed code
+				// 2. ExprString might someday change incompatibly to
+				//    include struct tags, which can be arbitrary strings
+				if x.Type == nil {
+					// Can this happen without a parse error? (Files with parse
+					// errors are ignored in getSymbols)
+					continue // maybe report this someday
+				}
+				tp := types.ExprString(x.Type)
+				if len(tp) == 0 {
+					// Can this happen?
+					continue // maybe report this someday
+				}
+				// This is only safe if ExprString never returns anything with a $
+				// The only place a $ can occur seems to be in a struct tag, which
+				// can be an arbitrary string literal, and ExprString does not presently
+				// print struct tags. So for this to happen the type of a formal parameter
+				// has to be a explict struct, e.g. foo(x struct{a int "$"}) and ExprString
+				// would have to show the struct tag. Even testing for this case seems
+				// a waste of effort, but let's not ignore such pathologies
+				if strings.Contains(tp, "$") {
+					continue
+				}
+				tp = strings.Replace(tp, " ", "$", -1)
+				if len(x.Names) == 0 {
+					result = append(result, "_")
+					result = append(result, tp)
+				} else {
+					for _, y := range x.Names {
+						result = append(result, y.Name)
+						result = append(result, tp)
+					}
+				}
+			}
+			sigs := strings.Join(result, " ")
+			if s := newsym(pkg, name, kind, sigs); s != nil {
+				ans = append(ans, *s)
+			}
+		case *ast.GenDecl:
+			depr := isDeprecated(decl.Doc)
+			switch decl.Tok {
+			case token.CONST, token.VAR:
+				tp := "V"
+				if decl.Tok == token.CONST {
+					tp = "C"
+				}
+				if depr {
+					tp += "D"
+				}
+				for _, sp := range decl.Specs {
+					for _, x := range sp.(*ast.ValueSpec).Names {
+						if s := newsym(pkg, x.Name, tp, ""); s != nil {
+							ans = append(ans, *s)
+						}
+					}
+				}
+			case token.TYPE:
+				tp := "T"
+				if depr {
+					tp += "D"
+				}
+				for _, sp := range decl.Specs {
+					if s := newsym(pkg, sp.(*ast.TypeSpec).Name.Name, tp, ""); s != nil {
+						ans = append(ans, *s)
+					}
+				}
+			}
+		}
+	}
+	return ans
+}
+
+func newsym(pkg, name, kind, sig string) *symbol {
+	if len(name) == 0 || !ast.IsExported(name) {
+		return nil
+	}
+	sym := symbol{pkg: pkg, name: name, kind: kind, sig: sig}
+	return &sym
+}
+
+func isDeprecated(doc *ast.CommentGroup) bool {
+	if doc == nil {
+		return false
+	}
+	// go.dev/wiki/Deprecated Paragraph starting 'Deprecated:'
+	// This code fails for /* Deprecated: */, but it's the code from
+	// gopls/internal/analysis/deprecated
+	lines := strings.Split(doc.Text(), "\n\n")
+	for _, line := range lines {
+		if strings.HasPrefix(line, "Deprecated:") {
+			return true
+		}
+	}
+	return false
+}
+
+// return the package name and the value for the symbols.
+// if there are multiple packages, choose one arbitrarily
+// the returned slice is sorted lexicographically
+func processSyms(syms []symbol) (string, []string) {
+	if len(syms) == 0 {
+		return "", nil
+	}
+	slices.SortFunc(syms, func(l, r symbol) int {
+		return strings.Compare(l.name, r.name)
+	})
+	pkg := syms[0].pkg
+	var names []string
+	for _, s := range syms {
+		var nx string
+		if s.pkg == pkg {
+			if s.sig != "" {
+				nx = fmt.Sprintf("%s %s %s", s.name, s.kind, s.sig)
+			} else {
+				nx = fmt.Sprintf("%s %s", s.name, s.kind)
+			}
+			names = append(names, nx)
+		} else {
+			continue // PJW: do we want to keep track of these?
+		}
+	}
+	return pkg, names
+}
diff --git a/test/performance/vendor/golang.org/x/tools/internal/modindex/types.go b/test/performance/vendor/golang.org/x/tools/internal/modindex/types.go
new file mode 100644
index 0000000000..ece4488630
--- /dev/null
+++ b/test/performance/vendor/golang.org/x/tools/internal/modindex/types.go
@@ -0,0 +1,25 @@
+// Copyright 2024 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 modindex
+
+import (
+	"strings"
+)
+
+// some special types to avoid confusions
+
+// distinguish various types of directory names. It's easy to get confused.
+type Abspath string // absolute paths
+type Relpath string // paths with GOMODCACHE prefix removed
+
+func toRelpath(cachedir Abspath, s string) Relpath {
+	if strings.HasPrefix(s, string(cachedir)) {
+		if s == string(cachedir) {
+			return Relpath("")
+		}
+		return Relpath(s[len(cachedir)+1:])
+	}
+	return Relpath(s)
+}
diff --git a/test/performance/vendor/golang.org/x/tools/internal/packagesinternal/packages.go b/test/performance/vendor/golang.org/x/tools/internal/packagesinternal/packages.go
index 44719de173..66e69b4389 100644
--- a/test/performance/vendor/golang.org/x/tools/internal/packagesinternal/packages.go
+++ b/test/performance/vendor/golang.org/x/tools/internal/packagesinternal/packages.go
@@ -5,7 +5,6 @@
 // Package packagesinternal exposes internal-only fields from go/packages.
 package packagesinternal
 
-var GetForTest = func(p interface{}) string { return "" }
 var GetDepsErrors = func(p interface{}) []*PackageError { return nil }
 
 type PackageError struct {
@@ -16,7 +15,6 @@ type PackageError struct {
 
 var TypecheckCgo int
 var DepsErrors int // must be set as a LoadMode to call GetDepsErrors
-var ForTest int    // must be set as a LoadMode to call GetForTest
 
 var SetModFlag = func(config interface{}, value string) {}
 var SetModFile = func(config interface{}, value string) {}
diff --git a/test/performance/vendor/golang.org/x/tools/internal/stdlib/manifest.go b/test/performance/vendor/golang.org/x/tools/internal/stdlib/manifest.go
index cdaac9ab34..9f0b871ff6 100644
--- a/test/performance/vendor/golang.org/x/tools/internal/stdlib/manifest.go
+++ b/test/performance/vendor/golang.org/x/tools/internal/stdlib/manifest.go
@@ -268,6 +268,8 @@ var PackageSymbols = map[string][]Symbol{
 		{"ErrTooLarge", Var, 0},
 		{"Fields", Func, 0},
 		{"FieldsFunc", Func, 0},
+		{"FieldsFuncSeq", Func, 24},
+		{"FieldsSeq", Func, 24},
 		{"HasPrefix", Func, 0},
 		{"HasSuffix", Func, 0},
 		{"Index", Func, 0},
@@ -280,6 +282,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"LastIndexAny", Func, 0},
 		{"LastIndexByte", Func, 5},
 		{"LastIndexFunc", Func, 0},
+		{"Lines", Func, 24},
 		{"Map", Func, 0},
 		{"MinRead", Const, 0},
 		{"NewBuffer", Func, 0},
@@ -293,7 +296,9 @@ var PackageSymbols = map[string][]Symbol{
 		{"Split", Func, 0},
 		{"SplitAfter", Func, 0},
 		{"SplitAfterN", Func, 0},
+		{"SplitAfterSeq", Func, 24},
 		{"SplitN", Func, 0},
+		{"SplitSeq", Func, 24},
 		{"Title", Func, 0},
 		{"ToLower", Func, 0},
 		{"ToLowerSpecial", Func, 0},
@@ -535,6 +540,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"NewCTR", Func, 0},
 		{"NewGCM", Func, 2},
 		{"NewGCMWithNonceSize", Func, 5},
+		{"NewGCMWithRandomNonce", Func, 24},
 		{"NewGCMWithTagSize", Func, 11},
 		{"NewOFB", Func, 0},
 		{"Stream", Type, 0},
@@ -673,6 +679,14 @@ var PackageSymbols = map[string][]Symbol{
 		{"Unmarshal", Func, 0},
 		{"UnmarshalCompressed", Func, 15},
 	},
+	"crypto/fips140": {
+		{"Enabled", Func, 24},
+	},
+	"crypto/hkdf": {
+		{"Expand", Func, 24},
+		{"Extract", Func, 24},
+		{"Key", Func, 24},
+	},
 	"crypto/hmac": {
 		{"Equal", Func, 1},
 		{"New", Func, 0},
@@ -683,11 +697,43 @@ var PackageSymbols = map[string][]Symbol{
 		{"Size", Const, 0},
 		{"Sum", Func, 2},
 	},
+	"crypto/mlkem": {
+		{"(*DecapsulationKey1024).Bytes", Method, 24},
+		{"(*DecapsulationKey1024).Decapsulate", Method, 24},
+		{"(*DecapsulationKey1024).EncapsulationKey", Method, 24},
+		{"(*DecapsulationKey768).Bytes", Method, 24},
+		{"(*DecapsulationKey768).Decapsulate", Method, 24},
+		{"(*DecapsulationKey768).EncapsulationKey", Method, 24},
+		{"(*EncapsulationKey1024).Bytes", Method, 24},
+		{"(*EncapsulationKey1024).Encapsulate", Method, 24},
+		{"(*EncapsulationKey768).Bytes", Method, 24},
+		{"(*EncapsulationKey768).Encapsulate", Method, 24},
+		{"CiphertextSize1024", Const, 24},
+		{"CiphertextSize768", Const, 24},
+		{"DecapsulationKey1024", Type, 24},
+		{"DecapsulationKey768", Type, 24},
+		{"EncapsulationKey1024", Type, 24},
+		{"EncapsulationKey768", Type, 24},
+		{"EncapsulationKeySize1024", Const, 24},
+		{"EncapsulationKeySize768", Const, 24},
+		{"GenerateKey1024", Func, 24},
+		{"GenerateKey768", Func, 24},
+		{"NewDecapsulationKey1024", Func, 24},
+		{"NewDecapsulationKey768", Func, 24},
+		{"NewEncapsulationKey1024", Func, 24},
+		{"NewEncapsulationKey768", Func, 24},
+		{"SeedSize", Const, 24},
+		{"SharedKeySize", Const, 24},
+	},
+	"crypto/pbkdf2": {
+		{"Key", Func, 24},
+	},
 	"crypto/rand": {
 		{"Int", Func, 0},
 		{"Prime", Func, 0},
 		{"Read", Func, 0},
 		{"Reader", Var, 0},
+		{"Text", Func, 24},
 	},
 	"crypto/rc4": {
 		{"(*Cipher).Reset", Method, 0},
@@ -766,6 +812,39 @@ var PackageSymbols = map[string][]Symbol{
 		{"Sum224", Func, 2},
 		{"Sum256", Func, 2},
 	},
+	"crypto/sha3": {
+		{"(*SHA3).AppendBinary", Method, 24},
+		{"(*SHA3).BlockSize", Method, 24},
+		{"(*SHA3).MarshalBinary", Method, 24},
+		{"(*SHA3).Reset", Method, 24},
+		{"(*SHA3).Size", Method, 24},
+		{"(*SHA3).Sum", Method, 24},
+		{"(*SHA3).UnmarshalBinary", Method, 24},
+		{"(*SHA3).Write", Method, 24},
+		{"(*SHAKE).AppendBinary", Method, 24},
+		{"(*SHAKE).BlockSize", Method, 24},
+		{"(*SHAKE).MarshalBinary", Method, 24},
+		{"(*SHAKE).Read", Method, 24},
+		{"(*SHAKE).Reset", Method, 24},
+		{"(*SHAKE).UnmarshalBinary", Method, 24},
+		{"(*SHAKE).Write", Method, 24},
+		{"New224", Func, 24},
+		{"New256", Func, 24},
+		{"New384", Func, 24},
+		{"New512", Func, 24},
+		{"NewCSHAKE128", Func, 24},
+		{"NewCSHAKE256", Func, 24},
+		{"NewSHAKE128", Func, 24},
+		{"NewSHAKE256", Func, 24},
+		{"SHA3", Type, 24},
+		{"SHAKE", Type, 24},
+		{"Sum224", Func, 24},
+		{"Sum256", Func, 24},
+		{"Sum384", Func, 24},
+		{"Sum512", Func, 24},
+		{"SumSHAKE128", Func, 24},
+		{"SumSHAKE256", Func, 24},
+	},
 	"crypto/sha512": {
 		{"BlockSize", Const, 0},
 		{"New", Func, 0},
@@ -788,6 +867,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"ConstantTimeEq", Func, 0},
 		{"ConstantTimeLessOrEq", Func, 2},
 		{"ConstantTimeSelect", Func, 0},
+		{"WithDataIndependentTiming", Func, 24},
 		{"XORBytes", Func, 20},
 	},
 	"crypto/tls": {
@@ -864,6 +944,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"ClientHelloInfo", Type, 4},
 		{"ClientHelloInfo.CipherSuites", Field, 4},
 		{"ClientHelloInfo.Conn", Field, 8},
+		{"ClientHelloInfo.Extensions", Field, 24},
 		{"ClientHelloInfo.ServerName", Field, 4},
 		{"ClientHelloInfo.SignatureSchemes", Field, 8},
 		{"ClientHelloInfo.SupportedCurves", Field, 4},
@@ -881,6 +962,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"Config.CurvePreferences", Field, 3},
 		{"Config.DynamicRecordSizingDisabled", Field, 7},
 		{"Config.EncryptedClientHelloConfigList", Field, 23},
+		{"Config.EncryptedClientHelloKeys", Field, 24},
 		{"Config.EncryptedClientHelloRejectionVerify", Field, 23},
 		{"Config.GetCertificate", Field, 4},
 		{"Config.GetClientCertificate", Field, 8},
@@ -934,6 +1016,10 @@ var PackageSymbols = map[string][]Symbol{
 		{"ECHRejectionError", Type, 23},
 		{"ECHRejectionError.RetryConfigList", Field, 23},
 		{"Ed25519", Const, 13},
+		{"EncryptedClientHelloKey", Type, 24},
+		{"EncryptedClientHelloKey.Config", Field, 24},
+		{"EncryptedClientHelloKey.PrivateKey", Field, 24},
+		{"EncryptedClientHelloKey.SendAsRetry", Field, 24},
 		{"InsecureCipherSuites", Func, 14},
 		{"Listen", Func, 0},
 		{"LoadX509KeyPair", Func, 0},
@@ -1032,6 +1118,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"VersionTLS12", Const, 2},
 		{"VersionTLS13", Const, 12},
 		{"X25519", Const, 8},
+		{"X25519MLKEM768", Const, 24},
 		{"X509KeyPair", Func, 0},
 	},
 	"crypto/x509": {
@@ -1056,6 +1143,8 @@ var PackageSymbols = map[string][]Symbol{
 		{"(ConstraintViolationError).Error", Method, 0},
 		{"(HostnameError).Error", Method, 0},
 		{"(InsecureAlgorithmError).Error", Method, 6},
+		{"(OID).AppendBinary", Method, 24},
+		{"(OID).AppendText", Method, 24},
 		{"(OID).Equal", Method, 22},
 		{"(OID).EqualASN1OID", Method, 22},
 		{"(OID).MarshalBinary", Method, 23},
@@ -1084,6 +1173,10 @@ var PackageSymbols = map[string][]Symbol{
 		{"Certificate.Extensions", Field, 2},
 		{"Certificate.ExtraExtensions", Field, 2},
 		{"Certificate.IPAddresses", Field, 1},
+		{"Certificate.InhibitAnyPolicy", Field, 24},
+		{"Certificate.InhibitAnyPolicyZero", Field, 24},
+		{"Certificate.InhibitPolicyMapping", Field, 24},
+		{"Certificate.InhibitPolicyMappingZero", Field, 24},
 		{"Certificate.IsCA", Field, 0},
 		{"Certificate.Issuer", Field, 0},
 		{"Certificate.IssuingCertificateURL", Field, 2},
@@ -1100,6 +1193,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"Certificate.PermittedURIDomains", Field, 10},
 		{"Certificate.Policies", Field, 22},
 		{"Certificate.PolicyIdentifiers", Field, 0},
+		{"Certificate.PolicyMappings", Field, 24},
 		{"Certificate.PublicKey", Field, 0},
 		{"Certificate.PublicKeyAlgorithm", Field, 0},
 		{"Certificate.Raw", Field, 0},
@@ -1107,6 +1201,8 @@ var PackageSymbols = map[string][]Symbol{
 		{"Certificate.RawSubject", Field, 0},
 		{"Certificate.RawSubjectPublicKeyInfo", Field, 0},
 		{"Certificate.RawTBSCertificate", Field, 0},
+		{"Certificate.RequireExplicitPolicy", Field, 24},
+		{"Certificate.RequireExplicitPolicyZero", Field, 24},
 		{"Certificate.SerialNumber", Field, 0},
 		{"Certificate.Signature", Field, 0},
 		{"Certificate.SignatureAlgorithm", Field, 0},
@@ -1198,6 +1294,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"NameConstraintsWithoutSANs", Const, 10},
 		{"NameMismatch", Const, 8},
 		{"NewCertPool", Func, 0},
+		{"NoValidChains", Const, 24},
 		{"NotAuthorizedToSign", Const, 0},
 		{"OID", Type, 22},
 		{"OIDFromInts", Func, 22},
@@ -1219,6 +1316,9 @@ var PackageSymbols = map[string][]Symbol{
 		{"ParsePKCS8PrivateKey", Func, 0},
 		{"ParsePKIXPublicKey", Func, 0},
 		{"ParseRevocationList", Func, 19},
+		{"PolicyMapping", Type, 24},
+		{"PolicyMapping.IssuerDomainPolicy", Field, 24},
+		{"PolicyMapping.SubjectDomainPolicy", Field, 24},
 		{"PublicKeyAlgorithm", Type, 0},
 		{"PureEd25519", Const, 13},
 		{"RSA", Const, 0},
@@ -1265,6 +1365,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"UnknownPublicKeyAlgorithm", Const, 0},
 		{"UnknownSignatureAlgorithm", Const, 0},
 		{"VerifyOptions", Type, 0},
+		{"VerifyOptions.CertificatePolicies", Field, 24},
 		{"VerifyOptions.CurrentTime", Field, 0},
 		{"VerifyOptions.DNSName", Field, 0},
 		{"VerifyOptions.Intermediates", Field, 0},
@@ -1975,6 +2076,8 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*File).DynString", Method, 1},
 		{"(*File).DynValue", Method, 21},
 		{"(*File).DynamicSymbols", Method, 4},
+		{"(*File).DynamicVersionNeeds", Method, 24},
+		{"(*File).DynamicVersions", Method, 24},
 		{"(*File).ImportedLibraries", Method, 0},
 		{"(*File).ImportedSymbols", Method, 0},
 		{"(*File).Section", Method, 0},
@@ -2240,6 +2343,19 @@ var PackageSymbols = map[string][]Symbol{
 		{"DynFlag", Type, 0},
 		{"DynFlag1", Type, 21},
 		{"DynTag", Type, 0},
+		{"DynamicVersion", Type, 24},
+		{"DynamicVersion.Deps", Field, 24},
+		{"DynamicVersion.Flags", Field, 24},
+		{"DynamicVersion.Index", Field, 24},
+		{"DynamicVersion.Name", Field, 24},
+		{"DynamicVersionDep", Type, 24},
+		{"DynamicVersionDep.Dep", Field, 24},
+		{"DynamicVersionDep.Flags", Field, 24},
+		{"DynamicVersionDep.Index", Field, 24},
+		{"DynamicVersionFlag", Type, 24},
+		{"DynamicVersionNeed", Type, 24},
+		{"DynamicVersionNeed.Name", Field, 24},
+		{"DynamicVersionNeed.Needs", Field, 24},
 		{"EI_ABIVERSION", Const, 0},
 		{"EI_CLASS", Const, 0},
 		{"EI_DATA", Const, 0},
@@ -3726,8 +3842,19 @@ var PackageSymbols = map[string][]Symbol{
 		{"Symbol.Size", Field, 0},
 		{"Symbol.Value", Field, 0},
 		{"Symbol.Version", Field, 13},
+		{"Symbol.VersionIndex", Field, 24},
+		{"Symbol.VersionScope", Field, 24},
+		{"SymbolVersionScope", Type, 24},
 		{"Type", Type, 0},
+		{"VER_FLG_BASE", Const, 24},
+		{"VER_FLG_INFO", Const, 24},
+		{"VER_FLG_WEAK", Const, 24},
 		{"Version", Type, 0},
+		{"VersionScopeGlobal", Const, 24},
+		{"VersionScopeHidden", Const, 24},
+		{"VersionScopeLocal", Const, 24},
+		{"VersionScopeNone", Const, 24},
+		{"VersionScopeSpecific", Const, 24},
 	},
 	"debug/gosym": {
 		{"(*DecodingError).Error", Method, 0},
@@ -4453,8 +4580,10 @@ var PackageSymbols = map[string][]Symbol{
 		{"FS", Type, 16},
 	},
 	"encoding": {
+		{"BinaryAppender", Type, 24},
 		{"BinaryMarshaler", Type, 2},
 		{"BinaryUnmarshaler", Type, 2},
+		{"TextAppender", Type, 24},
 		{"TextMarshaler", Type, 2},
 		{"TextUnmarshaler", Type, 2},
 	},
@@ -5984,13 +6113,16 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*Interface).Complete", Method, 5},
 		{"(*Interface).Embedded", Method, 5},
 		{"(*Interface).EmbeddedType", Method, 11},
+		{"(*Interface).EmbeddedTypes", Method, 24},
 		{"(*Interface).Empty", Method, 5},
 		{"(*Interface).ExplicitMethod", Method, 5},
+		{"(*Interface).ExplicitMethods", Method, 24},
 		{"(*Interface).IsComparable", Method, 18},
 		{"(*Interface).IsImplicit", Method, 18},
 		{"(*Interface).IsMethodSet", Method, 18},
 		{"(*Interface).MarkImplicit", Method, 18},
 		{"(*Interface).Method", Method, 5},
+		{"(*Interface).Methods", Method, 24},
 		{"(*Interface).NumEmbeddeds", Method, 5},
 		{"(*Interface).NumExplicitMethods", Method, 5},
 		{"(*Interface).NumMethods", Method, 5},
@@ -6011,9 +6143,11 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*MethodSet).At", Method, 5},
 		{"(*MethodSet).Len", Method, 5},
 		{"(*MethodSet).Lookup", Method, 5},
+		{"(*MethodSet).Methods", Method, 24},
 		{"(*MethodSet).String", Method, 5},
 		{"(*Named).AddMethod", Method, 5},
 		{"(*Named).Method", Method, 5},
+		{"(*Named).Methods", Method, 24},
 		{"(*Named).NumMethods", Method, 5},
 		{"(*Named).Obj", Method, 5},
 		{"(*Named).Origin", Method, 18},
@@ -6054,6 +6188,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*Pointer).String", Method, 5},
 		{"(*Pointer).Underlying", Method, 5},
 		{"(*Scope).Child", Method, 5},
+		{"(*Scope).Children", Method, 24},
 		{"(*Scope).Contains", Method, 5},
 		{"(*Scope).End", Method, 5},
 		{"(*Scope).Innermost", Method, 5},
@@ -6089,6 +6224,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*StdSizes).Offsetsof", Method, 5},
 		{"(*StdSizes).Sizeof", Method, 5},
 		{"(*Struct).Field", Method, 5},
+		{"(*Struct).Fields", Method, 24},
 		{"(*Struct).NumFields", Method, 5},
 		{"(*Struct).String", Method, 5},
 		{"(*Struct).Tag", Method, 5},
@@ -6100,8 +6236,10 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*Tuple).Len", Method, 5},
 		{"(*Tuple).String", Method, 5},
 		{"(*Tuple).Underlying", Method, 5},
+		{"(*Tuple).Variables", Method, 24},
 		{"(*TypeList).At", Method, 18},
 		{"(*TypeList).Len", Method, 18},
+		{"(*TypeList).Types", Method, 24},
 		{"(*TypeName).Exported", Method, 5},
 		{"(*TypeName).Id", Method, 5},
 		{"(*TypeName).IsAlias", Method, 9},
@@ -6119,9 +6257,11 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*TypeParam).Underlying", Method, 18},
 		{"(*TypeParamList).At", Method, 18},
 		{"(*TypeParamList).Len", Method, 18},
+		{"(*TypeParamList).TypeParams", Method, 24},
 		{"(*Union).Len", Method, 18},
 		{"(*Union).String", Method, 18},
 		{"(*Union).Term", Method, 18},
+		{"(*Union).Terms", Method, 24},
 		{"(*Union).Underlying", Method, 18},
 		{"(*Var).Anonymous", Method, 5},
 		{"(*Var).Embedded", Method, 11},
@@ -6392,10 +6532,12 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*Hash).WriteByte", Method, 14},
 		{"(*Hash).WriteString", Method, 14},
 		{"Bytes", Func, 19},
+		{"Comparable", Func, 24},
 		{"Hash", Type, 14},
 		{"MakeSeed", Func, 14},
 		{"Seed", Type, 14},
 		{"String", Func, 19},
+		{"WriteComparable", Func, 24},
 	},
 	"html": {
 		{"EscapeString", Func, 0},
@@ -7082,6 +7224,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*JSONHandler).WithGroup", Method, 21},
 		{"(*Level).UnmarshalJSON", Method, 21},
 		{"(*Level).UnmarshalText", Method, 21},
+		{"(*LevelVar).AppendText", Method, 24},
 		{"(*LevelVar).Level", Method, 21},
 		{"(*LevelVar).MarshalText", Method, 21},
 		{"(*LevelVar).Set", Method, 21},
@@ -7110,6 +7253,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"(Attr).Equal", Method, 21},
 		{"(Attr).String", Method, 21},
 		{"(Kind).String", Method, 21},
+		{"(Level).AppendText", Method, 24},
 		{"(Level).Level", Method, 21},
 		{"(Level).MarshalJSON", Method, 21},
 		{"(Level).MarshalText", Method, 21},
@@ -7140,6 +7284,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"Debug", Func, 21},
 		{"DebugContext", Func, 21},
 		{"Default", Func, 21},
+		{"DiscardHandler", Var, 24},
 		{"Duration", Func, 21},
 		{"DurationValue", Func, 21},
 		{"Error", Func, 21},
@@ -7375,6 +7520,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*Float).Acc", Method, 5},
 		{"(*Float).Add", Method, 5},
 		{"(*Float).Append", Method, 5},
+		{"(*Float).AppendText", Method, 24},
 		{"(*Float).Cmp", Method, 5},
 		{"(*Float).Copy", Method, 5},
 		{"(*Float).Float32", Method, 5},
@@ -7421,6 +7567,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*Int).And", Method, 0},
 		{"(*Int).AndNot", Method, 0},
 		{"(*Int).Append", Method, 6},
+		{"(*Int).AppendText", Method, 24},
 		{"(*Int).Binomial", Method, 0},
 		{"(*Int).Bit", Method, 0},
 		{"(*Int).BitLen", Method, 0},
@@ -7477,6 +7624,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*Int).Xor", Method, 0},
 		{"(*Rat).Abs", Method, 0},
 		{"(*Rat).Add", Method, 0},
+		{"(*Rat).AppendText", Method, 24},
 		{"(*Rat).Cmp", Method, 0},
 		{"(*Rat).Denom", Method, 0},
 		{"(*Rat).Float32", Method, 4},
@@ -7659,11 +7807,13 @@ var PackageSymbols = map[string][]Symbol{
 		{"Zipf", Type, 0},
 	},
 	"math/rand/v2": {
+		{"(*ChaCha8).AppendBinary", Method, 24},
 		{"(*ChaCha8).MarshalBinary", Method, 22},
 		{"(*ChaCha8).Read", Method, 23},
 		{"(*ChaCha8).Seed", Method, 22},
 		{"(*ChaCha8).Uint64", Method, 22},
 		{"(*ChaCha8).UnmarshalBinary", Method, 22},
+		{"(*PCG).AppendBinary", Method, 24},
 		{"(*PCG).MarshalBinary", Method, 22},
 		{"(*PCG).Seed", Method, 22},
 		{"(*PCG).Uint64", Method, 22},
@@ -7931,6 +8081,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*UnixListener).SyscallConn", Method, 10},
 		{"(Flags).String", Method, 0},
 		{"(HardwareAddr).String", Method, 0},
+		{"(IP).AppendText", Method, 24},
 		{"(IP).DefaultMask", Method, 0},
 		{"(IP).Equal", Method, 0},
 		{"(IP).IsGlobalUnicast", Method, 0},
@@ -8131,6 +8282,9 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*MaxBytesError).Error", Method, 19},
 		{"(*ProtocolError).Error", Method, 0},
 		{"(*ProtocolError).Is", Method, 21},
+		{"(*Protocols).SetHTTP1", Method, 24},
+		{"(*Protocols).SetHTTP2", Method, 24},
+		{"(*Protocols).SetUnencryptedHTTP2", Method, 24},
 		{"(*Request).AddCookie", Method, 0},
 		{"(*Request).BasicAuth", Method, 4},
 		{"(*Request).Clone", Method, 13},
@@ -8190,6 +8344,10 @@ var PackageSymbols = map[string][]Symbol{
 		{"(Header).Values", Method, 14},
 		{"(Header).Write", Method, 0},
 		{"(Header).WriteSubset", Method, 0},
+		{"(Protocols).HTTP1", Method, 24},
+		{"(Protocols).HTTP2", Method, 24},
+		{"(Protocols).String", Method, 24},
+		{"(Protocols).UnencryptedHTTP2", Method, 24},
 		{"AllowQuerySemicolons", Func, 17},
 		{"CanonicalHeaderKey", Func, 0},
 		{"Client", Type, 0},
@@ -8252,6 +8410,18 @@ var PackageSymbols = map[string][]Symbol{
 		{"FileSystem", Type, 0},
 		{"Flusher", Type, 0},
 		{"Get", Func, 0},
+		{"HTTP2Config", Type, 24},
+		{"HTTP2Config.CountError", Field, 24},
+		{"HTTP2Config.MaxConcurrentStreams", Field, 24},
+		{"HTTP2Config.MaxDecoderHeaderTableSize", Field, 24},
+		{"HTTP2Config.MaxEncoderHeaderTableSize", Field, 24},
+		{"HTTP2Config.MaxReadFrameSize", Field, 24},
+		{"HTTP2Config.MaxReceiveBufferPerConnection", Field, 24},
+		{"HTTP2Config.MaxReceiveBufferPerStream", Field, 24},
+		{"HTTP2Config.PermitProhibitedCipherSuites", Field, 24},
+		{"HTTP2Config.PingTimeout", Field, 24},
+		{"HTTP2Config.SendPingTimeout", Field, 24},
+		{"HTTP2Config.WriteByteTimeout", Field, 24},
 		{"Handle", Func, 0},
 		{"HandleFunc", Func, 0},
 		{"Handler", Type, 0},
@@ -8292,6 +8462,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"PostForm", Func, 0},
 		{"ProtocolError", Type, 0},
 		{"ProtocolError.ErrorString", Field, 0},
+		{"Protocols", Type, 24},
 		{"ProxyFromEnvironment", Func, 0},
 		{"ProxyURL", Func, 0},
 		{"PushOptions", Type, 8},
@@ -8361,9 +8532,11 @@ var PackageSymbols = map[string][]Symbol{
 		{"Server.ConnState", Field, 3},
 		{"Server.DisableGeneralOptionsHandler", Field, 20},
 		{"Server.ErrorLog", Field, 3},
+		{"Server.HTTP2", Field, 24},
 		{"Server.Handler", Field, 0},
 		{"Server.IdleTimeout", Field, 8},
 		{"Server.MaxHeaderBytes", Field, 0},
+		{"Server.Protocols", Field, 24},
 		{"Server.ReadHeaderTimeout", Field, 8},
 		{"Server.ReadTimeout", Field, 0},
 		{"Server.TLSConfig", Field, 0},
@@ -8453,12 +8626,14 @@ var PackageSymbols = map[string][]Symbol{
 		{"Transport.ExpectContinueTimeout", Field, 6},
 		{"Transport.ForceAttemptHTTP2", Field, 13},
 		{"Transport.GetProxyConnectHeader", Field, 16},
+		{"Transport.HTTP2", Field, 24},
 		{"Transport.IdleConnTimeout", Field, 7},
 		{"Transport.MaxConnsPerHost", Field, 11},
 		{"Transport.MaxIdleConns", Field, 7},
 		{"Transport.MaxIdleConnsPerHost", Field, 0},
 		{"Transport.MaxResponseHeaderBytes", Field, 7},
 		{"Transport.OnProxyConnectResponse", Field, 20},
+		{"Transport.Protocols", Field, 24},
 		{"Transport.Proxy", Field, 0},
 		{"Transport.ProxyConnectHeader", Field, 8},
 		{"Transport.ReadBufferSize", Field, 13},
@@ -8646,6 +8821,8 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*AddrPort).UnmarshalText", Method, 18},
 		{"(*Prefix).UnmarshalBinary", Method, 18},
 		{"(*Prefix).UnmarshalText", Method, 18},
+		{"(Addr).AppendBinary", Method, 24},
+		{"(Addr).AppendText", Method, 24},
 		{"(Addr).AppendTo", Method, 18},
 		{"(Addr).As16", Method, 18},
 		{"(Addr).As4", Method, 18},
@@ -8676,6 +8853,8 @@ var PackageSymbols = map[string][]Symbol{
 		{"(Addr).WithZone", Method, 18},
 		{"(Addr).Zone", Method, 18},
 		{"(AddrPort).Addr", Method, 18},
+		{"(AddrPort).AppendBinary", Method, 24},
+		{"(AddrPort).AppendText", Method, 24},
 		{"(AddrPort).AppendTo", Method, 18},
 		{"(AddrPort).Compare", Method, 22},
 		{"(AddrPort).IsValid", Method, 18},
@@ -8684,6 +8863,8 @@ var PackageSymbols = map[string][]Symbol{
 		{"(AddrPort).Port", Method, 18},
 		{"(AddrPort).String", Method, 18},
 		{"(Prefix).Addr", Method, 18},
+		{"(Prefix).AppendBinary", Method, 24},
+		{"(Prefix).AppendText", Method, 24},
 		{"(Prefix).AppendTo", Method, 18},
 		{"(Prefix).Bits", Method, 18},
 		{"(Prefix).Contains", Method, 18},
@@ -8868,6 +9049,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*Error).Temporary", Method, 6},
 		{"(*Error).Timeout", Method, 6},
 		{"(*Error).Unwrap", Method, 13},
+		{"(*URL).AppendBinary", Method, 24},
 		{"(*URL).EscapedFragment", Method, 15},
 		{"(*URL).EscapedPath", Method, 5},
 		{"(*URL).Hostname", Method, 8},
@@ -8967,6 +9149,17 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*ProcessState).SysUsage", Method, 0},
 		{"(*ProcessState).SystemTime", Method, 0},
 		{"(*ProcessState).UserTime", Method, 0},
+		{"(*Root).Close", Method, 24},
+		{"(*Root).Create", Method, 24},
+		{"(*Root).FS", Method, 24},
+		{"(*Root).Lstat", Method, 24},
+		{"(*Root).Mkdir", Method, 24},
+		{"(*Root).Name", Method, 24},
+		{"(*Root).Open", Method, 24},
+		{"(*Root).OpenFile", Method, 24},
+		{"(*Root).OpenRoot", Method, 24},
+		{"(*Root).Remove", Method, 24},
+		{"(*Root).Stat", Method, 24},
 		{"(*SyscallError).Error", Method, 0},
 		{"(*SyscallError).Timeout", Method, 10},
 		{"(*SyscallError).Unwrap", Method, 13},
@@ -9060,6 +9253,8 @@ var PackageSymbols = map[string][]Symbol{
 		{"O_WRONLY", Const, 0},
 		{"Open", Func, 0},
 		{"OpenFile", Func, 0},
+		{"OpenInRoot", Func, 24},
+		{"OpenRoot", Func, 24},
 		{"PathError", Type, 0},
 		{"PathError.Err", Field, 0},
 		{"PathError.Op", Field, 0},
@@ -9081,6 +9276,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"Remove", Func, 0},
 		{"RemoveAll", Func, 0},
 		{"Rename", Func, 0},
+		{"Root", Type, 24},
 		{"SEEK_CUR", Const, 0},
 		{"SEEK_END", Const, 0},
 		{"SEEK_SET", Const, 0},
@@ -9422,6 +9618,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"Zero", Func, 0},
 	},
 	"regexp": {
+		{"(*Regexp).AppendText", Method, 24},
 		{"(*Regexp).Copy", Method, 6},
 		{"(*Regexp).Expand", Method, 0},
 		{"(*Regexp).ExpandString", Method, 0},
@@ -9602,6 +9799,8 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*StackRecord).Stack", Method, 0},
 		{"(*TypeAssertionError).Error", Method, 0},
 		{"(*TypeAssertionError).RuntimeError", Method, 0},
+		{"(Cleanup).Stop", Method, 24},
+		{"AddCleanup", Func, 24},
 		{"BlockProfile", Func, 1},
 		{"BlockProfileRecord", Type, 1},
 		{"BlockProfileRecord.Count", Field, 1},
@@ -9612,6 +9811,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"Caller", Func, 0},
 		{"Callers", Func, 0},
 		{"CallersFrames", Func, 7},
+		{"Cleanup", Type, 24},
 		{"Compiler", Const, 0},
 		{"Error", Type, 0},
 		{"Frame", Type, 7},
@@ -9974,6 +10174,8 @@ var PackageSymbols = map[string][]Symbol{
 		{"EqualFold", Func, 0},
 		{"Fields", Func, 0},
 		{"FieldsFunc", Func, 0},
+		{"FieldsFuncSeq", Func, 24},
+		{"FieldsSeq", Func, 24},
 		{"HasPrefix", Func, 0},
 		{"HasSuffix", Func, 0},
 		{"Index", Func, 0},
@@ -9986,6 +10188,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"LastIndexAny", Func, 0},
 		{"LastIndexByte", Func, 5},
 		{"LastIndexFunc", Func, 0},
+		{"Lines", Func, 24},
 		{"Map", Func, 0},
 		{"NewReader", Func, 0},
 		{"NewReplacer", Func, 0},
@@ -9997,7 +10200,9 @@ var PackageSymbols = map[string][]Symbol{
 		{"Split", Func, 0},
 		{"SplitAfter", Func, 0},
 		{"SplitAfterN", Func, 0},
+		{"SplitAfterSeq", Func, 24},
 		{"SplitN", Func, 0},
+		{"SplitSeq", Func, 24},
 		{"Title", Func, 0},
 		{"ToLower", Func, 0},
 		{"ToLowerSpecial", Func, 0},
@@ -16413,7 +16618,9 @@ var PackageSymbols = map[string][]Symbol{
 		{"ValueOf", Func, 0},
 	},
 	"testing": {
+		{"(*B).Chdir", Method, 24},
 		{"(*B).Cleanup", Method, 14},
+		{"(*B).Context", Method, 24},
 		{"(*B).Elapsed", Method, 20},
 		{"(*B).Error", Method, 0},
 		{"(*B).Errorf", Method, 0},
@@ -16425,6 +16632,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*B).Helper", Method, 9},
 		{"(*B).Log", Method, 0},
 		{"(*B).Logf", Method, 0},
+		{"(*B).Loop", Method, 24},
 		{"(*B).Name", Method, 8},
 		{"(*B).ReportAllocs", Method, 1},
 		{"(*B).ReportMetric", Method, 13},
@@ -16442,7 +16650,9 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*B).StopTimer", Method, 0},
 		{"(*B).TempDir", Method, 15},
 		{"(*F).Add", Method, 18},
+		{"(*F).Chdir", Method, 24},
 		{"(*F).Cleanup", Method, 18},
+		{"(*F).Context", Method, 24},
 		{"(*F).Error", Method, 18},
 		{"(*F).Errorf", Method, 18},
 		{"(*F).Fail", Method, 18},
@@ -16463,7 +16673,9 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*F).TempDir", Method, 18},
 		{"(*M).Run", Method, 4},
 		{"(*PB).Next", Method, 3},
+		{"(*T).Chdir", Method, 24},
 		{"(*T).Cleanup", Method, 14},
+		{"(*T).Context", Method, 24},
 		{"(*T).Deadline", Method, 15},
 		{"(*T).Error", Method, 0},
 		{"(*T).Errorf", Method, 0},
@@ -16954,7 +17166,9 @@ var PackageSymbols = map[string][]Symbol{
 		{"(Time).Add", Method, 0},
 		{"(Time).AddDate", Method, 0},
 		{"(Time).After", Method, 0},
+		{"(Time).AppendBinary", Method, 24},
 		{"(Time).AppendFormat", Method, 5},
+		{"(Time).AppendText", Method, 24},
 		{"(Time).Before", Method, 0},
 		{"(Time).Clock", Method, 0},
 		{"(Time).Compare", Method, 20},
@@ -17428,4 +17642,9 @@ var PackageSymbols = map[string][]Symbol{
 		{"String", Func, 0},
 		{"StringData", Func, 0},
 	},
+	"weak": {
+		{"(Pointer).Value", Method, 24},
+		{"Make", Func, 24},
+		{"Pointer", Type, 24},
+	},
 }
diff --git a/test/performance/vendor/golang.org/x/tools/internal/tokeninternal/tokeninternal.go b/test/performance/vendor/golang.org/x/tools/internal/tokeninternal/tokeninternal.go
deleted file mode 100644
index ff9437a36c..0000000000
--- a/test/performance/vendor/golang.org/x/tools/internal/tokeninternal/tokeninternal.go
+++ /dev/null
@@ -1,137 +0,0 @@
-// Copyright 2023 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 tokeninternal provides access to some internal features of the token
-// package.
-package tokeninternal
-
-import (
-	"fmt"
-	"go/token"
-	"sort"
-	"sync"
-	"unsafe"
-)
-
-// GetLines returns the table of line-start offsets from a token.File.
-func GetLines(file *token.File) []int {
-	// token.File has a Lines method on Go 1.21 and later.
-	if file, ok := (interface{})(file).(interface{ Lines() []int }); ok {
-		return file.Lines()
-	}
-
-	// This declaration must match that of token.File.
-	// This creates a risk of dependency skew.
-	// For now we check that the size of the two
-	// declarations is the same, on the (fragile) assumption
-	// that future changes would add fields.
-	type tokenFile119 struct {
-		_     string
-		_     int
-		_     int
-		mu    sync.Mutex // we're not complete monsters
-		lines []int
-		_     []struct{}
-	}
-
-	if unsafe.Sizeof(*file) != unsafe.Sizeof(tokenFile119{}) {
-		panic("unexpected token.File size")
-	}
-	var ptr *tokenFile119
-	type uP = unsafe.Pointer
-	*(*uP)(uP(&ptr)) = uP(file)
-	ptr.mu.Lock()
-	defer ptr.mu.Unlock()
-	return ptr.lines
-}
-
-// AddExistingFiles adds the specified files to the FileSet if they
-// are not already present. It panics if any pair of files in the
-// resulting FileSet would overlap.
-func AddExistingFiles(fset *token.FileSet, files []*token.File) {
-	// Punch through the FileSet encapsulation.
-	type tokenFileSet struct {
-		// This type remained essentially consistent from go1.16 to go1.21.
-		mutex sync.RWMutex
-		base  int
-		files []*token.File
-		_     *token.File // changed to atomic.Pointer[token.File] in go1.19
-	}
-
-	// If the size of token.FileSet changes, this will fail to compile.
-	const delta = int64(unsafe.Sizeof(tokenFileSet{})) - int64(unsafe.Sizeof(token.FileSet{}))
-	var _ [-delta * delta]int
-
-	type uP = unsafe.Pointer
-	var ptr *tokenFileSet
-	*(*uP)(uP(&ptr)) = uP(fset)
-	ptr.mutex.Lock()
-	defer ptr.mutex.Unlock()
-
-	// Merge and sort.
-	newFiles := append(ptr.files, files...)
-	sort.Slice(newFiles, func(i, j int) bool {
-		return newFiles[i].Base() < newFiles[j].Base()
-	})
-
-	// Reject overlapping files.
-	// Discard adjacent identical files.
-	out := newFiles[:0]
-	for i, file := range newFiles {
-		if i > 0 {
-			prev := newFiles[i-1]
-			if file == prev {
-				continue
-			}
-			if prev.Base()+prev.Size()+1 > file.Base() {
-				panic(fmt.Sprintf("file %s (%d-%d) overlaps with file %s (%d-%d)",
-					prev.Name(), prev.Base(), prev.Base()+prev.Size(),
-					file.Name(), file.Base(), file.Base()+file.Size()))
-			}
-		}
-		out = append(out, file)
-	}
-	newFiles = out
-
-	ptr.files = newFiles
-
-	// Advance FileSet.Base().
-	if len(newFiles) > 0 {
-		last := newFiles[len(newFiles)-1]
-		newBase := last.Base() + last.Size() + 1
-		if ptr.base < newBase {
-			ptr.base = newBase
-		}
-	}
-}
-
-// FileSetFor returns a new FileSet containing a sequence of new Files with
-// the same base, size, and line as the input files, for use in APIs that
-// require a FileSet.
-//
-// Precondition: the input files must be non-overlapping, and sorted in order
-// of their Base.
-func FileSetFor(files ...*token.File) *token.FileSet {
-	fset := token.NewFileSet()
-	for _, f := range files {
-		f2 := fset.AddFile(f.Name(), f.Base(), f.Size())
-		lines := GetLines(f)
-		f2.SetLines(lines)
-	}
-	return fset
-}
-
-// CloneFileSet creates a new FileSet holding all files in fset. It does not
-// create copies of the token.Files in fset: they are added to the resulting
-// FileSet unmodified.
-func CloneFileSet(fset *token.FileSet) *token.FileSet {
-	var files []*token.File
-	fset.Iterate(func(f *token.File) bool {
-		files = append(files, f)
-		return true
-	})
-	newFileSet := token.NewFileSet()
-	AddExistingFiles(newFileSet, files)
-	return newFileSet
-}
diff --git a/test/performance/vendor/golang.org/x/tools/internal/typeparams/common.go b/test/performance/vendor/golang.org/x/tools/internal/typeparams/common.go
index 89bd256dc6..cdae2b8e81 100644
--- a/test/performance/vendor/golang.org/x/tools/internal/typeparams/common.go
+++ b/test/performance/vendor/golang.org/x/tools/internal/typeparams/common.go
@@ -16,8 +16,6 @@ import (
 	"go/ast"
 	"go/token"
 	"go/types"
-
-	"golang.org/x/tools/internal/aliases"
 )
 
 // UnpackIndexExpr extracts data from AST nodes that represent index
@@ -65,78 +63,6 @@ func PackIndexExpr(x ast.Expr, lbrack token.Pos, indices []ast.Expr, rbrack toke
 
 // IsTypeParam reports whether t is a type parameter (or an alias of one).
 func IsTypeParam(t types.Type) bool {
-	_, ok := aliases.Unalias(t).(*types.TypeParam)
+	_, ok := types.Unalias(t).(*types.TypeParam)
 	return ok
 }
-
-// GenericAssignableTo is a generalization of types.AssignableTo that
-// implements the following rule for uninstantiated generic types:
-//
-// If V and T are generic named types, then V is considered assignable to T if,
-// for every possible instantiation of V[A_1, ..., A_N], the instantiation
-// T[A_1, ..., A_N] is valid and V[A_1, ..., A_N] implements T[A_1, ..., A_N].
-//
-// If T has structural constraints, they must be satisfied by V.
-//
-// For example, consider the following type declarations:
-//
-//	type Interface[T any] interface {
-//		Accept(T)
-//	}
-//
-//	type Container[T any] struct {
-//		Element T
-//	}
-//
-//	func (c Container[T]) Accept(t T) { c.Element = t }
-//
-// In this case, GenericAssignableTo reports that instantiations of Container
-// are assignable to the corresponding instantiation of Interface.
-func GenericAssignableTo(ctxt *types.Context, V, T types.Type) bool {
-	V = aliases.Unalias(V)
-	T = aliases.Unalias(T)
-
-	// If V and T are not both named, or do not have matching non-empty type
-	// parameter lists, fall back on types.AssignableTo.
-
-	VN, Vnamed := V.(*types.Named)
-	TN, Tnamed := T.(*types.Named)
-	if !Vnamed || !Tnamed {
-		return types.AssignableTo(V, T)
-	}
-
-	vtparams := VN.TypeParams()
-	ttparams := TN.TypeParams()
-	if vtparams.Len() == 0 || vtparams.Len() != ttparams.Len() || VN.TypeArgs().Len() != 0 || TN.TypeArgs().Len() != 0 {
-		return types.AssignableTo(V, T)
-	}
-
-	// V and T have the same (non-zero) number of type params. Instantiate both
-	// with the type parameters of V. This must always succeed for V, and will
-	// succeed for T if and only if the type set of each type parameter of V is a
-	// subset of the type set of the corresponding type parameter of T, meaning
-	// that every instantiation of V corresponds to a valid instantiation of T.
-
-	// Minor optimization: ensure we share a context across the two
-	// instantiations below.
-	if ctxt == nil {
-		ctxt = types.NewContext()
-	}
-
-	var targs []types.Type
-	for i := 0; i < vtparams.Len(); i++ {
-		targs = append(targs, vtparams.At(i))
-	}
-
-	vinst, err := types.Instantiate(ctxt, V, targs, true)
-	if err != nil {
-		panic("type parameters should satisfy their own constraints")
-	}
-
-	tinst, err := types.Instantiate(ctxt, T, targs, true)
-	if err != nil {
-		return false
-	}
-
-	return types.AssignableTo(vinst, tinst)
-}
diff --git a/test/performance/vendor/golang.org/x/tools/internal/typeparams/free.go b/test/performance/vendor/golang.org/x/tools/internal/typeparams/free.go
index a1d138226c..0ade5c2949 100644
--- a/test/performance/vendor/golang.org/x/tools/internal/typeparams/free.go
+++ b/test/performance/vendor/golang.org/x/tools/internal/typeparams/free.go
@@ -37,8 +37,20 @@ func (w *Free) Has(typ types.Type) (res bool) {
 	case nil, *types.Basic: // TODO(gri) should nil be handled here?
 		break
 
-	case *aliases.Alias:
-		return w.Has(aliases.Unalias(t))
+	case *types.Alias:
+		if aliases.TypeParams(t).Len() > aliases.TypeArgs(t).Len() {
+			return true // This is an uninstantiated Alias.
+		}
+		// The expansion of an alias can have free type parameters,
+		// whether or not the alias itself has type parameters:
+		//
+		//   func _[K comparable]() {
+		//     type Set      = map[K]bool // free(Set)      = {K}
+		//     type MapTo[V] = map[K]V    // free(Map[foo]) = {V}
+		//   }
+		//
+		// So, we must Unalias.
+		return w.Has(types.Unalias(t))
 
 	case *types.Array:
 		return w.Has(t.Elem())
@@ -98,9 +110,8 @@ func (w *Free) Has(typ types.Type) (res bool) {
 
 	case *types.Named:
 		args := t.TypeArgs()
-		// TODO(taking): this does not match go/types/infer.go. Check with rfindley.
 		if params := t.TypeParams(); params.Len() > args.Len() {
-			return true
+			return true // this is an uninstantiated named type.
 		}
 		for i, n := 0, args.Len(); i < n; i++ {
 			if w.Has(args.At(i)) {
diff --git a/test/performance/vendor/golang.org/x/tools/internal/typesinternal/element.go b/test/performance/vendor/golang.org/x/tools/internal/typesinternal/element.go
new file mode 100644
index 0000000000..4957f02164
--- /dev/null
+++ b/test/performance/vendor/golang.org/x/tools/internal/typesinternal/element.go
@@ -0,0 +1,133 @@
+// Copyright 2024 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 typesinternal
+
+import (
+	"fmt"
+	"go/types"
+
+	"golang.org/x/tools/go/types/typeutil"
+)
+
+// ForEachElement calls f for type T and each type reachable from its
+// type through reflection. It does this by recursively stripping off
+// type constructors; in addition, for each named type N, the type *N
+// is added to the result as it may have additional methods.
+//
+// The caller must provide an initially empty set used to de-duplicate
+// identical types, potentially across multiple calls to ForEachElement.
+// (Its final value holds all the elements seen, matching the arguments
+// passed to f.)
+//
+// TODO(adonovan): share/harmonize with go/callgraph/rta.
+func ForEachElement(rtypes *typeutil.Map, msets *typeutil.MethodSetCache, T types.Type, f func(types.Type)) {
+	var visit func(T types.Type, skip bool)
+	visit = func(T types.Type, skip bool) {
+		if !skip {
+			if seen, _ := rtypes.Set(T, true).(bool); seen {
+				return // de-dup
+			}
+
+			f(T) // notify caller of new element type
+		}
+
+		// Recursion over signatures of each method.
+		tmset := msets.MethodSet(T)
+		for i := 0; i < tmset.Len(); i++ {
+			sig := tmset.At(i).Type().(*types.Signature)
+			// It is tempting to call visit(sig, false)
+			// but, as noted in golang.org/cl/65450043,
+			// the Signature.Recv field is ignored by
+			// types.Identical and typeutil.Map, which
+			// is confusing at best.
+			//
+			// More importantly, the true signature rtype
+			// reachable from a method using reflection
+			// has no receiver but an extra ordinary parameter.
+			// For the Read method of io.Reader we want:
+			//   func(Reader, []byte) (int, error)
+			// but here sig is:
+			//   func([]byte) (int, error)
+			// with .Recv = Reader (though it is hard to
+			// notice because it doesn't affect Signature.String
+			// or types.Identical).
+			//
+			// TODO(adonovan): construct and visit the correct
+			// non-method signature with an extra parameter
+			// (though since unnamed func types have no methods
+			// there is essentially no actual demand for this).
+			//
+			// TODO(adonovan): document whether or not it is
+			// safe to skip non-exported methods (as RTA does).
+			visit(sig.Params(), true)  // skip the Tuple
+			visit(sig.Results(), true) // skip the Tuple
+		}
+
+		switch T := T.(type) {
+		case *types.Alias:
+			visit(types.Unalias(T), skip) // emulates the pre-Alias behavior
+
+		case *types.Basic:
+			// nop
+
+		case *types.Interface:
+			// nop---handled by recursion over method set.
+
+		case *types.Pointer:
+			visit(T.Elem(), false)
+
+		case *types.Slice:
+			visit(T.Elem(), false)
+
+		case *types.Chan:
+			visit(T.Elem(), false)
+
+		case *types.Map:
+			visit(T.Key(), false)
+			visit(T.Elem(), false)
+
+		case *types.Signature:
+			if T.Recv() != nil {
+				panic(fmt.Sprintf("Signature %s has Recv %s", T, T.Recv()))
+			}
+			visit(T.Params(), true)  // skip the Tuple
+			visit(T.Results(), true) // skip the Tuple
+
+		case *types.Named:
+			// A pointer-to-named type can be derived from a named
+			// type via reflection.  It may have methods too.
+			visit(types.NewPointer(T), false)
+
+			// Consider 'type T struct{S}' where S has methods.
+			// Reflection provides no way to get from T to struct{S},
+			// only to S, so the method set of struct{S} is unwanted,
+			// so set 'skip' flag during recursion.
+			visit(T.Underlying(), true) // skip the unnamed type
+
+		case *types.Array:
+			visit(T.Elem(), false)
+
+		case *types.Struct:
+			for i, n := 0, T.NumFields(); i < n; i++ {
+				// TODO(adonovan): document whether or not
+				// it is safe to skip non-exported fields.
+				visit(T.Field(i).Type(), false)
+			}
+
+		case *types.Tuple:
+			for i, n := 0, T.Len(); i < n; i++ {
+				visit(T.At(i).Type(), false)
+			}
+
+		case *types.TypeParam, *types.Union:
+			// forEachReachable must not be called on parameterized types.
+			panic(T)
+
+		default:
+			panic(T)
+		}
+	}
+	visit(T, false)
+}
diff --git a/test/performance/vendor/golang.org/x/tools/internal/typesinternal/qualifier.go b/test/performance/vendor/golang.org/x/tools/internal/typesinternal/qualifier.go
new file mode 100644
index 0000000000..b64f714eb3
--- /dev/null
+++ b/test/performance/vendor/golang.org/x/tools/internal/typesinternal/qualifier.go
@@ -0,0 +1,46 @@
+// Copyright 2024 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 typesinternal
+
+import (
+	"go/ast"
+	"go/types"
+	"strconv"
+)
+
+// FileQualifier returns a [types.Qualifier] function that qualifies
+// imported symbols appropriately based on the import environment of a given
+// file.
+// If the same package is imported multiple times, the last appearance is
+// recorded.
+func FileQualifier(f *ast.File, pkg *types.Package) types.Qualifier {
+	// Construct mapping of import paths to their defined names.
+	// It is only necessary to look at renaming imports.
+	imports := make(map[string]string)
+	for _, imp := range f.Imports {
+		if imp.Name != nil && imp.Name.Name != "_" {
+			path, _ := strconv.Unquote(imp.Path.Value)
+			imports[path] = imp.Name.Name
+		}
+	}
+
+	// Define qualifier to replace full package paths with names of the imports.
+	return func(p *types.Package) string {
+		if p == nil || p == pkg {
+			return ""
+		}
+
+		if name, ok := imports[p.Path()]; ok {
+			if name == "." {
+				return ""
+			} else {
+				return name
+			}
+		}
+
+		// If there is no local renaming, fall back to the package name.
+		return p.Name()
+	}
+}
diff --git a/test/performance/vendor/golang.org/x/tools/internal/typesinternal/recv.go b/test/performance/vendor/golang.org/x/tools/internal/typesinternal/recv.go
index fea7c8b75e..e54accc69a 100644
--- a/test/performance/vendor/golang.org/x/tools/internal/typesinternal/recv.go
+++ b/test/performance/vendor/golang.org/x/tools/internal/typesinternal/recv.go
@@ -6,20 +6,20 @@ package typesinternal
 
 import (
 	"go/types"
-
-	"golang.org/x/tools/internal/aliases"
 )
 
 // ReceiverNamed returns the named type (if any) associated with the
 // type of recv, which may be of the form N or *N, or aliases thereof.
 // It also reports whether a Pointer was present.
+//
+// The named result may be nil in ill-typed code.
 func ReceiverNamed(recv *types.Var) (isPtr bool, named *types.Named) {
 	t := recv.Type()
-	if ptr, ok := aliases.Unalias(t).(*types.Pointer); ok {
+	if ptr, ok := types.Unalias(t).(*types.Pointer); ok {
 		isPtr = true
 		t = ptr.Elem()
 	}
-	named, _ = aliases.Unalias(t).(*types.Named)
+	named, _ = types.Unalias(t).(*types.Named)
 	return
 }
 
@@ -36,7 +36,7 @@ func ReceiverNamed(recv *types.Var) (isPtr bool, named *types.Named) {
 // indirection from the type, regardless of named types (analogous to
 // a LOAD instruction).
 func Unpointer(t types.Type) types.Type {
-	if ptr, ok := aliases.Unalias(t).(*types.Pointer); ok {
+	if ptr, ok := types.Unalias(t).(*types.Pointer); ok {
 		return ptr.Elem()
 	}
 	return t
diff --git a/test/performance/vendor/golang.org/x/tools/internal/typesinternal/types.go b/test/performance/vendor/golang.org/x/tools/internal/typesinternal/types.go
index 8392328612..a93d51f988 100644
--- a/test/performance/vendor/golang.org/x/tools/internal/typesinternal/types.go
+++ b/test/performance/vendor/golang.org/x/tools/internal/typesinternal/types.go
@@ -11,6 +11,8 @@ import (
 	"go/types"
 	"reflect"
 	"unsafe"
+
+	"golang.org/x/tools/internal/aliases"
 )
 
 func SetUsesCgo(conf *types.Config) bool {
@@ -63,3 +65,58 @@ func NameRelativeTo(pkg *types.Package) types.Qualifier {
 		return other.Name()
 	}
 }
+
+// A NamedOrAlias is a [types.Type] that is named (as
+// defined by the spec) and capable of bearing type parameters: it
+// abstracts aliases ([types.Alias]) and defined types
+// ([types.Named]).
+//
+// Every type declared by an explicit "type" declaration is a
+// NamedOrAlias. (Built-in type symbols may additionally
+// have type [types.Basic], which is not a NamedOrAlias,
+// though the spec regards them as "named".)
+//
+// NamedOrAlias cannot expose the Origin method, because
+// [types.Alias.Origin] and [types.Named.Origin] have different
+// (covariant) result types; use [Origin] instead.
+type NamedOrAlias interface {
+	types.Type
+	Obj() *types.TypeName
+	// TODO(hxjiang): add method TypeArgs() *types.TypeList after stop supporting go1.22.
+}
+
+// TypeParams is a light shim around t.TypeParams().
+// (go/types.Alias).TypeParams requires >= 1.23.
+func TypeParams(t NamedOrAlias) *types.TypeParamList {
+	switch t := t.(type) {
+	case *types.Alias:
+		return aliases.TypeParams(t)
+	case *types.Named:
+		return t.TypeParams()
+	}
+	return nil
+}
+
+// TypeArgs is a light shim around t.TypeArgs().
+// (go/types.Alias).TypeArgs requires >= 1.23.
+func TypeArgs(t NamedOrAlias) *types.TypeList {
+	switch t := t.(type) {
+	case *types.Alias:
+		return aliases.TypeArgs(t)
+	case *types.Named:
+		return t.TypeArgs()
+	}
+	return nil
+}
+
+// Origin returns the generic type of the Named or Alias type t if it
+// is instantiated, otherwise it returns t.
+func Origin(t NamedOrAlias) NamedOrAlias {
+	switch t := t.(type) {
+	case *types.Alias:
+		return aliases.Origin(t)
+	case *types.Named:
+		return t.Origin()
+	}
+	return t
+}
diff --git a/test/performance/vendor/golang.org/x/tools/internal/typesinternal/zerovalue.go b/test/performance/vendor/golang.org/x/tools/internal/typesinternal/zerovalue.go
new file mode 100644
index 0000000000..d272949c17
--- /dev/null
+++ b/test/performance/vendor/golang.org/x/tools/internal/typesinternal/zerovalue.go
@@ -0,0 +1,392 @@
+// Copyright 2024 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 typesinternal
+
+import (
+	"fmt"
+	"go/ast"
+	"go/token"
+	"go/types"
+	"strings"
+)
+
+// ZeroString returns the string representation of the zero value for any type t.
+// The boolean result indicates whether the type is or contains an invalid type
+// or a non-basic (constraint) interface type.
+//
+// Even for invalid input types, ZeroString may return a partially correct
+// string representation. The caller should use the returned isValid boolean
+// to determine the validity of the expression.
+//
+// When assigning to a wider type (such as 'any'), it's the caller's
+// responsibility to handle any necessary type conversions.
+//
+// This string can be used on the right-hand side of an assignment where the
+// left-hand side has that explicit type.
+// References to named types are qualified by an appropriate (optional)
+// qualifier function.
+// Exception: This does not apply to tuples. Their string representation is
+// informational only and cannot be used in an assignment.
+//
+// See [ZeroExpr] for a variant that returns an [ast.Expr].
+func ZeroString(t types.Type, qual types.Qualifier) (_ string, isValid bool) {
+	switch t := t.(type) {
+	case *types.Basic:
+		switch {
+		case t.Info()&types.IsBoolean != 0:
+			return "false", true
+		case t.Info()&types.IsNumeric != 0:
+			return "0", true
+		case t.Info()&types.IsString != 0:
+			return `""`, true
+		case t.Kind() == types.UnsafePointer:
+			fallthrough
+		case t.Kind() == types.UntypedNil:
+			return "nil", true
+		case t.Kind() == types.Invalid:
+			return "invalid", false
+		default:
+			panic(fmt.Sprintf("ZeroString for unexpected type %v", t))
+		}
+
+	case *types.Pointer, *types.Slice, *types.Chan, *types.Map, *types.Signature:
+		return "nil", true
+
+	case *types.Interface:
+		if !t.IsMethodSet() {
+			return "invalid", false
+		}
+		return "nil", true
+
+	case *types.Named:
+		switch under := t.Underlying().(type) {
+		case *types.Struct, *types.Array:
+			return types.TypeString(t, qual) + "{}", true
+		default:
+			return ZeroString(under, qual)
+		}
+
+	case *types.Alias:
+		switch t.Underlying().(type) {
+		case *types.Struct, *types.Array:
+			return types.TypeString(t, qual) + "{}", true
+		default:
+			// A type parameter can have alias but alias type's underlying type
+			// can never be a type parameter.
+			// Use types.Unalias to preserve the info of type parameter instead
+			// of call Underlying() going right through and get the underlying
+			// type of the type parameter which is always an interface.
+			return ZeroString(types.Unalias(t), qual)
+		}
+
+	case *types.Array, *types.Struct:
+		return types.TypeString(t, qual) + "{}", true
+
+	case *types.TypeParam:
+		// Assumes func new is not shadowed.
+		return "*new(" + types.TypeString(t, qual) + ")", true
+
+	case *types.Tuple:
+		// Tuples are not normal values.
+		// We are currently format as "(t[0], ..., t[n])". Could be something else.
+		isValid := true
+		components := make([]string, t.Len())
+		for i := 0; i < t.Len(); i++ {
+			comp, ok := ZeroString(t.At(i).Type(), qual)
+
+			components[i] = comp
+			isValid = isValid && ok
+		}
+		return "(" + strings.Join(components, ", ") + ")", isValid
+
+	case *types.Union:
+		// Variables of these types cannot be created, so it makes
+		// no sense to ask for their zero value.
+		panic(fmt.Sprintf("invalid type for a variable: %v", t))
+
+	default:
+		panic(t) // unreachable.
+	}
+}
+
+// ZeroExpr returns the ast.Expr representation of the zero value for any type t.
+// The boolean result indicates whether the type is or contains an invalid type
+// or a non-basic (constraint) interface type.
+//
+// Even for invalid input types, ZeroExpr may return a partially correct ast.Expr
+// representation. The caller should use the returned isValid boolean to determine
+// the validity of the expression.
+//
+// This function is designed for types suitable for variables and should not be
+// used with Tuple or Union types.References to named types are qualified by an
+// appropriate (optional) qualifier function.
+//
+// See [ZeroString] for a variant that returns a string.
+func ZeroExpr(t types.Type, qual types.Qualifier) (_ ast.Expr, isValid bool) {
+	switch t := t.(type) {
+	case *types.Basic:
+		switch {
+		case t.Info()&types.IsBoolean != 0:
+			return &ast.Ident{Name: "false"}, true
+		case t.Info()&types.IsNumeric != 0:
+			return &ast.BasicLit{Kind: token.INT, Value: "0"}, true
+		case t.Info()&types.IsString != 0:
+			return &ast.BasicLit{Kind: token.STRING, Value: `""`}, true
+		case t.Kind() == types.UnsafePointer:
+			fallthrough
+		case t.Kind() == types.UntypedNil:
+			return ast.NewIdent("nil"), true
+		case t.Kind() == types.Invalid:
+			return &ast.BasicLit{Kind: token.STRING, Value: `"invalid"`}, false
+		default:
+			panic(fmt.Sprintf("ZeroExpr for unexpected type %v", t))
+		}
+
+	case *types.Pointer, *types.Slice, *types.Chan, *types.Map, *types.Signature:
+		return ast.NewIdent("nil"), true
+
+	case *types.Interface:
+		if !t.IsMethodSet() {
+			return &ast.BasicLit{Kind: token.STRING, Value: `"invalid"`}, false
+		}
+		return ast.NewIdent("nil"), true
+
+	case *types.Named:
+		switch under := t.Underlying().(type) {
+		case *types.Struct, *types.Array:
+			return &ast.CompositeLit{
+				Type: TypeExpr(t, qual),
+			}, true
+		default:
+			return ZeroExpr(under, qual)
+		}
+
+	case *types.Alias:
+		switch t.Underlying().(type) {
+		case *types.Struct, *types.Array:
+			return &ast.CompositeLit{
+				Type: TypeExpr(t, qual),
+			}, true
+		default:
+			return ZeroExpr(types.Unalias(t), qual)
+		}
+
+	case *types.Array, *types.Struct:
+		return &ast.CompositeLit{
+			Type: TypeExpr(t, qual),
+		}, true
+
+	case *types.TypeParam:
+		return &ast.StarExpr{ // *new(T)
+			X: &ast.CallExpr{
+				// Assumes func new is not shadowed.
+				Fun: ast.NewIdent("new"),
+				Args: []ast.Expr{
+					ast.NewIdent(t.Obj().Name()),
+				},
+			},
+		}, true
+
+	case *types.Tuple:
+		// Unlike ZeroString, there is no ast.Expr can express tuple by
+		// "(t[0], ..., t[n])".
+		panic(fmt.Sprintf("invalid type for a variable: %v", t))
+
+	case *types.Union:
+		// Variables of these types cannot be created, so it makes
+		// no sense to ask for their zero value.
+		panic(fmt.Sprintf("invalid type for a variable: %v", t))
+
+	default:
+		panic(t) // unreachable.
+	}
+}
+
+// IsZeroExpr uses simple syntactic heuristics to report whether expr
+// is a obvious zero value, such as 0, "", nil, or false.
+// It cannot do better without type information.
+func IsZeroExpr(expr ast.Expr) bool {
+	switch e := expr.(type) {
+	case *ast.BasicLit:
+		return e.Value == "0" || e.Value == `""`
+	case *ast.Ident:
+		return e.Name == "nil" || e.Name == "false"
+	default:
+		return false
+	}
+}
+
+// TypeExpr returns syntax for the specified type. References to named types
+// are qualified by an appropriate (optional) qualifier function.
+// It may panic for types such as Tuple or Union.
+func TypeExpr(t types.Type, qual types.Qualifier) ast.Expr {
+	switch t := t.(type) {
+	case *types.Basic:
+		switch t.Kind() {
+		case types.UnsafePointer:
+			return &ast.SelectorExpr{X: ast.NewIdent(qual(types.NewPackage("unsafe", "unsafe"))), Sel: ast.NewIdent("Pointer")}
+		default:
+			return ast.NewIdent(t.Name())
+		}
+
+	case *types.Pointer:
+		return &ast.UnaryExpr{
+			Op: token.MUL,
+			X:  TypeExpr(t.Elem(), qual),
+		}
+
+	case *types.Array:
+		return &ast.ArrayType{
+			Len: &ast.BasicLit{
+				Kind:  token.INT,
+				Value: fmt.Sprintf("%d", t.Len()),
+			},
+			Elt: TypeExpr(t.Elem(), qual),
+		}
+
+	case *types.Slice:
+		return &ast.ArrayType{
+			Elt: TypeExpr(t.Elem(), qual),
+		}
+
+	case *types.Map:
+		return &ast.MapType{
+			Key:   TypeExpr(t.Key(), qual),
+			Value: TypeExpr(t.Elem(), qual),
+		}
+
+	case *types.Chan:
+		dir := ast.ChanDir(t.Dir())
+		if t.Dir() == types.SendRecv {
+			dir = ast.SEND | ast.RECV
+		}
+		return &ast.ChanType{
+			Dir:   dir,
+			Value: TypeExpr(t.Elem(), qual),
+		}
+
+	case *types.Signature:
+		var params []*ast.Field
+		for i := 0; i < t.Params().Len(); i++ {
+			params = append(params, &ast.Field{
+				Type: TypeExpr(t.Params().At(i).Type(), qual),
+				Names: []*ast.Ident{
+					{
+						Name: t.Params().At(i).Name(),
+					},
+				},
+			})
+		}
+		if t.Variadic() {
+			last := params[len(params)-1]
+			last.Type = &ast.Ellipsis{Elt: last.Type.(*ast.ArrayType).Elt}
+		}
+		var returns []*ast.Field
+		for i := 0; i < t.Results().Len(); i++ {
+			returns = append(returns, &ast.Field{
+				Type: TypeExpr(t.Results().At(i).Type(), qual),
+			})
+		}
+		return &ast.FuncType{
+			Params: &ast.FieldList{
+				List: params,
+			},
+			Results: &ast.FieldList{
+				List: returns,
+			},
+		}
+
+	case *types.TypeParam:
+		pkgName := qual(t.Obj().Pkg())
+		if pkgName == "" || t.Obj().Pkg() == nil {
+			return ast.NewIdent(t.Obj().Name())
+		}
+		return &ast.SelectorExpr{
+			X:   ast.NewIdent(pkgName),
+			Sel: ast.NewIdent(t.Obj().Name()),
+		}
+
+	// types.TypeParam also implements interface NamedOrAlias. To differentiate,
+	// case TypeParam need to be present before case NamedOrAlias.
+	// TODO(hxjiang): remove this comment once TypeArgs() is added to interface
+	// NamedOrAlias.
+	case NamedOrAlias:
+		var expr ast.Expr = ast.NewIdent(t.Obj().Name())
+		if pkgName := qual(t.Obj().Pkg()); pkgName != "." && pkgName != "" {
+			expr = &ast.SelectorExpr{
+				X:   ast.NewIdent(pkgName),
+				Sel: expr.(*ast.Ident),
+			}
+		}
+
+		// TODO(hxjiang): call t.TypeArgs after adding method TypeArgs() to
+		// typesinternal.NamedOrAlias.
+		if hasTypeArgs, ok := t.(interface{ TypeArgs() *types.TypeList }); ok {
+			if typeArgs := hasTypeArgs.TypeArgs(); typeArgs != nil && typeArgs.Len() > 0 {
+				var indices []ast.Expr
+				for i := range typeArgs.Len() {
+					indices = append(indices, TypeExpr(typeArgs.At(i), qual))
+				}
+				expr = &ast.IndexListExpr{
+					X:       expr,
+					Indices: indices,
+				}
+			}
+		}
+
+		return expr
+
+	case *types.Struct:
+		return ast.NewIdent(t.String())
+
+	case *types.Interface:
+		return ast.NewIdent(t.String())
+
+	case *types.Union:
+		if t.Len() == 0 {
+			panic("Union type should have at least one term")
+		}
+		// Same as go/ast, the return expression will put last term in the
+		// Y field at topmost level of BinaryExpr.
+		// For union of type "float32 | float64 | int64", the structure looks
+		// similar to:
+		// {
+		// 	X: {
+		// 		X: float32,
+		// 		Op: |
+		// 		Y: float64,
+		// 	}
+		// 	Op: |,
+		// 	Y: int64,
+		// }
+		var union ast.Expr
+		for i := range t.Len() {
+			term := t.Term(i)
+			termExpr := TypeExpr(term.Type(), qual)
+			if term.Tilde() {
+				termExpr = &ast.UnaryExpr{
+					Op: token.TILDE,
+					X:  termExpr,
+				}
+			}
+			if i == 0 {
+				union = termExpr
+			} else {
+				union = &ast.BinaryExpr{
+					X:  union,
+					Op: token.OR,
+					Y:  termExpr,
+				}
+			}
+		}
+		return union
+
+	case *types.Tuple:
+		panic("invalid input type types.Tuple")
+
+	default:
+		panic("unreachable")
+	}
+}
diff --git a/test/performance/vendor/golang.org/x/tools/internal/versions/constraint.go b/test/performance/vendor/golang.org/x/tools/internal/versions/constraint.go
deleted file mode 100644
index 179063d484..0000000000
--- a/test/performance/vendor/golang.org/x/tools/internal/versions/constraint.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2024 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 versions
-
-import "go/build/constraint"
-
-// ConstraintGoVersion is constraint.GoVersion (if built with go1.21+).
-// Otherwise nil.
-//
-// Deprecate once x/tools is after go1.21.
-var ConstraintGoVersion func(x constraint.Expr) string
diff --git a/test/performance/vendor/golang.org/x/tools/internal/versions/constraint_go121.go b/test/performance/vendor/golang.org/x/tools/internal/versions/constraint_go121.go
deleted file mode 100644
index 38011407d5..0000000000
--- a/test/performance/vendor/golang.org/x/tools/internal/versions/constraint_go121.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2024 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 go1.21
-// +build go1.21
-
-package versions
-
-import "go/build/constraint"
-
-func init() {
-	ConstraintGoVersion = constraint.GoVersion
-}
diff --git a/test/performance/vendor/golang.org/x/tools/internal/versions/toolchain.go b/test/performance/vendor/golang.org/x/tools/internal/versions/toolchain.go
deleted file mode 100644
index 377bf7a53b..0000000000
--- a/test/performance/vendor/golang.org/x/tools/internal/versions/toolchain.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2024 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 versions
-
-// toolchain is maximum version (<1.22) that the go toolchain used
-// to build the current tool is known to support.
-//
-// When a tool is built with >=1.22, the value of toolchain is unused.
-//
-// x/tools does not support building with go <1.18. So we take this
-// as the minimum possible maximum.
-var toolchain string = Go1_18
diff --git a/test/performance/vendor/golang.org/x/tools/internal/versions/toolchain_go119.go b/test/performance/vendor/golang.org/x/tools/internal/versions/toolchain_go119.go
deleted file mode 100644
index f65beed9d8..0000000000
--- a/test/performance/vendor/golang.org/x/tools/internal/versions/toolchain_go119.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2024 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 go1.19
-// +build go1.19
-
-package versions
-
-func init() {
-	if Compare(toolchain, Go1_19) < 0 {
-		toolchain = Go1_19
-	}
-}
diff --git a/test/performance/vendor/golang.org/x/tools/internal/versions/toolchain_go120.go b/test/performance/vendor/golang.org/x/tools/internal/versions/toolchain_go120.go
deleted file mode 100644
index 1a9efa126c..0000000000
--- a/test/performance/vendor/golang.org/x/tools/internal/versions/toolchain_go120.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2024 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 go1.20
-// +build go1.20
-
-package versions
-
-func init() {
-	if Compare(toolchain, Go1_20) < 0 {
-		toolchain = Go1_20
-	}
-}
diff --git a/test/performance/vendor/golang.org/x/tools/internal/versions/toolchain_go121.go b/test/performance/vendor/golang.org/x/tools/internal/versions/toolchain_go121.go
deleted file mode 100644
index b7ef216dfe..0000000000
--- a/test/performance/vendor/golang.org/x/tools/internal/versions/toolchain_go121.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2024 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 go1.21
-// +build go1.21
-
-package versions
-
-func init() {
-	if Compare(toolchain, Go1_21) < 0 {
-		toolchain = Go1_21
-	}
-}
diff --git a/test/performance/vendor/golang.org/x/tools/internal/versions/types.go b/test/performance/vendor/golang.org/x/tools/internal/versions/types.go
index 562eef21fa..0fc10ce4eb 100644
--- a/test/performance/vendor/golang.org/x/tools/internal/versions/types.go
+++ b/test/performance/vendor/golang.org/x/tools/internal/versions/types.go
@@ -5,15 +5,29 @@
 package versions
 
 import (
+	"go/ast"
 	"go/types"
 )
 
-// GoVersion returns the Go version of the type package.
-// It returns zero if no version can be determined.
-func GoVersion(pkg *types.Package) string {
-	// TODO(taking): x/tools can call GoVersion() [from 1.21] after 1.25.
-	if pkg, ok := any(pkg).(interface{ GoVersion() string }); ok {
-		return pkg.GoVersion()
+// FileVersion returns a file's Go version.
+// The reported version is an unknown Future version if a
+// version cannot be determined.
+func FileVersion(info *types.Info, file *ast.File) string {
+	// In tools built with Go >= 1.22, the Go version of a file
+	// follow a cascades of sources:
+	// 1) types.Info.FileVersion, which follows the cascade:
+	//   1.a) file version (ast.File.GoVersion),
+	//   1.b) the package version (types.Config.GoVersion), or
+	// 2) is some unknown Future version.
+	//
+	// File versions require a valid package version to be provided to types
+	// in Config.GoVersion. Config.GoVersion is either from the package's module
+	// or the toolchain (go run). This value should be provided by go/packages
+	// or unitchecker.Config.GoVersion.
+	if v := info.FileVersions[file]; IsValid(v) {
+		return v
 	}
-	return ""
+	// Note: we could instead return runtime.Version() [if valid].
+	// This would act as a max version on what a tool can support.
+	return Future
 }
diff --git a/test/performance/vendor/golang.org/x/tools/internal/versions/types_go121.go b/test/performance/vendor/golang.org/x/tools/internal/versions/types_go121.go
deleted file mode 100644
index b4345d3349..0000000000
--- a/test/performance/vendor/golang.org/x/tools/internal/versions/types_go121.go
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2023 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 !go1.22
-// +build !go1.22
-
-package versions
-
-import (
-	"go/ast"
-	"go/types"
-)
-
-// FileVersion returns a language version (<=1.21) derived from runtime.Version()
-// or an unknown future version.
-func FileVersion(info *types.Info, file *ast.File) string {
-	// In x/tools built with Go <= 1.21, we do not have Info.FileVersions
-	// available. We use a go version derived from the toolchain used to
-	// compile the tool by default.
-	// This will be <= go1.21. We take this as the maximum version that
-	// this tool can support.
-	//
-	// There are no features currently in x/tools that need to tell fine grained
-	// differences for versions <1.22.
-	return toolchain
-}
-
-// InitFileVersions is a noop when compiled with this Go version.
-func InitFileVersions(*types.Info) {}
diff --git a/test/performance/vendor/golang.org/x/tools/internal/versions/types_go122.go b/test/performance/vendor/golang.org/x/tools/internal/versions/types_go122.go
deleted file mode 100644
index aac5db62c9..0000000000
--- a/test/performance/vendor/golang.org/x/tools/internal/versions/types_go122.go
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2023 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 go1.22
-// +build go1.22
-
-package versions
-
-import (
-	"go/ast"
-	"go/types"
-)
-
-// FileVersion returns a file's Go version.
-// The reported version is an unknown Future version if a
-// version cannot be determined.
-func FileVersion(info *types.Info, file *ast.File) string {
-	// In tools built with Go >= 1.22, the Go version of a file
-	// follow a cascades of sources:
-	// 1) types.Info.FileVersion, which follows the cascade:
-	//   1.a) file version (ast.File.GoVersion),
-	//   1.b) the package version (types.Config.GoVersion), or
-	// 2) is some unknown Future version.
-	//
-	// File versions require a valid package version to be provided to types
-	// in Config.GoVersion. Config.GoVersion is either from the package's module
-	// or the toolchain (go run). This value should be provided by go/packages
-	// or unitchecker.Config.GoVersion.
-	if v := info.FileVersions[file]; IsValid(v) {
-		return v
-	}
-	// Note: we could instead return runtime.Version() [if valid].
-	// This would act as a max version on what a tool can support.
-	return Future
-}
-
-// InitFileVersions initializes info to record Go versions for Go files.
-func InitFileVersions(info *types.Info) {
-	info.FileVersions = make(map[*ast.File]string)
-}
diff --git a/test/performance/vendor/modules.txt b/test/performance/vendor/modules.txt
index a1a76c0c5a..16d0972f8a 100644
--- a/test/performance/vendor/modules.txt
+++ b/test/performance/vendor/modules.txt
@@ -68,8 +68,6 @@ github.com/hashicorp/hcl/json/token
 github.com/inconshreveable/mousetrap
 # github.com/jstemmer/go-junit-report v1.0.0
 ## explicit; go 1.2
-github.com/jstemmer/go-junit-report
-github.com/jstemmer/go-junit-report/formatter
 github.com/jstemmer/go-junit-report/parser
 # github.com/kelseyhightower/envconfig v1.4.0
 ## explicit
@@ -88,11 +86,8 @@ github.com/lufia/plan9stats
 # github.com/magiconair/properties v1.8.7
 ## explicit; go 1.19
 github.com/magiconair/properties
-# github.com/maxbrunsfeld/counterfeiter/v6 v6.8.1
-## explicit; go 1.20
-github.com/maxbrunsfeld/counterfeiter/v6
-github.com/maxbrunsfeld/counterfeiter/v6/arguments
-github.com/maxbrunsfeld/counterfeiter/v6/command
+# github.com/maxbrunsfeld/counterfeiter/v6 v6.11.2
+## explicit; go 1.23
 github.com/maxbrunsfeld/counterfeiter/v6/generator
 # github.com/minio/highwayhash v1.0.2
 ## explicit; go 1.15
@@ -179,7 +174,7 @@ github.com/nginx/agent/v2/src/extensions/prometheus-metrics
 github.com/nginx/agent/v2/src/plugins
 github.com/nginx/agent/v2/test/utils
 github.com/nginx/agent/v2/test/utils/system
-# github.com/nginxinc/nginx-go-crossplane v0.4.48
+# github.com/nginxinc/nginx-go-crossplane v0.4.70
 ## explicit; go 1.19
 github.com/nginxinc/nginx-go-crossplane
 # github.com/nginxinc/nginx-plus-go-client/v2 v2.0.1
@@ -301,9 +296,10 @@ github.com/spf13/viper/internal/features
 # github.com/stretchr/objx v0.5.2
 ## explicit; go 1.20
 github.com/stretchr/objx
-# github.com/stretchr/testify v1.9.0
+# github.com/stretchr/testify v1.10.0
 ## explicit; go 1.17
 github.com/stretchr/testify/assert
+github.com/stretchr/testify/assert/yaml
 github.com/stretchr/testify/mock
 github.com/stretchr/testify/require
 # github.com/subosito/gotenv v1.6.0
@@ -330,7 +326,7 @@ go.uber.org/atomic
 # go.uber.org/multierr v1.11.0
 ## explicit; go 1.19
 go.uber.org/multierr
-# golang.org/x/crypto v0.31.0
+# golang.org/x/crypto v0.32.0
 ## explicit; go 1.20
 golang.org/x/crypto/bcrypt
 golang.org/x/crypto/blake2b
@@ -354,12 +350,12 @@ golang.org/x/exp/slices
 golang.org/x/exp/slog
 golang.org/x/exp/slog/internal
 golang.org/x/exp/slog/internal/buffer
-# golang.org/x/mod v0.21.0
+# golang.org/x/mod v0.22.0
 ## explicit; go 1.22.0
 golang.org/x/mod/internal/lazyregexp
 golang.org/x/mod/module
 golang.org/x/mod/semver
-# golang.org/x/net v0.33.0
+# golang.org/x/net v0.34.0
 ## explicit; go 1.18
 golang.org/x/net/http/httpguts
 golang.org/x/net/http2
@@ -372,7 +368,7 @@ golang.org/x/net/trace
 ## explicit; go 1.18
 golang.org/x/sync/errgroup
 golang.org/x/sync/singleflight
-# golang.org/x/sys v0.28.0
+# golang.org/x/sys v0.29.0
 ## explicit; go 1.18
 golang.org/x/sys/cpu
 golang.org/x/sys/unix
@@ -402,9 +398,8 @@ golang.org/x/text/unicode/norm
 # golang.org/x/time v0.5.0
 ## explicit; go 1.18
 golang.org/x/time/rate
-# golang.org/x/tools v0.25.0
+# golang.org/x/tools v0.29.0
 ## explicit; go 1.22.0
-golang.org/x/tools/cmd/goimports
 golang.org/x/tools/go/ast/astutil
 golang.org/x/tools/go/gcexportdata
 golang.org/x/tools/go/packages
@@ -420,10 +415,10 @@ golang.org/x/tools/internal/gcimporter
 golang.org/x/tools/internal/gocommand
 golang.org/x/tools/internal/gopathwalk
 golang.org/x/tools/internal/imports
+golang.org/x/tools/internal/modindex
 golang.org/x/tools/internal/packagesinternal
 golang.org/x/tools/internal/pkgbits
 golang.org/x/tools/internal/stdlib
-golang.org/x/tools/internal/tokeninternal
 golang.org/x/tools/internal/typeparams
 golang.org/x/tools/internal/typesinternal
 golang.org/x/tools/internal/versions
diff --git a/vendor/github.com/jstemmer/go-junit-report/.gitignore b/vendor/github.com/jstemmer/go-junit-report/.gitignore
deleted file mode 100644
index 7216c087e1..0000000000
--- a/vendor/github.com/jstemmer/go-junit-report/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-go-junit-report
-build/
diff --git a/vendor/github.com/jstemmer/go-junit-report/.travis.yml b/vendor/github.com/jstemmer/go-junit-report/.travis.yml
deleted file mode 100644
index d0dff3ef8e..0000000000
--- a/vendor/github.com/jstemmer/go-junit-report/.travis.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-language: go
-
-go:
-  - tip
-  - "1.13.x"
-  - "1.12.x"
-  - "1.11.x"
-  - "1.10.x"
-  - "1.9.x"
-  - "1.8.x"
-  - "1.7.x"
-  - "1.6.x"
-  - "1.5.x"
-  - "1.4.x"
-  - "1.3.x"
-  - "1.2.x"
diff --git a/vendor/github.com/jstemmer/go-junit-report/CONTRIBUTING.md b/vendor/github.com/jstemmer/go-junit-report/CONTRIBUTING.md
deleted file mode 100644
index 125d350e11..0000000000
--- a/vendor/github.com/jstemmer/go-junit-report/CONTRIBUTING.md
+++ /dev/null
@@ -1,21 +0,0 @@
-# Contributing
-
-## Bug reports
-
-- Before reporting a bug, have a look at the [issue
-  list](https://github.com/jstemmer/go-junit-report/issues) to see if an issue
-  already exists for your problem.
-- Include as much information as you can in the bug report, e.g.: the versions
-  of go-junit-report and the Go compiler, how go-junit-report was called, what
-  input was given to go-junit-report, what the actual output was, was the
-  expected output was.
-
-## Pull requests
-
-- Before sending a pull request for new features, open an issue to discuss it.
-- Run `go fmt` to format your code.
-- Add test coverage and run all tests.
-- Prefer small PRs, avoid making unrelated changes in the same PR.
-- Limit the first line of the commit message to 72 characters.
-- Write commit messages in the imperative mood ("Fix bug", not "Fixed bug" or
-  "Fixes bug") .
diff --git a/vendor/github.com/jstemmer/go-junit-report/Makefile b/vendor/github.com/jstemmer/go-junit-report/Makefile
deleted file mode 100644
index 4c0aaf218f..0000000000
--- a/vendor/github.com/jstemmer/go-junit-report/Makefile
+++ /dev/null
@@ -1,26 +0,0 @@
-VERSION=$(shell git describe --match="v*")
-REVISION=$(shell git rev-parse HEAD)
-TIMESTAMP=$(shell date +%FT%T)
-
-test:
-	go test ./...
-
-build/go-junit-report build/go-junit-report.exe: clean
-	go build --ldflags "-s -X main.Version=$(VERSION) -X main.Revision=$(REVISION) -X main.BuildTime=$(TIMESTAMP)" -o $@
-
-build/go-junit-report-$(VERSION)-$(GOOS)-$(GOARCH).tar.gz: build/go-junit-report
-	tar czf $@ -C build go-junit-report
-
-build/go-junit-report-$(VERSION)-windows-amd64.zip: build/go-junit-report.exe
-	zip -j $@ build/go-junit-report.exe
-
-release: test
-	$(MAKE) GOOS=linux GOARCH=amd64 build/go-junit-report-$(VERSION)-linux-amd64.tar.gz
-	$(MAKE) GOOS=windows GOARCH=amd64 build/go-junit-report-$(VERSION)-windows-amd64.zip
-	$(MAKE) GOOS=darwin GOARCH=amd64 build/go-junit-report-$(VERSION)-darwin-amd64.tar.gz
-
-clean:
-	rm -f build/go-junit-report
-	rm -f build/go-junit-report.exe
-
-.PHONY: build clean release test
diff --git a/vendor/github.com/jstemmer/go-junit-report/README.md b/vendor/github.com/jstemmer/go-junit-report/README.md
deleted file mode 100644
index a81ad10e46..0000000000
--- a/vendor/github.com/jstemmer/go-junit-report/README.md
+++ /dev/null
@@ -1,56 +0,0 @@
-# go-junit-report
-
-go-junit-report is a tool that converts [`go test`] output to an XML report,
-suitable for applications that expect JUnit-style XML reports (e.g.
-[Jenkins](http://jenkins-ci.org)).
-
-The test output [parser] and JUnit report [formatter] are also available as Go
-packages.
-
-[![Build Status][travis-badge]][travis-link]
-
-## Install from package (recommended)
-
-Pre-built packages for Windows, macOS and Linux are found on the [Releases]
-page.
-
-## Install from source
-
-Download and install the latest stable version from source by running:
-
-```bash
-go install github.com/jstemmer/go-junit-report@latest
-```
-
-## Usage
-
-go-junit-report reads the full `go test` output from stdin and writes JUnit
-compatible XML to stdout. In order to capture build errors as well as test
-output, redirect both stdout and stderr to go-junit-report.
-
-```bash
-go test -v 2>&1 | go-junit-report > report.xml
-```
-
-Parsing benchmark output is also supported, for example:
-
-```bash
-go test -v -bench . -count 5 2>&1 | go-junit-report > report.xml
-```
-
-If you want go-junit-report to exit with a non-zero exit code when it encounters
-build errors or test failures, set the `-set-exit-code` flag.
-
-Run `go-junit-report -help` for a list of all supported flags.
-
-## Contributing
-
-See [CONTRIBUTING.md].
-
-[`go test`]: https://pkg.go.dev/cmd/go#hdr-Test_packages
-[parser]: https://pkg.go.dev/github.com/jstemmer/go-junit-report/parser
-[formatter]: https://pkg.go.dev/github.com/jstemmer/go-junit-report/formatter
-[travis-badge]: https://travis-ci.org/jstemmer/go-junit-report.svg?branch=master
-[travis-link]: https://travis-ci.org/jstemmer/go-junit-report
-[Releases]: https://github.com/jstemmer/go-junit-report/releases
-[CONTRIBUTING.md]: https://github.com/jstemmer/go-junit-report/blob/master/CONTRIBUTING.md
diff --git a/vendor/github.com/jstemmer/go-junit-report/formatter/formatter.go b/vendor/github.com/jstemmer/go-junit-report/formatter/formatter.go
deleted file mode 100644
index 6e1a0f31d6..0000000000
--- a/vendor/github.com/jstemmer/go-junit-report/formatter/formatter.go
+++ /dev/null
@@ -1,182 +0,0 @@
-package formatter
-
-import (
-	"bufio"
-	"encoding/xml"
-	"fmt"
-	"io"
-	"runtime"
-	"strings"
-	"time"
-
-	"github.com/jstemmer/go-junit-report/parser"
-)
-
-// JUnitTestSuites is a collection of JUnit test suites.
-type JUnitTestSuites struct {
-	XMLName xml.Name         `xml:"testsuites"`
-	Suites  []JUnitTestSuite `xml:"testsuite"`
-}
-
-// JUnitTestSuite is a single JUnit test suite which may contain many
-// testcases.
-type JUnitTestSuite struct {
-	XMLName    xml.Name        `xml:"testsuite"`
-	Tests      int             `xml:"tests,attr"`
-	Failures   int             `xml:"failures,attr"`
-	Time       string          `xml:"time,attr"`
-	Name       string          `xml:"name,attr"`
-	Properties []JUnitProperty `xml:"properties>property,omitempty"`
-	TestCases  []JUnitTestCase `xml:"testcase"`
-}
-
-// JUnitTestCase is a single test case with its result.
-type JUnitTestCase struct {
-	XMLName     xml.Name          `xml:"testcase"`
-	Classname   string            `xml:"classname,attr"`
-	Name        string            `xml:"name,attr"`
-	Time        string            `xml:"time,attr"`
-	SkipMessage *JUnitSkipMessage `xml:"skipped,omitempty"`
-	Failure     *JUnitFailure     `xml:"failure,omitempty"`
-}
-
-// JUnitSkipMessage contains the reason why a testcase was skipped.
-type JUnitSkipMessage struct {
-	Message string `xml:"message,attr"`
-}
-
-// JUnitProperty represents a key/value pair used to define properties.
-type JUnitProperty struct {
-	Name  string `xml:"name,attr"`
-	Value string `xml:"value,attr"`
-}
-
-// JUnitFailure contains data related to a failed test.
-type JUnitFailure struct {
-	Message  string `xml:"message,attr"`
-	Type     string `xml:"type,attr"`
-	Contents string `xml:",chardata"`
-}
-
-// JUnitReportXML writes a JUnit xml representation of the given report to w
-// in the format described at http://windyroad.org/dl/Open%20Source/JUnit.xsd
-func JUnitReportXML(report *parser.Report, noXMLHeader bool, goVersion string, w io.Writer) error {
-	suites := JUnitTestSuites{}
-
-	// convert Report to JUnit test suites
-	for _, pkg := range report.Packages {
-		pkg.Benchmarks = mergeBenchmarks(pkg.Benchmarks)
-		ts := JUnitTestSuite{
-			Tests:      len(pkg.Tests) + len(pkg.Benchmarks),
-			Failures:   0,
-			Time:       formatTime(pkg.Duration),
-			Name:       pkg.Name,
-			Properties: []JUnitProperty{},
-			TestCases:  []JUnitTestCase{},
-		}
-
-		classname := pkg.Name
-		if idx := strings.LastIndex(classname, "/"); idx > -1 && idx < len(pkg.Name) {
-			classname = pkg.Name[idx+1:]
-		}
-
-		// properties
-		if goVersion == "" {
-			// if goVersion was not specified as a flag, fall back to version reported by runtime
-			goVersion = runtime.Version()
-		}
-		ts.Properties = append(ts.Properties, JUnitProperty{"go.version", goVersion})
-		if pkg.CoveragePct != "" {
-			ts.Properties = append(ts.Properties, JUnitProperty{"coverage.statements.pct", pkg.CoveragePct})
-		}
-
-		// individual test cases
-		for _, test := range pkg.Tests {
-			testCase := JUnitTestCase{
-				Classname: classname,
-				Name:      test.Name,
-				Time:      formatTime(test.Duration),
-				Failure:   nil,
-			}
-
-			if test.Result == parser.FAIL {
-				ts.Failures++
-				testCase.Failure = &JUnitFailure{
-					Message:  "Failed",
-					Type:     "",
-					Contents: strings.Join(test.Output, "\n"),
-				}
-			}
-
-			if test.Result == parser.SKIP {
-				testCase.SkipMessage = &JUnitSkipMessage{strings.Join(test.Output, "\n")}
-			}
-
-			ts.TestCases = append(ts.TestCases, testCase)
-		}
-
-		// individual benchmarks
-		for _, benchmark := range pkg.Benchmarks {
-			benchmarkCase := JUnitTestCase{
-				Classname: classname,
-				Name:      benchmark.Name,
-				Time:      formatBenchmarkTime(benchmark.Duration),
-			}
-
-			ts.TestCases = append(ts.TestCases, benchmarkCase)
-		}
-
-		suites.Suites = append(suites.Suites, ts)
-	}
-
-	// to xml
-	bytes, err := xml.MarshalIndent(suites, "", "\t")
-	if err != nil {
-		return err
-	}
-
-	writer := bufio.NewWriter(w)
-
-	if !noXMLHeader {
-		writer.WriteString(xml.Header)
-	}
-
-	writer.Write(bytes)
-	writer.WriteByte('\n')
-	writer.Flush()
-
-	return nil
-}
-
-func mergeBenchmarks(benchmarks []*parser.Benchmark) []*parser.Benchmark {
-	var merged []*parser.Benchmark
-	benchmap := make(map[string][]*parser.Benchmark)
-	for _, bm := range benchmarks {
-		if _, ok := benchmap[bm.Name]; !ok {
-			merged = append(merged, &parser.Benchmark{Name: bm.Name})
-		}
-		benchmap[bm.Name] = append(benchmap[bm.Name], bm)
-	}
-
-	for _, bm := range merged {
-		for _, b := range benchmap[bm.Name] {
-			bm.Allocs += b.Allocs
-			bm.Bytes += b.Bytes
-			bm.Duration += b.Duration
-		}
-		n := len(benchmap[bm.Name])
-		bm.Allocs /= n
-		bm.Bytes /= n
-		bm.Duration /= time.Duration(n)
-	}
-
-	return merged
-}
-
-func formatTime(d time.Duration) string {
-	return fmt.Sprintf("%.3f", d.Seconds())
-}
-
-func formatBenchmarkTime(d time.Duration) string {
-	return fmt.Sprintf("%.9f", d.Seconds())
-}
diff --git a/vendor/github.com/jstemmer/go-junit-report/go-junit-report.go b/vendor/github.com/jstemmer/go-junit-report/go-junit-report.go
deleted file mode 100644
index 24de3d9c4a..0000000000
--- a/vendor/github.com/jstemmer/go-junit-report/go-junit-report.go
+++ /dev/null
@@ -1,57 +0,0 @@
-package main
-
-import (
-	"flag"
-	"fmt"
-	"os"
-
-	"github.com/jstemmer/go-junit-report/formatter"
-	"github.com/jstemmer/go-junit-report/parser"
-)
-
-var (
-	Version   = "v1.0.0-dev"
-	Revision  = "HEAD"
-	BuildTime string
-)
-
-var (
-	noXMLHeader   = flag.Bool("no-xml-header", false, "do not print xml header")
-	packageName   = flag.String("package-name", "", "specify a package name (compiled test have no package name in output)")
-	goVersionFlag = flag.String("go-version", "", "specify the value to use for the go.version property in the generated XML")
-	setExitCode   = flag.Bool("set-exit-code", false, "set exit code to 1 if tests failed")
-	version       = flag.Bool("version", false, "print version")
-)
-
-func main() {
-	flag.Parse()
-
-	if *version {
-		fmt.Printf("go-junit-report %s %s (%s)\n", Version, BuildTime, Revision)
-		return
-	}
-
-	if flag.NArg() != 0 {
-		fmt.Fprintf(os.Stderr, "%s does not accept positional arguments\n", os.Args[0])
-		flag.Usage()
-		os.Exit(1)
-	}
-
-	// Read input
-	report, err := parser.Parse(os.Stdin, *packageName)
-	if err != nil {
-		fmt.Printf("Error reading input: %s\n", err)
-		os.Exit(1)
-	}
-
-	// Write xml
-	err = formatter.JUnitReportXML(report, *noXMLHeader, *goVersionFlag, os.Stdout)
-	if err != nil {
-		fmt.Printf("Error writing XML: %s\n", err)
-		os.Exit(1)
-	}
-
-	if *setExitCode && report.Failures() > 0 {
-		os.Exit(1)
-	}
-}
diff --git a/vendor/github.com/maxbrunsfeld/counterfeiter/v6/.gitattributes b/vendor/github.com/maxbrunsfeld/counterfeiter/v6/.gitattributes
deleted file mode 100644
index fcadb2cf97..0000000000
--- a/vendor/github.com/maxbrunsfeld/counterfeiter/v6/.gitattributes
+++ /dev/null
@@ -1 +0,0 @@
-* text eol=lf
diff --git a/vendor/github.com/maxbrunsfeld/counterfeiter/v6/.gitignore b/vendor/github.com/maxbrunsfeld/counterfeiter/v6/.gitignore
deleted file mode 100644
index 1597f12b71..0000000000
--- a/vendor/github.com/maxbrunsfeld/counterfeiter/v6/.gitignore
+++ /dev/null
@@ -1,32 +0,0 @@
-# Compiled Object files, Static and Dynamic libs (Shared Objects)
-*.o
-*.a
-*.so
-
-# Folders
-_obj
-_test
-
-# Architecture specific extensions/prefixes
-*.[568vq]
-[568vq].out
-
-*.cgo1.go
-*.cgo2.c
-_cgo_defun.c
-_cgo_gotypes.go
-_cgo_export.*
-
-_testmain.go
-
-*.exe
-*.test
-*.iml
-.idea
-.envrc
-
-/counterfeiter
-integration/testdata/output
-*.profile
-*.bench
-/.vscode
diff --git a/vendor/github.com/maxbrunsfeld/counterfeiter/v6/.golangci.yaml b/vendor/github.com/maxbrunsfeld/counterfeiter/v6/.golangci.yaml
deleted file mode 100644
index 1f2afa43bb..0000000000
--- a/vendor/github.com/maxbrunsfeld/counterfeiter/v6/.golangci.yaml
+++ /dev/null
@@ -1,3 +0,0 @@
-run:
-  skip-dirs:
-    - fixtures
\ No newline at end of file
diff --git a/vendor/github.com/maxbrunsfeld/counterfeiter/v6/README.md b/vendor/github.com/maxbrunsfeld/counterfeiter/v6/README.md
deleted file mode 100644
index 5d471d6431..0000000000
--- a/vendor/github.com/maxbrunsfeld/counterfeiter/v6/README.md
+++ /dev/null
@@ -1,228 +0,0 @@
-# `counterfeiter` [![GitHub Actions](https://github.com/maxbrunsfeld/counterfeiter/actions/workflows/go.yml/badge.svg)](https://github.com/maxbrunsfeld/counterfeiter/actions/workflows/go.yml) [![Go Report Card](https://goreportcard.com/badge/github.com/maxbrunsfeld/counterfeiter/v6)](https://goreportcard.com/report/github.com/maxbrunsfeld/counterfeiter/v6) [![GoDoc](https://godoc.org/github.com/maxbrunsfeld/counterfeiter/v6?status.svg)](https://godoc.org/github.com/maxbrunsfeld/counterfeiter/v6)
-
-When writing unit-tests for an object, it is often useful to have fake implementations
-of the object's collaborators. In go, such fake implementations cannot be generated
-automatically at runtime, and writing them by hand can be quite arduous.
-
-`counterfeiter` allows you to simply generate test doubles for a given interface.
-
-### Supported Versions Of `go`
-
-`counterfeiter` follows the [support policy of `go` itself](https://golang.org/doc/devel/release.html#policy):
-
-> Each major Go release is supported until there are two newer major releases. For example, Go 1.5 was supported until the Go 1.7 release, and Go 1.6 was supported until the Go 1.8 release. We fix critical problems, including [critical security problems](https://golang.org/security), in supported releases as needed by issuing minor revisions (for example, Go 1.6.1, Go 1.6.2, and so on).
-
-If you are having problems with `counterfeiter` and are not using a supported version of go, please update to use a supported version of go before opening an issue.
-
-### Using `counterfeiter`
-
-⚠️ Please use [`go modules`](https://blog.golang.org/using-go-modules) when working with counterfeiter.
-
-Typically, `counterfeiter` is used in `go generate` directives. It can be frustrating when you change your interface declaration and suddenly all of your generated code is suddenly out-of-date. The best practice here is to use the [`go generate` command](https://blog.golang.org/generate) to make it easier to keep your test doubles up to date.
-
-#### Step 1 - Create `tools.go`
-
-You can take a dependency on tools by creating a `tools.go` file, as described in [How can I track tool dependencies for a module?](https://github.com/golang/go/wiki/Modules#how-can-i-track-tool-dependencies-for-a-module). This ensures that everyone working with your module is using the same version of each tool you use.
-
-```shell
-$ cat tools/tools.go
-```
-
-```go
-//go:build tools
-
-package tools
-
-import (
-	_ "github.com/maxbrunsfeld/counterfeiter/v6"
-)
-
-// This file imports packages that are used when running go generate, or used
-// during the development process but not otherwise depended on by built code.
-```
-
-#### Step 2a - Add `go:generate` Directives
-
-You can add directives right next to your interface definitions (or not), in any `.go` file in your module.
-
-```shell
-$ cat myinterface.go
-```
-
-```go
-package foo
-
-//go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 . MySpecialInterface
-
-type MySpecialInterface interface {
-	DoThings(string, uint64) (int, error)
-}
-```
-
-```shell
-$ go generate ./...
-Writing `FakeMySpecialInterface` to `foofakes/fake_my_special_interface.go`... Done
-```
-
-#### Step 2b - Add `counterfeiter:generate` Directives
-
-If you plan to have many directives in a single package, consider using this
-option. You can add directives right next to your interface definitions
-(or not), in any `.go` file in your module.
-
-```shell
-$ cat myinterface.go
-```
-
-```go
-package foo
-
-// You only need **one** of these per package!
-//go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -generate
-
-// You will add lots of directives like these in the same package...
-//counterfeiter:generate . MySpecialInterface
-type MySpecialInterface interface {
-	DoThings(string, uint64) (int, error)
-}
-
-// Like this...
-//counterfeiter:generate . MyOtherInterface
-type MyOtherInterface interface {
-	DoOtherThings(string, uint64) (int, error)
-}
-```
-
-```shell
-$ go generate ./...
-Writing `FakeMySpecialInterface` to `foofakes/fake_my_special_interface.go`... Done
-Writing `FakeMyOtherInterface` to `foofakes/fake_my_other_interface.go`... Done
-```
-
-#### Step 3 - Run `go generate`
-
-You can run `go generate` in the directory with your directive, or in the root of your module (to ensure you generate for all packages in your module):
-
-```shell
-$ go generate ./...
-```
-
-#### Invoking `counterfeiter` from the shell
-
-You can use the following command to invoke `counterfeiter` from within a go module:
-
-```shell
-$ go run github.com/maxbrunsfeld/counterfeiter/v6
-
-USAGE
-	counterfeiter
-		[-generate>] [-o ] [-p] [--fake-name ]
-		[-header ]
-		[]  [-]
-```
-
-#### Installing `counterfeiter` to `$GOPATH/bin`
-
-This is unnecessary if you're using the approach described above, but does allow you to invoke `counterfeiter` in your shell _outside_ of a module:
-
-```shell
-$ go install github.com/maxbrunsfeld/counterfeiter/v6
-$ ~/go/bin/counterfeiter
-
-USAGE
-	counterfeiter
-		[-generate>] [-o ] [-p] [--fake-name ]
-		[-header ]
-		[]  [-]
-```
-
-### Generating Test Doubles
-
-Given a path to a package and an interface name, you can generate a test double.
-
-```shell
-$ cat path/to/foo/file.go
-```
-
-```go
-package foo
-
-type MySpecialInterface interface {
-		DoThings(string, uint64) (int, error)
-}
-```
-
-```shell
-$ go run github.com/maxbrunsfeld/counterfeiter/v6 path/to/foo MySpecialInterface
-Wrote `FakeMySpecialInterface` to `path/to/foo/foofakes/fake_my_special_interface.go`
-```
-
-### Using Test Doubles In Your Tests
-
-Instantiate fakes`:
-
-```go
-import "my-repo/path/to/foo/foofakes"
-
-var fake = &foofakes.FakeMySpecialInterface{}
-```
-
-Fakes record the arguments they were called with:
-
-```go
-fake.DoThings("stuff", 5)
-
-Expect(fake.DoThingsCallCount()).To(Equal(1))
-
-str, num := fake.DoThingsArgsForCall(0)
-Expect(str).To(Equal("stuff"))
-Expect(num).To(Equal(uint64(5)))
-```
-
-You can stub their return values:
-
-```go
-fake.DoThingsReturns(3, errors.New("the-error"))
-
-num, err := fake.DoThings("stuff", 5)
-Expect(num).To(Equal(3))
-Expect(err).To(Equal(errors.New("the-error")))
-```
-
-For more examples of using the `counterfeiter` API, look at [some of the provided examples](https://github.com/maxbrunsfeld/counterfeiter/blob/master/generated_fakes_test.go).
-
-### Generating Test Doubles For Third Party Interfaces
-
-For third party interfaces, you can specify the interface using the alternative syntax `.`, for example:
-
-```shell
-$ go run github.com/maxbrunsfeld/counterfeiter/v6 github.com/go-redis/redis.Pipeliner
-```
-
-### Running The Tests For `counterfeiter`
-
-If you want to run the tests for `counterfeiter` (perhaps, because you want to contribute a PR), all you have to do is run `scripts/ci.sh`.
-
-### Contributions
-
-So you want to contribute to `counterfeiter`! That's great, here's exactly what you should do:
-
-- open a new github issue, describing your problem, or use case
-- help us understand how you want to fix or extend `counterfeiter`
-- write one or more unit tests for the behavior you want
-- write the simplest code you can for the feature you're working on
-- try to find any opportunities to refactor
-- avoid writing code that isn't covered by unit tests
-
-`counterfeiter` has a few high level goals for contributors to keep in mind
-
-- keep unit-level test coverage as high as possible
-- keep `main.go` as simple as possible
-- avoid making the command line options any more complicated
-- avoid making the internals of `counterfeiter` any more complicated
-
-If you have any questions about how to contribute, rest assured that @tjarratt and other maintainers will work with you to ensure we make `counterfeiter` better, together. This project has largely been maintained by the community, and we greatly appreciate any PR (whether big or small).
-
-### License
-
-`counterfeiter` is MIT-licensed.
diff --git a/vendor/github.com/maxbrunsfeld/counterfeiter/v6/arguments/files.go b/vendor/github.com/maxbrunsfeld/counterfeiter/v6/arguments/files.go
deleted file mode 100644
index a2485878db..0000000000
--- a/vendor/github.com/maxbrunsfeld/counterfeiter/v6/arguments/files.go
+++ /dev/null
@@ -1,6 +0,0 @@
-package arguments
-
-import "os"
-
-type Evaler func(string) (string, error)
-type Stater func(string) (os.FileInfo, error)
diff --git a/vendor/github.com/maxbrunsfeld/counterfeiter/v6/arguments/parser.go b/vendor/github.com/maxbrunsfeld/counterfeiter/v6/arguments/parser.go
deleted file mode 100644
index 557d4959f1..0000000000
--- a/vendor/github.com/maxbrunsfeld/counterfeiter/v6/arguments/parser.go
+++ /dev/null
@@ -1,271 +0,0 @@
-package arguments
-
-import (
-	"encoding/json"
-	"errors"
-	"flag"
-	"fmt"
-	"path"
-	"path/filepath"
-	"regexp"
-	"strings"
-	"unicode"
-)
-
-func New(args []string, workingDir string, evaler Evaler, stater Stater) (*ParsedArguments, error) {
-	if len(args) == 0 {
-		return nil, errors.New("argument parsing requires at least one argument")
-	}
-
-	fs := flag.NewFlagSet("counterfeiter", flag.ContinueOnError)
-	fakeNameFlag := fs.String(
-		"fake-name",
-		"",
-		"The name of the fake struct",
-	)
-
-	outputPathFlag := fs.String(
-		"o",
-		"",
-		"The file or directory to which the generated fake will be written",
-	)
-
-	packageFlag := fs.Bool(
-		"p",
-		false,
-		"Whether or not to generate a package shim",
-	)
-	generateFlag := fs.Bool(
-		"generate",
-		false,
-		"Identify all //counterfeiter:generate directives in the current working directory and generate fakes for them",
-	)
-	headerFlag := fs.String(
-		"header",
-		"",
-		"A path to a file that should be used as a header for the generated fake",
-	)
-	quietFlag := fs.Bool(
-		"q",
-		false,
-		"Suppress status statements",
-	)
-	helpFlag := fs.Bool(
-		"help",
-		false,
-		"Display this help",
-	)
-
-	err := fs.Parse(args[1:])
-	if err != nil {
-		return nil, err
-	}
-	if *helpFlag {
-		return nil, errors.New(usage)
-	}
-	if len(fs.Args()) == 0 && !*generateFlag {
-		return nil, errors.New(usage)
-	}
-
-	packageMode := *packageFlag
-	result := &ParsedArguments{
-		PrintToStdOut: any(args, "-"),
-		GenerateInterfaceAndShimFromPackageDirectory: packageMode,
-		GenerateMode: *generateFlag,
-		HeaderFile:   *headerFlag,
-		Quiet:        *quietFlag,
-	}
-	if *generateFlag {
-		return result, nil
-	}
-	err = result.parseSourcePackageDir(packageMode, workingDir, evaler, stater, fs.Args())
-	if err != nil {
-		return nil, err
-	}
-	result.parseInterfaceName(packageMode, fs.Args())
-	result.parseFakeName(packageMode, *fakeNameFlag, fs.Args())
-	result.parseOutputPath(packageMode, workingDir, *outputPathFlag, fs.Args())
-	result.parseDestinationPackageName(packageMode, fs.Args())
-	result.parsePackagePath(packageMode, fs.Args())
-	return result, nil
-}
-
-func (a *ParsedArguments) PrettyPrint() {
-	b, _ := json.Marshal(a)
-	fmt.Println(string(b))
-}
-
-func (a *ParsedArguments) parseInterfaceName(packageMode bool, args []string) {
-	if packageMode {
-		a.InterfaceName = ""
-		return
-	}
-	if len(args) == 1 {
-		fullyQualifiedInterface := strings.Split(args[0], ".")
-		a.InterfaceName = fullyQualifiedInterface[len(fullyQualifiedInterface)-1]
-	} else {
-		a.InterfaceName = args[1]
-	}
-}
-
-func (a *ParsedArguments) parseSourcePackageDir(packageMode bool, workingDir string, evaler Evaler, stater Stater, args []string) error {
-	if packageMode {
-		a.SourcePackageDir = args[0]
-		return nil
-	}
-	if len(args) <= 1 {
-		return nil
-	}
-	s, err := getSourceDir(args[0], workingDir, evaler, stater)
-	if err != nil {
-		return err
-	}
-	a.SourcePackageDir = s
-	return nil
-}
-
-func (a *ParsedArguments) parseFakeName(packageMode bool, fakeName string, args []string) {
-	if packageMode {
-		a.parsePackagePath(packageMode, args)
-		a.FakeImplName = strings.ToUpper(path.Base(a.PackagePath))[:1] + path.Base(a.PackagePath)[1:]
-		return
-	}
-	if fakeName == "" {
-		fakeName = "Fake" + fixupUnexportedNames(a.InterfaceName)
-	}
-	a.FakeImplName = fakeName
-}
-
-func (a *ParsedArguments) parseOutputPath(packageMode bool, workingDir string, outputPath string, args []string) {
-	outputPathIsFilename := false
-	if strings.HasSuffix(outputPath, ".go") {
-		outputPathIsFilename = true
-	}
-	snakeCaseName := strings.ToLower(camelRegexp.ReplaceAllString(a.FakeImplName, "${1}_${2}"))
-
-	if outputPath != "" {
-		if !filepath.IsAbs(outputPath) {
-			outputPath = filepath.Join(workingDir, outputPath)
-		}
-		a.OutputPath = outputPath
-		if !outputPathIsFilename {
-			a.OutputPath = filepath.Join(a.OutputPath, snakeCaseName+".go")
-		}
-		return
-	}
-
-	if packageMode {
-		a.parseDestinationPackageName(packageMode, args)
-		a.OutputPath = path.Join(workingDir, a.DestinationPackageName, snakeCaseName+".go")
-		return
-	}
-
-	d := workingDir
-	if len(args) > 1 {
-		d = a.SourcePackageDir
-	}
-	a.OutputPath = filepath.Join(d, packageNameForPath(d), snakeCaseName+".go")
-}
-
-func (a *ParsedArguments) parseDestinationPackageName(packageMode bool, args []string) {
-	if packageMode {
-		a.parsePackagePath(packageMode, args)
-		a.DestinationPackageName = path.Base(a.PackagePath) + "shim"
-		return
-	}
-
-	a.DestinationPackageName = restrictToValidPackageName(filepath.Base(filepath.Dir(a.OutputPath)))
-}
-
-func (a *ParsedArguments) parsePackagePath(packageMode bool, args []string) {
-	if packageMode {
-		a.PackagePath = args[0]
-		return
-	}
-	if len(args) == 1 {
-		fullyQualifiedInterface := strings.Split(args[0], ".")
-		a.PackagePath = strings.Join(fullyQualifiedInterface[:len(fullyQualifiedInterface)-1], ".")
-	} else {
-		a.InterfaceName = args[1]
-	}
-
-	if a.PackagePath == "" {
-		a.PackagePath = a.SourcePackageDir
-	}
-}
-
-type ParsedArguments struct {
-	GenerateInterfaceAndShimFromPackageDirectory bool
-
-	SourcePackageDir string // abs path to the dir containing the interface to fake
-	PackagePath      string // package path to the package containing the interface to fake
-	OutputPath       string // path to write the fake file to
-
-	DestinationPackageName string // often the base-dir for OutputPath but must be a valid package name
-
-	InterfaceName string // the interface to counterfeit
-	FakeImplName  string // the name of the struct implementing the given interface
-
-	PrintToStdOut bool
-	GenerateMode  bool
-	Quiet         bool
-
-	HeaderFile string
-}
-
-func fixupUnexportedNames(interfaceName string) string {
-	asRunes := []rune(interfaceName)
-	if len(asRunes) == 0 || !unicode.IsLower(asRunes[0]) {
-		return interfaceName
-	}
-	asRunes[0] = unicode.ToUpper(asRunes[0])
-	return string(asRunes)
-}
-
-var camelRegexp = regexp.MustCompile("([a-z])([A-Z])")
-
-func packageNameForPath(pathToPackage string) string {
-	_, packageName := filepath.Split(pathToPackage)
-	return packageName + "fakes"
-}
-
-func getSourceDir(path string, workingDir string, evaler Evaler, stater Stater) (string, error) {
-	if !filepath.IsAbs(path) {
-		path = filepath.Join(workingDir, path)
-	}
-
-	evaluatedPath, err := evaler(path)
-	if err != nil {
-		return "", fmt.Errorf("No such file/directory/package [%s]: %v", path, err)
-	}
-
-	stat, err := stater(evaluatedPath)
-	if err != nil {
-		return "", fmt.Errorf("No such file/directory/package [%s]: %v", path, err)
-	}
-
-	if !stat.IsDir() {
-		return filepath.Dir(path), nil
-	}
-	return path, nil
-}
-
-func any(slice []string, needle string) bool {
-	for _, str := range slice {
-		if str == needle {
-			return true
-		}
-	}
-
-	return false
-}
-
-func restrictToValidPackageName(input string) string {
-	return strings.Map(func(r rune) rune {
-		if (r >= 'a' && r <= 'z') || (r >= 'A' && r <= 'Z') || (r >= '0' && r <= '9') || r == '_' {
-			return r
-		} else {
-			return -1
-		}
-	}, input)
-}
diff --git a/vendor/github.com/maxbrunsfeld/counterfeiter/v6/arguments/usage.go b/vendor/github.com/maxbrunsfeld/counterfeiter/v6/arguments/usage.go
deleted file mode 100644
index 0d707afaaa..0000000000
--- a/vendor/github.com/maxbrunsfeld/counterfeiter/v6/arguments/usage.go
+++ /dev/null
@@ -1,112 +0,0 @@
-package arguments
-
-const usage = `
-USAGE
-	counterfeiter
-		[-generate>] [-o ] [-p] [--fake-name ]
-		[-header ]
-		[]  [-]
-
-ARGUMENTS
-	source-path
-		Path to the file or directory containing the interface to fake.
-		In package mode (-p), source-path should instead specify the path
-		of the input package; alternatively you can use the package name
-		(e.g. "os") and the path will be inferred from your GOROOT.
-
-	interface
-		If source-path is specified: Name of the interface to fake.
-		If no source-path is specified: Fully qualified interface path of the interface to fake.
-    If -p is specified, this will be the name of the interface to generate.
-
-	example:
-		# writes "FakeStdInterface" to ./packagefakes/fake_std_interface.go
-		counterfeiter package/subpackage.StdInterface
-
-	'-' argument
-		Write code to standard out instead of to a file
-
-OPTIONS
-	-generate
-		Identify all //counterfeiter:generate directives in .go file in the
-		current working directory and generate fakes for them. You can pass
-		arguments as usual.
-
-		NOTE: This is not the same as //go:generate directives
-		(used with the 'go generate' command), but it can be combined with
-		go generate by adding the following to a .go file:
-
-		# runs counterfeiter in generate mode
-		//go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -generate
-
-	example:
-		Add the following to a .go file:
-
-		//counterfeiter:generate . MyInterface
-		//counterfeiter:generate . MyOtherInterface
-		//counterfeiter:generate . MyThirdInterface
-
-		# run counterfeiter
-		counterfeiter -generate
-		# writes "FakeMyInterface" to ./mypackagefakes/fake_my_interface.go
-		# writes "FakeMyOtherInterface" to ./mypackagefakes/fake_my_other_interface.go
-		# writes "FakeMyThirdInterface" to ./mypackagefakes/fake_my_third_interface.go
-
-	-o
-		Path to the file or directory for the generated fakes.
-		This also determines the package name that will be used.
-		By default, the generated fakes will be generated in
-		the package "xyzfakes" which is nested in package "xyz",
-		where "xyz" is the name of referenced package.
-
-	example:
-		# writes "FakeMyInterface" to ./mySpecialFakesDir/specialFake.go
-		counterfeiter -o ./mySpecialFakesDir/specialFake.go ./mypackage MyInterface
-
-		# writes "FakeMyInterface" to ./mySpecialFakesDir/fake_my_interface.go
-		counterfeiter -o ./mySpecialFakesDir ./mypackage MyInterface
-
-	-p
-		Package mode:  When invoked in package mode, counterfeiter
-		will generate an interface and shim implementation from a
-		package in your module.  Counterfeiter finds the public methods
-		in the package  and adds those method signatures
-		to the generated interface .
-
-	example:
-		# generates os.go (interface) and osshim.go (shim) in ${PWD}/osshim
-		counterfeiter -p os
-		# now generate fake in ${PWD}/osshim/os_fake (fake_os.go)
-		go generate osshim/...
-
-	-header
-		Path to the file which should be used as a header for all generated fakes.
-		By default, no special header is used.
-		This is useful to e.g. add a licence header to every fake.
-
-		If the generate mode is used and both the "go:generate" and the
-		"counterfeiter:generate" specify a header file, the header file from the
-		"counterfeiter:generate" line takes precedence.
-
-	example:
-		# having the following code in a package ...
-		//go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -header ./generic.go.txt -generate
-		//counterfeiter:generate -header ./specific.go.txt . MyInterface
-		//counterfeiter:generate . MyOtherInterface
-		//counterfeiter:generate . MyThirdInterface
-
-		# ... generating the fakes ...
-		go generate .
-
-		# writes "FakeMyInterface" with ./specific.go.txt as a header
-		# writes "FakeMyOtherInterface" & "FakeMyThirdInterface" with ./generic.go.txt as a header
-
-	--fake-name
-		Name of the fake struct to generate. By default, 'Fake' will
-		be prepended to the name of the original interface. (ignored in
-		-p mode)
-
-	example:
-		# writes "CoolThing" to ./mypackagefakes/cool_thing.go
-		counterfeiter --fake-name CoolThing ./mypackage MyInterface
-`
diff --git a/vendor/github.com/maxbrunsfeld/counterfeiter/v6/command/runner.go b/vendor/github.com/maxbrunsfeld/counterfeiter/v6/command/runner.go
deleted file mode 100644
index 161fc4b2f4..0000000000
--- a/vendor/github.com/maxbrunsfeld/counterfeiter/v6/command/runner.go
+++ /dev/null
@@ -1,117 +0,0 @@
-package command
-
-import (
-	"fmt"
-	"go/build"
-	"os"
-	"path/filepath"
-	"sort"
-	"strconv"
-	"strings"
-)
-
-func Detect(cwd string, args []string, generateMode bool) ([]Invocation, error) {
-	if generateMode {
-		return generateModeInvocations(cwd)
-	}
-
-	file := os.Getenv("GOFILE")
-	var lineno int
-	if goline, err := strconv.Atoi(os.Getenv("GOLINE")); err == nil {
-		lineno = goline
-	}
-
-	i, err := NewInvocation(file, lineno, args)
-	if err != nil {
-		return nil, err
-	}
-	return []Invocation{i}, nil
-}
-
-type Invocation struct {
-	Args []string
-	Line int
-	File string
-}
-
-func NewInvocation(file string, line int, args []string) (Invocation, error) {
-	if len(args) < 1 {
-		return Invocation{}, fmt.Errorf("%s:%v an invocation of counterfeiter must have arguments", file, line)
-	}
-	i := Invocation{
-		File: file,
-		Line: line,
-		Args: args,
-	}
-	return i, nil
-}
-
-func generateModeInvocations(cwd string) ([]Invocation, error) {
-	var result []Invocation
-	// Find all the go files
-	pkg, err := build.ImportDir(cwd, build.IgnoreVendor)
-	if err != nil {
-		return nil, err
-	}
-
-	gofiles := make([]string, 0, len(pkg.GoFiles)+len(pkg.CgoFiles)+len(pkg.TestGoFiles)+len(pkg.XTestGoFiles))
-	gofiles = append(gofiles, pkg.GoFiles...)
-	gofiles = append(gofiles, pkg.CgoFiles...)
-	gofiles = append(gofiles, pkg.TestGoFiles...)
-	gofiles = append(gofiles, pkg.XTestGoFiles...)
-	sort.Strings(gofiles)
-
-	for _, file := range gofiles {
-		invocations, err := invocationsInFile(cwd, file)
-		if err != nil {
-			return nil, err
-		}
-		result = append(result, invocations...)
-	}
-
-	return result, nil
-}
-
-func invocationsInFile(dir string, file string) ([]Invocation, error) {
-	str, err := os.ReadFile(filepath.Join(dir, file))
-	if err != nil {
-		return nil, err
-	}
-	lines := strings.Split(string(str), "\n")
-
-	var result []Invocation
-	line := 0
-	for i := range lines {
-		line++
-		args, ok := matchForString(lines[i])
-		if !ok {
-			continue
-		}
-		inv, err := NewInvocation(file, line, args)
-		if err != nil {
-			return nil, err
-		}
-
-		result = append(result, inv)
-	}
-
-	return result, nil
-}
-
-const generateDirectivePrefix = "//counterfeiter:generate "
-
-func matchForString(s string) ([]string, bool) {
-	if !strings.HasPrefix(s, generateDirectivePrefix) {
-		return nil, false
-	}
-	return stringToArgs(s[len(generateDirectivePrefix):]), true
-}
-
-func stringToArgs(s string) []string {
-	a := strings.Fields(s)
-	result := []string{
-		"counterfeiter",
-	}
-	result = append(result, a...)
-	return result
-}
diff --git a/vendor/github.com/maxbrunsfeld/counterfeiter/v6/generator/fake.go b/vendor/github.com/maxbrunsfeld/counterfeiter/v6/generator/fake.go
index bf88f18d79..5c2a6fd1ac 100644
--- a/vendor/github.com/maxbrunsfeld/counterfeiter/v6/generator/fake.go
+++ b/vendor/github.com/maxbrunsfeld/counterfeiter/v6/generator/fake.go
@@ -25,19 +25,22 @@ const (
 
 // Fake is used to generate a Fake implementation of an interface.
 type Fake struct {
-	Packages           []*packages.Package
-	Package            *packages.Package
-	Target             *types.TypeName
-	Mode               FakeMode
-	DestinationPackage string
-	Name               string
-	TargetAlias        string
-	TargetName         string
-	TargetPackage      string
-	Imports            Imports
-	Methods            []Method
-	Function           Method
-	Header             string
+	Packages                            []*packages.Package
+	Package                             *packages.Package
+	Target                              *types.TypeName
+	Mode                                FakeMode
+	DestinationPackage                  string
+	Name                                string
+	GenericTypeParametersAndConstraints string
+	GenericTypeParameters               string
+	GenericTypeConstraints              string
+	TargetAlias                         string
+	TargetName                          string
+	TargetPackage                       string
+	Imports                             Imports
+	Methods                             []Method
+	Function                            Method
+	Header                              string
 }
 
 // Method is a method of the interface.
diff --git a/vendor/github.com/maxbrunsfeld/counterfeiter/v6/generator/interface_template.go b/vendor/github.com/maxbrunsfeld/counterfeiter/v6/generator/interface_template.go
index 1a8fde9b46..3be9c1a5c3 100644
--- a/vendor/github.com/maxbrunsfeld/counterfeiter/v6/generator/interface_template.go
+++ b/vendor/github.com/maxbrunsfeld/counterfeiter/v6/generator/interface_template.go
@@ -27,7 +27,7 @@ import (
 	{{- end}}
 )
 
-type {{.Name}} struct {
+type {{.Name}}{{.GenericTypeParametersAndConstraints}} struct {
 	{{- range .Methods}}
 	{{.Name}}Stub func({{.Params.AsArgs}}) {{.Returns.AsReturnSignature}}
 	{{UnExport .Name}}Mutex sync.RWMutex
@@ -54,7 +54,7 @@ type {{.Name}} struct {
 }
 
 {{range .Methods -}}
-func (fake *{{$.Name}}) {{.Name}}({{.Params.AsNamedArgsWithTypes}}) {{.Returns.AsReturnSignature}} {
+func (fake *{{$.Name}}{{$.GenericTypeParameters}}) {{.Name}}({{.Params.AsNamedArgsWithTypes}}) {{.Returns.AsReturnSignature}} {
 	{{- range .Params.Slices}}
 	var {{UnExport .Name}}Copy {{.Type}}
 	if {{UnExport .Name}} != nil {
@@ -90,20 +90,20 @@ func (fake *{{$.Name}}) {{.Name}}({{.Params.AsNamedArgsWithTypes}}) {{.Returns.A
 	{{- end}}
 }
 
-func (fake *{{$.Name}}) {{Title .Name}}CallCount() int {
+func (fake *{{$.Name}}{{$.GenericTypeParameters}}) {{Title .Name}}CallCount() int {
 	fake.{{UnExport .Name}}Mutex.RLock()
 	defer fake.{{UnExport .Name}}Mutex.RUnlock()
 	return len(fake.{{UnExport .Name}}ArgsForCall)
 }
 
-func (fake *{{$.Name}}) {{Title .Name}}Calls(stub func({{.Params.AsArgs}}) {{.Returns.AsReturnSignature}}) {
+func (fake *{{$.Name}}{{$.GenericTypeParameters}}) {{Title .Name}}Calls(stub func({{.Params.AsArgs}}) {{.Returns.AsReturnSignature}}) {
 	fake.{{UnExport .Name}}Mutex.Lock()
 	defer fake.{{UnExport .Name}}Mutex.Unlock()
 	fake.{{.Name}}Stub = stub
 }
 
 {{if .Params.HasLength -}}
-func (fake *{{$.Name}}) {{Title .Name}}ArgsForCall(i int) {{.Params.AsReturnSignature}} {
+func (fake *{{$.Name}}{{$.GenericTypeParameters}}) {{Title .Name}}ArgsForCall(i int) {{.Params.AsReturnSignature}} {
 	fake.{{UnExport .Name}}Mutex.RLock()
 	defer fake.{{UnExport .Name}}Mutex.RUnlock()
 	argsForCall := fake.{{UnExport .Name}}ArgsForCall[i]
@@ -112,7 +112,7 @@ func (fake *{{$.Name}}) {{Title .Name}}ArgsForCall(i int) {{.Params.AsReturnSign
 {{- end}}
 
 {{if .Returns.HasLength -}}
-func (fake *{{$.Name}}) {{Title .Name}}Returns({{.Returns.AsNamedArgsWithTypes}}) {
+func (fake *{{$.Name}}{{$.GenericTypeParameters}}) {{Title .Name}}Returns({{.Returns.AsNamedArgsWithTypes}}) {
 	fake.{{UnExport .Name}}Mutex.Lock()
 	defer fake.{{UnExport .Name}}Mutex.Unlock()
 	fake.{{.Name}}Stub = nil
@@ -123,7 +123,7 @@ func (fake *{{$.Name}}) {{Title .Name}}Returns({{.Returns.AsNamedArgsWithTypes}}
 	}{ {{- .Returns.AsNamedArgs -}} }
 }
 
-func (fake *{{$.Name}}) {{Title .Name}}ReturnsOnCall(i int, {{.Returns.AsNamedArgsWithTypes}}) {
+func (fake *{{$.Name}}{{$.GenericTypeParameters}}) {{Title .Name}}ReturnsOnCall(i int, {{.Returns.AsNamedArgsWithTypes}}) {
 	fake.{{UnExport .Name}}Mutex.Lock()
 	defer fake.{{UnExport .Name}}Mutex.Unlock()
 	fake.{{.Name}}Stub = nil
@@ -144,7 +144,7 @@ func (fake *{{$.Name}}) {{Title .Name}}ReturnsOnCall(i int, {{.Returns.AsNamedAr
 {{end -}}
 {{end}}
 
-func (fake *{{.Name}}) Invocations() map[string][][]interface{} {
+func (fake *{{.Name}}{{$.GenericTypeParameters}}) Invocations() map[string][][]interface{} {
 	fake.invocationsMutex.RLock()
 	defer fake.invocationsMutex.RUnlock()
 	{{- range .Methods}}
@@ -158,7 +158,7 @@ func (fake *{{.Name}}) Invocations() map[string][][]interface{} {
 	return copiedInvocations
 }
 
-func (fake *{{.Name}}) recordInvocation(key string, args []interface{}) {
+func (fake *{{.Name}}{{$.GenericTypeParameters}}) recordInvocation(key string, args []interface{}) {
 	fake.invocationsMutex.Lock()
 	defer fake.invocationsMutex.Unlock()
 	if fake.invocations == nil {
@@ -171,6 +171,6 @@ func (fake *{{.Name}}) recordInvocation(key string, args []interface{}) {
 }
 
 {{if IsExported .TargetName -}}
-var _ {{.TargetAlias}}.{{.TargetName}} = new({{.Name}})
+var _ {{.TargetAlias}}.{{.TargetName}}{{.GenericTypeConstraints}} = new({{.Name}}{{.GenericTypeConstraints}})
 {{- end}}
 `
diff --git a/vendor/github.com/maxbrunsfeld/counterfeiter/v6/generator/loader.go b/vendor/github.com/maxbrunsfeld/counterfeiter/v6/generator/loader.go
index 4a8695b1ed..106ddfbd58 100644
--- a/vendor/github.com/maxbrunsfeld/counterfeiter/v6/generator/loader.go
+++ b/vendor/github.com/maxbrunsfeld/counterfeiter/v6/generator/loader.go
@@ -57,9 +57,34 @@ func (f *Fake) loadPackages(c Cacher, workingDir string) error {
 	return nil
 }
 
+func (f *Fake) getGenericTypeData(typeName *types.TypeName) (paramNames []string, constraintNames []string, paramAndConstraintNames []string, found bool) {
+	if named, ok := typeName.Type().(*types.Named); ok {
+		if _, ok := named.Underlying().(*types.Interface); ok {
+			typeParams := named.TypeParams()
+			if typeParams.Len() > 0 {
+				for i := 0; i < typeParams.Len(); i++ {
+					param := typeParams.At(i)
+					paramName := param.Obj().Name()
+					constraint := param.Constraint()
+					constraintSections := strings.Split(constraint.String(), "/")
+					constraintName := constraintSections[len(constraintSections)-1]
+					paramNames = append(paramNames, paramName)
+					constraintNames = append(constraintNames, constraintName)
+					paramAndConstraintNames = append(paramAndConstraintNames, fmt.Sprintf("%s %s", paramName, constraintName))
+					found = true
+				}
+			}
+		}
+	}
+	return
+}
+
 func (f *Fake) findPackage() error {
 	var target *types.TypeName
 	var pkg *packages.Package
+	genericTypeParametersAndConstraints := []string{}
+	genericTypeConstraints := []string{}
+	genericTypeParameters := []string{}
 	for i := range f.Packages {
 		if f.Packages[i].Types == nil || f.Packages[i].Types.Scope() == nil {
 			continue
@@ -72,6 +97,15 @@ func (f *Fake) findPackage() error {
 		raw := pkg.Types.Scope().Lookup(f.TargetName)
 		if raw != nil {
 			if typeName, ok := raw.(*types.TypeName); ok {
+				if paramNames, constraintNames, paramAndConstraintNames, found := f.getGenericTypeData(typeName); found {
+					genericTypeParameters = append(genericTypeParameters, paramNames...)
+					genericTypeConstraints = append(genericTypeConstraints, constraintNames...)
+					genericTypeParametersAndConstraints = append(
+						genericTypeParametersAndConstraints,
+						paramAndConstraintNames...,
+					)
+				}
+
 				target = typeName
 				break
 			}
@@ -89,6 +123,11 @@ func (f *Fake) findPackage() error {
 	f.Target = target
 	f.Package = pkg
 	f.TargetPackage = imports.VendorlessPath(pkg.PkgPath)
+	if len(genericTypeParameters) > 0 {
+		f.GenericTypeParametersAndConstraints = fmt.Sprintf("[%s]", strings.Join(genericTypeParametersAndConstraints, ", "))
+		f.GenericTypeParameters = fmt.Sprintf("[%s]", strings.Join(genericTypeParameters, ", "))
+		f.GenericTypeConstraints = fmt.Sprintf("[%s]", strings.Join(genericTypeConstraints, ", "))
+	}
 	t := f.Imports.Add(pkg.Name, f.TargetPackage)
 	f.TargetAlias = t.Alias
 	if f.Mode != Package {
@@ -97,7 +136,7 @@ func (f *Fake) findPackage() error {
 
 	if f.Mode == InterfaceOrFunction {
 		if !f.IsInterface() && !f.IsFunction() {
-			return fmt.Errorf("cannot generate an fake for %s because it is not an interface or function", f.TargetName)
+			return fmt.Errorf("cannot generate a fake for %s because it is not an interface or function", f.TargetName)
 		}
 	}
 
@@ -130,14 +169,10 @@ func (f *Fake) addImportsFor(typ types.Type) {
 		f.addImportsFor(t.Elem())
 	case *types.Chan:
 		f.addImportsFor(t.Elem())
+	case *types.Alias:
+		f.addImportsForNamedType(t)
 	case *types.Named:
-		if t.Obj() != nil && t.Obj().Pkg() != nil {
-			typeArgs := t.TypeArgs()
-			for i := 0; i < typeArgs.Len(); i++ {
-				f.addImportsFor(typeArgs.At(i))
-			}
-			f.Imports.Add(t.Obj().Pkg().Name(), t.Obj().Pkg().Path())
-		}
+		f.addImportsForNamedType(t)
 	case *types.Slice:
 		f.addImportsFor(t.Elem())
 	case *types.Array:
@@ -154,3 +189,16 @@ func (f *Fake) addImportsFor(typ types.Type) {
 		log.Printf("!!! WARNING: Missing case for type %s\n", reflect.TypeOf(typ).String())
 	}
 }
+
+func (f *Fake) addImportsForNamedType(t interface {
+	Obj() *types.TypeName
+	TypeArgs() *types.TypeList
+}) {
+	if t.Obj() != nil && t.Obj().Pkg() != nil {
+		typeArgs := t.TypeArgs()
+		for i := 0; i < typeArgs.Len(); i++ {
+			f.addImportsFor(typeArgs.At(i))
+		}
+		f.Imports.Add(t.Obj().Pkg().Name(), t.Obj().Pkg().Path())
+	}
+}
diff --git a/vendor/github.com/maxbrunsfeld/counterfeiter/v6/main.go b/vendor/github.com/maxbrunsfeld/counterfeiter/v6/main.go
deleted file mode 100644
index fcaf995a6f..0000000000
--- a/vendor/github.com/maxbrunsfeld/counterfeiter/v6/main.go
+++ /dev/null
@@ -1,207 +0,0 @@
-package main
-
-import (
-	"errors"
-	"fmt"
-	"go/format"
-	"io"
-	"log"
-	"os"
-	"path/filepath"
-	"runtime/debug"
-	"runtime/pprof"
-
-	"github.com/maxbrunsfeld/counterfeiter/v6/arguments"
-	"github.com/maxbrunsfeld/counterfeiter/v6/command"
-	"github.com/maxbrunsfeld/counterfeiter/v6/generator"
-)
-
-func main() {
-	debug.SetGCPercent(-1)
-
-	if err := run(); err != nil {
-		fail("%v", err)
-	}
-}
-
-func run() error {
-	profile := os.Getenv("COUNTERFEITER_PROFILE") != ""
-	if profile {
-		p, err := filepath.Abs(filepath.Join(".", "counterfeiter.profile"))
-		if err != nil {
-			return err
-		}
-		f, err := os.Create(p)
-		if err != nil {
-			return err
-		}
-		if err := pprof.StartCPUProfile(f); err != nil {
-			return err
-		}
-		fmt.Printf("Profile: %s\n", p)
-		defer pprof.StopCPUProfile()
-	}
-
-	log.SetFlags(log.Lshortfile)
-	if !isDebug() {
-		log.SetOutput(io.Discard)
-	}
-
-	cwd, err := os.Getwd()
-	if err != nil {
-		return errors.New("Error - couldn't determine current working directory")
-	}
-
-	var cache generator.Cacher
-	var headerReader generator.FileReader
-	if disableCache() {
-		cache = &generator.FakeCache{}
-		headerReader = &generator.SimpleFileReader{}
-	} else {
-		cache = &generator.Cache{}
-		headerReader = &generator.CachedFileReader{}
-	}
-	var invocations []command.Invocation
-	var args *arguments.ParsedArguments
-	args, _ = arguments.New(os.Args, cwd, filepath.EvalSymlinks, os.Stat)
-	generateMode := false
-	if args != nil {
-		generateMode = args.GenerateMode
-	}
-	if !generateMode && shouldPrintGenerateWarning() {
-		fmt.Printf("\nWARNING: Invoking counterfeiter multiple times from \"go generate\" is slow.\nConsider using counterfeiter:generate directives to speed things up.\nSee https://github.com/maxbrunsfeld/counterfeiter#step-2b---add-counterfeitergenerate-directives for more information.\nSet the \"COUNTERFEITER_NO_GENERATE_WARNING\" environment variable to suppress this message.\n\n")
-	}
-	invocations, err = command.Detect(cwd, os.Args, generateMode)
-	if err != nil {
-		return err
-	}
-
-	for i := range invocations {
-		a, err := arguments.New(invocations[i].Args, cwd, filepath.EvalSymlinks, os.Stat)
-		if err != nil {
-			return err
-		}
-
-		// If the '//counterfeiter:generate ...' line does not have a '-header'
-		// flag, we use the one from the "global"
-		// '//go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -generate -header /some/header.txt'
-		// line (which defaults to none). By doing so, we can configure the header
-		// once per package, which is probably the most common case for adding
-		// licence headers (i.e. all the fakes will have the same licence headers).
-		a.HeaderFile = or(a.HeaderFile, args.HeaderFile)
-
-		err = generate(cwd, a, cache, headerReader)
-		if err != nil {
-			return err
-		}
-	}
-	return nil
-}
-
-func or(opts ...string) string {
-	for _, s := range opts {
-		if s != "" {
-			return s
-		}
-	}
-	return ""
-}
-
-func isDebug() bool {
-	return os.Getenv("COUNTERFEITER_DEBUG") != ""
-}
-
-func disableCache() bool {
-	return os.Getenv("COUNTERFEITER_DISABLECACHE") != ""
-}
-
-func shouldPrintGenerateWarning() bool {
-	return invokedByGoGenerate() && os.Getenv("COUNTERFEITER_NO_GENERATE_WARNING") == ""
-}
-
-func invokedByGoGenerate() bool {
-	return os.Getenv("DOLLAR") == "$"
-}
-
-func generate(workingDir string, args *arguments.ParsedArguments, cache generator.Cacher, headerReader generator.FileReader) error {
-	if !args.Quiet {
-		if err := reportStarting(workingDir, args.OutputPath, args.FakeImplName); err != nil {
-			return err
-		}
-	}
-
-	b, err := doGenerate(workingDir, args, cache, headerReader)
-	if err != nil {
-		return err
-	}
-
-	if err := printCode(b, args.OutputPath, args.PrintToStdOut); err != nil {
-		return err
-	}
-
-	if !args.Quiet {
-		fmt.Fprint(os.Stderr, "Done\n")
-	}
-
-	return nil
-}
-
-func doGenerate(workingDir string, args *arguments.ParsedArguments, cache generator.Cacher, headerReader generator.FileReader) ([]byte, error) {
-	mode := generator.InterfaceOrFunction
-	if args.GenerateInterfaceAndShimFromPackageDirectory {
-		mode = generator.Package
-	}
-
-	headerContent, err := headerReader.Get(workingDir, args.HeaderFile)
-	if err != nil {
-		return nil, err
-	}
-
-	f, err := generator.NewFake(mode, args.InterfaceName, args.PackagePath, args.FakeImplName, args.DestinationPackageName, headerContent, workingDir, cache)
-	if err != nil {
-		return nil, err
-	}
-	return f.Generate(true)
-}
-
-func printCode(code []byte, outputPath string, printToStdOut bool) error {
-	formattedCode, err := format.Source(code)
-	if err != nil {
-		return err
-	}
-
-	if printToStdOut {
-		fmt.Println(string(formattedCode))
-		return nil
-	}
-	_ = os.MkdirAll(filepath.Dir(outputPath), 0777)
-	file, err := os.Create(outputPath)
-	if err != nil {
-		return fmt.Errorf("Couldn't create fake file - %v", err)
-	}
-
-	_, err = file.Write(formattedCode)
-	if err != nil {
-		return fmt.Errorf("Couldn't write to fake file - %v", err)
-	}
-	return nil
-}
-
-func reportStarting(workingDir string, outputPath, fakeName string) error {
-	rel, err := filepath.Rel(workingDir, outputPath)
-	if err != nil {
-		return err
-	}
-
-	msg := fmt.Sprintf("Writing `%s` to `%s`... ", fakeName, rel)
-	if isDebug() {
-		msg = msg + "\n"
-	}
-	fmt.Fprint(os.Stderr, msg)
-	return nil
-}
-
-func fail(s string, args ...interface{}) {
-	fmt.Printf("\n"+s+"\n", args...)
-	os.Exit(1)
-}
diff --git a/vendor/github.com/nginx/agent/sdk/v2/config_helpers.go b/vendor/github.com/nginx/agent/sdk/v2/config_helpers.go
index ed2595be87..9baa07e828 100644
--- a/vendor/github.com/nginx/agent/sdk/v2/config_helpers.go
+++ b/vendor/github.com/nginx/agent/sdk/v2/config_helpers.go
@@ -125,6 +125,7 @@ func GetNginxConfigWithIgnoreDirectives(
 		},
 	)
 	if err != nil {
+		readLock.Unlock()
 		return nil, fmt.Errorf("error reading config from %s, error: %s", confFile, err)
 	}
 
@@ -144,10 +145,11 @@ func GetNginxConfigWithIgnoreDirectives(
 
 	err = updateNginxConfigFromPayload(confFile, payload, nginxConfig, allowedDirectories)
 	if err != nil {
+		readLock.Unlock()
 		return nil, fmt.Errorf("error assemble payload from %s, error: %s", confFile, err)
 	}
-	readLock.Unlock()
 
+	readLock.Unlock()
 	return nginxConfig, nil
 }
 
diff --git a/vendor/github.com/nginxinc/nginx-go-crossplane/.gitignore b/vendor/github.com/nginxinc/nginx-go-crossplane/.gitignore
index 82c668079f..e8838f9fa9 100644
--- a/vendor/github.com/nginxinc/nginx-go-crossplane/.gitignore
+++ b/vendor/github.com/nginxinc/nginx-go-crossplane/.gitignore
@@ -16,9 +16,6 @@ __pycache__/
 *.out
 coverage.*
 
-# Kubernetes Generated files - skip generated files, except for vendored files
-!vendor/**/zz_generated.*
-
 # editor and IDE paraphernalia
 .idea
 .vscode
diff --git a/vendor/github.com/nginxinc/nginx-go-crossplane/.golangci.yml b/vendor/github.com/nginxinc/nginx-go-crossplane/.golangci.yml
index 7888e9f1a6..593c5b9d06 100644
--- a/vendor/github.com/nginxinc/nginx-go-crossplane/.golangci.yml
+++ b/vendor/github.com/nginxinc/nginx-go-crossplane/.golangci.yml
@@ -40,9 +40,10 @@ linters:
 run:
   # 10 minute timeout for analysis
   timeout: 10m
-  modules-download-mode: vendor
+  modules-download-mode: mod
   skip-dirs-use-default: true
 
+
 # Specific linter settings
 linters-settings:
   gocyclo:
@@ -62,6 +63,9 @@ linters-settings:
     local-prefixes: gitswarm.f5net.com/indigo,gitlab.com/f5
   errcheck:
     ignore: ^Close.*,os:^Setenv.*,fmt:.*,io/ioutil:^Read.*,github.com/spf13/viper:.*,github.com/pkg/errors:^Wrap.*
+  funclen:
+    skip-ifles:
+        - ".*\\.gen\\.go"
 
   lll:
     line-length: 140
diff --git a/vendor/github.com/nginxinc/nginx-go-crossplane/Makefile b/vendor/github.com/nginxinc/nginx-go-crossplane/Makefile
index aada8bcacb..80ee2c08e4 100644
--- a/vendor/github.com/nginxinc/nginx-go-crossplane/Makefile
+++ b/vendor/github.com/nginxinc/nginx-go-crossplane/Makefile
@@ -1,6 +1,5 @@
 PACKAGE           = $(notdir $(patsubst %/,%,$(dir $(realpath $(lastword $(MAKEFILE_LIST))))))
 OUT_DIR          ?= build
-VENDOR_DIR       ?= vendor
 RESULTS_DIR		 ?= results
 DOCKER_REGISTRY  ?= local
 DOCKER_TAG       ?= latest
@@ -25,7 +24,6 @@ deps:
 	go mod download
 	go mod tidy
 	go mod verify
-	go mod vendor
 
 deps-upgrade:
 	GOFLAGS="" go get -u ./...
@@ -36,7 +34,7 @@ deps-upgrade:
 #######################################
 fmt:
 	$(info Running goimports...)
-	@goimports -w -e $$(find . -type f -name '*.go' -not -path "./vendor/*")
+	@goimports -w -e $$(find . -type f -name '*.go')
 
 test:
 	$(info Running unit tests...)
@@ -60,7 +58,7 @@ lint-docker:
 	docker run --rm -v "${PWD}":/app -w /app golangci/golangci-lint:v1.51.2 golangci-lint run
 
 lint-shell:
-	shellcheck -x $$(find . -name "*.sh" -type f -not -path "./vendor/*")
+	shellcheck -x $$(find . -name "*.sh" -type f)
 
 gen:
 	go generate -x ./...
diff --git a/vendor/github.com/nginxinc/nginx-go-crossplane/README.md b/vendor/github.com/nginxinc/nginx-go-crossplane/README.md
index 3f84bce266..e75f02cf44 100644
--- a/vendor/github.com/nginxinc/nginx-go-crossplane/README.md
+++ b/vendor/github.com/nginxinc/nginx-go-crossplane/README.md
@@ -74,7 +74,9 @@ func main() {
 ```
 
 # Generate support for third-party modules
-This is an example that takes the path of a third-party module source code to generate support for it. Assume the source code path of that module is `./src`. You can call `go run cmd/generate/main.go ./src`. The stdout will be like
+This is a simple example that takes the path of a third-party module source code to generate support for it. For detailed usage of the tool, please run
+`go run ./cmd/generate/ --help`.
+Assuming the source code path of that module is `./src`, you can call `go run ./cmd/generate/ --src-path=./src -directive-map-name=directives -match-func-name=Match -match-func-comment=comment`. The output will be similar to:
 
 ```go
 /**
@@ -107,8 +109,7 @@ var directives = map[string][]uint{
     },
 }
 
-// Match is a matchFunc for parsing an NGINX config that contains the
-// preceding directives.
+// comment
 func Match(directive string) ([]uint, bool) {
     m, ok := directives[directive]
     return m, ok
diff --git a/vendor/github.com/nginxinc/nginx-go-crossplane/analyze.go b/vendor/github.com/nginxinc/nginx-go-crossplane/analyze.go
index d453b3d67e..e1127b2da7 100644
--- a/vendor/github.com/nginxinc/nginx-go-crossplane/analyze.go
+++ b/vendor/github.com/nginxinc/nginx-go-crossplane/analyze.go
@@ -7,6 +7,39 @@
 
 package crossplane
 
+// Upgrade for .gen.go files. If you don't have access to some private modules,
+// please use -skip options to skip them. e.g. go generate -skip="nap".
+
+// Update for headersmore
+//go:generate sh -c "sh ./scripts/generate/generate.sh --url https://github.com/openresty/headers-more-nginx-module.git --config-path ./scripts/generate/configs/headersmore_config.json > ./analyze_headersMore_directives.gen.go"
+
+// Update for njs
+//go:generate sh -c "sh ./scripts/generate/generate.sh --url https://github.com/nginx/njs.git --config-path ./scripts/generate/configs/njs_config.json > ./analyze_njs_directives.gen.go"
+
+// Update for OSS, filter in config is the directives not in https://nginx.org/en/docs/dirindex.html but in source code.
+// Override in config is for the "if" directive. We create a bitmask ngxConfExpr for it in crossplane, which is not in source code.
+//go:generate sh -c "sh ./scripts/generate/generate.sh --url https://github.com/nginx/nginx.git --config-path ./scripts/generate/configs/oss_latest_config.json > ./analyze_oss_latest_directives.gen.go"
+//go:generate sh -c "sh ./scripts/generate/generate.sh --url https://github.com/nginx/nginx.git --config-path ./scripts/generate/configs/oss_126_config.json --branch branches/stable-1.26 > ./analyze_oss_126_directives.gen.go"
+//go:generate sh -c "sh ./scripts/generate/generate.sh --url https://github.com/nginx/nginx.git --config-path ./scripts/generate/configs/oss_124_config.json --branch branches/stable-1.24 > ./analyze_oss_124_directives.gen.go"
+
+// Update for lua, override is for the lua block directives, see https://github.com/nginxinc/nginx-go-crossplane/pull/86.
+//go:generate sh -c "sh ./scripts/generate/generate.sh --url https://github.com/openresty/lua-nginx-module.git --config-path ./scripts/generate/configs/lua_config.json  --path ./src > ./analyze_lua_directives.gen.go"
+
+// Update for otel. Filter is for some directives withou context.
+// Otel provides its own config handler for some directives and they don't have context. Currently we don't support them.
+//go:generate sh -c "sh ./scripts/generate/generate.sh --url https://github.com/nginxinc/nginx-otel.git --config-path ./scripts/generate/configs/otel_config.json --branch main > ./analyze_otel_directives.gen.go"
+
+// Update for NAP v4 and v5.
+// NAP is a private module. Please ensure you have correct access and put the url.
+// and branch of it in environment variable NAP_URL, NAP_V4_BRANCH, and NAP_V5_BRANCH.
+// Override is for flag dirctives. NAP used ngxConfTake1 for flag directives, we change them to ngxConfFlag in crossplane.
+// NAP v4
+//go:generate sh -c "sh ./scripts/generate/generate.sh --url $NAP_URL --config-path ./scripts/generate/configs/nap_v4_config.json --branch $NAP_V4_BRANCH --path ./src > analyze_appProtectWAFv4_directives.gen.go"
+// NAP v5
+//go:generate sh -c "sh ./scripts/generate/generate.sh --url $NAP_URL --config-path ./scripts/generate/configs/nap_v5_config.json --branch $NAP_V5_BRANCH --path ./src > analyze_appProtectWAFv5_directives.gen.go"
+
+// Update for geoip2
+//go:generate sh -c "sh ./scripts/generate/generate.sh --url https://github.com/leev/ngx_http_geoip2_module.git --config-path ./scripts/generate/configs/geoip2_config.json > ./analyze_geoip2_directives.gen.go"
 import (
 	"fmt"
 )
@@ -219,7 +252,7 @@ func unionBitmaskMaps(maps ...map[string][]uint) map[string][]uint {
 // not provided. It is union of latest Nplus, Njs, and Otel.
 //
 //nolint:gochecknoglobals
-var defaultDirectives = unionBitmaskMaps(ngxPlusLatestDirectives, moduleNjsDirectives, moduleOtelDirectives)
+var defaultDirectives = unionBitmaskMaps(nginxPlusLatestDirectives, njsDirectives, otelDirectives)
 
 func DefaultDirectivesMatchFunc(directive string) ([]uint, bool) {
 	masks, matched := defaultDirectives[directive]
diff --git a/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_appProtectWAFv4_directives.gen.go b/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_appProtectWAFv4_directives.gen.go
new file mode 100644
index 0000000000..c639b73fb4
--- /dev/null
+++ b/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_appProtectWAFv4_directives.gen.go
@@ -0,0 +1,88 @@
+/**
+ * Copyright (c) F5, Inc.
+ *
+ * This source code is licensed under the Apache License, Version 2.0 license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+// Code generated by generator; DO NOT EDIT.
+// All the definitions are extracted from the source code
+// Each bit mask describes these behaviors:
+//   - how many arguments the directive can take
+//   - whether or not it is a block directive
+//   - whether this is a flag (takes one argument that's either "on" or "off")
+//   - which contexts it's allowed to be in
+
+package crossplane
+
+var appProtectWAFv4Directives = map[string][]uint{
+    "app_protect_app_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "app_protect_compressed_requests_action": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_config_set_timeout": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_cookie_seed": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_cpu_thresholds": {
+        ngxHTTPMainConf | ngxConfTake2,
+    },
+    "app_protect_custom_log_attribute": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "app_protect_enable": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "app_protect_enforcer_address": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_enforcer_memory_limit_mb": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_failure_mode_action": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_global_settings": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_logging_str": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "app_protect_physical_memory_util_thresholds": {
+        ngxHTTPMainConf | ngxConfTake2,
+    },
+    "app_protect_policy_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "app_protect_reconnect_period_seconds": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_request_buffer_overflow_action": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_response_enforcement_disable": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_security_log": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "app_protect_security_log_enable": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "app_protect_streaming_buffer_watermarks": {
+        ngxHTTPMainConf | ngxConfTake2,
+    },
+    "app_protect_user_defined_signatures": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+}
+
+// MatchAppProtectWAFv4 is a MatchFunc for App Protect v4 module.
+func MatchAppProtectWAFv4(directive string) ([]uint, bool) {
+    m, ok := appProtectWAFv4Directives[directive]
+    return m, ok
+}
diff --git a/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_appProtectWAFv4_directives.go b/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_appProtectWAFv4_directives.go
deleted file mode 100644
index 4ef764f6f9..0000000000
--- a/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_appProtectWAFv4_directives.go
+++ /dev/null
@@ -1,51 +0,0 @@
-package crossplane
-
-// nginx app protect specific and global directives, inferred from
-// [https://docs.nginx.com/nginx-app-protect/configuration-guide/configuration/#directives]
-
-//nolint:gochecknoglobals
-var appProtectWAFv4Directives = map[string][]uint{
-	"app_protect_compressed_requests_action": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"app_protect_cookie_seed": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"app_protect_cpu_thresholds": {
-		ngxHTTPMainConf | ngxConfTake2,
-	},
-	"app_protect_enable": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"app_protect_failure_mode_action": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"app_protect_physical_memory_util_thresholds": {
-		ngxHTTPMainConf | ngxConfTake2,
-	},
-	"app_protect_policy_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"app_protect_reconnect_period_seconds": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"app_protect_request_buffer_overflow_action": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"app_protect_security_log_enable": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"app_protect_security_log": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"app_protect_user_defined_signatures": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-}
-
-// AppProtectWAFv4DirectivesMatchFn is a match function for parsing an NGINX config that contains the
-// App Protect v4 module.
-func AppProtectWAFv4DirectivesMatchFn(directive string) ([]uint, bool) {
-	masks, matched := appProtectWAFv4Directives[directive]
-	return masks, matched
-}
diff --git a/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_appProtectWAFv5_directives.gen.go b/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_appProtectWAFv5_directives.gen.go
new file mode 100644
index 0000000000..4601a25a1e
--- /dev/null
+++ b/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_appProtectWAFv5_directives.gen.go
@@ -0,0 +1,88 @@
+/**
+ * Copyright (c) F5, Inc.
+ *
+ * This source code is licensed under the Apache License, Version 2.0 license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+// Code generated by generator; DO NOT EDIT.
+// All the definitions are extracted from the source code
+// Each bit mask describes these behaviors:
+//   - how many arguments the directive can take
+//   - whether or not it is a block directive
+//   - whether this is a flag (takes one argument that's either "on" or "off")
+//   - which contexts it's allowed to be in
+
+package crossplane
+
+var appProtectWAFv5Directives = map[string][]uint{
+    "app_protect_app_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "app_protect_compressed_requests_action": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_config_set_timeout": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_cookie_seed": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_cpu_thresholds": {
+        ngxHTTPMainConf | ngxConfTake2,
+    },
+    "app_protect_custom_log_attribute": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "app_protect_enable": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "app_protect_enforcer_address": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_enforcer_memory_limit_mb": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_failure_mode_action": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_global_settings": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_logging_str": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "app_protect_physical_memory_util_thresholds": {
+        ngxHTTPMainConf | ngxConfTake2,
+    },
+    "app_protect_policy_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "app_protect_reconnect_period_seconds": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_request_buffer_overflow_action": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_response_enforcement_disable": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "app_protect_security_log": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "app_protect_security_log_enable": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "app_protect_streaming_buffer_watermarks": {
+        ngxHTTPMainConf | ngxConfTake2,
+    },
+    "app_protect_user_defined_signatures": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+}
+
+// MatchAppProtectWAFv5 is a MatchFunc for App Protect v5 module.
+func MatchAppProtectWAFv5(directive string) ([]uint, bool) {
+    m, ok := appProtectWAFv5Directives[directive]
+    return m, ok
+}
diff --git a/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_appProtectWAFv5_directives.go b/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_appProtectWAFv5_directives.go
deleted file mode 100644
index bba7faa142..0000000000
--- a/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_appProtectWAFv5_directives.go
+++ /dev/null
@@ -1,51 +0,0 @@
-package crossplane
-
-// nginx app protect specific and global directives, inferred from
-// [https://docs.nginx.com/nginx-app-protect/configuration-guide/configuration/#directives]
-
-//nolint:gochecknoglobals
-var appProtectWAFv5Directives = map[string][]uint{
-	"app_protect_physical_memory_util_thresholds": {
-		ngxHTTPMainConf | ngxConfTake2,
-	},
-	"app_protect_cpu_thresholds": {
-		ngxHTTPMainConf | ngxConfTake2,
-	},
-	"app_protect_failure_mode_action": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"app_protect_cookie_seed": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"app_protect_request_buffer_overflow_action": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"app_protect_reconnect_period_seconds": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"app_protect_enforcer_address": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"app_protect_enable": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"app_protect_policy_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"app_protect_security_log_enable": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"app_protect_security_log": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"app_protect_custom_log_attribute": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-}
-
-// AppProtectWAFv5DirectivesMatchFn is a match function for parsing an NGINX config that contains the
-// App Protect v5 module.
-func AppProtectWAFv5DirectivesMatchFn(directive string) ([]uint, bool) {
-	masks, matched := appProtectWAFv5Directives[directive]
-	return masks, matched
-}
diff --git a/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_geoip2_directives.gen.go b/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_geoip2_directives.gen.go
new file mode 100644
index 0000000000..998d61a948
--- /dev/null
+++ b/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_geoip2_directives.gen.go
@@ -0,0 +1,35 @@
+/**
+ * Copyright (c) F5, Inc.
+ *
+ * This source code is licensed under the Apache License, Version 2.0 license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+// Code generated by generator; DO NOT EDIT.
+// All the definitions are extracted from the source code
+// Each bit mask describes these behaviors:
+//   - how many arguments the directive can take
+//   - whether or not it is a block directive
+//   - whether this is a flag (takes one argument that's either "on" or "off")
+//   - which contexts it's allowed to be in
+
+package crossplane
+
+var geoip2Directives = map[string][]uint{
+    "geoip2": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfTake1,
+        ngxStreamMainConf | ngxConfBlock | ngxConfTake1,
+    },
+    "geoip2_proxy": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "geoip2_proxy_recursive": {
+        ngxHTTPMainConf | ngxConfFlag,
+    },
+}
+
+// MatchGeoip2Latest is a MatchFunc for the latest version of geoip2.
+func MatchGeoip2Latest(directive string) ([]uint, bool) {
+    m, ok := geoip2Directives[directive]
+    return m, ok
+}
diff --git a/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_headersMore_directives.gen.go b/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_headersMore_directives.gen.go
new file mode 100644
index 0000000000..462a81bd82
--- /dev/null
+++ b/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_headersMore_directives.gen.go
@@ -0,0 +1,37 @@
+/**
+ * Copyright (c) F5, Inc.
+ *
+ * This source code is licensed under the Apache License, Version 2.0 license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+// Code generated by generator; DO NOT EDIT.
+// All the definitions are extracted from the source code
+// Each bit mask describes these behaviors:
+//   - how many arguments the directive can take
+//   - whether or not it is a block directive
+//   - whether this is a flag (takes one argument that's either "on" or "off")
+//   - which contexts it's allowed to be in
+
+package crossplane
+
+var headersMoreDirectives = map[string][]uint{
+    "more_clear_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf1More,
+    },
+    "more_clear_input_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf1More,
+    },
+    "more_set_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf1More,
+    },
+    "more_set_input_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf1More,
+    },
+}
+
+// MatchHeadersMoreLatest is a MatchFunc for the latest version of headersmore.
+func MatchHeadersMoreLatest(directive string) ([]uint, bool) {
+    m, ok := headersMoreDirectives[directive]
+    return m, ok
+}
diff --git a/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_headersMore_directives.go b/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_headersMore_directives.go
deleted file mode 100644
index d32558dfb9..0000000000
--- a/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_headersMore_directives.go
+++ /dev/null
@@ -1,36 +0,0 @@
-/**
- * Copyright (c) F5, Inc.
- *
- * This source code is licensed under the Apache License, Version 2.0 license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-// All the definitions are extracted from the source code
-// Each bit mask describes these behaviors:
-//   - how many arguments the directive can take
-//   - whether or not it is a block directive
-//   - whether this is a flag (takes one argument that's either "on" or "off")
-//   - which contexts it's allowed to be in
-
-package crossplane
-
-//nolint:gochecknoglobals
-var moduleHeadersMoreDirectives = map[string][]uint{
-	"more_clear_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf1More,
-	},
-	"more_clear_input_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf1More,
-	},
-	"more_set_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf1More,
-	},
-	"more_set_input_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf1More,
-	},
-}
-
-func HeadersMoreDirectivesMatchFn(directive string) ([]uint, bool) {
-	masks, matched := moduleHeadersMoreDirectives[directive]
-	return masks, matched
-}
diff --git a/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_lua_directives.gen.go b/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_lua_directives.gen.go
new file mode 100644
index 0000000000..d30e0b29d1
--- /dev/null
+++ b/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_lua_directives.gen.go
@@ -0,0 +1,262 @@
+/**
+ * Copyright (c) F5, Inc.
+ *
+ * This source code is licensed under the Apache License, Version 2.0 license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+// Code generated by generator; DO NOT EDIT.
+// All the definitions are extracted from the source code
+// Each bit mask describes these behaviors:
+//   - how many arguments the directive can take
+//   - whether or not it is a block directive
+//   - whether this is a flag (takes one argument that's either "on" or "off")
+//   - which contexts it's allowed to be in
+
+package crossplane
+
+var luaDirectives = map[string][]uint{
+    "access_by_lua": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "access_by_lua_block": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "access_by_lua_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "access_by_lua_no_postpone": {
+        ngxHTTPMainConf | ngxConfFlag,
+    },
+    "balancer_by_lua_block": {
+        ngxHTTPUpsConf | ngxConfTake1,
+    },
+    "balancer_by_lua_file": {
+        ngxHTTPUpsConf | ngxConfTake1,
+    },
+    "balancer_keepalive": {
+        ngxHTTPUpsConf | ngxConfTake1,
+    },
+    "body_filter_by_lua": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "body_filter_by_lua_block": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "body_filter_by_lua_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "content_by_lua": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "content_by_lua_block": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "content_by_lua_file": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "exit_worker_by_lua_block": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "exit_worker_by_lua_file": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "header_filter_by_lua": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "header_filter_by_lua_block": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "header_filter_by_lua_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "init_by_lua": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "init_by_lua_block": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "init_by_lua_file": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "init_worker_by_lua": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "init_worker_by_lua_block": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "init_worker_by_lua_file": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "log_by_lua": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "log_by_lua_block": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "log_by_lua_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "lua_capture_error_log": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "lua_check_client_abort": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "lua_code_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "lua_http10_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "lua_load_resty_core": {
+        ngxHTTPMainConf | ngxConfFlag,
+    },
+    "lua_malloc_trim": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "lua_max_pending_timers": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "lua_max_running_timers": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "lua_need_request_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "lua_package_cpath": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "lua_package_path": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "lua_regex_cache_max_entries": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "lua_regex_match_limit": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "lua_sa_restart": {
+        ngxHTTPMainConf | ngxConfFlag,
+    },
+    "lua_shared_dict": {
+        ngxHTTPMainConf | ngxConfTake2,
+    },
+    "lua_socket_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "lua_socket_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "lua_socket_keepalive_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "lua_socket_log_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "lua_socket_pool_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "lua_socket_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "lua_socket_send_lowat": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "lua_socket_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "lua_ssl_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "lua_ssl_certificate_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "lua_ssl_ciphers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "lua_ssl_conf_command": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "lua_ssl_crl": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "lua_ssl_protocols": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "lua_ssl_trusted_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "lua_ssl_verify_depth": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "lua_thread_cache_max_entries": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "lua_transform_underscores_in_response_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "lua_use_default_type": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "lua_worker_thread_vm_pool_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "rewrite_by_lua": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "rewrite_by_lua_block": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "rewrite_by_lua_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "rewrite_by_lua_no_postpone": {
+        ngxHTTPMainConf | ngxConfFlag,
+    },
+    "server_rewrite_by_lua_block": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "server_rewrite_by_lua_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "set_by_lua": {
+        ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf2More,
+    },
+    "set_by_lua_block": {
+        ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake2,
+    },
+    "set_by_lua_file": {
+        ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf2More,
+    },
+    "ssl_certificate_by_lua_block": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_certificate_by_lua_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_client_hello_by_lua_block": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_client_hello_by_lua_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_session_fetch_by_lua_block": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "ssl_session_fetch_by_lua_file": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "ssl_session_store_by_lua_block": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "ssl_session_store_by_lua_file": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+}
+
+// MatchLuaLatest is a MatchFunc for latest version of Lua.
+func MatchLuaLatest(directive string) ([]uint, bool) {
+    m, ok := luaDirectives[directive]
+    return m, ok
+}
diff --git a/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_lua_directives.go b/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_lua_directives.go
deleted file mode 100644
index 5008baaf4c..0000000000
--- a/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_lua_directives.go
+++ /dev/null
@@ -1,261 +0,0 @@
-/**
- * Copyright (c) F5, Inc.
- *
- * This source code is licensed under the Apache License, Version 2.0 license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-// All the definitions are extracted from the source code
-// Each bit mask describes these behaviors:
-//   - how many arguments the directive can take
-//   - whether or not it is a block directive
-//   - whether this is a flag (takes one argument that's either "on" or "off")
-//   - which contexts it's allowed to be in
-
-package crossplane
-
-//nolint:gochecknoglobals
-var moduleLuaDirectives = map[string][]uint{
-	"access_by_lua": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"access_by_lua_block": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"access_by_lua_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"access_by_lua_no_postpone": {
-		ngxHTTPMainConf | ngxConfFlag,
-	},
-	"balancer_by_lua_block": {
-		ngxHTTPUpsConf | ngxConfTake1,
-	},
-	"balancer_by_lua_file": {
-		ngxHTTPUpsConf | ngxConfTake1,
-	},
-	"body_filter_by_lua": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"body_filter_by_lua_block": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"body_filter_by_lua_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"content_by_lua": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"content_by_lua_block": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"content_by_lua_file": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"exit_worker_by_lua_block": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"exit_worker_by_lua_file": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"header_filter_by_lua": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"header_filter_by_lua_block": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"header_filter_by_lua_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"init_by_lua": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"init_by_lua_block": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"init_by_lua_file": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"init_worker_by_lua": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"init_worker_by_lua_block": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"init_worker_by_lua_file": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"log_by_lua": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"log_by_lua_block": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"log_by_lua_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"lua_capture_error_log": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"lua_check_client_abort": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"lua_code_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"lua_fake_shm": {
-		ngxHTTPMainConf | ngxConfTake2,
-	},
-	"lua_http10_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"lua_load_resty_core": {
-		ngxHTTPMainConf | ngxConfFlag,
-	},
-	"lua_malloc_trim": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"lua_max_pending_timers": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"lua_max_running_timers": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"lua_need_request_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"lua_package_cpath": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"lua_package_path": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"lua_regex_cache_max_entries": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"lua_regex_match_limit": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"lua_sa_restart": {
-		ngxHTTPMainConf | ngxConfFlag,
-	},
-	"lua_shared_dict": {
-		ngxHTTPMainConf | ngxConfTake2,
-	},
-	"lua_socket_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"lua_socket_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"lua_socket_keepalive_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"lua_socket_log_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"lua_socket_pool_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"lua_socket_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"lua_socket_send_lowat": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"lua_socket_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"lua_ssl_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"lua_ssl_certificate_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"lua_ssl_ciphers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"lua_ssl_conf_command": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"lua_ssl_crl": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"lua_ssl_protocols": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"lua_ssl_trusted_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"lua_ssl_verify_depth": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"lua_thread_cache_max_entries": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"lua_transform_underscores_in_response_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"lua_use_default_type": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"lua_worker_thread_vm_pool_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"rewrite_by_lua": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"rewrite_by_lua_block": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"rewrite_by_lua_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"rewrite_by_lua_no_postpone": {
-		ngxHTTPMainConf | ngxConfFlag,
-	},
-	"server_rewrite_by_lua_block": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"server_rewrite_by_lua_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"set_by_lua": {
-		ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf2More,
-	},
-	"set_by_lua_block": {
-		ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake2,
-	},
-	"set_by_lua_file": {
-		ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf2More,
-	},
-	"ssl_certificate_by_lua_block": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_certificate_by_lua_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_client_hello_by_lua_block": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_client_hello_by_lua_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_session_fetch_by_lua_block": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"ssl_session_fetch_by_lua_file": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"ssl_session_store_by_lua_block": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"ssl_session_store_by_lua_file": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-}
-
-func LuaDirectivesMatchFn(directive string) ([]uint, bool) {
-	masks, matched := moduleLuaDirectives[directive]
-	return masks, matched
-}
diff --git a/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_map.go b/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_map.go
index 731f3640f2..e0570e4721 100644
--- a/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_map.go
+++ b/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_map.go
@@ -39,6 +39,7 @@ var mapBodies = map[string]mapParameterMasks{
 		defaultMasks: ngxConfTake1,
 	},
 	"geoip2": {
+		specialParameterMasks: map[string]uint{"auto_reload": ngxConfTake1},
 		defaultMasks: ngxConf1More,
 	},
 	"otel_exporter": {
diff --git a/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_njs_directives.gen.go b/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_njs_directives.gen.go
new file mode 100644
index 0000000000..3e0f9e047a
--- /dev/null
+++ b/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_njs_directives.gen.go
@@ -0,0 +1,103 @@
+/**
+ * Copyright (c) F5, Inc.
+ *
+ * This source code is licensed under the Apache License, Version 2.0 license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+// Code generated by generator; DO NOT EDIT.
+// All the definitions are extracted from the source code
+// Each bit mask describes these behaviors:
+//   - how many arguments the directive can take
+//   - whether or not it is a block directive
+//   - whether this is a flag (takes one argument that's either "on" or "off")
+//   - which contexts it's allowed to be in
+
+package crossplane
+
+var njsDirectives = map[string][]uint{
+    "js_access": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "js_body_filter": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConfTake12,
+    },
+    "js_content": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConfTake1,
+    },
+    "js_fetch_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "js_fetch_ciphers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "js_fetch_max_response_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "js_fetch_protocols": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "js_fetch_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "js_fetch_trusted_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "js_fetch_verify": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "js_fetch_verify_depth": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "js_filter": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "js_header_filter": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConfTake1,
+    },
+    "js_import": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake13,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake13,
+    },
+    "js_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "js_periodic": {
+        ngxHTTPLocConf | ngxConfAny,
+        ngxStreamSrvConf | ngxConfAny,
+    },
+    "js_preload_object": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake13,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake13,
+    },
+    "js_preread": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "js_set": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
+    },
+    "js_shared_dict_zone": {
+        ngxHTTPMainConf | ngxConf1More,
+        ngxStreamMainConf | ngxConf1More,
+    },
+    "js_var": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12,
+    },
+}
+
+// MatchNjsLatest is a MatchFunc for the latest version of njs.
+func MatchNjsLatest(directive string) ([]uint, bool) {
+    m, ok := njsDirectives[directive]
+    return m, ok
+}
diff --git a/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_njs_directives.go b/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_njs_directives.go
deleted file mode 100644
index 414aee1cb0..0000000000
--- a/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_njs_directives.go
+++ /dev/null
@@ -1,102 +0,0 @@
-/**
- * Copyright (c) F5, Inc.
- *
- * This source code is licensed under the Apache License, Version 2.0 license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-// All the definitions are extracted from the source code
-// Each bit mask describes these behaviors:
-//   - how many arguments the directive can take
-//   - whether or not it is a block directive
-//   - whether this is a flag (takes one argument that's either "on" or "off")
-//   - which contexts it's allowed to be in
-
-package crossplane
-
-//nolint:gochecknoglobals
-var moduleNjsDirectives = map[string][]uint{
-	"js_access": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"js_body_filter": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConfTake12,
-	},
-	"js_content": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConfTake1,
-	},
-	"js_fetch_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"js_fetch_ciphers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"js_fetch_max_response_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"js_fetch_protocols": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"js_fetch_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"js_fetch_trusted_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"js_fetch_verify": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"js_fetch_verify_depth": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"js_filter": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"js_header_filter": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConfTake1,
-	},
-	"js_import": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake13,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake13,
-	},
-	"js_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"js_periodic": {
-		ngxHTTPLocConf | ngxConfAny,
-		ngxStreamSrvConf | ngxConfAny,
-	},
-	"js_preload_object": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake13,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake13,
-	},
-	"js_preread": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"js_set": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
-	},
-	"js_shared_dict_zone": {
-		ngxHTTPMainConf | ngxConf1More,
-		ngxStreamMainConf | ngxConf1More,
-	},
-	"js_var": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12,
-	},
-}
-
-func NjsDirectivesMatchFn(directive string) ([]uint, bool) {
-	masks, matched := moduleNjsDirectives[directive]
-	return masks, matched
-}
diff --git a/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_nplus_R30_directives.go b/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_nplus_R30_directives.go
index 8ed60cd4f3..e06a42a9e1 100644
--- a/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_nplus_R30_directives.go
+++ b/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_nplus_R30_directives.go
@@ -15,7 +15,7 @@
 package crossplane
 
 //nolint:gochecknoglobals
-var ngxPlusR30Directives = map[string][]uint{
+var nginxPlusR30Directives = map[string][]uint{
 	"absolute_redirect": {
 		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
 	},
@@ -2106,7 +2106,7 @@ var ngxPlusR30Directives = map[string][]uint{
 	},
 }
 
-func NgxPlusR30DirectivesMatchFn(directive string) ([]uint, bool) {
-	masks, matched := ngxPlusR30Directives[directive]
+func MatchNginxPlusR30(directive string) ([]uint, bool) {
+	masks, matched := nginxPlusR30Directives[directive]
 	return masks, matched
 }
diff --git a/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_nplus_R31_directives.go b/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_nplus_R31_directives.go
index 1fa3960e03..13d31ef47e 100644
--- a/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_nplus_R31_directives.go
+++ b/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_nplus_R31_directives.go
@@ -15,7 +15,7 @@
 package crossplane
 
 //nolint:gochecknoglobals
-var ngxPlusR31Directives = map[string][]uint{
+var nginxPlusR31Directives = map[string][]uint{
 	"absolute_redirect": {
 		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
 	},
@@ -2144,7 +2144,7 @@ var ngxPlusR31Directives = map[string][]uint{
 	},
 }
 
-func NgxPlusR31DirectivesMatchFn(directive string) ([]uint, bool) {
-	masks, matched := ngxPlusR31Directives[directive]
+func MatchNginxPlusR31(directive string) ([]uint, bool) {
+	masks, matched := nginxPlusR31Directives[directive]
 	return masks, matched
 }
diff --git a/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_nplus_latest_directives.go b/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_nplus_latest_directives.go
index 66cec3bc0b..7434823698 100644
--- a/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_nplus_latest_directives.go
+++ b/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_nplus_latest_directives.go
@@ -15,7 +15,7 @@
 package crossplane
 
 //nolint:gochecknoglobals
-var ngxPlusLatestDirectives = map[string][]uint{
+var nginxPlusLatestDirectives = map[string][]uint{
 	"absolute_redirect": {
 		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
 	},
@@ -2151,7 +2151,7 @@ var ngxPlusLatestDirectives = map[string][]uint{
 	},
 }
 
-func NgxPlusLatestDirectivesMatchFn(directive string) ([]uint, bool) {
-	masks, matched := ngxPlusLatestDirectives[directive]
+func MatchNginxPlusLatest(directive string) ([]uint, bool) {
+	masks, matched := nginxPlusLatestDirectives[directive]
 	return masks, matched
 }
diff --git a/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_124_directives.gen.go b/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_124_directives.gen.go
new file mode 100644
index 0000000000..2e2b8da4dd
--- /dev/null
+++ b/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_124_directives.gen.go
@@ -0,0 +1,1874 @@
+/**
+ * Copyright (c) F5, Inc.
+ *
+ * This source code is licensed under the Apache License, Version 2.0 license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+// Code generated by generator; DO NOT EDIT.
+// All the definitions are extracted from the source code
+// Each bit mask describes these behaviors:
+//   - how many arguments the directive can take
+//   - whether or not it is a block directive
+//   - whether this is a flag (takes one argument that's either "on" or "off")
+//   - which contexts it's allowed to be in
+
+package crossplane
+
+var oss124Directives = map[string][]uint{
+    "absolute_redirect": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "accept_mutex": {
+        ngxEventConf | ngxConfFlag,
+    },
+    "accept_mutex_delay": {
+        ngxEventConf | ngxConfTake1,
+    },
+    "access_log": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "add_after_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "add_before_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "add_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23,
+    },
+    "add_trailer": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23,
+    },
+    "addition_types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "aio": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "aio_write": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "alias": {
+        ngxHTTPLocConf | ngxConfTake1,
+    },
+    "allow": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ancient_browser": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "ancient_browser_value": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "auth_basic": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
+    },
+    "auth_basic_user_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
+    },
+    "auth_delay": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "auth_http": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "auth_http_header": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake2,
+    },
+    "auth_http_pass_client_cert": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+    },
+    "auth_http_timeout": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "auth_request": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "auth_request_set": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "autoindex": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "autoindex_exact_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "autoindex_format": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "autoindex_localtime": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "break": {
+        ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfNoArgs,
+    },
+    "charset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "charset_map": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfTake2,
+    },
+    "charset_types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "chunked_transfer_encoding": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "client_body_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "client_body_in_file_only": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "client_body_in_single_buffer": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "client_body_temp_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+    },
+    "client_body_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "client_header_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "client_header_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "client_max_body_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "connection_pool_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "create_full_put_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "daemon": {
+        ngxMainConf | ngxDirectConf | ngxConfFlag,
+    },
+    "dav_access": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "dav_methods": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "debug_connection": {
+        ngxEventConf | ngxConfTake1,
+    },
+    "debug_points": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "default_type": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "deny": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "directio": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "directio_alignment": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "disable_symlinks": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "empty_gif": {
+        ngxHTTPLocConf | ngxConfNoArgs,
+    },
+    "env": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "error_log": {
+        ngxMainConf | ngxConf1More,
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "error_page": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf2More,
+    },
+    "etag": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "events": {
+        ngxMainConf | ngxConfBlock | ngxConfNoArgs,
+    },
+    "expires": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake12,
+    },
+    "fastcgi_bind": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "fastcgi_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "fastcgi_busy_buffers_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache_background_update": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_cache_bypass": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_cache_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache_lock": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_cache_lock_age": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache_lock_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache_max_range_offset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache_methods": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_cache_min_uses": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache_path": {
+        ngxHTTPMainConf | ngxConf2More,
+    },
+    "fastcgi_cache_revalidate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_cache_use_stale": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_cache_valid": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_catch_stderr": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_force_ranges": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_hide_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_ignore_client_abort": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_ignore_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_index": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_intercept_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_keep_conn": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_limit_rate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_max_temp_file_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_next_upstream": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_next_upstream_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_next_upstream_tries": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_no_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_param": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23,
+    },
+    "fastcgi_pass": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "fastcgi_pass_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_pass_request_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_pass_request_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_request_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_send_lowat": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_socket_keepalive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_split_path_info": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_store": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_store_access": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "fastcgi_temp_file_write_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_temp_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+    },
+    "flv": {
+        ngxHTTPLocConf | ngxConfNoArgs,
+    },
+    "geo": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfTake12,
+        ngxStreamMainConf | ngxConfBlock | ngxConfTake12,
+    },
+    "geoip_city": {
+        ngxHTTPMainConf | ngxConfTake12,
+        ngxStreamMainConf | ngxConfTake12,
+    },
+    "geoip_country": {
+        ngxHTTPMainConf | ngxConfTake12,
+        ngxStreamMainConf | ngxConfTake12,
+    },
+    "geoip_org": {
+        ngxHTTPMainConf | ngxConfTake12,
+        ngxStreamMainConf | ngxConfTake12,
+    },
+    "geoip_proxy": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "geoip_proxy_recursive": {
+        ngxHTTPMainConf | ngxConfFlag,
+    },
+    "google_perftools_profiles": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "grpc_bind": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "grpc_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_hide_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ignore_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "grpc_intercept_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "grpc_next_upstream": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "grpc_next_upstream_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_next_upstream_tries": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_pass": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "grpc_pass_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_set_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "grpc_socket_keepalive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "grpc_ssl_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_certificate_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_ciphers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_conf_command": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "grpc_ssl_crl": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_password_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_protocols": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "grpc_ssl_server_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "grpc_ssl_session_reuse": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "grpc_ssl_trusted_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_verify": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "grpc_ssl_verify_depth": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "gunzip": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "gunzip_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "gzip": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "gzip_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "gzip_comp_level": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "gzip_disable": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "gzip_http_version": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "gzip_min_length": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "gzip_proxied": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "gzip_static": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "gzip_types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "gzip_vary": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "hash": {
+        ngxHTTPUpsConf | ngxConfTake12,
+        ngxStreamUpsConf | ngxConfTake12,
+    },
+    "http": {
+        ngxMainConf | ngxConfBlock | ngxConfNoArgs,
+    },
+    "http2_body_preread_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_chunk_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "http2_idle_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_max_concurrent_pushes": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_max_concurrent_streams": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_max_field_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_max_header_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_max_requests": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_push": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "http2_push_preload": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "http2_recv_buffer_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "http2_recv_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "if": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfExpr | ngxConf1More,
+    },
+    "if_modified_since": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "ignore_invalid_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "image_filter": {
+        ngxHTTPLocConf | ngxConfTake123,
+    },
+    "image_filter_buffer": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "image_filter_interlace": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "image_filter_jpeg_quality": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "image_filter_sharpen": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "image_filter_transparency": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "image_filter_webp_quality": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "imap_auth": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+    },
+    "imap_capabilities": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+    },
+    "imap_client_buffer": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "include": {
+        ngxAnyConf | ngxConfTake1,
+    },
+    "index": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "internal": {
+        ngxHTTPLocConf | ngxConfNoArgs,
+    },
+    "ip_hash": {
+        ngxHTTPUpsConf | ngxConfNoArgs,
+    },
+    "keepalive": {
+        ngxHTTPUpsConf | ngxConfTake1,
+    },
+    "keepalive_disable": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "keepalive_requests": {
+        ngxHTTPUpsConf | ngxConfTake1,
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "keepalive_time": {
+        ngxHTTPUpsConf | ngxConfTake1,
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "keepalive_timeout": {
+        ngxHTTPUpsConf | ngxConfTake1,
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "large_client_header_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake2,
+    },
+    "least_conn": {
+        ngxHTTPUpsConf | ngxConfNoArgs,
+        ngxStreamUpsConf | ngxConfNoArgs,
+    },
+    "limit_conn": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
+    },
+    "limit_conn_dry_run": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "limit_conn_log_level": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "limit_conn_status": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "limit_conn_zone": {
+        ngxHTTPMainConf | ngxConfTake2,
+        ngxStreamMainConf | ngxConfTake2,
+    },
+    "limit_except": {
+        ngxHTTPLocConf | ngxConfBlock | ngxConf1More,
+    },
+    "limit_rate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "limit_rate_after": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "limit_req": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "limit_req_dry_run": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "limit_req_log_level": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "limit_req_status": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "limit_req_zone": {
+        ngxHTTPMainConf | ngxConfTake3,
+    },
+    "lingering_close": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "lingering_time": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "lingering_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "listen": {
+        ngxHTTPSrvConf | ngxConf1More,
+        ngxMailSrvConf | ngxConf1More,
+        ngxStreamSrvConf | ngxConf1More,
+    },
+    "load_module": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "location": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfTake12,
+    },
+    "lock_file": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "log_format": {
+        ngxHTTPMainConf | ngxConf2More,
+        ngxStreamMainConf | ngxConf2More,
+    },
+    "log_not_found": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "log_subrequest": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "mail": {
+        ngxMainConf | ngxConfBlock | ngxConfNoArgs,
+    },
+    "map": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfTake2,
+        ngxStreamMainConf | ngxConfBlock | ngxConfTake2,
+    },
+    "map_hash_bucket_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+        ngxStreamMainConf | ngxConfTake1,
+    },
+    "map_hash_max_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+        ngxStreamMainConf | ngxConfTake1,
+    },
+    "master_process": {
+        ngxMainConf | ngxDirectConf | ngxConfFlag,
+    },
+    "max_errors": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "max_ranges": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_bind": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "memcached_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_gzip_flag": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_next_upstream": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "memcached_next_upstream_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_next_upstream_tries": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_pass": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "memcached_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_socket_keepalive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "merge_slashes": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "min_delete_depth": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "mirror": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "mirror_request_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "modern_browser": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "modern_browser_value": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "mp4": {
+        ngxHTTPLocConf | ngxConfNoArgs,
+    },
+    "mp4_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "mp4_max_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "mp4_start_key_frame": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "msie_padding": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "msie_refresh": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "multi_accept": {
+        ngxEventConf | ngxConfFlag,
+    },
+    "open_file_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "open_file_cache_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "open_file_cache_min_uses": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "open_file_cache_valid": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "open_log_file_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1234,
+    },
+    "output_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "override_charset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "pcre_jit": {
+        ngxMainConf | ngxDirectConf | ngxConfFlag,
+    },
+    "perl": {
+        ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
+    },
+    "perl_modules": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "perl_require": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "perl_set": {
+        ngxHTTPMainConf | ngxConfTake2,
+    },
+    "pid": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "pop3_auth": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+    },
+    "pop3_capabilities": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+    },
+    "port_in_redirect": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "postpone_output": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "preread_buffer_size": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "preread_timeout": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "protocol": {
+        ngxMailSrvConf | ngxConfTake1,
+    },
+    "proxy_bind": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12,
+    },
+    "proxy_buffer": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "proxy_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "proxy_busy_buffers_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache_background_update": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_cache_bypass": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "proxy_cache_convert_head": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_cache_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache_lock": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_cache_lock_age": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache_lock_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache_max_range_offset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache_methods": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "proxy_cache_min_uses": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache_path": {
+        ngxHTTPMainConf | ngxConf2More,
+    },
+    "proxy_cache_revalidate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_cache_use_stale": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "proxy_cache_valid": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "proxy_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_cookie_domain": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "proxy_cookie_flags": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+    },
+    "proxy_cookie_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "proxy_download_rate": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_force_ranges": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_half_close": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_headers_hash_bucket_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_headers_hash_max_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_hide_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_http_version": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_ignore_client_abort": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_ignore_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "proxy_intercept_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_limit_rate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_max_temp_file_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_method": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_next_upstream": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_next_upstream_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_next_upstream_tries": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_no_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "proxy_pass": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConfTake1,
+        ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_pass_error_message": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+    },
+    "proxy_pass_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_pass_request_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_pass_request_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_protocol": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_protocol_timeout": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_redirect": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "proxy_request_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_requests": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_responses": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_send_lowat": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_set_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_set_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "proxy_smtp_auth": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+    },
+    "proxy_socket_keepalive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_ssl": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_ssl_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_certificate_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_ciphers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_conf_command": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
+    },
+    "proxy_ssl_crl": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_password_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_protocols": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "proxy_ssl_server_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_ssl_session_reuse": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_ssl_trusted_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_verify": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_ssl_verify_depth": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_store": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_store_access": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "proxy_temp_file_write_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_temp_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+    },
+    "proxy_timeout": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_upload_rate": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "random": {
+        ngxHTTPUpsConf | ngxConfNoArgs | ngxConfTake12,
+        ngxStreamUpsConf | ngxConfNoArgs | ngxConfTake12,
+    },
+    "random_index": {
+        ngxHTTPLocConf | ngxConfFlag,
+    },
+    "read_ahead": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "real_ip_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "real_ip_recursive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "recursive_error_pages": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "referer_hash_bucket_size": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "referer_hash_max_size": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "request_pool_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "reset_timedout_connection": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "resolver": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "resolver_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "return": {
+        ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake12,
+        ngxStreamSrvConf | ngxConfTake1,
+    },
+    "rewrite": {
+        ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23,
+    },
+    "rewrite_log": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "root": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "satisfy": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_bind": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "scgi_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "scgi_busy_buffers_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache_background_update": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_cache_bypass": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_cache_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache_lock": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_cache_lock_age": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache_lock_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache_max_range_offset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache_methods": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_cache_min_uses": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache_path": {
+        ngxHTTPMainConf | ngxConf2More,
+    },
+    "scgi_cache_revalidate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_cache_use_stale": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_cache_valid": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_force_ranges": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_hide_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_ignore_client_abort": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_ignore_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_intercept_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_limit_rate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_max_temp_file_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_next_upstream": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_next_upstream_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_next_upstream_tries": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_no_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_param": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23,
+    },
+    "scgi_pass": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "scgi_pass_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_pass_request_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_pass_request_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_request_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_socket_keepalive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_store": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_store_access": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "scgi_temp_file_write_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_temp_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+    },
+    "secure_link": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "secure_link_md5": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "secure_link_secret": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "send_lowat": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "sendfile": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "sendfile_max_chunk": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "server": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfNoArgs,
+        ngxHTTPUpsConf | ngxConf1More,
+        ngxMailMainConf | ngxConfBlock | ngxConfNoArgs,
+        ngxStreamMainConf | ngxConfBlock | ngxConfNoArgs,
+        ngxStreamUpsConf | ngxConf1More,
+    },
+    "server_name": {
+        ngxHTTPSrvConf | ngxConf1More,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "server_name_in_redirect": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "server_names_hash_bucket_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "server_names_hash_max_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "server_tokens": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "set": {
+        ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake2,
+        ngxStreamSrvConf | ngxConfTake2,
+    },
+    "set_real_ip_from": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "slice": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "smtp_auth": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+    },
+    "smtp_capabilities": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+    },
+    "smtp_client_buffer": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "smtp_greeting_delay": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "source_charset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "split_clients": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfTake2,
+        ngxStreamMainConf | ngxConfBlock | ngxConfTake2,
+    },
+    "ssi": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "ssi_last_modified": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "ssi_min_file_chunk": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "ssi_silent_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "ssi_types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "ssi_value_length": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "ssl": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+    },
+    "ssl_alpn": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "ssl_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_certificate_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_ciphers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_client_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_conf_command": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake2,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake2,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
+    },
+    "ssl_crl": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_dhparam": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_early_data": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "ssl_ecdh_curve": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_engine": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "ssl_handshake_timeout": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_ocsp": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "ssl_ocsp_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_ocsp_responder": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_password_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_prefer_server_ciphers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "ssl_preread": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "ssl_protocols": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConf1More,
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "ssl_reject_handshake": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "ssl_session_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake12,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake12,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12,
+    },
+    "ssl_session_ticket_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_session_tickets": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "ssl_session_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_stapling": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "ssl_stapling_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_stapling_responder": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_stapling_verify": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "ssl_trusted_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_verify_client": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_verify_depth": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "starttls": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "stream": {
+        ngxMainConf | ngxConfBlock | ngxConfNoArgs,
+    },
+    "stub_status": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfNoArgs | ngxConfTake1,
+    },
+    "sub_filter": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "sub_filter_last_modified": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "sub_filter_once": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "sub_filter_types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "subrequest_output_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "tcp_nodelay": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "tcp_nopush": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "thread_pool": {
+        ngxMainConf | ngxDirectConf | ngxConfTake23,
+    },
+    "timeout": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "timer_resolution": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "try_files": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf2More,
+    },
+    "types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfNoArgs,
+    },
+    "types_hash_bucket_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "types_hash_max_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "underscores_in_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "uninitialized_variable_warn": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "upstream": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfTake1,
+        ngxStreamMainConf | ngxConfBlock | ngxConfTake1,
+    },
+    "use": {
+        ngxEventConf | ngxConfTake1,
+    },
+    "user": {
+        ngxMainConf | ngxDirectConf | ngxConfTake12,
+    },
+    "userid": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_domain": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_expires": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_flags": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "userid_mark": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_p3p": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_service": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_bind": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "uwsgi_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "uwsgi_busy_buffers_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_background_update": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_bypass": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_cache_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_lock": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_cache_lock_age": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_lock_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_max_range_offset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_methods": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_cache_min_uses": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_path": {
+        ngxHTTPMainConf | ngxConf2More,
+    },
+    "uwsgi_cache_revalidate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_cache_use_stale": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_cache_valid": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_force_ranges": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_hide_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ignore_client_abort": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_ignore_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_intercept_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_limit_rate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_max_temp_file_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_modifier1": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_modifier2": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_next_upstream": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_next_upstream_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_next_upstream_tries": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_no_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_param": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23,
+    },
+    "uwsgi_pass": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "uwsgi_pass_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_pass_request_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_pass_request_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_request_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_socket_keepalive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_ssl_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_certificate_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_ciphers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_conf_command": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "uwsgi_ssl_crl": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_password_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_protocols": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_ssl_server_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_ssl_session_reuse": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_ssl_trusted_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_verify": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_ssl_verify_depth": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_store": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_store_access": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "uwsgi_temp_file_write_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_temp_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+    },
+    "valid_referers": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "variables_hash_bucket_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+        ngxStreamMainConf | ngxConfTake1,
+    },
+    "variables_hash_max_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+        ngxStreamMainConf | ngxConfTake1,
+    },
+    "worker_aio_requests": {
+        ngxEventConf | ngxConfTake1,
+    },
+    "worker_connections": {
+        ngxEventConf | ngxConfTake1,
+    },
+    "worker_cpu_affinity": {
+        ngxMainConf | ngxDirectConf | ngxConf1More,
+    },
+    "worker_priority": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "worker_processes": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "worker_rlimit_core": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "worker_rlimit_nofile": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "worker_shutdown_timeout": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "working_directory": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "xclient": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+    },
+    "xml_entities": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "xslt_last_modified": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "xslt_param": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "xslt_string_param": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "xslt_stylesheet": {
+        ngxHTTPLocConf | ngxConf1More,
+    },
+    "xslt_types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "zone": {
+        ngxHTTPUpsConf | ngxConfTake12,
+        ngxStreamUpsConf | ngxConfTake12,
+    },
+}
+
+// MatchOss124 contains directives in OSS 1.2.4 source code(including GEOIP, Perl, and XSLT)
+func MatchOss124(directive string) ([]uint, bool) {
+    m, ok := oss124Directives[directive]
+    return m, ok
+}
diff --git a/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_124_directives.go b/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_124_directives.go
deleted file mode 100644
index 10808c90b4..0000000000
--- a/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_124_directives.go
+++ /dev/null
@@ -1,1873 +0,0 @@
-/**
- * Copyright (c) F5, Inc.
- *
- * This source code is licensed under the Apache License, Version 2.0 license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-// All the definitions are extracted from the source code
-// Each bit mask describes these behaviors:
-//   - how many arguments the directive can take
-//   - whether or not it is a block directive
-//   - whether this is a flag (takes one argument that's either "on" or "off")
-//   - which contexts it's allowed to be in
-
-package crossplane
-
-//nolint:gochecknoglobals
-var ngxOss124Directives = map[string][]uint{
-	"absolute_redirect": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"accept_mutex": {
-		ngxEventConf | ngxConfFlag,
-	},
-	"accept_mutex_delay": {
-		ngxEventConf | ngxConfTake1,
-	},
-	"access_log": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"add_after_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"add_before_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"add_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23,
-	},
-	"add_trailer": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23,
-	},
-	"addition_types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"aio": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"aio_write": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"alias": {
-		ngxHTTPLocConf | ngxConfTake1,
-	},
-	"allow": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ancient_browser": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"ancient_browser_value": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"auth_basic": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
-	},
-	"auth_basic_user_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
-	},
-	"auth_delay": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"auth_http": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"auth_http_header": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake2,
-	},
-	"auth_http_pass_client_cert": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-	},
-	"auth_http_timeout": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"auth_request": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"auth_request_set": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"autoindex": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"autoindex_exact_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"autoindex_format": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"autoindex_localtime": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"break": {
-		ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfNoArgs,
-	},
-	"charset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"charset_map": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfTake2,
-	},
-	"charset_types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"chunked_transfer_encoding": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"client_body_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"client_body_in_file_only": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"client_body_in_single_buffer": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"client_body_temp_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-	},
-	"client_body_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"client_header_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"client_header_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"client_max_body_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"connection_pool_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"create_full_put_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"daemon": {
-		ngxMainConf | ngxDirectConf | ngxConfFlag,
-	},
-	"dav_access": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"dav_methods": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"debug_connection": {
-		ngxEventConf | ngxConfTake1,
-	},
-	"debug_points": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"default_type": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"deny": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"directio": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"directio_alignment": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"disable_symlinks": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"empty_gif": {
-		ngxHTTPLocConf | ngxConfNoArgs,
-	},
-	"env": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"error_log": {
-		ngxMainConf | ngxConf1More,
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"error_page": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf2More,
-	},
-	"etag": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"events": {
-		ngxMainConf | ngxConfBlock | ngxConfNoArgs,
-	},
-	"expires": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake12,
-	},
-	"fastcgi_bind": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"fastcgi_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"fastcgi_busy_buffers_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache_background_update": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_cache_bypass": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_cache_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache_lock": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_cache_lock_age": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache_lock_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache_max_range_offset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache_methods": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_cache_min_uses": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache_path": {
-		ngxHTTPMainConf | ngxConf2More,
-	},
-	"fastcgi_cache_revalidate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_cache_use_stale": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_cache_valid": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_catch_stderr": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_force_ranges": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_hide_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_ignore_client_abort": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_ignore_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_index": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_intercept_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_keep_conn": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_limit_rate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_max_temp_file_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_next_upstream": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_next_upstream_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_next_upstream_tries": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_no_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_param": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23,
-	},
-	"fastcgi_pass": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"fastcgi_pass_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_pass_request_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_pass_request_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_request_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_send_lowat": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_socket_keepalive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_split_path_info": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_store": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_store_access": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"fastcgi_temp_file_write_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_temp_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-	},
-	"flv": {
-		ngxHTTPLocConf | ngxConfNoArgs,
-	},
-	"geo": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfTake12,
-		ngxStreamMainConf | ngxConfBlock | ngxConfTake12,
-	},
-	"geoip_city": {
-		ngxHTTPMainConf | ngxConfTake12,
-		ngxStreamMainConf | ngxConfTake12,
-	},
-	"geoip_country": {
-		ngxHTTPMainConf | ngxConfTake12,
-		ngxStreamMainConf | ngxConfTake12,
-	},
-	"geoip_org": {
-		ngxHTTPMainConf | ngxConfTake12,
-		ngxStreamMainConf | ngxConfTake12,
-	},
-	"geoip_proxy": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"geoip_proxy_recursive": {
-		ngxHTTPMainConf | ngxConfFlag,
-	},
-	"google_perftools_profiles": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"grpc_bind": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"grpc_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_hide_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ignore_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"grpc_intercept_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"grpc_next_upstream": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"grpc_next_upstream_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_next_upstream_tries": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_pass": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"grpc_pass_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_set_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"grpc_socket_keepalive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"grpc_ssl_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_certificate_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_ciphers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_conf_command": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"grpc_ssl_crl": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_password_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_protocols": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"grpc_ssl_server_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"grpc_ssl_session_reuse": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"grpc_ssl_trusted_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_verify": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"grpc_ssl_verify_depth": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"gunzip": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"gunzip_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"gzip": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"gzip_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"gzip_comp_level": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"gzip_disable": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"gzip_http_version": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"gzip_min_length": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"gzip_proxied": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"gzip_static": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"gzip_types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"gzip_vary": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"hash": {
-		ngxHTTPUpsConf | ngxConfTake12,
-		ngxStreamUpsConf | ngxConfTake12,
-	},
-	"http": {
-		ngxMainConf | ngxConfBlock | ngxConfNoArgs,
-	},
-	"http2_body_preread_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_chunk_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"http2_idle_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_max_concurrent_pushes": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_max_concurrent_streams": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_max_field_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_max_header_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_max_requests": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_push": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"http2_push_preload": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"http2_recv_buffer_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"http2_recv_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"if": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfExpr | ngxConf1More,
-	},
-	"if_modified_since": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"ignore_invalid_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"image_filter": {
-		ngxHTTPLocConf | ngxConfTake123,
-	},
-	"image_filter_buffer": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"image_filter_interlace": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"image_filter_jpeg_quality": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"image_filter_sharpen": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"image_filter_transparency": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"image_filter_webp_quality": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"imap_auth": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-	},
-	"imap_capabilities": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-	},
-	"imap_client_buffer": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"include": {
-		ngxAnyConf | ngxConfTake1,
-	},
-	"index": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"internal": {
-		ngxHTTPLocConf | ngxConfNoArgs,
-	},
-	"ip_hash": {
-		ngxHTTPUpsConf | ngxConfNoArgs,
-	},
-	"keepalive": {
-		ngxHTTPUpsConf | ngxConfTake1,
-	},
-	"keepalive_disable": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"keepalive_requests": {
-		ngxHTTPUpsConf | ngxConfTake1,
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"keepalive_time": {
-		ngxHTTPUpsConf | ngxConfTake1,
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"keepalive_timeout": {
-		ngxHTTPUpsConf | ngxConfTake1,
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"large_client_header_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake2,
-	},
-	"least_conn": {
-		ngxHTTPUpsConf | ngxConfNoArgs,
-		ngxStreamUpsConf | ngxConfNoArgs,
-	},
-	"limit_conn": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
-	},
-	"limit_conn_dry_run": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"limit_conn_log_level": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"limit_conn_status": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"limit_conn_zone": {
-		ngxHTTPMainConf | ngxConfTake2,
-		ngxStreamMainConf | ngxConfTake2,
-	},
-	"limit_except": {
-		ngxHTTPLocConf | ngxConfBlock | ngxConf1More,
-	},
-	"limit_rate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"limit_rate_after": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"limit_req": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"limit_req_dry_run": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"limit_req_log_level": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"limit_req_status": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"limit_req_zone": {
-		ngxHTTPMainConf | ngxConfTake3,
-	},
-	"lingering_close": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"lingering_time": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"lingering_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"listen": {
-		ngxHTTPSrvConf | ngxConf1More,
-		ngxMailSrvConf | ngxConf1More,
-		ngxStreamSrvConf | ngxConf1More,
-	},
-	"load_module": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"location": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfTake12,
-	},
-	"lock_file": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"log_format": {
-		ngxHTTPMainConf | ngxConf2More,
-		ngxStreamMainConf | ngxConf2More,
-	},
-	"log_not_found": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"log_subrequest": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"mail": {
-		ngxMainConf | ngxConfBlock | ngxConfNoArgs,
-	},
-	"map": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfTake2,
-		ngxStreamMainConf | ngxConfBlock | ngxConfTake2,
-	},
-	"map_hash_bucket_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-		ngxStreamMainConf | ngxConfTake1,
-	},
-	"map_hash_max_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-		ngxStreamMainConf | ngxConfTake1,
-	},
-	"master_process": {
-		ngxMainConf | ngxDirectConf | ngxConfFlag,
-	},
-	"max_errors": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"max_ranges": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_bind": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"memcached_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_gzip_flag": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_next_upstream": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"memcached_next_upstream_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_next_upstream_tries": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_pass": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"memcached_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_socket_keepalive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"merge_slashes": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"min_delete_depth": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"mirror": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"mirror_request_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"modern_browser": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"modern_browser_value": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"mp4": {
-		ngxHTTPLocConf | ngxConfNoArgs,
-	},
-	"mp4_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"mp4_max_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"mp4_start_key_frame": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"msie_padding": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"msie_refresh": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"multi_accept": {
-		ngxEventConf | ngxConfFlag,
-	},
-	"open_file_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"open_file_cache_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"open_file_cache_min_uses": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"open_file_cache_valid": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"open_log_file_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1234,
-	},
-	"output_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"override_charset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"pcre_jit": {
-		ngxMainConf | ngxDirectConf | ngxConfFlag,
-	},
-	"perl": {
-		ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
-	},
-	"perl_modules": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"perl_require": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"perl_set": {
-		ngxHTTPMainConf | ngxConfTake2,
-	},
-	"pid": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"pop3_auth": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-	},
-	"pop3_capabilities": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-	},
-	"port_in_redirect": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"postpone_output": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"preread_buffer_size": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"preread_timeout": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"protocol": {
-		ngxMailSrvConf | ngxConfTake1,
-	},
-	"proxy_bind": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12,
-	},
-	"proxy_buffer": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"proxy_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"proxy_busy_buffers_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache_background_update": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_cache_bypass": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"proxy_cache_convert_head": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_cache_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache_lock": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_cache_lock_age": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache_lock_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache_max_range_offset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache_methods": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"proxy_cache_min_uses": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache_path": {
-		ngxHTTPMainConf | ngxConf2More,
-	},
-	"proxy_cache_revalidate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_cache_use_stale": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"proxy_cache_valid": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"proxy_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_cookie_domain": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"proxy_cookie_flags": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-	},
-	"proxy_cookie_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"proxy_download_rate": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_force_ranges": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_half_close": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_headers_hash_bucket_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_headers_hash_max_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_hide_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_http_version": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_ignore_client_abort": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_ignore_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"proxy_intercept_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_limit_rate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_max_temp_file_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_method": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_next_upstream": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_next_upstream_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_next_upstream_tries": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_no_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"proxy_pass": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConfTake1,
-		ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_pass_error_message": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-	},
-	"proxy_pass_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_pass_request_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_pass_request_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_protocol": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_protocol_timeout": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_redirect": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"proxy_request_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_requests": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_responses": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_send_lowat": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_set_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_set_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"proxy_smtp_auth": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-	},
-	"proxy_socket_keepalive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_ssl": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_ssl_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_certificate_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_ciphers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_conf_command": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
-	},
-	"proxy_ssl_crl": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_password_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_protocols": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"proxy_ssl_server_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_ssl_session_reuse": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_ssl_trusted_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_verify": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_ssl_verify_depth": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_store": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_store_access": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"proxy_temp_file_write_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_temp_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-	},
-	"proxy_timeout": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_upload_rate": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"random": {
-		ngxHTTPUpsConf | ngxConfNoArgs | ngxConfTake12,
-		ngxStreamUpsConf | ngxConfNoArgs | ngxConfTake12,
-	},
-	"random_index": {
-		ngxHTTPLocConf | ngxConfFlag,
-	},
-	"read_ahead": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"real_ip_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"real_ip_recursive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"recursive_error_pages": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"referer_hash_bucket_size": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"referer_hash_max_size": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"request_pool_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"reset_timedout_connection": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"resolver": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"resolver_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"return": {
-		ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake12,
-		ngxStreamSrvConf | ngxConfTake1,
-	},
-	"rewrite": {
-		ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23,
-	},
-	"rewrite_log": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"root": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"satisfy": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_bind": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"scgi_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"scgi_busy_buffers_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache_background_update": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_cache_bypass": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_cache_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache_lock": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_cache_lock_age": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache_lock_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache_max_range_offset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache_methods": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_cache_min_uses": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache_path": {
-		ngxHTTPMainConf | ngxConf2More,
-	},
-	"scgi_cache_revalidate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_cache_use_stale": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_cache_valid": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_force_ranges": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_hide_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_ignore_client_abort": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_ignore_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_intercept_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_limit_rate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_max_temp_file_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_next_upstream": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_next_upstream_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_next_upstream_tries": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_no_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_param": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23,
-	},
-	"scgi_pass": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"scgi_pass_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_pass_request_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_pass_request_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_request_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_socket_keepalive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_store": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_store_access": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"scgi_temp_file_write_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_temp_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-	},
-	"secure_link": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"secure_link_md5": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"secure_link_secret": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"send_lowat": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"sendfile": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"sendfile_max_chunk": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"server": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfNoArgs,
-		ngxHTTPUpsConf | ngxConf1More,
-		ngxMailMainConf | ngxConfBlock | ngxConfNoArgs,
-		ngxStreamMainConf | ngxConfBlock | ngxConfNoArgs,
-		ngxStreamUpsConf | ngxConf1More,
-	},
-	"server_name": {
-		ngxHTTPSrvConf | ngxConf1More,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"server_name_in_redirect": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"server_names_hash_bucket_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"server_names_hash_max_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"server_tokens": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"set": {
-		ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake2,
-		ngxStreamSrvConf | ngxConfTake2,
-	},
-	"set_real_ip_from": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"slice": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"smtp_auth": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-	},
-	"smtp_capabilities": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-	},
-	"smtp_client_buffer": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"smtp_greeting_delay": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"source_charset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"split_clients": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfTake2,
-		ngxStreamMainConf | ngxConfBlock | ngxConfTake2,
-	},
-	"ssi": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"ssi_last_modified": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"ssi_min_file_chunk": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"ssi_silent_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"ssi_types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"ssi_value_length": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"ssl": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-	},
-	"ssl_alpn": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"ssl_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_certificate_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_ciphers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_client_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_conf_command": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake2,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake2,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
-	},
-	"ssl_crl": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_dhparam": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_early_data": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"ssl_ecdh_curve": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_engine": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"ssl_handshake_timeout": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_ocsp": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"ssl_ocsp_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_ocsp_responder": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_password_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_prefer_server_ciphers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"ssl_preread": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"ssl_protocols": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConf1More,
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"ssl_reject_handshake": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"ssl_session_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake12,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake12,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12,
-	},
-	"ssl_session_ticket_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_session_tickets": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"ssl_session_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_stapling": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"ssl_stapling_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_stapling_responder": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_stapling_verify": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"ssl_trusted_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_verify_client": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_verify_depth": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"starttls": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"stream": {
-		ngxMainConf | ngxConfBlock | ngxConfNoArgs,
-	},
-	"stub_status": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfNoArgs | ngxConfTake1,
-	},
-	"sub_filter": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"sub_filter_last_modified": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"sub_filter_once": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"sub_filter_types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"subrequest_output_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"tcp_nodelay": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"tcp_nopush": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"thread_pool": {
-		ngxMainConf | ngxDirectConf | ngxConfTake23,
-	},
-	"timeout": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"timer_resolution": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"try_files": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf2More,
-	},
-	"types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfNoArgs,
-	},
-	"types_hash_bucket_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"types_hash_max_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"underscores_in_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"uninitialized_variable_warn": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"upstream": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfTake1,
-		ngxStreamMainConf | ngxConfBlock | ngxConfTake1,
-	},
-	"use": {
-		ngxEventConf | ngxConfTake1,
-	},
-	"user": {
-		ngxMainConf | ngxDirectConf | ngxConfTake12,
-	},
-	"userid": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_domain": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_expires": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_flags": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"userid_mark": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_p3p": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_service": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_bind": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"uwsgi_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"uwsgi_busy_buffers_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_background_update": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_bypass": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_cache_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_lock": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_cache_lock_age": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_lock_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_max_range_offset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_methods": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_cache_min_uses": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_path": {
-		ngxHTTPMainConf | ngxConf2More,
-	},
-	"uwsgi_cache_revalidate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_cache_use_stale": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_cache_valid": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_force_ranges": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_hide_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ignore_client_abort": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_ignore_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_intercept_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_limit_rate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_max_temp_file_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_modifier1": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_modifier2": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_next_upstream": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_next_upstream_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_next_upstream_tries": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_no_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_param": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23,
-	},
-	"uwsgi_pass": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"uwsgi_pass_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_pass_request_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_pass_request_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_request_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_socket_keepalive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_ssl_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_certificate_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_ciphers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_conf_command": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"uwsgi_ssl_crl": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_password_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_protocols": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_ssl_server_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_ssl_session_reuse": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_ssl_trusted_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_verify": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_ssl_verify_depth": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_store": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_store_access": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"uwsgi_temp_file_write_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_temp_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-	},
-	"valid_referers": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"variables_hash_bucket_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-		ngxStreamMainConf | ngxConfTake1,
-	},
-	"variables_hash_max_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-		ngxStreamMainConf | ngxConfTake1,
-	},
-	"worker_aio_requests": {
-		ngxEventConf | ngxConfTake1,
-	},
-	"worker_connections": {
-		ngxEventConf | ngxConfTake1,
-	},
-	"worker_cpu_affinity": {
-		ngxMainConf | ngxDirectConf | ngxConf1More,
-	},
-	"worker_priority": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"worker_processes": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"worker_rlimit_core": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"worker_rlimit_nofile": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"worker_shutdown_timeout": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"working_directory": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"xclient": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-	},
-	"xml_entities": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"xslt_last_modified": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"xslt_param": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"xslt_string_param": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"xslt_stylesheet": {
-		ngxHTTPLocConf | ngxConf1More,
-	},
-	"xslt_types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"zone": {
-		ngxHTTPUpsConf | ngxConfTake12,
-		ngxStreamUpsConf | ngxConfTake12,
-	},
-}
-
-func Oss124DirectivesMatchFn(directive string) ([]uint, bool) {
-	masks, matched := ngxOss124Directives[directive]
-	return masks, matched
-}
diff --git a/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_126_directives.gen.go b/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_126_directives.gen.go
new file mode 100644
index 0000000000..1fb0ee8cf1
--- /dev/null
+++ b/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_126_directives.gen.go
@@ -0,0 +1,1907 @@
+/**
+ * Copyright (c) F5, Inc.
+ *
+ * This source code is licensed under the Apache License, Version 2.0 license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+// Code generated by generator; DO NOT EDIT.
+// All the definitions are extracted from the source code
+// Each bit mask describes these behaviors:
+//   - how many arguments the directive can take
+//   - whether or not it is a block directive
+//   - whether this is a flag (takes one argument that's either "on" or "off")
+//   - which contexts it's allowed to be in
+
+package crossplane
+
+var oss126Directives = map[string][]uint{
+    "absolute_redirect": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "accept_mutex": {
+        ngxEventConf | ngxConfFlag,
+    },
+    "accept_mutex_delay": {
+        ngxEventConf | ngxConfTake1,
+    },
+    "access_log": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "add_after_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "add_before_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "add_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23,
+    },
+    "add_trailer": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23,
+    },
+    "addition_types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "aio": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "aio_write": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "alias": {
+        ngxHTTPLocConf | ngxConfTake1,
+    },
+    "allow": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ancient_browser": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "ancient_browser_value": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "auth_basic": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
+    },
+    "auth_basic_user_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
+    },
+    "auth_delay": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "auth_http": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "auth_http_header": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake2,
+    },
+    "auth_http_pass_client_cert": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+    },
+    "auth_http_timeout": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "auth_request": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "auth_request_set": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "autoindex": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "autoindex_exact_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "autoindex_format": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "autoindex_localtime": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "break": {
+        ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfNoArgs,
+    },
+    "charset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "charset_map": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfTake2,
+    },
+    "charset_types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "chunked_transfer_encoding": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "client_body_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "client_body_in_file_only": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "client_body_in_single_buffer": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "client_body_temp_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+    },
+    "client_body_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "client_header_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "client_header_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "client_max_body_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "connection_pool_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "create_full_put_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "daemon": {
+        ngxMainConf | ngxDirectConf | ngxConfFlag,
+    },
+    "dav_access": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "dav_methods": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "debug_connection": {
+        ngxEventConf | ngxConfTake1,
+    },
+    "debug_points": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "default_type": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "deny": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "directio": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "directio_alignment": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "disable_symlinks": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "empty_gif": {
+        ngxHTTPLocConf | ngxConfNoArgs,
+    },
+    "env": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "error_log": {
+        ngxMainConf | ngxConf1More,
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "error_page": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf2More,
+    },
+    "etag": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "events": {
+        ngxMainConf | ngxConfBlock | ngxConfNoArgs,
+    },
+    "expires": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake12,
+    },
+    "fastcgi_bind": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "fastcgi_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "fastcgi_busy_buffers_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache_background_update": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_cache_bypass": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_cache_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache_lock": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_cache_lock_age": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache_lock_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache_max_range_offset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache_methods": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_cache_min_uses": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache_path": {
+        ngxHTTPMainConf | ngxConf2More,
+    },
+    "fastcgi_cache_revalidate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_cache_use_stale": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_cache_valid": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_catch_stderr": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_force_ranges": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_hide_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_ignore_client_abort": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_ignore_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_index": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_intercept_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_keep_conn": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_limit_rate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_max_temp_file_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_next_upstream": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_next_upstream_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_next_upstream_tries": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_no_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_param": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23,
+    },
+    "fastcgi_pass": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "fastcgi_pass_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_pass_request_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_pass_request_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_request_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_send_lowat": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_socket_keepalive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_split_path_info": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_store": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_store_access": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "fastcgi_temp_file_write_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_temp_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+    },
+    "flv": {
+        ngxHTTPLocConf | ngxConfNoArgs,
+    },
+    "geo": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfTake12,
+        ngxStreamMainConf | ngxConfBlock | ngxConfTake12,
+    },
+    "geoip_city": {
+        ngxHTTPMainConf | ngxConfTake12,
+        ngxStreamMainConf | ngxConfTake12,
+    },
+    "geoip_country": {
+        ngxHTTPMainConf | ngxConfTake12,
+        ngxStreamMainConf | ngxConfTake12,
+    },
+    "geoip_org": {
+        ngxHTTPMainConf | ngxConfTake12,
+        ngxStreamMainConf | ngxConfTake12,
+    },
+    "geoip_proxy": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "geoip_proxy_recursive": {
+        ngxHTTPMainConf | ngxConfFlag,
+    },
+    "google_perftools_profiles": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "grpc_bind": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "grpc_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_hide_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ignore_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "grpc_intercept_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "grpc_next_upstream": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "grpc_next_upstream_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_next_upstream_tries": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_pass": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "grpc_pass_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_set_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "grpc_socket_keepalive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "grpc_ssl_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_certificate_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_ciphers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_conf_command": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "grpc_ssl_crl": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_password_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_protocols": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "grpc_ssl_server_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "grpc_ssl_session_reuse": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "grpc_ssl_trusted_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_verify": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "grpc_ssl_verify_depth": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "gunzip": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "gunzip_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "gzip": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "gzip_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "gzip_comp_level": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "gzip_disable": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "gzip_http_version": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "gzip_min_length": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "gzip_proxied": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "gzip_static": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "gzip_types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "gzip_vary": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "hash": {
+        ngxHTTPUpsConf | ngxConfTake12,
+        ngxStreamUpsConf | ngxConfTake12,
+    },
+    "http": {
+        ngxMainConf | ngxConfBlock | ngxConfNoArgs,
+    },
+    "http2": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "http2_body_preread_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_chunk_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "http2_idle_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_max_concurrent_pushes": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_max_concurrent_streams": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_max_field_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_max_header_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_max_requests": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_push": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "http2_push_preload": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "http2_recv_buffer_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "http2_recv_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http3": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "http3_hq": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "http3_max_concurrent_streams": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http3_stream_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "if": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfExpr | ngxConf1More,
+    },
+    "if_modified_since": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "ignore_invalid_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "image_filter": {
+        ngxHTTPLocConf | ngxConfTake123,
+    },
+    "image_filter_buffer": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "image_filter_interlace": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "image_filter_jpeg_quality": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "image_filter_sharpen": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "image_filter_transparency": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "image_filter_webp_quality": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "imap_auth": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+    },
+    "imap_capabilities": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+    },
+    "imap_client_buffer": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "include": {
+        ngxAnyConf | ngxConfTake1,
+    },
+    "index": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "internal": {
+        ngxHTTPLocConf | ngxConfNoArgs,
+    },
+    "ip_hash": {
+        ngxHTTPUpsConf | ngxConfNoArgs,
+    },
+    "keepalive": {
+        ngxHTTPUpsConf | ngxConfTake1,
+    },
+    "keepalive_disable": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "keepalive_requests": {
+        ngxHTTPUpsConf | ngxConfTake1,
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "keepalive_time": {
+        ngxHTTPUpsConf | ngxConfTake1,
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "keepalive_timeout": {
+        ngxHTTPUpsConf | ngxConfTake1,
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "large_client_header_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake2,
+    },
+    "least_conn": {
+        ngxHTTPUpsConf | ngxConfNoArgs,
+        ngxStreamUpsConf | ngxConfNoArgs,
+    },
+    "limit_conn": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
+    },
+    "limit_conn_dry_run": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "limit_conn_log_level": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "limit_conn_status": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "limit_conn_zone": {
+        ngxHTTPMainConf | ngxConfTake2,
+        ngxStreamMainConf | ngxConfTake2,
+    },
+    "limit_except": {
+        ngxHTTPLocConf | ngxConfBlock | ngxConf1More,
+    },
+    "limit_rate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "limit_rate_after": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "limit_req": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "limit_req_dry_run": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "limit_req_log_level": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "limit_req_status": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "limit_req_zone": {
+        ngxHTTPMainConf | ngxConfTake3,
+    },
+    "lingering_close": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "lingering_time": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "lingering_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "listen": {
+        ngxHTTPSrvConf | ngxConf1More,
+        ngxMailSrvConf | ngxConf1More,
+        ngxStreamSrvConf | ngxConf1More,
+    },
+    "load_module": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "location": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfTake12,
+    },
+    "lock_file": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "log_format": {
+        ngxHTTPMainConf | ngxConf2More,
+        ngxStreamMainConf | ngxConf2More,
+    },
+    "log_not_found": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "log_subrequest": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "mail": {
+        ngxMainConf | ngxConfBlock | ngxConfNoArgs,
+    },
+    "map": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfTake2,
+        ngxStreamMainConf | ngxConfBlock | ngxConfTake2,
+    },
+    "map_hash_bucket_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+        ngxStreamMainConf | ngxConfTake1,
+    },
+    "map_hash_max_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+        ngxStreamMainConf | ngxConfTake1,
+    },
+    "master_process": {
+        ngxMainConf | ngxDirectConf | ngxConfFlag,
+    },
+    "max_errors": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "max_ranges": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_bind": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "memcached_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_gzip_flag": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_next_upstream": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "memcached_next_upstream_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_next_upstream_tries": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_pass": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "memcached_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_socket_keepalive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "merge_slashes": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "min_delete_depth": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "mirror": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "mirror_request_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "modern_browser": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "modern_browser_value": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "mp4": {
+        ngxHTTPLocConf | ngxConfNoArgs,
+    },
+    "mp4_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "mp4_max_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "mp4_start_key_frame": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "msie_padding": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "msie_refresh": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "multi_accept": {
+        ngxEventConf | ngxConfFlag,
+    },
+    "open_file_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "open_file_cache_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "open_file_cache_min_uses": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "open_file_cache_valid": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "open_log_file_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1234,
+    },
+    "output_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "override_charset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "pass": {
+        ngxStreamSrvConf | ngxConfTake1,
+    },
+    "pcre_jit": {
+        ngxMainConf | ngxDirectConf | ngxConfFlag,
+    },
+    "perl": {
+        ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
+    },
+    "perl_modules": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "perl_require": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "perl_set": {
+        ngxHTTPMainConf | ngxConfTake2,
+    },
+    "pid": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "pop3_auth": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+    },
+    "pop3_capabilities": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+    },
+    "port_in_redirect": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "postpone_output": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "preread_buffer_size": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "preread_timeout": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "protocol": {
+        ngxMailSrvConf | ngxConfTake1,
+    },
+    "proxy_bind": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12,
+    },
+    "proxy_buffer": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "proxy_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "proxy_busy_buffers_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache_background_update": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_cache_bypass": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "proxy_cache_convert_head": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_cache_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache_lock": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_cache_lock_age": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache_lock_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache_max_range_offset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache_methods": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "proxy_cache_min_uses": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache_path": {
+        ngxHTTPMainConf | ngxConf2More,
+    },
+    "proxy_cache_revalidate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_cache_use_stale": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "proxy_cache_valid": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "proxy_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_cookie_domain": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "proxy_cookie_flags": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+    },
+    "proxy_cookie_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "proxy_download_rate": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_force_ranges": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_half_close": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_headers_hash_bucket_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_headers_hash_max_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_hide_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_http_version": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_ignore_client_abort": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_ignore_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "proxy_intercept_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_limit_rate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_max_temp_file_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_method": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_next_upstream": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_next_upstream_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_next_upstream_tries": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_no_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "proxy_pass": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConfTake1,
+        ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_pass_error_message": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+    },
+    "proxy_pass_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_pass_request_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_pass_request_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_protocol": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_protocol_timeout": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_redirect": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "proxy_request_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_requests": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_responses": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_send_lowat": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_set_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_set_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "proxy_smtp_auth": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+    },
+    "proxy_socket_keepalive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_ssl": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_ssl_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_certificate_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_ciphers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_conf_command": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
+    },
+    "proxy_ssl_crl": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_password_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_protocols": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "proxy_ssl_server_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_ssl_session_reuse": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_ssl_trusted_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_verify": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_ssl_verify_depth": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_store": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_store_access": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "proxy_temp_file_write_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_temp_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+    },
+    "proxy_timeout": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_upload_rate": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "quic_active_connection_id_limit": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "quic_bpf": {
+        ngxMainConf | ngxDirectConf | ngxConfFlag,
+    },
+    "quic_gso": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "quic_host_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "quic_retry": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "random": {
+        ngxHTTPUpsConf | ngxConfNoArgs | ngxConfTake12,
+        ngxStreamUpsConf | ngxConfNoArgs | ngxConfTake12,
+    },
+    "random_index": {
+        ngxHTTPLocConf | ngxConfFlag,
+    },
+    "read_ahead": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "real_ip_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "real_ip_recursive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "recursive_error_pages": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "referer_hash_bucket_size": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "referer_hash_max_size": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "request_pool_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "reset_timedout_connection": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "resolver": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "resolver_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "return": {
+        ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake12,
+        ngxStreamSrvConf | ngxConfTake1,
+    },
+    "rewrite": {
+        ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23,
+    },
+    "rewrite_log": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "root": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "satisfy": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_bind": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "scgi_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "scgi_busy_buffers_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache_background_update": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_cache_bypass": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_cache_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache_lock": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_cache_lock_age": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache_lock_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache_max_range_offset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache_methods": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_cache_min_uses": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache_path": {
+        ngxHTTPMainConf | ngxConf2More,
+    },
+    "scgi_cache_revalidate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_cache_use_stale": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_cache_valid": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_force_ranges": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_hide_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_ignore_client_abort": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_ignore_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_intercept_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_limit_rate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_max_temp_file_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_next_upstream": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_next_upstream_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_next_upstream_tries": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_no_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_param": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23,
+    },
+    "scgi_pass": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "scgi_pass_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_pass_request_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_pass_request_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_request_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_socket_keepalive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_store": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_store_access": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "scgi_temp_file_write_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_temp_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+    },
+    "secure_link": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "secure_link_md5": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "secure_link_secret": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "send_lowat": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "sendfile": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "sendfile_max_chunk": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "server": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfNoArgs,
+        ngxHTTPUpsConf | ngxConf1More,
+        ngxMailMainConf | ngxConfBlock | ngxConfNoArgs,
+        ngxStreamMainConf | ngxConfBlock | ngxConfNoArgs,
+        ngxStreamUpsConf | ngxConf1More,
+    },
+    "server_name": {
+        ngxHTTPSrvConf | ngxConf1More,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamSrvConf | ngxConf1More,
+    },
+    "server_name_in_redirect": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "server_names_hash_bucket_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+        ngxStreamMainConf | ngxConfTake1,
+    },
+    "server_names_hash_max_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+        ngxStreamMainConf | ngxConfTake1,
+    },
+    "server_tokens": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "set": {
+        ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake2,
+        ngxStreamSrvConf | ngxConfTake2,
+    },
+    "set_real_ip_from": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "slice": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "smtp_auth": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+    },
+    "smtp_capabilities": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+    },
+    "smtp_client_buffer": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "smtp_greeting_delay": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "source_charset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "split_clients": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfTake2,
+        ngxStreamMainConf | ngxConfBlock | ngxConfTake2,
+    },
+    "ssi": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "ssi_last_modified": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "ssi_min_file_chunk": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "ssi_silent_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "ssi_types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "ssi_value_length": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "ssl_alpn": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "ssl_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_certificate_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_ciphers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_client_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_conf_command": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake2,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake2,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
+    },
+    "ssl_crl": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_dhparam": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_early_data": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "ssl_ecdh_curve": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_engine": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "ssl_handshake_timeout": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_ocsp": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "ssl_ocsp_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_ocsp_responder": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_password_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_prefer_server_ciphers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "ssl_preread": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "ssl_protocols": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConf1More,
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "ssl_reject_handshake": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "ssl_session_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake12,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake12,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12,
+    },
+    "ssl_session_ticket_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_session_tickets": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "ssl_session_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_stapling": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "ssl_stapling_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_stapling_responder": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_stapling_verify": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "ssl_trusted_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_verify_client": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_verify_depth": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "starttls": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "stream": {
+        ngxMainConf | ngxConfBlock | ngxConfNoArgs,
+    },
+    "stub_status": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfNoArgs | ngxConfTake1,
+    },
+    "sub_filter": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "sub_filter_last_modified": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "sub_filter_once": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "sub_filter_types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "subrequest_output_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "tcp_nodelay": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "tcp_nopush": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "thread_pool": {
+        ngxMainConf | ngxDirectConf | ngxConfTake23,
+    },
+    "timeout": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "timer_resolution": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "try_files": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf2More,
+    },
+    "types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfNoArgs,
+    },
+    "types_hash_bucket_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "types_hash_max_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "underscores_in_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "uninitialized_variable_warn": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "upstream": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfTake1,
+        ngxStreamMainConf | ngxConfBlock | ngxConfTake1,
+    },
+    "use": {
+        ngxEventConf | ngxConfTake1,
+    },
+    "user": {
+        ngxMainConf | ngxDirectConf | ngxConfTake12,
+    },
+    "userid": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_domain": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_expires": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_flags": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "userid_mark": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_p3p": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_service": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_bind": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "uwsgi_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "uwsgi_busy_buffers_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_background_update": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_bypass": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_cache_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_lock": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_cache_lock_age": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_lock_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_max_range_offset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_methods": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_cache_min_uses": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_path": {
+        ngxHTTPMainConf | ngxConf2More,
+    },
+    "uwsgi_cache_revalidate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_cache_use_stale": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_cache_valid": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_force_ranges": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_hide_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ignore_client_abort": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_ignore_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_intercept_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_limit_rate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_max_temp_file_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_modifier1": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_modifier2": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_next_upstream": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_next_upstream_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_next_upstream_tries": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_no_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_param": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23,
+    },
+    "uwsgi_pass": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "uwsgi_pass_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_pass_request_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_pass_request_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_request_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_socket_keepalive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_ssl_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_certificate_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_ciphers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_conf_command": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "uwsgi_ssl_crl": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_password_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_protocols": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_ssl_server_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_ssl_session_reuse": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_ssl_trusted_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_verify": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_ssl_verify_depth": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_store": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_store_access": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "uwsgi_temp_file_write_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_temp_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+    },
+    "valid_referers": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "variables_hash_bucket_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+        ngxStreamMainConf | ngxConfTake1,
+    },
+    "variables_hash_max_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+        ngxStreamMainConf | ngxConfTake1,
+    },
+    "worker_aio_requests": {
+        ngxEventConf | ngxConfTake1,
+    },
+    "worker_connections": {
+        ngxEventConf | ngxConfTake1,
+    },
+    "worker_cpu_affinity": {
+        ngxMainConf | ngxDirectConf | ngxConf1More,
+    },
+    "worker_priority": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "worker_processes": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "worker_rlimit_core": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "worker_rlimit_nofile": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "worker_shutdown_timeout": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "working_directory": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "xclient": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+    },
+    "xml_entities": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "xslt_last_modified": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "xslt_param": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "xslt_string_param": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "xslt_stylesheet": {
+        ngxHTTPLocConf | ngxConf1More,
+    },
+    "xslt_types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "zone": {
+        ngxHTTPUpsConf | ngxConfTake12,
+        ngxStreamUpsConf | ngxConfTake12,
+    },
+}
+
+// MatchOss126 contains directives in OSS 1.2.6 source code(including GEOIP, Perl, and XSLT)
+func MatchOss126(directive string) ([]uint, bool) {
+    m, ok := oss126Directives[directive]
+    return m, ok
+}
diff --git a/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_126_directives.go b/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_126_directives.go
deleted file mode 100644
index 6a35295eed..0000000000
--- a/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_126_directives.go
+++ /dev/null
@@ -1,1906 +0,0 @@
-/**
- * Copyright (c) F5, Inc.
- *
- * This source code is licensed under the Apache License, Version 2.0 license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-// All the definitions are extracted from the source code
-// Each bit mask describes these behaviors:
-//   - how many arguments the directive can take
-//   - whether or not it is a block directive
-//   - whether this is a flag (takes one argument that's either "on" or "off")
-//   - which contexts it's allowed to be in
-
-package crossplane
-
-//nolint:gochecknoglobals
-var ngxOss126Directives = map[string][]uint{
-	"absolute_redirect": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"accept_mutex": {
-		ngxEventConf | ngxConfFlag,
-	},
-	"accept_mutex_delay": {
-		ngxEventConf | ngxConfTake1,
-	},
-	"access_log": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"add_after_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"add_before_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"add_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23,
-	},
-	"add_trailer": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23,
-	},
-	"addition_types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"aio": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"aio_write": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"alias": {
-		ngxHTTPLocConf | ngxConfTake1,
-	},
-	"allow": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ancient_browser": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"ancient_browser_value": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"auth_basic": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
-	},
-	"auth_basic_user_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
-	},
-	"auth_delay": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"auth_http": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"auth_http_header": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake2,
-	},
-	"auth_http_pass_client_cert": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-	},
-	"auth_http_timeout": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"auth_request": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"auth_request_set": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"autoindex": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"autoindex_exact_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"autoindex_format": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"autoindex_localtime": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"break": {
-		ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfNoArgs,
-	},
-	"charset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"charset_map": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfTake2,
-	},
-	"charset_types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"chunked_transfer_encoding": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"client_body_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"client_body_in_file_only": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"client_body_in_single_buffer": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"client_body_temp_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-	},
-	"client_body_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"client_header_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"client_header_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"client_max_body_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"connection_pool_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"create_full_put_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"daemon": {
-		ngxMainConf | ngxDirectConf | ngxConfFlag,
-	},
-	"dav_access": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"dav_methods": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"debug_connection": {
-		ngxEventConf | ngxConfTake1,
-	},
-	"debug_points": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"default_type": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"deny": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"directio": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"directio_alignment": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"disable_symlinks": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"empty_gif": {
-		ngxHTTPLocConf | ngxConfNoArgs,
-	},
-	"env": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"error_log": {
-		ngxMainConf | ngxConf1More,
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"error_page": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf2More,
-	},
-	"etag": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"events": {
-		ngxMainConf | ngxConfBlock | ngxConfNoArgs,
-	},
-	"expires": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake12,
-	},
-	"fastcgi_bind": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"fastcgi_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"fastcgi_busy_buffers_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache_background_update": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_cache_bypass": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_cache_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache_lock": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_cache_lock_age": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache_lock_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache_max_range_offset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache_methods": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_cache_min_uses": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache_path": {
-		ngxHTTPMainConf | ngxConf2More,
-	},
-	"fastcgi_cache_revalidate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_cache_use_stale": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_cache_valid": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_catch_stderr": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_force_ranges": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_hide_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_ignore_client_abort": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_ignore_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_index": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_intercept_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_keep_conn": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_limit_rate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_max_temp_file_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_next_upstream": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_next_upstream_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_next_upstream_tries": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_no_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_param": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23,
-	},
-	"fastcgi_pass": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"fastcgi_pass_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_pass_request_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_pass_request_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_request_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_send_lowat": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_socket_keepalive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_split_path_info": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_store": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_store_access": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"fastcgi_temp_file_write_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_temp_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-	},
-	"flv": {
-		ngxHTTPLocConf | ngxConfNoArgs,
-	},
-	"geo": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfTake12,
-		ngxStreamMainConf | ngxConfBlock | ngxConfTake12,
-	},
-	"geoip_city": {
-		ngxHTTPMainConf | ngxConfTake12,
-		ngxStreamMainConf | ngxConfTake12,
-	},
-	"geoip_country": {
-		ngxHTTPMainConf | ngxConfTake12,
-		ngxStreamMainConf | ngxConfTake12,
-	},
-	"geoip_org": {
-		ngxHTTPMainConf | ngxConfTake12,
-		ngxStreamMainConf | ngxConfTake12,
-	},
-	"geoip_proxy": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"geoip_proxy_recursive": {
-		ngxHTTPMainConf | ngxConfFlag,
-	},
-	"google_perftools_profiles": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"grpc_bind": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"grpc_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_hide_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ignore_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"grpc_intercept_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"grpc_next_upstream": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"grpc_next_upstream_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_next_upstream_tries": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_pass": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"grpc_pass_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_set_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"grpc_socket_keepalive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"grpc_ssl_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_certificate_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_ciphers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_conf_command": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"grpc_ssl_crl": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_password_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_protocols": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"grpc_ssl_server_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"grpc_ssl_session_reuse": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"grpc_ssl_trusted_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_verify": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"grpc_ssl_verify_depth": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"gunzip": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"gunzip_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"gzip": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"gzip_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"gzip_comp_level": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"gzip_disable": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"gzip_http_version": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"gzip_min_length": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"gzip_proxied": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"gzip_static": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"gzip_types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"gzip_vary": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"hash": {
-		ngxHTTPUpsConf | ngxConfTake12,
-		ngxStreamUpsConf | ngxConfTake12,
-	},
-	"http": {
-		ngxMainConf | ngxConfBlock | ngxConfNoArgs,
-	},
-	"http2": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"http2_body_preread_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_chunk_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"http2_idle_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_max_concurrent_pushes": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_max_concurrent_streams": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_max_field_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_max_header_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_max_requests": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_push": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"http2_push_preload": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"http2_recv_buffer_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"http2_recv_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http3": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"http3_hq": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"http3_max_concurrent_streams": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http3_stream_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"if": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfExpr | ngxConf1More,
-	},
-	"if_modified_since": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"ignore_invalid_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"image_filter": {
-		ngxHTTPLocConf | ngxConfTake123,
-	},
-	"image_filter_buffer": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"image_filter_interlace": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"image_filter_jpeg_quality": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"image_filter_sharpen": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"image_filter_transparency": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"image_filter_webp_quality": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"imap_auth": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-	},
-	"imap_capabilities": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-	},
-	"imap_client_buffer": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"include": {
-		ngxAnyConf | ngxConfTake1,
-	},
-	"index": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"internal": {
-		ngxHTTPLocConf | ngxConfNoArgs,
-	},
-	"ip_hash": {
-		ngxHTTPUpsConf | ngxConfNoArgs,
-	},
-	"keepalive": {
-		ngxHTTPUpsConf | ngxConfTake1,
-	},
-	"keepalive_disable": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"keepalive_requests": {
-		ngxHTTPUpsConf | ngxConfTake1,
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"keepalive_time": {
-		ngxHTTPUpsConf | ngxConfTake1,
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"keepalive_timeout": {
-		ngxHTTPUpsConf | ngxConfTake1,
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"large_client_header_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake2,
-	},
-	"least_conn": {
-		ngxHTTPUpsConf | ngxConfNoArgs,
-		ngxStreamUpsConf | ngxConfNoArgs,
-	},
-	"limit_conn": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
-	},
-	"limit_conn_dry_run": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"limit_conn_log_level": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"limit_conn_status": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"limit_conn_zone": {
-		ngxHTTPMainConf | ngxConfTake2,
-		ngxStreamMainConf | ngxConfTake2,
-	},
-	"limit_except": {
-		ngxHTTPLocConf | ngxConfBlock | ngxConf1More,
-	},
-	"limit_rate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"limit_rate_after": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"limit_req": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"limit_req_dry_run": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"limit_req_log_level": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"limit_req_status": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"limit_req_zone": {
-		ngxHTTPMainConf | ngxConfTake3,
-	},
-	"lingering_close": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"lingering_time": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"lingering_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"listen": {
-		ngxHTTPSrvConf | ngxConf1More,
-		ngxMailSrvConf | ngxConf1More,
-		ngxStreamSrvConf | ngxConf1More,
-	},
-	"load_module": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"location": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfTake12,
-	},
-	"lock_file": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"log_format": {
-		ngxHTTPMainConf | ngxConf2More,
-		ngxStreamMainConf | ngxConf2More,
-	},
-	"log_not_found": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"log_subrequest": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"mail": {
-		ngxMainConf | ngxConfBlock | ngxConfNoArgs,
-	},
-	"map": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfTake2,
-		ngxStreamMainConf | ngxConfBlock | ngxConfTake2,
-	},
-	"map_hash_bucket_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-		ngxStreamMainConf | ngxConfTake1,
-	},
-	"map_hash_max_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-		ngxStreamMainConf | ngxConfTake1,
-	},
-	"master_process": {
-		ngxMainConf | ngxDirectConf | ngxConfFlag,
-	},
-	"max_errors": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"max_ranges": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_bind": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"memcached_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_gzip_flag": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_next_upstream": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"memcached_next_upstream_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_next_upstream_tries": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_pass": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"memcached_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_socket_keepalive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"merge_slashes": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"min_delete_depth": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"mirror": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"mirror_request_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"modern_browser": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"modern_browser_value": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"mp4": {
-		ngxHTTPLocConf | ngxConfNoArgs,
-	},
-	"mp4_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"mp4_max_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"mp4_start_key_frame": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"msie_padding": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"msie_refresh": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"multi_accept": {
-		ngxEventConf | ngxConfFlag,
-	},
-	"open_file_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"open_file_cache_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"open_file_cache_min_uses": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"open_file_cache_valid": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"open_log_file_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1234,
-	},
-	"output_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"override_charset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"pass": {
-		ngxStreamSrvConf | ngxConfTake1,
-	},
-	"pcre_jit": {
-		ngxMainConf | ngxDirectConf | ngxConfFlag,
-	},
-	"perl": {
-		ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
-	},
-	"perl_modules": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"perl_require": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"perl_set": {
-		ngxHTTPMainConf | ngxConfTake2,
-	},
-	"pid": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"pop3_auth": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-	},
-	"pop3_capabilities": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-	},
-	"port_in_redirect": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"postpone_output": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"preread_buffer_size": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"preread_timeout": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"protocol": {
-		ngxMailSrvConf | ngxConfTake1,
-	},
-	"proxy_bind": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12,
-	},
-	"proxy_buffer": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"proxy_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"proxy_busy_buffers_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache_background_update": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_cache_bypass": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"proxy_cache_convert_head": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_cache_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache_lock": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_cache_lock_age": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache_lock_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache_max_range_offset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache_methods": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"proxy_cache_min_uses": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache_path": {
-		ngxHTTPMainConf | ngxConf2More,
-	},
-	"proxy_cache_revalidate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_cache_use_stale": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"proxy_cache_valid": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"proxy_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_cookie_domain": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"proxy_cookie_flags": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-	},
-	"proxy_cookie_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"proxy_download_rate": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_force_ranges": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_half_close": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_headers_hash_bucket_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_headers_hash_max_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_hide_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_http_version": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_ignore_client_abort": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_ignore_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"proxy_intercept_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_limit_rate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_max_temp_file_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_method": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_next_upstream": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_next_upstream_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_next_upstream_tries": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_no_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"proxy_pass": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConfTake1,
-		ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_pass_error_message": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-	},
-	"proxy_pass_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_pass_request_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_pass_request_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_protocol": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_protocol_timeout": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_redirect": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"proxy_request_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_requests": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_responses": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_send_lowat": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_set_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_set_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"proxy_smtp_auth": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-	},
-	"proxy_socket_keepalive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_ssl": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_ssl_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_certificate_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_ciphers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_conf_command": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
-	},
-	"proxy_ssl_crl": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_password_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_protocols": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"proxy_ssl_server_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_ssl_session_reuse": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_ssl_trusted_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_verify": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_ssl_verify_depth": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_store": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_store_access": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"proxy_temp_file_write_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_temp_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-	},
-	"proxy_timeout": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_upload_rate": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"quic_active_connection_id_limit": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"quic_bpf": {
-		ngxMainConf | ngxDirectConf | ngxConfFlag,
-	},
-	"quic_gso": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"quic_host_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"quic_retry": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"random": {
-		ngxHTTPUpsConf | ngxConfNoArgs | ngxConfTake12,
-		ngxStreamUpsConf | ngxConfNoArgs | ngxConfTake12,
-	},
-	"random_index": {
-		ngxHTTPLocConf | ngxConfFlag,
-	},
-	"read_ahead": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"real_ip_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"real_ip_recursive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"recursive_error_pages": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"referer_hash_bucket_size": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"referer_hash_max_size": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"request_pool_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"reset_timedout_connection": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"resolver": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"resolver_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"return": {
-		ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake12,
-		ngxStreamSrvConf | ngxConfTake1,
-	},
-	"rewrite": {
-		ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23,
-	},
-	"rewrite_log": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"root": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"satisfy": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_bind": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"scgi_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"scgi_busy_buffers_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache_background_update": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_cache_bypass": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_cache_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache_lock": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_cache_lock_age": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache_lock_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache_max_range_offset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache_methods": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_cache_min_uses": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache_path": {
-		ngxHTTPMainConf | ngxConf2More,
-	},
-	"scgi_cache_revalidate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_cache_use_stale": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_cache_valid": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_force_ranges": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_hide_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_ignore_client_abort": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_ignore_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_intercept_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_limit_rate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_max_temp_file_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_next_upstream": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_next_upstream_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_next_upstream_tries": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_no_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_param": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23,
-	},
-	"scgi_pass": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"scgi_pass_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_pass_request_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_pass_request_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_request_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_socket_keepalive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_store": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_store_access": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"scgi_temp_file_write_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_temp_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-	},
-	"secure_link": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"secure_link_md5": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"secure_link_secret": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"send_lowat": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"sendfile": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"sendfile_max_chunk": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"server": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfNoArgs,
-		ngxHTTPUpsConf | ngxConf1More,
-		ngxMailMainConf | ngxConfBlock | ngxConfNoArgs,
-		ngxStreamMainConf | ngxConfBlock | ngxConfNoArgs,
-		ngxStreamUpsConf | ngxConf1More,
-	},
-	"server_name": {
-		ngxHTTPSrvConf | ngxConf1More,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamSrvConf | ngxConf1More,
-	},
-	"server_name_in_redirect": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"server_names_hash_bucket_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-		ngxStreamMainConf | ngxConfTake1,
-	},
-	"server_names_hash_max_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-		ngxStreamMainConf | ngxConfTake1,
-	},
-	"server_tokens": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"set": {
-		ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake2,
-		ngxStreamSrvConf | ngxConfTake2,
-	},
-	"set_real_ip_from": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"slice": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"smtp_auth": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-	},
-	"smtp_capabilities": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-	},
-	"smtp_client_buffer": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"smtp_greeting_delay": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"source_charset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"split_clients": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfTake2,
-		ngxStreamMainConf | ngxConfBlock | ngxConfTake2,
-	},
-	"ssi": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"ssi_last_modified": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"ssi_min_file_chunk": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"ssi_silent_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"ssi_types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"ssi_value_length": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"ssl_alpn": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"ssl_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_certificate_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_ciphers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_client_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_conf_command": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake2,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake2,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
-	},
-	"ssl_crl": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_dhparam": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_early_data": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"ssl_ecdh_curve": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_engine": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"ssl_handshake_timeout": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_ocsp": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"ssl_ocsp_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_ocsp_responder": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_password_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_prefer_server_ciphers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"ssl_preread": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"ssl_protocols": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConf1More,
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"ssl_reject_handshake": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"ssl_session_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake12,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake12,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12,
-	},
-	"ssl_session_ticket_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_session_tickets": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"ssl_session_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_stapling": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"ssl_stapling_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_stapling_responder": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_stapling_verify": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"ssl_trusted_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_verify_client": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_verify_depth": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"starttls": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"stream": {
-		ngxMainConf | ngxConfBlock | ngxConfNoArgs,
-	},
-	"stub_status": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfNoArgs | ngxConfTake1,
-	},
-	"sub_filter": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"sub_filter_last_modified": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"sub_filter_once": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"sub_filter_types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"subrequest_output_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"tcp_nodelay": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"tcp_nopush": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"thread_pool": {
-		ngxMainConf | ngxDirectConf | ngxConfTake23,
-	},
-	"timeout": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"timer_resolution": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"try_files": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf2More,
-	},
-	"types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfNoArgs,
-	},
-	"types_hash_bucket_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"types_hash_max_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"underscores_in_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"uninitialized_variable_warn": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"upstream": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfTake1,
-		ngxStreamMainConf | ngxConfBlock | ngxConfTake1,
-	},
-	"use": {
-		ngxEventConf | ngxConfTake1,
-	},
-	"user": {
-		ngxMainConf | ngxDirectConf | ngxConfTake12,
-	},
-	"userid": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_domain": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_expires": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_flags": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"userid_mark": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_p3p": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_service": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_bind": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"uwsgi_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"uwsgi_busy_buffers_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_background_update": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_bypass": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_cache_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_lock": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_cache_lock_age": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_lock_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_max_range_offset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_methods": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_cache_min_uses": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_path": {
-		ngxHTTPMainConf | ngxConf2More,
-	},
-	"uwsgi_cache_revalidate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_cache_use_stale": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_cache_valid": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_force_ranges": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_hide_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ignore_client_abort": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_ignore_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_intercept_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_limit_rate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_max_temp_file_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_modifier1": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_modifier2": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_next_upstream": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_next_upstream_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_next_upstream_tries": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_no_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_param": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23,
-	},
-	"uwsgi_pass": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"uwsgi_pass_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_pass_request_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_pass_request_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_request_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_socket_keepalive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_ssl_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_certificate_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_ciphers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_conf_command": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"uwsgi_ssl_crl": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_password_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_protocols": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_ssl_server_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_ssl_session_reuse": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_ssl_trusted_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_verify": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_ssl_verify_depth": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_store": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_store_access": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"uwsgi_temp_file_write_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_temp_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-	},
-	"valid_referers": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"variables_hash_bucket_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-		ngxStreamMainConf | ngxConfTake1,
-	},
-	"variables_hash_max_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-		ngxStreamMainConf | ngxConfTake1,
-	},
-	"worker_aio_requests": {
-		ngxEventConf | ngxConfTake1,
-	},
-	"worker_connections": {
-		ngxEventConf | ngxConfTake1,
-	},
-	"worker_cpu_affinity": {
-		ngxMainConf | ngxDirectConf | ngxConf1More,
-	},
-	"worker_priority": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"worker_processes": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"worker_rlimit_core": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"worker_rlimit_nofile": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"worker_shutdown_timeout": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"working_directory": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"xclient": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-	},
-	"xml_entities": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"xslt_last_modified": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"xslt_param": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"xslt_string_param": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"xslt_stylesheet": {
-		ngxHTTPLocConf | ngxConf1More,
-	},
-	"xslt_types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"zone": {
-		ngxHTTPUpsConf | ngxConfTake12,
-		ngxStreamUpsConf | ngxConfTake12,
-	},
-}
-
-func Oss126DirectivesMatchFn(directive string) ([]uint, bool) {
-	masks, matched := ngxOss126Directives[directive]
-	return masks, matched
-}
diff --git a/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_latest_directives.gen.go b/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_latest_directives.gen.go
new file mode 100644
index 0000000000..5ef3eac02a
--- /dev/null
+++ b/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_latest_directives.gen.go
@@ -0,0 +1,1907 @@
+/**
+ * Copyright (c) F5, Inc.
+ *
+ * This source code is licensed under the Apache License, Version 2.0 license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+// Code generated by generator; DO NOT EDIT.
+// All the definitions are extracted from the source code
+// Each bit mask describes these behaviors:
+//   - how many arguments the directive can take
+//   - whether or not it is a block directive
+//   - whether this is a flag (takes one argument that's either "on" or "off")
+//   - which contexts it's allowed to be in
+
+package crossplane
+
+var ossLatestDirectives = map[string][]uint{
+    "absolute_redirect": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "accept_mutex": {
+        ngxEventConf | ngxConfFlag,
+    },
+    "accept_mutex_delay": {
+        ngxEventConf | ngxConfTake1,
+    },
+    "access_log": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "add_after_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "add_before_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "add_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23,
+    },
+    "add_trailer": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23,
+    },
+    "addition_types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "aio": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "aio_write": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "alias": {
+        ngxHTTPLocConf | ngxConfTake1,
+    },
+    "allow": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ancient_browser": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "ancient_browser_value": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "auth_basic": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
+    },
+    "auth_basic_user_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
+    },
+    "auth_delay": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "auth_http": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "auth_http_header": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake2,
+    },
+    "auth_http_pass_client_cert": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+    },
+    "auth_http_timeout": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "auth_request": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "auth_request_set": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "autoindex": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "autoindex_exact_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "autoindex_format": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "autoindex_localtime": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "break": {
+        ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfNoArgs,
+    },
+    "charset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "charset_map": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfTake2,
+    },
+    "charset_types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "chunked_transfer_encoding": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "client_body_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "client_body_in_file_only": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "client_body_in_single_buffer": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "client_body_temp_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+    },
+    "client_body_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "client_header_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "client_header_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "client_max_body_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "connection_pool_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "create_full_put_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "daemon": {
+        ngxMainConf | ngxDirectConf | ngxConfFlag,
+    },
+    "dav_access": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "dav_methods": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "debug_connection": {
+        ngxEventConf | ngxConfTake1,
+    },
+    "debug_points": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "default_type": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "deny": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "directio": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "directio_alignment": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "disable_symlinks": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "empty_gif": {
+        ngxHTTPLocConf | ngxConfNoArgs,
+    },
+    "env": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "error_log": {
+        ngxMainConf | ngxConf1More,
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "error_page": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf2More,
+    },
+    "etag": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "events": {
+        ngxMainConf | ngxConfBlock | ngxConfNoArgs,
+    },
+    "expires": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake12,
+    },
+    "fastcgi_bind": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "fastcgi_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "fastcgi_busy_buffers_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache_background_update": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_cache_bypass": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_cache_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache_lock": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_cache_lock_age": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache_lock_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache_max_range_offset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache_methods": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_cache_min_uses": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_cache_path": {
+        ngxHTTPMainConf | ngxConf2More,
+    },
+    "fastcgi_cache_revalidate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_cache_use_stale": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_cache_valid": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_catch_stderr": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_force_ranges": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_hide_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_ignore_client_abort": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_ignore_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_index": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_intercept_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_keep_conn": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_limit_rate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_max_temp_file_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_next_upstream": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_next_upstream_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_next_upstream_tries": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_no_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "fastcgi_param": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23,
+    },
+    "fastcgi_pass": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "fastcgi_pass_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_pass_request_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_pass_request_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_request_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_send_lowat": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_socket_keepalive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "fastcgi_split_path_info": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_store": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_store_access": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "fastcgi_temp_file_write_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "fastcgi_temp_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+    },
+    "flv": {
+        ngxHTTPLocConf | ngxConfNoArgs,
+    },
+    "geo": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfTake12,
+        ngxStreamMainConf | ngxConfBlock | ngxConfTake12,
+    },
+    "geoip_city": {
+        ngxHTTPMainConf | ngxConfTake12,
+        ngxStreamMainConf | ngxConfTake12,
+    },
+    "geoip_country": {
+        ngxHTTPMainConf | ngxConfTake12,
+        ngxStreamMainConf | ngxConfTake12,
+    },
+    "geoip_org": {
+        ngxHTTPMainConf | ngxConfTake12,
+        ngxStreamMainConf | ngxConfTake12,
+    },
+    "geoip_proxy": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "geoip_proxy_recursive": {
+        ngxHTTPMainConf | ngxConfFlag,
+    },
+    "google_perftools_profiles": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "grpc_bind": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "grpc_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_hide_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ignore_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "grpc_intercept_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "grpc_next_upstream": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "grpc_next_upstream_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_next_upstream_tries": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_pass": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "grpc_pass_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_set_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "grpc_socket_keepalive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "grpc_ssl_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_certificate_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_ciphers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_conf_command": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "grpc_ssl_crl": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_password_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_protocols": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "grpc_ssl_server_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "grpc_ssl_session_reuse": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "grpc_ssl_trusted_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "grpc_ssl_verify": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "grpc_ssl_verify_depth": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "gunzip": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "gunzip_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "gzip": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "gzip_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "gzip_comp_level": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "gzip_disable": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "gzip_http_version": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "gzip_min_length": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "gzip_proxied": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "gzip_static": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "gzip_types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "gzip_vary": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "hash": {
+        ngxHTTPUpsConf | ngxConfTake12,
+        ngxStreamUpsConf | ngxConfTake12,
+    },
+    "http": {
+        ngxMainConf | ngxConfBlock | ngxConfNoArgs,
+    },
+    "http2": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "http2_body_preread_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_chunk_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "http2_idle_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_max_concurrent_pushes": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_max_concurrent_streams": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_max_field_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_max_header_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_max_requests": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http2_push": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "http2_push_preload": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "http2_recv_buffer_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "http2_recv_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http3": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "http3_hq": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "http3_max_concurrent_streams": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "http3_stream_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "if": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfExpr | ngxConf1More,
+    },
+    "if_modified_since": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "ignore_invalid_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "image_filter": {
+        ngxHTTPLocConf | ngxConfTake123,
+    },
+    "image_filter_buffer": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "image_filter_interlace": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "image_filter_jpeg_quality": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "image_filter_sharpen": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "image_filter_transparency": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "image_filter_webp_quality": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "imap_auth": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+    },
+    "imap_capabilities": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+    },
+    "imap_client_buffer": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "include": {
+        ngxAnyConf | ngxConfTake1,
+    },
+    "index": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "internal": {
+        ngxHTTPLocConf | ngxConfNoArgs,
+    },
+    "ip_hash": {
+        ngxHTTPUpsConf | ngxConfNoArgs,
+    },
+    "keepalive": {
+        ngxHTTPUpsConf | ngxConfTake1,
+    },
+    "keepalive_disable": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "keepalive_requests": {
+        ngxHTTPUpsConf | ngxConfTake1,
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "keepalive_time": {
+        ngxHTTPUpsConf | ngxConfTake1,
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "keepalive_timeout": {
+        ngxHTTPUpsConf | ngxConfTake1,
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "large_client_header_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake2,
+    },
+    "least_conn": {
+        ngxHTTPUpsConf | ngxConfNoArgs,
+        ngxStreamUpsConf | ngxConfNoArgs,
+    },
+    "limit_conn": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
+    },
+    "limit_conn_dry_run": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "limit_conn_log_level": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "limit_conn_status": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "limit_conn_zone": {
+        ngxHTTPMainConf | ngxConfTake2,
+        ngxStreamMainConf | ngxConfTake2,
+    },
+    "limit_except": {
+        ngxHTTPLocConf | ngxConfBlock | ngxConf1More,
+    },
+    "limit_rate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "limit_rate_after": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "limit_req": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "limit_req_dry_run": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "limit_req_log_level": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "limit_req_status": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "limit_req_zone": {
+        ngxHTTPMainConf | ngxConfTake3,
+    },
+    "lingering_close": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "lingering_time": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "lingering_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "listen": {
+        ngxHTTPSrvConf | ngxConf1More,
+        ngxMailSrvConf | ngxConf1More,
+        ngxStreamSrvConf | ngxConf1More,
+    },
+    "load_module": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "location": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfTake12,
+    },
+    "lock_file": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "log_format": {
+        ngxHTTPMainConf | ngxConf2More,
+        ngxStreamMainConf | ngxConf2More,
+    },
+    "log_not_found": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "log_subrequest": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "mail": {
+        ngxMainConf | ngxConfBlock | ngxConfNoArgs,
+    },
+    "map": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfTake2,
+        ngxStreamMainConf | ngxConfBlock | ngxConfTake2,
+    },
+    "map_hash_bucket_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+        ngxStreamMainConf | ngxConfTake1,
+    },
+    "map_hash_max_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+        ngxStreamMainConf | ngxConfTake1,
+    },
+    "master_process": {
+        ngxMainConf | ngxDirectConf | ngxConfFlag,
+    },
+    "max_errors": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "max_ranges": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_bind": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "memcached_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_gzip_flag": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_next_upstream": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "memcached_next_upstream_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_next_upstream_tries": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_pass": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "memcached_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "memcached_socket_keepalive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "merge_slashes": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "min_delete_depth": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "mirror": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "mirror_request_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "modern_browser": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "modern_browser_value": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "mp4": {
+        ngxHTTPLocConf | ngxConfNoArgs,
+    },
+    "mp4_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "mp4_max_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "mp4_start_key_frame": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "msie_padding": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "msie_refresh": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "multi_accept": {
+        ngxEventConf | ngxConfFlag,
+    },
+    "open_file_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "open_file_cache_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "open_file_cache_min_uses": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "open_file_cache_valid": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "open_log_file_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1234,
+    },
+    "output_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "override_charset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "pass": {
+        ngxStreamSrvConf | ngxConfTake1,
+    },
+    "pcre_jit": {
+        ngxMainConf | ngxDirectConf | ngxConfFlag,
+    },
+    "perl": {
+        ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
+    },
+    "perl_modules": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "perl_require": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "perl_set": {
+        ngxHTTPMainConf | ngxConfTake2,
+    },
+    "pid": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "pop3_auth": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+    },
+    "pop3_capabilities": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+    },
+    "port_in_redirect": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "postpone_output": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "preread_buffer_size": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "preread_timeout": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "protocol": {
+        ngxMailSrvConf | ngxConfTake1,
+    },
+    "proxy_bind": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12,
+    },
+    "proxy_buffer": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "proxy_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "proxy_busy_buffers_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache_background_update": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_cache_bypass": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "proxy_cache_convert_head": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_cache_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache_lock": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_cache_lock_age": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache_lock_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache_max_range_offset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache_methods": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "proxy_cache_min_uses": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_cache_path": {
+        ngxHTTPMainConf | ngxConf2More,
+    },
+    "proxy_cache_revalidate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_cache_use_stale": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "proxy_cache_valid": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "proxy_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_cookie_domain": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "proxy_cookie_flags": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+    },
+    "proxy_cookie_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "proxy_download_rate": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_force_ranges": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_half_close": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_headers_hash_bucket_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_headers_hash_max_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_hide_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_http_version": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_ignore_client_abort": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_ignore_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "proxy_intercept_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_limit_rate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_max_temp_file_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_method": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_next_upstream": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_next_upstream_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_next_upstream_tries": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_no_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "proxy_pass": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConfTake1,
+        ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_pass_error_message": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+    },
+    "proxy_pass_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_pass_request_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_pass_request_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_protocol": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_protocol_timeout": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_redirect": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "proxy_request_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "proxy_requests": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_responses": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_send_lowat": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_set_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_set_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "proxy_smtp_auth": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+    },
+    "proxy_socket_keepalive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_ssl": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_ssl_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_certificate_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_ciphers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_conf_command": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
+    },
+    "proxy_ssl_crl": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_password_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_protocols": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "proxy_ssl_server_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_ssl_session_reuse": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_ssl_trusted_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_ssl_verify": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "proxy_ssl_verify_depth": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_store": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_store_access": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "proxy_temp_file_write_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "proxy_temp_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+    },
+    "proxy_timeout": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "proxy_upload_rate": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "quic_active_connection_id_limit": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "quic_bpf": {
+        ngxMainConf | ngxDirectConf | ngxConfFlag,
+    },
+    "quic_gso": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "quic_host_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "quic_retry": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "random": {
+        ngxHTTPUpsConf | ngxConfNoArgs | ngxConfTake12,
+        ngxStreamUpsConf | ngxConfNoArgs | ngxConfTake12,
+    },
+    "random_index": {
+        ngxHTTPLocConf | ngxConfFlag,
+    },
+    "read_ahead": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "real_ip_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "real_ip_recursive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "recursive_error_pages": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "referer_hash_bucket_size": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "referer_hash_max_size": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "request_pool_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "reset_timedout_connection": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "resolver": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "resolver_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "return": {
+        ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake12,
+        ngxStreamSrvConf | ngxConfTake1,
+    },
+    "rewrite": {
+        ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23,
+    },
+    "rewrite_log": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "root": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "satisfy": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_bind": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "scgi_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "scgi_busy_buffers_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache_background_update": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_cache_bypass": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_cache_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache_lock": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_cache_lock_age": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache_lock_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache_max_range_offset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache_methods": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_cache_min_uses": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_cache_path": {
+        ngxHTTPMainConf | ngxConf2More,
+    },
+    "scgi_cache_revalidate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_cache_use_stale": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_cache_valid": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_force_ranges": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_hide_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_ignore_client_abort": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_ignore_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_intercept_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_limit_rate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_max_temp_file_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_next_upstream": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_next_upstream_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_next_upstream_tries": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_no_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "scgi_param": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23,
+    },
+    "scgi_pass": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "scgi_pass_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_pass_request_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_pass_request_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_request_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_socket_keepalive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "scgi_store": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_store_access": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "scgi_temp_file_write_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "scgi_temp_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+    },
+    "secure_link": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "secure_link_md5": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "secure_link_secret": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "send_lowat": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "sendfile": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "sendfile_max_chunk": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "server": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfNoArgs,
+        ngxHTTPUpsConf | ngxConf1More,
+        ngxMailMainConf | ngxConfBlock | ngxConfNoArgs,
+        ngxStreamMainConf | ngxConfBlock | ngxConfNoArgs,
+        ngxStreamUpsConf | ngxConf1More,
+    },
+    "server_name": {
+        ngxHTTPSrvConf | ngxConf1More,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamSrvConf | ngxConf1More,
+    },
+    "server_name_in_redirect": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "server_names_hash_bucket_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+        ngxStreamMainConf | ngxConfTake1,
+    },
+    "server_names_hash_max_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+        ngxStreamMainConf | ngxConfTake1,
+    },
+    "server_tokens": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "set": {
+        ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake2,
+        ngxStreamSrvConf | ngxConfTake2,
+    },
+    "set_real_ip_from": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "slice": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "smtp_auth": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+    },
+    "smtp_capabilities": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+    },
+    "smtp_client_buffer": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "smtp_greeting_delay": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "source_charset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "split_clients": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfTake2,
+        ngxStreamMainConf | ngxConfBlock | ngxConfTake2,
+    },
+    "ssi": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "ssi_last_modified": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "ssi_min_file_chunk": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "ssi_silent_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "ssi_types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "ssi_value_length": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "ssl_alpn": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "ssl_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_certificate_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_ciphers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_client_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_conf_command": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake2,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake2,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
+    },
+    "ssl_crl": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_dhparam": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_early_data": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "ssl_ecdh_curve": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_engine": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "ssl_handshake_timeout": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_ocsp": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "ssl_ocsp_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_ocsp_responder": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_password_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_prefer_server_ciphers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "ssl_preread": {
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "ssl_protocols": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConf1More,
+        ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
+    },
+    "ssl_reject_handshake": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "ssl_session_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake12,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake12,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12,
+    },
+    "ssl_session_ticket_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_session_tickets": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "ssl_session_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_stapling": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "ssl_stapling_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_stapling_responder": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+    },
+    "ssl_stapling_verify": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "ssl_trusted_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_verify_client": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "ssl_verify_depth": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
+    },
+    "starttls": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "stream": {
+        ngxMainConf | ngxConfBlock | ngxConfNoArgs,
+    },
+    "stub_status": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfNoArgs | ngxConfTake1,
+    },
+    "sub_filter": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "sub_filter_last_modified": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "sub_filter_once": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "sub_filter_types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "subrequest_output_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "tcp_nodelay": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+        ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
+    },
+    "tcp_nopush": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "thread_pool": {
+        ngxMainConf | ngxDirectConf | ngxConfTake23,
+    },
+    "timeout": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
+    },
+    "timer_resolution": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "try_files": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf2More,
+    },
+    "types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfNoArgs,
+    },
+    "types_hash_bucket_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "types_hash_max_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "underscores_in_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
+    },
+    "uninitialized_variable_warn": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
+    },
+    "upstream": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfTake1,
+        ngxStreamMainConf | ngxConfBlock | ngxConfTake1,
+    },
+    "use": {
+        ngxEventConf | ngxConfTake1,
+    },
+    "user": {
+        ngxMainConf | ngxDirectConf | ngxConfTake12,
+    },
+    "userid": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_domain": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_expires": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_flags": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "userid_mark": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_p3p": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "userid_service": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_bind": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
+    },
+    "uwsgi_buffer_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_buffers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "uwsgi_busy_buffers_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_background_update": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_bypass": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_cache_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_lock": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_cache_lock_age": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_lock_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_max_range_offset": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_methods": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_cache_min_uses": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_cache_path": {
+        ngxHTTPMainConf | ngxConf2More,
+    },
+    "uwsgi_cache_revalidate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_cache_use_stale": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_cache_valid": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_connect_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_force_ranges": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_hide_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ignore_client_abort": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_ignore_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_intercept_errors": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_limit_rate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_max_temp_file_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_modifier1": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_modifier2": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_next_upstream": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_next_upstream_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_next_upstream_tries": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_no_cache": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_param": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23,
+    },
+    "uwsgi_pass": {
+        ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
+    },
+    "uwsgi_pass_header": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_pass_request_body": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_pass_request_headers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_read_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_request_buffering": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_send_timeout": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_socket_keepalive": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_ssl_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_certificate_key": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_ciphers": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_conf_command": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "uwsgi_ssl_crl": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_password_file": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_protocols": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "uwsgi_ssl_server_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_ssl_session_reuse": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_ssl_trusted_certificate": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_ssl_verify": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "uwsgi_ssl_verify_depth": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_store": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_store_access": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
+    },
+    "uwsgi_temp_file_write_size": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "uwsgi_temp_path": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
+    },
+    "valid_referers": {
+        ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "variables_hash_bucket_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+        ngxStreamMainConf | ngxConfTake1,
+    },
+    "variables_hash_max_size": {
+        ngxHTTPMainConf | ngxConfTake1,
+        ngxStreamMainConf | ngxConfTake1,
+    },
+    "worker_aio_requests": {
+        ngxEventConf | ngxConfTake1,
+    },
+    "worker_connections": {
+        ngxEventConf | ngxConfTake1,
+    },
+    "worker_cpu_affinity": {
+        ngxMainConf | ngxDirectConf | ngxConf1More,
+    },
+    "worker_priority": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "worker_processes": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "worker_rlimit_core": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "worker_rlimit_nofile": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "worker_shutdown_timeout": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "working_directory": {
+        ngxMainConf | ngxDirectConf | ngxConfTake1,
+    },
+    "xclient": {
+        ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
+    },
+    "xml_entities": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "xslt_last_modified": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
+    },
+    "xslt_param": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "xslt_string_param": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "xslt_stylesheet": {
+        ngxHTTPLocConf | ngxConf1More,
+    },
+    "xslt_types": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
+    },
+    "zone": {
+        ngxHTTPUpsConf | ngxConfTake12,
+        ngxStreamUpsConf | ngxConfTake12,
+    },
+}
+
+// MatchOssLatest contains directives in latest version of OSS source code(including GEOIP, Perl, and XSLT)
+func MatchOssLatest(directive string) ([]uint, bool) {
+    m, ok := ossLatestDirectives[directive]
+    return m, ok
+}
diff --git a/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_latest_directives.go b/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_latest_directives.go
deleted file mode 100644
index c74abb00c4..0000000000
--- a/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_oss_latest_directives.go
+++ /dev/null
@@ -1,1906 +0,0 @@
-/**
- * Copyright (c) F5, Inc.
- *
- * This source code is licensed under the Apache License, Version 2.0 license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-// All the definitions are extracted from the source code
-// Each bit mask describes these behaviors:
-//   - how many arguments the directive can take
-//   - whether or not it is a block directive
-//   - whether this is a flag (takes one argument that's either "on" or "off")
-//   - which contexts it's allowed to be in
-
-package crossplane
-
-//nolint:gochecknoglobals
-var ngxOssLatestDirectives = map[string][]uint{
-	"absolute_redirect": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"accept_mutex": {
-		ngxEventConf | ngxConfFlag,
-	},
-	"accept_mutex_delay": {
-		ngxEventConf | ngxConfTake1,
-	},
-	"access_log": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"add_after_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"add_before_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"add_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23,
-	},
-	"add_trailer": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23,
-	},
-	"addition_types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"aio": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"aio_write": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"alias": {
-		ngxHTTPLocConf | ngxConfTake1,
-	},
-	"allow": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ancient_browser": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"ancient_browser_value": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"auth_basic": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
-	},
-	"auth_basic_user_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
-	},
-	"auth_delay": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"auth_http": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"auth_http_header": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake2,
-	},
-	"auth_http_pass_client_cert": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-	},
-	"auth_http_timeout": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"auth_request": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"auth_request_set": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"autoindex": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"autoindex_exact_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"autoindex_format": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"autoindex_localtime": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"break": {
-		ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfNoArgs,
-	},
-	"charset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"charset_map": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfTake2,
-	},
-	"charset_types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"chunked_transfer_encoding": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"client_body_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"client_body_in_file_only": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"client_body_in_single_buffer": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"client_body_temp_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-	},
-	"client_body_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"client_header_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"client_header_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"client_max_body_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"connection_pool_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"create_full_put_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"daemon": {
-		ngxMainConf | ngxDirectConf | ngxConfFlag,
-	},
-	"dav_access": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"dav_methods": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"debug_connection": {
-		ngxEventConf | ngxConfTake1,
-	},
-	"debug_points": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"default_type": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"deny": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"directio": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"directio_alignment": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"disable_symlinks": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"empty_gif": {
-		ngxHTTPLocConf | ngxConfNoArgs,
-	},
-	"env": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"error_log": {
-		ngxMainConf | ngxConf1More,
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"error_page": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConf2More,
-	},
-	"etag": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"events": {
-		ngxMainConf | ngxConfBlock | ngxConfNoArgs,
-	},
-	"expires": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake12,
-	},
-	"fastcgi_bind": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"fastcgi_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"fastcgi_busy_buffers_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache_background_update": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_cache_bypass": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_cache_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache_lock": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_cache_lock_age": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache_lock_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache_max_range_offset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache_methods": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_cache_min_uses": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_cache_path": {
-		ngxHTTPMainConf | ngxConf2More,
-	},
-	"fastcgi_cache_revalidate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_cache_use_stale": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_cache_valid": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_catch_stderr": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_force_ranges": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_hide_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_ignore_client_abort": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_ignore_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_index": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_intercept_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_keep_conn": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_limit_rate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_max_temp_file_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_next_upstream": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_next_upstream_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_next_upstream_tries": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_no_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"fastcgi_param": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23,
-	},
-	"fastcgi_pass": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"fastcgi_pass_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_pass_request_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_pass_request_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_request_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_send_lowat": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_socket_keepalive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"fastcgi_split_path_info": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_store": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_store_access": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"fastcgi_temp_file_write_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"fastcgi_temp_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-	},
-	"flv": {
-		ngxHTTPLocConf | ngxConfNoArgs,
-	},
-	"geo": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfTake12,
-		ngxStreamMainConf | ngxConfBlock | ngxConfTake12,
-	},
-	"geoip_city": {
-		ngxHTTPMainConf | ngxConfTake12,
-		ngxStreamMainConf | ngxConfTake12,
-	},
-	"geoip_country": {
-		ngxHTTPMainConf | ngxConfTake12,
-		ngxStreamMainConf | ngxConfTake12,
-	},
-	"geoip_org": {
-		ngxHTTPMainConf | ngxConfTake12,
-		ngxStreamMainConf | ngxConfTake12,
-	},
-	"geoip_proxy": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"geoip_proxy_recursive": {
-		ngxHTTPMainConf | ngxConfFlag,
-	},
-	"google_perftools_profiles": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"grpc_bind": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"grpc_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_hide_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ignore_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"grpc_intercept_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"grpc_next_upstream": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"grpc_next_upstream_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_next_upstream_tries": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_pass": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"grpc_pass_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_set_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"grpc_socket_keepalive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"grpc_ssl_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_certificate_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_ciphers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_conf_command": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"grpc_ssl_crl": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_password_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_protocols": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"grpc_ssl_server_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"grpc_ssl_session_reuse": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"grpc_ssl_trusted_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"grpc_ssl_verify": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"grpc_ssl_verify_depth": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"gunzip": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"gunzip_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"gzip": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"gzip_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"gzip_comp_level": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"gzip_disable": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"gzip_http_version": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"gzip_min_length": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"gzip_proxied": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"gzip_static": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"gzip_types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"gzip_vary": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"hash": {
-		ngxHTTPUpsConf | ngxConfTake12,
-		ngxStreamUpsConf | ngxConfTake12,
-	},
-	"http": {
-		ngxMainConf | ngxConfBlock | ngxConfNoArgs,
-	},
-	"http2": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"http2_body_preread_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_chunk_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"http2_idle_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_max_concurrent_pushes": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_max_concurrent_streams": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_max_field_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_max_header_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_max_requests": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http2_push": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"http2_push_preload": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"http2_recv_buffer_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"http2_recv_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http3": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"http3_hq": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"http3_max_concurrent_streams": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"http3_stream_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"if": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfExpr | ngxConf1More,
-	},
-	"if_modified_since": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"ignore_invalid_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"image_filter": {
-		ngxHTTPLocConf | ngxConfTake123,
-	},
-	"image_filter_buffer": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"image_filter_interlace": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"image_filter_jpeg_quality": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"image_filter_sharpen": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"image_filter_transparency": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"image_filter_webp_quality": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"imap_auth": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-	},
-	"imap_capabilities": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-	},
-	"imap_client_buffer": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"include": {
-		ngxAnyConf | ngxConfTake1,
-	},
-	"index": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"internal": {
-		ngxHTTPLocConf | ngxConfNoArgs,
-	},
-	"ip_hash": {
-		ngxHTTPUpsConf | ngxConfNoArgs,
-	},
-	"keepalive": {
-		ngxHTTPUpsConf | ngxConfTake1,
-	},
-	"keepalive_disable": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"keepalive_requests": {
-		ngxHTTPUpsConf | ngxConfTake1,
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"keepalive_time": {
-		ngxHTTPUpsConf | ngxConfTake1,
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"keepalive_timeout": {
-		ngxHTTPUpsConf | ngxConfTake1,
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"large_client_header_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake2,
-	},
-	"least_conn": {
-		ngxHTTPUpsConf | ngxConfNoArgs,
-		ngxStreamUpsConf | ngxConfNoArgs,
-	},
-	"limit_conn": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
-	},
-	"limit_conn_dry_run": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"limit_conn_log_level": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"limit_conn_status": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"limit_conn_zone": {
-		ngxHTTPMainConf | ngxConfTake2,
-		ngxStreamMainConf | ngxConfTake2,
-	},
-	"limit_except": {
-		ngxHTTPLocConf | ngxConfBlock | ngxConf1More,
-	},
-	"limit_rate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"limit_rate_after": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"limit_req": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"limit_req_dry_run": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"limit_req_log_level": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"limit_req_status": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"limit_req_zone": {
-		ngxHTTPMainConf | ngxConfTake3,
-	},
-	"lingering_close": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"lingering_time": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"lingering_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"listen": {
-		ngxHTTPSrvConf | ngxConf1More,
-		ngxMailSrvConf | ngxConf1More,
-		ngxStreamSrvConf | ngxConf1More,
-	},
-	"load_module": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"location": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfTake12,
-	},
-	"lock_file": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"log_format": {
-		ngxHTTPMainConf | ngxConf2More,
-		ngxStreamMainConf | ngxConf2More,
-	},
-	"log_not_found": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"log_subrequest": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"mail": {
-		ngxMainConf | ngxConfBlock | ngxConfNoArgs,
-	},
-	"map": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfTake2,
-		ngxStreamMainConf | ngxConfBlock | ngxConfTake2,
-	},
-	"map_hash_bucket_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-		ngxStreamMainConf | ngxConfTake1,
-	},
-	"map_hash_max_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-		ngxStreamMainConf | ngxConfTake1,
-	},
-	"master_process": {
-		ngxMainConf | ngxDirectConf | ngxConfFlag,
-	},
-	"max_errors": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"max_ranges": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_bind": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"memcached_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_gzip_flag": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_next_upstream": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"memcached_next_upstream_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_next_upstream_tries": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_pass": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"memcached_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"memcached_socket_keepalive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"merge_slashes": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"min_delete_depth": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"mirror": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"mirror_request_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"modern_browser": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"modern_browser_value": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"mp4": {
-		ngxHTTPLocConf | ngxConfNoArgs,
-	},
-	"mp4_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"mp4_max_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"mp4_start_key_frame": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"msie_padding": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"msie_refresh": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"multi_accept": {
-		ngxEventConf | ngxConfFlag,
-	},
-	"open_file_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"open_file_cache_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"open_file_cache_min_uses": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"open_file_cache_valid": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"open_log_file_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1234,
-	},
-	"output_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"override_charset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"pass": {
-		ngxStreamSrvConf | ngxConfTake1,
-	},
-	"pcre_jit": {
-		ngxMainConf | ngxDirectConf | ngxConfFlag,
-	},
-	"perl": {
-		ngxHTTPLocConf | ngxHTTPLmtConf | ngxConfTake1,
-	},
-	"perl_modules": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"perl_require": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"perl_set": {
-		ngxHTTPMainConf | ngxConfTake2,
-	},
-	"pid": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"pop3_auth": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-	},
-	"pop3_capabilities": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-	},
-	"port_in_redirect": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"postpone_output": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"preread_buffer_size": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"preread_timeout": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"protocol": {
-		ngxMailSrvConf | ngxConfTake1,
-	},
-	"proxy_bind": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12,
-	},
-	"proxy_buffer": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"proxy_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"proxy_busy_buffers_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache_background_update": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_cache_bypass": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"proxy_cache_convert_head": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_cache_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache_lock": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_cache_lock_age": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache_lock_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache_max_range_offset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache_methods": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"proxy_cache_min_uses": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_cache_path": {
-		ngxHTTPMainConf | ngxConf2More,
-	},
-	"proxy_cache_revalidate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_cache_use_stale": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"proxy_cache_valid": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"proxy_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_cookie_domain": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"proxy_cookie_flags": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-	},
-	"proxy_cookie_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"proxy_download_rate": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_force_ranges": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_half_close": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_headers_hash_bucket_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_headers_hash_max_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_hide_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_http_version": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_ignore_client_abort": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_ignore_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"proxy_intercept_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_limit_rate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_max_temp_file_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_method": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_next_upstream": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_next_upstream_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_next_upstream_tries": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_no_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"proxy_pass": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxHTTPLmtConf | ngxConfTake1,
-		ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_pass_error_message": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-	},
-	"proxy_pass_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_pass_request_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_pass_request_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_protocol": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_protocol_timeout": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_redirect": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"proxy_request_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"proxy_requests": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_responses": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_send_lowat": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_set_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_set_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"proxy_smtp_auth": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-	},
-	"proxy_socket_keepalive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_ssl": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_ssl_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_certificate_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_ciphers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_conf_command": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
-	},
-	"proxy_ssl_crl": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_password_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_protocols": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"proxy_ssl_server_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_ssl_session_reuse": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_ssl_trusted_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_ssl_verify": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"proxy_ssl_verify_depth": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_store": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_store_access": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"proxy_temp_file_write_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"proxy_temp_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-	},
-	"proxy_timeout": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"proxy_upload_rate": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"quic_active_connection_id_limit": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"quic_bpf": {
-		ngxMainConf | ngxDirectConf | ngxConfFlag,
-	},
-	"quic_gso": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"quic_host_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"quic_retry": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"random": {
-		ngxHTTPUpsConf | ngxConfNoArgs | ngxConfTake12,
-		ngxStreamUpsConf | ngxConfNoArgs | ngxConfTake12,
-	},
-	"random_index": {
-		ngxHTTPLocConf | ngxConfFlag,
-	},
-	"read_ahead": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"real_ip_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"real_ip_recursive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"recursive_error_pages": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"referer_hash_bucket_size": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"referer_hash_max_size": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"request_pool_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"reset_timedout_connection": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"resolver": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"resolver_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"return": {
-		ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake12,
-		ngxStreamSrvConf | ngxConfTake1,
-	},
-	"rewrite": {
-		ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake23,
-	},
-	"rewrite_log": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"root": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"satisfy": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_bind": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"scgi_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"scgi_busy_buffers_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache_background_update": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_cache_bypass": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_cache_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache_lock": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_cache_lock_age": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache_lock_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache_max_range_offset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache_methods": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_cache_min_uses": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_cache_path": {
-		ngxHTTPMainConf | ngxConf2More,
-	},
-	"scgi_cache_revalidate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_cache_use_stale": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_cache_valid": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_force_ranges": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_hide_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_ignore_client_abort": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_ignore_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_intercept_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_limit_rate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_max_temp_file_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_next_upstream": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_next_upstream_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_next_upstream_tries": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_no_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"scgi_param": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23,
-	},
-	"scgi_pass": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"scgi_pass_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_pass_request_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_pass_request_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_request_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_socket_keepalive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"scgi_store": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_store_access": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"scgi_temp_file_write_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"scgi_temp_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-	},
-	"secure_link": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"secure_link_md5": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"secure_link_secret": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"send_lowat": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"sendfile": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"sendfile_max_chunk": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"server": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfNoArgs,
-		ngxHTTPUpsConf | ngxConf1More,
-		ngxMailMainConf | ngxConfBlock | ngxConfNoArgs,
-		ngxStreamMainConf | ngxConfBlock | ngxConfNoArgs,
-		ngxStreamUpsConf | ngxConf1More,
-	},
-	"server_name": {
-		ngxHTTPSrvConf | ngxConf1More,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamSrvConf | ngxConf1More,
-	},
-	"server_name_in_redirect": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"server_names_hash_bucket_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-		ngxStreamMainConf | ngxConfTake1,
-	},
-	"server_names_hash_max_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-		ngxStreamMainConf | ngxConfTake1,
-	},
-	"server_tokens": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"set": {
-		ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake2,
-		ngxStreamSrvConf | ngxConfTake2,
-	},
-	"set_real_ip_from": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"slice": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"smtp_auth": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-	},
-	"smtp_capabilities": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-	},
-	"smtp_client_buffer": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"smtp_greeting_delay": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"source_charset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"split_clients": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfTake2,
-		ngxStreamMainConf | ngxConfBlock | ngxConfTake2,
-	},
-	"ssi": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"ssi_last_modified": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"ssi_min_file_chunk": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"ssi_silent_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"ssi_types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"ssi_value_length": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"ssl_alpn": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"ssl_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_certificate_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_ciphers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_client_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_conf_command": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake2,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake2,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake2,
-	},
-	"ssl_crl": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_dhparam": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_early_data": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"ssl_ecdh_curve": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_engine": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"ssl_handshake_timeout": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_ocsp": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"ssl_ocsp_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_ocsp_responder": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_password_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_prefer_server_ciphers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"ssl_preread": {
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"ssl_protocols": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConf1More,
-		ngxMailMainConf | ngxMailSrvConf | ngxConf1More,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConf1More,
-	},
-	"ssl_reject_handshake": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"ssl_session_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake12,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake12,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake12,
-	},
-	"ssl_session_ticket_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_session_tickets": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"ssl_session_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_stapling": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"ssl_stapling_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_stapling_responder": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-	},
-	"ssl_stapling_verify": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"ssl_trusted_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_verify_client": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"ssl_verify_depth": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfTake1,
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfTake1,
-	},
-	"starttls": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"stream": {
-		ngxMainConf | ngxConfBlock | ngxConfNoArgs,
-	},
-	"stub_status": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfNoArgs | ngxConfTake1,
-	},
-	"sub_filter": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"sub_filter_last_modified": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"sub_filter_once": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"sub_filter_types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"subrequest_output_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"tcp_nodelay": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-		ngxStreamMainConf | ngxStreamSrvConf | ngxConfFlag,
-	},
-	"tcp_nopush": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"thread_pool": {
-		ngxMainConf | ngxDirectConf | ngxConfTake23,
-	},
-	"timeout": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfTake1,
-	},
-	"timer_resolution": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"try_files": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf2More,
-	},
-	"types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfBlock | ngxConfNoArgs,
-	},
-	"types_hash_bucket_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"types_hash_max_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"underscores_in_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxConfFlag,
-	},
-	"uninitialized_variable_warn": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPSifConf | ngxHTTPLocConf | ngxHTTPLifConf | ngxConfFlag,
-	},
-	"upstream": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfTake1,
-		ngxStreamMainConf | ngxConfBlock | ngxConfTake1,
-	},
-	"use": {
-		ngxEventConf | ngxConfTake1,
-	},
-	"user": {
-		ngxMainConf | ngxDirectConf | ngxConfTake12,
-	},
-	"userid": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_domain": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_expires": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_flags": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"userid_mark": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_p3p": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"userid_service": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_bind": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake12,
-	},
-	"uwsgi_buffer_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_buffers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"uwsgi_busy_buffers_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_background_update": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_bypass": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_cache_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_lock": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_cache_lock_age": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_lock_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_max_range_offset": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_methods": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_cache_min_uses": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_cache_path": {
-		ngxHTTPMainConf | ngxConf2More,
-	},
-	"uwsgi_cache_revalidate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_cache_use_stale": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_cache_valid": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_connect_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_force_ranges": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_hide_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ignore_client_abort": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_ignore_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_intercept_errors": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_limit_rate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_max_temp_file_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_modifier1": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_modifier2": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_next_upstream": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_next_upstream_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_next_upstream_tries": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_no_cache": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_param": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake23,
-	},
-	"uwsgi_pass": {
-		ngxHTTPLocConf | ngxHTTPLifConf | ngxConfTake1,
-	},
-	"uwsgi_pass_header": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_pass_request_body": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_pass_request_headers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_read_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_request_buffering": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_send_timeout": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_socket_keepalive": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_ssl_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_certificate_key": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_ciphers": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_conf_command": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"uwsgi_ssl_crl": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_password_file": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_protocols": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"uwsgi_ssl_server_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_ssl_session_reuse": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_ssl_trusted_certificate": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_ssl_verify": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"uwsgi_ssl_verify_depth": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_store": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_store_access": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake123,
-	},
-	"uwsgi_temp_file_write_size": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"uwsgi_temp_path": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1234,
-	},
-	"valid_referers": {
-		ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"variables_hash_bucket_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-		ngxStreamMainConf | ngxConfTake1,
-	},
-	"variables_hash_max_size": {
-		ngxHTTPMainConf | ngxConfTake1,
-		ngxStreamMainConf | ngxConfTake1,
-	},
-	"worker_aio_requests": {
-		ngxEventConf | ngxConfTake1,
-	},
-	"worker_connections": {
-		ngxEventConf | ngxConfTake1,
-	},
-	"worker_cpu_affinity": {
-		ngxMainConf | ngxDirectConf | ngxConf1More,
-	},
-	"worker_priority": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"worker_processes": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"worker_rlimit_core": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"worker_rlimit_nofile": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"worker_shutdown_timeout": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"working_directory": {
-		ngxMainConf | ngxDirectConf | ngxConfTake1,
-	},
-	"xclient": {
-		ngxMailMainConf | ngxMailSrvConf | ngxConfFlag,
-	},
-	"xml_entities": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"xslt_last_modified": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfFlag,
-	},
-	"xslt_param": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"xslt_string_param": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"xslt_stylesheet": {
-		ngxHTTPLocConf | ngxConf1More,
-	},
-	"xslt_types": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConf1More,
-	},
-	"zone": {
-		ngxHTTPUpsConf | ngxConfTake12,
-		ngxStreamUpsConf | ngxConfTake12,
-	},
-}
-
-func OssLatestDirectivesMatchFn(directive string) ([]uint, bool) {
-	masks, matched := ngxOssLatestDirectives[directive]
-	return masks, matched
-}
diff --git a/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_otel_directives.gen.go b/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_otel_directives.gen.go
new file mode 100644
index 0000000000..5047bf39f2
--- /dev/null
+++ b/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_otel_directives.gen.go
@@ -0,0 +1,43 @@
+/**
+ * Copyright (c) F5, Inc.
+ *
+ * This source code is licensed under the Apache License, Version 2.0 license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+// Code generated by generator; DO NOT EDIT.
+// All the definitions are extracted from the source code
+// Each bit mask describes these behaviors:
+//   - how many arguments the directive can take
+//   - whether or not it is a block directive
+//   - whether this is a flag (takes one argument that's either "on" or "off")
+//   - which contexts it's allowed to be in
+
+package crossplane
+
+var otelDirectives = map[string][]uint{
+    "otel_exporter": {
+        ngxHTTPMainConf | ngxConfBlock | ngxConfNoArgs,
+    },
+    "otel_service_name": {
+        ngxHTTPMainConf | ngxConfTake1,
+    },
+    "otel_span_attr": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
+    },
+    "otel_span_name": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "otel_trace": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+    "otel_trace_context": {
+        ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
+    },
+}
+
+// MatchOtelLatest is a MatchFunc for latest version of otel.
+func MatchOtelLatest(directive string) ([]uint, bool) {
+    m, ok := otelDirectives[directive]
+    return m, ok
+}
diff --git a/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_otel_directives.go b/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_otel_directives.go
deleted file mode 100644
index b597179ff2..0000000000
--- a/vendor/github.com/nginxinc/nginx-go-crossplane/analyze_otel_directives.go
+++ /dev/null
@@ -1,54 +0,0 @@
-/**
- * Copyright (c) F5, Inc.
- *
- * This source code is licensed under the Apache License, Version 2.0 license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-// All the definitions are extracted from the source code
-// Each bit mask describes these behaviors:
-//   - how many arguments the directive can take
-//   - whether or not it is a block directive
-//   - whether this is a flag (takes one argument that's either "on" or "off")
-//   - which contexts it's allowed to be in
-
-package crossplane
-
-//nolint:gochecknoglobals
-var moduleOtelDirectives = map[string][]uint{
-	"batch_count": {
-		ngxConfTake1,
-	},
-	"batch_size": {
-		ngxConfTake1,
-	},
-	"endpoint": {
-		ngxConfTake1,
-	},
-	"interval": {
-		ngxConfTake1,
-	},
-	"otel_exporter": {
-		ngxHTTPMainConf | ngxConfBlock | ngxConfNoArgs,
-	},
-	"otel_service_name": {
-		ngxHTTPMainConf | ngxConfTake1,
-	},
-	"otel_span_attr": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake2,
-	},
-	"otel_span_name": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"otel_trace": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-	"otel_trace_context": {
-		ngxHTTPMainConf | ngxHTTPSrvConf | ngxHTTPLocConf | ngxConfTake1,
-	},
-}
-
-func OtelDirectivesMatchFn(directive string) ([]uint, bool) {
-	masks, matched := moduleOtelDirectives[directive]
-	return masks, matched
-}
diff --git a/vendor/github.com/nginxinc/nginx-go-crossplane/buffer.go b/vendor/github.com/nginxinc/nginx-go-crossplane/buffer.go
index f43186fcaa..0da6dcac32 100644
--- a/vendor/github.com/nginxinc/nginx-go-crossplane/buffer.go
+++ b/vendor/github.com/nginxinc/nginx-go-crossplane/buffer.go
@@ -14,7 +14,7 @@ import (
 
 // Creator abstracts file creation (to write configs to something other than files).
 type Creator interface {
-	Create(string) (io.WriteCloser, error)
+	Create(path string) (io.WriteCloser, error)
 	Reset()
 }
 
diff --git a/vendor/github.com/nginxinc/nginx-go-crossplane/parse.go b/vendor/github.com/nginxinc/nginx-go-crossplane/parse.go
index 4d44904709..2f3126f7d5 100644
--- a/vendor/github.com/nginxinc/nginx-go-crossplane/parse.go
+++ b/vendor/github.com/nginxinc/nginx-go-crossplane/parse.go
@@ -385,7 +385,6 @@ func (p *parser) parse(parsing *Config, tokens <-chan NgxToken, ctx blockCtx, co
 				// if the file pattern was explicit, nginx will check
 				// that the included file can be opened and read
 				if f, err := p.openFile(pattern); err != nil {
-					defer f.Close()
 					perr := &ParseError{
 						What:      err.Error(),
 						File:      &parsing.File,
@@ -399,6 +398,7 @@ func (p *parser) parse(parsing *Config, tokens <-chan NgxToken, ctx blockCtx, co
 						return nil, perr
 					}
 				} else {
+					defer f.Close()
 					fnames = []string{pattern}
 				}
 			}
diff --git a/vendor/github.com/nginxinc/nginx-go-crossplane/tools.go b/vendor/github.com/nginxinc/nginx-go-crossplane/tools.go
index 2114566b8f..ece0bb62e4 100644
--- a/vendor/github.com/nginxinc/nginx-go-crossplane/tools.go
+++ b/vendor/github.com/nginxinc/nginx-go-crossplane/tools.go
@@ -4,10 +4,10 @@
 // This file just exists to ensure we download the tools we need for building
 // See https://github.com/golang/go/wiki/Modules#how-can-i-track-tool-dependencies-for-a-module
 
-package tools
+package crossplane
 
 import (
-	_ "github.com/jstemmer/go-junit-report"
-	_ "github.com/maxbrunsfeld/counterfeiter/v6"
-	_ "golang.org/x/tools/cmd/goimports"
+	_ "github.com/jstemmer/go-junit-report/parser"
+	_ "github.com/maxbrunsfeld/counterfeiter/v6/generator"
+	_ "golang.org/x/tools/imports"
 )
diff --git a/vendor/github.com/nginxinc/nginx-go-crossplane/util.go b/vendor/github.com/nginxinc/nginx-go-crossplane/util.go
index d2e84adeb9..b7af673bf8 100644
--- a/vendor/github.com/nginxinc/nginx-go-crossplane/util.go
+++ b/vendor/github.com/nginxinc/nginx-go-crossplane/util.go
@@ -64,7 +64,7 @@ func validExpr(d *Directive) bool {
 		strings.HasSuffix(d.Args[e], ")") &&
 		((l == 1 && len(d.Args[b]) > 2) || // empty expression single arg '()'
 			(l == 2 && (len(d.Args[b]) > 1 || len(d.Args[e]) > 1)) || // empty expression two args '(', ')'
-			(l > 2))
+			(l > 2)) //nolint: mnd
 }
 
 // prepareIfArgs removes parentheses from an `if` directive's arguments.
diff --git a/vendor/github.com/stretchr/testify/assert/assertion_compare.go b/vendor/github.com/stretchr/testify/assert/assertion_compare.go
index 4d4b4aad6f..7e19eba090 100644
--- a/vendor/github.com/stretchr/testify/assert/assertion_compare.go
+++ b/vendor/github.com/stretchr/testify/assert/assertion_compare.go
@@ -7,10 +7,13 @@ import (
 	"time"
 )
 
-type CompareType int
+// Deprecated: CompareType has only ever been for internal use and has accidentally been published since v1.6.0. Do not use it.
+type CompareType = compareResult
+
+type compareResult int
 
 const (
-	compareLess CompareType = iota - 1
+	compareLess compareResult = iota - 1
 	compareEqual
 	compareGreater
 )
@@ -39,7 +42,7 @@ var (
 	bytesType = reflect.TypeOf([]byte{})
 )
 
-func compare(obj1, obj2 interface{}, kind reflect.Kind) (CompareType, bool) {
+func compare(obj1, obj2 interface{}, kind reflect.Kind) (compareResult, bool) {
 	obj1Value := reflect.ValueOf(obj1)
 	obj2Value := reflect.ValueOf(obj2)
 
@@ -325,7 +328,13 @@ func compare(obj1, obj2 interface{}, kind reflect.Kind) (CompareType, bool) {
 				timeObj2 = obj2Value.Convert(timeType).Interface().(time.Time)
 			}
 
-			return compare(timeObj1.UnixNano(), timeObj2.UnixNano(), reflect.Int64)
+			if timeObj1.Before(timeObj2) {
+				return compareLess, true
+			}
+			if timeObj1.Equal(timeObj2) {
+				return compareEqual, true
+			}
+			return compareGreater, true
 		}
 	case reflect.Slice:
 		{
@@ -345,7 +354,7 @@ func compare(obj1, obj2 interface{}, kind reflect.Kind) (CompareType, bool) {
 				bytesObj2 = obj2Value.Convert(bytesType).Interface().([]byte)
 			}
 
-			return CompareType(bytes.Compare(bytesObj1, bytesObj2)), true
+			return compareResult(bytes.Compare(bytesObj1, bytesObj2)), true
 		}
 	case reflect.Uintptr:
 		{
@@ -381,7 +390,7 @@ func Greater(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
 	}
-	return compareTwoValues(t, e1, e2, []CompareType{compareGreater}, "\"%v\" is not greater than \"%v\"", msgAndArgs...)
+	return compareTwoValues(t, e1, e2, []compareResult{compareGreater}, "\"%v\" is not greater than \"%v\"", msgAndArgs...)
 }
 
 // GreaterOrEqual asserts that the first element is greater than or equal to the second
@@ -394,7 +403,7 @@ func GreaterOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...in
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
 	}
-	return compareTwoValues(t, e1, e2, []CompareType{compareGreater, compareEqual}, "\"%v\" is not greater than or equal to \"%v\"", msgAndArgs...)
+	return compareTwoValues(t, e1, e2, []compareResult{compareGreater, compareEqual}, "\"%v\" is not greater than or equal to \"%v\"", msgAndArgs...)
 }
 
 // Less asserts that the first element is less than the second
@@ -406,7 +415,7 @@ func Less(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{})
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
 	}
-	return compareTwoValues(t, e1, e2, []CompareType{compareLess}, "\"%v\" is not less than \"%v\"", msgAndArgs...)
+	return compareTwoValues(t, e1, e2, []compareResult{compareLess}, "\"%v\" is not less than \"%v\"", msgAndArgs...)
 }
 
 // LessOrEqual asserts that the first element is less than or equal to the second
@@ -419,7 +428,7 @@ func LessOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...inter
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
 	}
-	return compareTwoValues(t, e1, e2, []CompareType{compareLess, compareEqual}, "\"%v\" is not less than or equal to \"%v\"", msgAndArgs...)
+	return compareTwoValues(t, e1, e2, []compareResult{compareLess, compareEqual}, "\"%v\" is not less than or equal to \"%v\"", msgAndArgs...)
 }
 
 // Positive asserts that the specified element is positive
@@ -431,7 +440,7 @@ func Positive(t TestingT, e interface{}, msgAndArgs ...interface{}) bool {
 		h.Helper()
 	}
 	zero := reflect.Zero(reflect.TypeOf(e))
-	return compareTwoValues(t, e, zero.Interface(), []CompareType{compareGreater}, "\"%v\" is not positive", msgAndArgs...)
+	return compareTwoValues(t, e, zero.Interface(), []compareResult{compareGreater}, "\"%v\" is not positive", msgAndArgs...)
 }
 
 // Negative asserts that the specified element is negative
@@ -443,10 +452,10 @@ func Negative(t TestingT, e interface{}, msgAndArgs ...interface{}) bool {
 		h.Helper()
 	}
 	zero := reflect.Zero(reflect.TypeOf(e))
-	return compareTwoValues(t, e, zero.Interface(), []CompareType{compareLess}, "\"%v\" is not negative", msgAndArgs...)
+	return compareTwoValues(t, e, zero.Interface(), []compareResult{compareLess}, "\"%v\" is not negative", msgAndArgs...)
 }
 
-func compareTwoValues(t TestingT, e1 interface{}, e2 interface{}, allowedComparesResults []CompareType, failMessage string, msgAndArgs ...interface{}) bool {
+func compareTwoValues(t TestingT, e1 interface{}, e2 interface{}, allowedComparesResults []compareResult, failMessage string, msgAndArgs ...interface{}) bool {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
 	}
@@ -469,7 +478,7 @@ func compareTwoValues(t TestingT, e1 interface{}, e2 interface{}, allowedCompare
 	return true
 }
 
-func containsValue(values []CompareType, value CompareType) bool {
+func containsValue(values []compareResult, value compareResult) bool {
 	for _, v := range values {
 		if v == value {
 			return true
diff --git a/vendor/github.com/stretchr/testify/assert/assertion_format.go b/vendor/github.com/stretchr/testify/assert/assertion_format.go
index 3ddab109ad..1906341657 100644
--- a/vendor/github.com/stretchr/testify/assert/assertion_format.go
+++ b/vendor/github.com/stretchr/testify/assert/assertion_format.go
@@ -104,8 +104,8 @@ func EqualExportedValuesf(t TestingT, expected interface{}, actual interface{},
 	return EqualExportedValues(t, expected, actual, append([]interface{}{msg}, args...)...)
 }
 
-// EqualValuesf asserts that two objects are equal or convertible to the same types
-// and equal.
+// EqualValuesf asserts that two objects are equal or convertible to the larger
+// type and equal.
 //
 //	assert.EqualValuesf(t, uint32(123), int32(123), "error message %s", "formatted")
 func EqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool {
@@ -186,7 +186,7 @@ func Eventuallyf(t TestingT, condition func() bool, waitFor time.Duration, tick
 //	assert.EventuallyWithTf(t, func(c *assert.CollectT, "error message %s", "formatted") {
 //		// add assertions as needed; any assertion failure will fail the current tick
 //		assert.True(c, externalValue, "expected 'externalValue' to be true")
-//	}, 1*time.Second, 10*time.Second, "external state has not changed to 'true'; still false")
+//	}, 10*time.Second, 1*time.Second, "external state has not changed to 'true'; still false")
 func EventuallyWithTf(t TestingT, condition func(collect *CollectT), waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) bool {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -568,6 +568,23 @@ func NotContainsf(t TestingT, s interface{}, contains interface{}, msg string, a
 	return NotContains(t, s, contains, append([]interface{}{msg}, args...)...)
 }
 
+// NotElementsMatchf asserts that the specified listA(array, slice...) is NOT equal to specified
+// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements,
+// the number of appearances of each of them in both lists should not match.
+// This is an inverse of ElementsMatch.
+//
+// assert.NotElementsMatchf(t, [1, 1, 2, 3], [1, 1, 2, 3], "error message %s", "formatted") -> false
+//
+// assert.NotElementsMatchf(t, [1, 1, 2, 3], [1, 2, 3], "error message %s", "formatted") -> true
+//
+// assert.NotElementsMatchf(t, [1, 2, 3], [1, 2, 4], "error message %s", "formatted") -> true
+func NotElementsMatchf(t TestingT, listA interface{}, listB interface{}, msg string, args ...interface{}) bool {
+	if h, ok := t.(tHelper); ok {
+		h.Helper()
+	}
+	return NotElementsMatch(t, listA, listB, append([]interface{}{msg}, args...)...)
+}
+
 // NotEmptyf asserts that the specified object is NOT empty.  I.e. not nil, "", false, 0 or either
 // a slice or a channel with len == 0.
 //
@@ -604,7 +621,16 @@ func NotEqualValuesf(t TestingT, expected interface{}, actual interface{}, msg s
 	return NotEqualValues(t, expected, actual, append([]interface{}{msg}, args...)...)
 }
 
-// NotErrorIsf asserts that at none of the errors in err's chain matches target.
+// NotErrorAsf asserts that none of the errors in err's chain matches target,
+// but if so, sets target to that error value.
+func NotErrorAsf(t TestingT, err error, target interface{}, msg string, args ...interface{}) bool {
+	if h, ok := t.(tHelper); ok {
+		h.Helper()
+	}
+	return NotErrorAs(t, err, target, append([]interface{}{msg}, args...)...)
+}
+
+// NotErrorIsf asserts that none of the errors in err's chain matches target.
 // This is a wrapper for errors.Is.
 func NotErrorIsf(t TestingT, err error, target error, msg string, args ...interface{}) bool {
 	if h, ok := t.(tHelper); ok {
diff --git a/vendor/github.com/stretchr/testify/assert/assertion_forward.go b/vendor/github.com/stretchr/testify/assert/assertion_forward.go
index a84e09bd40..21629087ba 100644
--- a/vendor/github.com/stretchr/testify/assert/assertion_forward.go
+++ b/vendor/github.com/stretchr/testify/assert/assertion_forward.go
@@ -186,8 +186,8 @@ func (a *Assertions) EqualExportedValuesf(expected interface{}, actual interface
 	return EqualExportedValuesf(a.t, expected, actual, msg, args...)
 }
 
-// EqualValues asserts that two objects are equal or convertible to the same types
-// and equal.
+// EqualValues asserts that two objects are equal or convertible to the larger
+// type and equal.
 //
 //	a.EqualValues(uint32(123), int32(123))
 func (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool {
@@ -197,8 +197,8 @@ func (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAn
 	return EqualValues(a.t, expected, actual, msgAndArgs...)
 }
 
-// EqualValuesf asserts that two objects are equal or convertible to the same types
-// and equal.
+// EqualValuesf asserts that two objects are equal or convertible to the larger
+// type and equal.
 //
 //	a.EqualValuesf(uint32(123), int32(123), "error message %s", "formatted")
 func (a *Assertions) EqualValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool {
@@ -336,7 +336,7 @@ func (a *Assertions) Eventually(condition func() bool, waitFor time.Duration, ti
 //	a.EventuallyWithT(func(c *assert.CollectT) {
 //		// add assertions as needed; any assertion failure will fail the current tick
 //		assert.True(c, externalValue, "expected 'externalValue' to be true")
-//	}, 1*time.Second, 10*time.Second, "external state has not changed to 'true'; still false")
+//	}, 10*time.Second, 1*time.Second, "external state has not changed to 'true'; still false")
 func (a *Assertions) EventuallyWithT(condition func(collect *CollectT), waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) bool {
 	if h, ok := a.t.(tHelper); ok {
 		h.Helper()
@@ -361,7 +361,7 @@ func (a *Assertions) EventuallyWithT(condition func(collect *CollectT), waitFor
 //	a.EventuallyWithTf(func(c *assert.CollectT, "error message %s", "formatted") {
 //		// add assertions as needed; any assertion failure will fail the current tick
 //		assert.True(c, externalValue, "expected 'externalValue' to be true")
-//	}, 1*time.Second, 10*time.Second, "external state has not changed to 'true'; still false")
+//	}, 10*time.Second, 1*time.Second, "external state has not changed to 'true'; still false")
 func (a *Assertions) EventuallyWithTf(condition func(collect *CollectT), waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) bool {
 	if h, ok := a.t.(tHelper); ok {
 		h.Helper()
@@ -1128,6 +1128,40 @@ func (a *Assertions) NotContainsf(s interface{}, contains interface{}, msg strin
 	return NotContainsf(a.t, s, contains, msg, args...)
 }
 
+// NotElementsMatch asserts that the specified listA(array, slice...) is NOT equal to specified
+// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements,
+// the number of appearances of each of them in both lists should not match.
+// This is an inverse of ElementsMatch.
+//
+// a.NotElementsMatch([1, 1, 2, 3], [1, 1, 2, 3]) -> false
+//
+// a.NotElementsMatch([1, 1, 2, 3], [1, 2, 3]) -> true
+//
+// a.NotElementsMatch([1, 2, 3], [1, 2, 4]) -> true
+func (a *Assertions) NotElementsMatch(listA interface{}, listB interface{}, msgAndArgs ...interface{}) bool {
+	if h, ok := a.t.(tHelper); ok {
+		h.Helper()
+	}
+	return NotElementsMatch(a.t, listA, listB, msgAndArgs...)
+}
+
+// NotElementsMatchf asserts that the specified listA(array, slice...) is NOT equal to specified
+// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements,
+// the number of appearances of each of them in both lists should not match.
+// This is an inverse of ElementsMatch.
+//
+// a.NotElementsMatchf([1, 1, 2, 3], [1, 1, 2, 3], "error message %s", "formatted") -> false
+//
+// a.NotElementsMatchf([1, 1, 2, 3], [1, 2, 3], "error message %s", "formatted") -> true
+//
+// a.NotElementsMatchf([1, 2, 3], [1, 2, 4], "error message %s", "formatted") -> true
+func (a *Assertions) NotElementsMatchf(listA interface{}, listB interface{}, msg string, args ...interface{}) bool {
+	if h, ok := a.t.(tHelper); ok {
+		h.Helper()
+	}
+	return NotElementsMatchf(a.t, listA, listB, msg, args...)
+}
+
 // NotEmpty asserts that the specified object is NOT empty.  I.e. not nil, "", false, 0 or either
 // a slice or a channel with len == 0.
 //
@@ -1200,7 +1234,25 @@ func (a *Assertions) NotEqualf(expected interface{}, actual interface{}, msg str
 	return NotEqualf(a.t, expected, actual, msg, args...)
 }
 
-// NotErrorIs asserts that at none of the errors in err's chain matches target.
+// NotErrorAs asserts that none of the errors in err's chain matches target,
+// but if so, sets target to that error value.
+func (a *Assertions) NotErrorAs(err error, target interface{}, msgAndArgs ...interface{}) bool {
+	if h, ok := a.t.(tHelper); ok {
+		h.Helper()
+	}
+	return NotErrorAs(a.t, err, target, msgAndArgs...)
+}
+
+// NotErrorAsf asserts that none of the errors in err's chain matches target,
+// but if so, sets target to that error value.
+func (a *Assertions) NotErrorAsf(err error, target interface{}, msg string, args ...interface{}) bool {
+	if h, ok := a.t.(tHelper); ok {
+		h.Helper()
+	}
+	return NotErrorAsf(a.t, err, target, msg, args...)
+}
+
+// NotErrorIs asserts that none of the errors in err's chain matches target.
 // This is a wrapper for errors.Is.
 func (a *Assertions) NotErrorIs(err error, target error, msgAndArgs ...interface{}) bool {
 	if h, ok := a.t.(tHelper); ok {
@@ -1209,7 +1261,7 @@ func (a *Assertions) NotErrorIs(err error, target error, msgAndArgs ...interface
 	return NotErrorIs(a.t, err, target, msgAndArgs...)
 }
 
-// NotErrorIsf asserts that at none of the errors in err's chain matches target.
+// NotErrorIsf asserts that none of the errors in err's chain matches target.
 // This is a wrapper for errors.Is.
 func (a *Assertions) NotErrorIsf(err error, target error, msg string, args ...interface{}) bool {
 	if h, ok := a.t.(tHelper); ok {
diff --git a/vendor/github.com/stretchr/testify/assert/assertion_order.go b/vendor/github.com/stretchr/testify/assert/assertion_order.go
index 00df62a059..1d2f71824a 100644
--- a/vendor/github.com/stretchr/testify/assert/assertion_order.go
+++ b/vendor/github.com/stretchr/testify/assert/assertion_order.go
@@ -6,7 +6,7 @@ import (
 )
 
 // isOrdered checks that collection contains orderable elements.
-func isOrdered(t TestingT, object interface{}, allowedComparesResults []CompareType, failMessage string, msgAndArgs ...interface{}) bool {
+func isOrdered(t TestingT, object interface{}, allowedComparesResults []compareResult, failMessage string, msgAndArgs ...interface{}) bool {
 	objKind := reflect.TypeOf(object).Kind()
 	if objKind != reflect.Slice && objKind != reflect.Array {
 		return false
@@ -50,7 +50,7 @@ func isOrdered(t TestingT, object interface{}, allowedComparesResults []CompareT
 //	assert.IsIncreasing(t, []float{1, 2})
 //	assert.IsIncreasing(t, []string{"a", "b"})
 func IsIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
-	return isOrdered(t, object, []CompareType{compareLess}, "\"%v\" is not less than \"%v\"", msgAndArgs...)
+	return isOrdered(t, object, []compareResult{compareLess}, "\"%v\" is not less than \"%v\"", msgAndArgs...)
 }
 
 // IsNonIncreasing asserts that the collection is not increasing
@@ -59,7 +59,7 @@ func IsIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) boo
 //	assert.IsNonIncreasing(t, []float{2, 1})
 //	assert.IsNonIncreasing(t, []string{"b", "a"})
 func IsNonIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
-	return isOrdered(t, object, []CompareType{compareEqual, compareGreater}, "\"%v\" is not greater than or equal to \"%v\"", msgAndArgs...)
+	return isOrdered(t, object, []compareResult{compareEqual, compareGreater}, "\"%v\" is not greater than or equal to \"%v\"", msgAndArgs...)
 }
 
 // IsDecreasing asserts that the collection is decreasing
@@ -68,7 +68,7 @@ func IsNonIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{})
 //	assert.IsDecreasing(t, []float{2, 1})
 //	assert.IsDecreasing(t, []string{"b", "a"})
 func IsDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
-	return isOrdered(t, object, []CompareType{compareGreater}, "\"%v\" is not greater than \"%v\"", msgAndArgs...)
+	return isOrdered(t, object, []compareResult{compareGreater}, "\"%v\" is not greater than \"%v\"", msgAndArgs...)
 }
 
 // IsNonDecreasing asserts that the collection is not decreasing
@@ -77,5 +77,5 @@ func IsDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) boo
 //	assert.IsNonDecreasing(t, []float{1, 2})
 //	assert.IsNonDecreasing(t, []string{"a", "b"})
 func IsNonDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
-	return isOrdered(t, object, []CompareType{compareLess, compareEqual}, "\"%v\" is not less than or equal to \"%v\"", msgAndArgs...)
+	return isOrdered(t, object, []compareResult{compareLess, compareEqual}, "\"%v\" is not less than or equal to \"%v\"", msgAndArgs...)
 }
diff --git a/vendor/github.com/stretchr/testify/assert/assertions.go b/vendor/github.com/stretchr/testify/assert/assertions.go
index 0b7570f21c..4e91332bb5 100644
--- a/vendor/github.com/stretchr/testify/assert/assertions.go
+++ b/vendor/github.com/stretchr/testify/assert/assertions.go
@@ -19,7 +19,9 @@ import (
 
 	"github.com/davecgh/go-spew/spew"
 	"github.com/pmezard/go-difflib/difflib"
-	"gopkg.in/yaml.v3"
+
+	// Wrapper around gopkg.in/yaml.v3
+	"github.com/stretchr/testify/assert/yaml"
 )
 
 //go:generate sh -c "cd ../_codegen && go build && cd - && ../_codegen/_codegen -output-package=assert -template=assertion_format.go.tmpl"
@@ -45,6 +47,10 @@ type BoolAssertionFunc func(TestingT, bool, ...interface{}) bool
 // for table driven tests.
 type ErrorAssertionFunc func(TestingT, error, ...interface{}) bool
 
+// PanicAssertionFunc is a common function prototype when validating a panic value.  Can be useful
+// for table driven tests.
+type PanicAssertionFunc = func(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool
+
 // Comparison is a custom function that returns true on success and false on failure
 type Comparison func() (success bool)
 
@@ -496,7 +502,13 @@ func Same(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) b
 		h.Helper()
 	}
 
-	if !samePointers(expected, actual) {
+	same, ok := samePointers(expected, actual)
+	if !ok {
+		return Fail(t, "Both arguments must be pointers", msgAndArgs...)
+	}
+
+	if !same {
+		// both are pointers but not the same type & pointing to the same address
 		return Fail(t, fmt.Sprintf("Not same: \n"+
 			"expected: %p %#v\n"+
 			"actual  : %p %#v", expected, expected, actual, actual), msgAndArgs...)
@@ -516,7 +528,13 @@ func NotSame(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}
 		h.Helper()
 	}
 
-	if samePointers(expected, actual) {
+	same, ok := samePointers(expected, actual)
+	if !ok {
+		//fails when the arguments are not pointers
+		return !(Fail(t, "Both arguments must be pointers", msgAndArgs...))
+	}
+
+	if same {
 		return Fail(t, fmt.Sprintf(
 			"Expected and actual point to the same object: %p %#v",
 			expected, expected), msgAndArgs...)
@@ -524,21 +542,23 @@ func NotSame(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}
 	return true
 }
 
-// samePointers compares two generic interface objects and returns whether
-// they point to the same object
-func samePointers(first, second interface{}) bool {
+// samePointers checks if two generic interface objects are pointers of the same
+// type pointing to the same object. It returns two values: same indicating if
+// they are the same type and point to the same object, and ok indicating that
+// both inputs are pointers.
+func samePointers(first, second interface{}) (same bool, ok bool) {
 	firstPtr, secondPtr := reflect.ValueOf(first), reflect.ValueOf(second)
 	if firstPtr.Kind() != reflect.Ptr || secondPtr.Kind() != reflect.Ptr {
-		return false
+		return false, false //not both are pointers
 	}
 
 	firstType, secondType := reflect.TypeOf(first), reflect.TypeOf(second)
 	if firstType != secondType {
-		return false
+		return false, true // both are pointers, but of different types
 	}
 
 	// compare pointer addresses
-	return first == second
+	return first == second, true
 }
 
 // formatUnequalValues takes two values of arbitrary types and returns string
@@ -572,8 +592,8 @@ func truncatingFormat(data interface{}) string {
 	return value
 }
 
-// EqualValues asserts that two objects are equal or convertible to the same types
-// and equal.
+// EqualValues asserts that two objects are equal or convertible to the larger
+// type and equal.
 //
 //	assert.EqualValues(t, uint32(123), int32(123))
 func EqualValues(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool {
@@ -615,21 +635,6 @@ func EqualExportedValues(t TestingT, expected, actual interface{}, msgAndArgs ..
 		return Fail(t, fmt.Sprintf("Types expected to match exactly\n\t%v != %v", aType, bType), msgAndArgs...)
 	}
 
-	if aType.Kind() == reflect.Ptr {
-		aType = aType.Elem()
-	}
-	if bType.Kind() == reflect.Ptr {
-		bType = bType.Elem()
-	}
-
-	if aType.Kind() != reflect.Struct {
-		return Fail(t, fmt.Sprintf("Types expected to both be struct or pointer to struct \n\t%v != %v", aType.Kind(), reflect.Struct), msgAndArgs...)
-	}
-
-	if bType.Kind() != reflect.Struct {
-		return Fail(t, fmt.Sprintf("Types expected to both be struct or pointer to struct \n\t%v != %v", bType.Kind(), reflect.Struct), msgAndArgs...)
-	}
-
 	expected = copyExportedFields(expected)
 	actual = copyExportedFields(actual)
 
@@ -1170,6 +1175,39 @@ func formatListDiff(listA, listB interface{}, extraA, extraB []interface{}) stri
 	return msg.String()
 }
 
+// NotElementsMatch asserts that the specified listA(array, slice...) is NOT equal to specified
+// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements,
+// the number of appearances of each of them in both lists should not match.
+// This is an inverse of ElementsMatch.
+//
+// assert.NotElementsMatch(t, [1, 1, 2, 3], [1, 1, 2, 3]) -> false
+//
+// assert.NotElementsMatch(t, [1, 1, 2, 3], [1, 2, 3]) -> true
+//
+// assert.NotElementsMatch(t, [1, 2, 3], [1, 2, 4]) -> true
+func NotElementsMatch(t TestingT, listA, listB interface{}, msgAndArgs ...interface{}) (ok bool) {
+	if h, ok := t.(tHelper); ok {
+		h.Helper()
+	}
+	if isEmpty(listA) && isEmpty(listB) {
+		return Fail(t, "listA and listB contain the same elements", msgAndArgs)
+	}
+
+	if !isList(t, listA, msgAndArgs...) {
+		return Fail(t, "listA is not a list type", msgAndArgs...)
+	}
+	if !isList(t, listB, msgAndArgs...) {
+		return Fail(t, "listB is not a list type", msgAndArgs...)
+	}
+
+	extraA, extraB := diffLists(listA, listB)
+	if len(extraA) == 0 && len(extraB) == 0 {
+		return Fail(t, "listA and listB contain the same elements", msgAndArgs)
+	}
+
+	return true
+}
+
 // Condition uses a Comparison to assert a complex condition.
 func Condition(t TestingT, comp Comparison, msgAndArgs ...interface{}) bool {
 	if h, ok := t.(tHelper); ok {
@@ -1488,6 +1526,9 @@ func InEpsilon(t TestingT, expected, actual interface{}, epsilon float64, msgAnd
 	if err != nil {
 		return Fail(t, err.Error(), msgAndArgs...)
 	}
+	if math.IsNaN(actualEpsilon) {
+		return Fail(t, "relative error is NaN", msgAndArgs...)
+	}
 	if actualEpsilon > epsilon {
 		return Fail(t, fmt.Sprintf("Relative error is too high: %#v (expected)\n"+
 			"        < %#v (actual)", epsilon, actualEpsilon), msgAndArgs...)
@@ -1611,7 +1652,6 @@ func ErrorContains(t TestingT, theError error, contains string, msgAndArgs ...in
 
 // matchRegexp return true if a specified regexp matches a string.
 func matchRegexp(rx interface{}, str interface{}) bool {
-
 	var r *regexp.Regexp
 	if rr, ok := rx.(*regexp.Regexp); ok {
 		r = rr
@@ -1619,7 +1659,14 @@ func matchRegexp(rx interface{}, str interface{}) bool {
 		r = regexp.MustCompile(fmt.Sprint(rx))
 	}
 
-	return (r.FindStringIndex(fmt.Sprint(str)) != nil)
+	switch v := str.(type) {
+	case []byte:
+		return r.Match(v)
+	case string:
+		return r.MatchString(v)
+	default:
+		return r.MatchString(fmt.Sprint(v))
+	}
 
 }
 
@@ -1872,7 +1919,7 @@ var spewConfigStringerEnabled = spew.ConfigState{
 	MaxDepth:                10,
 }
 
-type tHelper interface {
+type tHelper = interface {
 	Helper()
 }
 
@@ -1911,6 +1958,9 @@ func Eventually(t TestingT, condition func() bool, waitFor time.Duration, tick t
 
 // CollectT implements the TestingT interface and collects all errors.
 type CollectT struct {
+	// A slice of errors. Non-nil slice denotes a failure.
+	// If it's non-nil but len(c.errors) == 0, this is also a failure
+	// obtained by direct c.FailNow() call.
 	errors []error
 }
 
@@ -1919,9 +1969,10 @@ func (c *CollectT) Errorf(format string, args ...interface{}) {
 	c.errors = append(c.errors, fmt.Errorf(format, args...))
 }
 
-// FailNow panics.
-func (*CollectT) FailNow() {
-	panic("Assertion failed")
+// FailNow stops execution by calling runtime.Goexit.
+func (c *CollectT) FailNow() {
+	c.fail()
+	runtime.Goexit()
 }
 
 // Deprecated: That was a method for internal usage that should not have been published. Now just panics.
@@ -1934,6 +1985,16 @@ func (*CollectT) Copy(TestingT) {
 	panic("Copy() is deprecated")
 }
 
+func (c *CollectT) fail() {
+	if !c.failed() {
+		c.errors = []error{} // Make it non-nil to mark a failure.
+	}
+}
+
+func (c *CollectT) failed() bool {
+	return c.errors != nil
+}
+
 // EventuallyWithT asserts that given condition will be met in waitFor time,
 // periodically checking target function each tick. In contrast to Eventually,
 // it supplies a CollectT to the condition function, so that the condition
@@ -1951,14 +2012,14 @@ func (*CollectT) Copy(TestingT) {
 //	assert.EventuallyWithT(t, func(c *assert.CollectT) {
 //		// add assertions as needed; any assertion failure will fail the current tick
 //		assert.True(c, externalValue, "expected 'externalValue' to be true")
-//	}, 1*time.Second, 10*time.Second, "external state has not changed to 'true'; still false")
+//	}, 10*time.Second, 1*time.Second, "external state has not changed to 'true'; still false")
 func EventuallyWithT(t TestingT, condition func(collect *CollectT), waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) bool {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
 	}
 
 	var lastFinishedTickErrs []error
-	ch := make(chan []error, 1)
+	ch := make(chan *CollectT, 1)
 
 	timer := time.NewTimer(waitFor)
 	defer timer.Stop()
@@ -1978,16 +2039,16 @@ func EventuallyWithT(t TestingT, condition func(collect *CollectT), waitFor time
 			go func() {
 				collect := new(CollectT)
 				defer func() {
-					ch <- collect.errors
+					ch <- collect
 				}()
 				condition(collect)
 			}()
-		case errs := <-ch:
-			if len(errs) == 0 {
+		case collect := <-ch:
+			if !collect.failed() {
 				return true
 			}
 			// Keep the errors from the last ended condition, so that they can be copied to t if timeout is reached.
-			lastFinishedTickErrs = errs
+			lastFinishedTickErrs = collect.errors
 			tick = ticker.C
 		}
 	}
@@ -2049,7 +2110,7 @@ func ErrorIs(t TestingT, err, target error, msgAndArgs ...interface{}) bool {
 	), msgAndArgs...)
 }
 
-// NotErrorIs asserts that at none of the errors in err's chain matches target.
+// NotErrorIs asserts that none of the errors in err's chain matches target.
 // This is a wrapper for errors.Is.
 func NotErrorIs(t TestingT, err, target error, msgAndArgs ...interface{}) bool {
 	if h, ok := t.(tHelper); ok {
@@ -2090,6 +2151,24 @@ func ErrorAs(t TestingT, err error, target interface{}, msgAndArgs ...interface{
 	), msgAndArgs...)
 }
 
+// NotErrorAs asserts that none of the errors in err's chain matches target,
+// but if so, sets target to that error value.
+func NotErrorAs(t TestingT, err error, target interface{}, msgAndArgs ...interface{}) bool {
+	if h, ok := t.(tHelper); ok {
+		h.Helper()
+	}
+	if !errors.As(err, target) {
+		return true
+	}
+
+	chain := buildErrorChainString(err)
+
+	return Fail(t, fmt.Sprintf("Target error should not be in err chain:\n"+
+		"found: %q\n"+
+		"in chain: %s", target, chain,
+	), msgAndArgs...)
+}
+
 func buildErrorChainString(err error) string {
 	if err == nil {
 		return ""
diff --git a/vendor/github.com/stretchr/testify/assert/yaml/yaml_custom.go b/vendor/github.com/stretchr/testify/assert/yaml/yaml_custom.go
new file mode 100644
index 0000000000..baa0cc7d7f
--- /dev/null
+++ b/vendor/github.com/stretchr/testify/assert/yaml/yaml_custom.go
@@ -0,0 +1,25 @@
+//go:build testify_yaml_custom && !testify_yaml_fail && !testify_yaml_default
+// +build testify_yaml_custom,!testify_yaml_fail,!testify_yaml_default
+
+// Package yaml is an implementation of YAML functions that calls a pluggable implementation.
+//
+// This implementation is selected with the testify_yaml_custom build tag.
+//
+//	go test -tags testify_yaml_custom
+//
+// This implementation can be used at build time to replace the default implementation
+// to avoid linking with [gopkg.in/yaml.v3].
+//
+// In your test package:
+//
+//		import assertYaml "github.com/stretchr/testify/assert/yaml"
+//
+//		func init() {
+//			assertYaml.Unmarshal = func (in []byte, out interface{}) error {
+//				// ...
+//	     			return nil
+//			}
+//		}
+package yaml
+
+var Unmarshal func(in []byte, out interface{}) error
diff --git a/vendor/github.com/stretchr/testify/assert/yaml/yaml_default.go b/vendor/github.com/stretchr/testify/assert/yaml/yaml_default.go
new file mode 100644
index 0000000000..b83c6cf64c
--- /dev/null
+++ b/vendor/github.com/stretchr/testify/assert/yaml/yaml_default.go
@@ -0,0 +1,37 @@
+//go:build !testify_yaml_fail && !testify_yaml_custom
+// +build !testify_yaml_fail,!testify_yaml_custom
+
+// Package yaml is just an indirection to handle YAML deserialization.
+//
+// This package is just an indirection that allows the builder to override the
+// indirection with an alternative implementation of this package that uses
+// another implementation of YAML deserialization. This allows to not either not
+// use YAML deserialization at all, or to use another implementation than
+// [gopkg.in/yaml.v3] (for example for license compatibility reasons, see [PR #1120]).
+//
+// Alternative implementations are selected using build tags:
+//
+//   - testify_yaml_fail: [Unmarshal] always fails with an error
+//   - testify_yaml_custom: [Unmarshal] is a variable. Caller must initialize it
+//     before calling any of [github.com/stretchr/testify/assert.YAMLEq] or
+//     [github.com/stretchr/testify/assert.YAMLEqf].
+//
+// Usage:
+//
+//	go test -tags testify_yaml_fail
+//
+// You can check with "go list" which implementation is linked:
+//
+//	go list -f '{{.Imports}}' github.com/stretchr/testify/assert/yaml
+//	go list -tags testify_yaml_fail -f '{{.Imports}}' github.com/stretchr/testify/assert/yaml
+//	go list -tags testify_yaml_custom -f '{{.Imports}}' github.com/stretchr/testify/assert/yaml
+//
+// [PR #1120]: https://github.com/stretchr/testify/pull/1120
+package yaml
+
+import goyaml "gopkg.in/yaml.v3"
+
+// Unmarshal is just a wrapper of [gopkg.in/yaml.v3.Unmarshal].
+func Unmarshal(in []byte, out interface{}) error {
+	return goyaml.Unmarshal(in, out)
+}
diff --git a/vendor/github.com/stretchr/testify/assert/yaml/yaml_fail.go b/vendor/github.com/stretchr/testify/assert/yaml/yaml_fail.go
new file mode 100644
index 0000000000..e78f7dfe69
--- /dev/null
+++ b/vendor/github.com/stretchr/testify/assert/yaml/yaml_fail.go
@@ -0,0 +1,18 @@
+//go:build testify_yaml_fail && !testify_yaml_custom && !testify_yaml_default
+// +build testify_yaml_fail,!testify_yaml_custom,!testify_yaml_default
+
+// Package yaml is an implementation of YAML functions that always fail.
+//
+// This implementation can be used at build time to replace the default implementation
+// to avoid linking with [gopkg.in/yaml.v3]:
+//
+//	go test -tags testify_yaml_fail
+package yaml
+
+import "errors"
+
+var errNotImplemented = errors.New("YAML functions are not available (see https://pkg.go.dev/github.com/stretchr/testify/assert/yaml)")
+
+func Unmarshal([]byte, interface{}) error {
+	return errNotImplemented
+}
diff --git a/vendor/github.com/stretchr/testify/mock/mock.go b/vendor/github.com/stretchr/testify/mock/mock.go
index 213bde2ea6..eb5682df97 100644
--- a/vendor/github.com/stretchr/testify/mock/mock.go
+++ b/vendor/github.com/stretchr/testify/mock/mock.go
@@ -80,12 +80,12 @@ type Call struct {
 	requires []*Call
 }
 
-func newCall(parent *Mock, methodName string, callerInfo []string, methodArguments ...interface{}) *Call {
+func newCall(parent *Mock, methodName string, callerInfo []string, methodArguments Arguments, returnArguments Arguments) *Call {
 	return &Call{
 		Parent:          parent,
 		Method:          methodName,
 		Arguments:       methodArguments,
-		ReturnArguments: make([]interface{}, 0),
+		ReturnArguments: returnArguments,
 		callerInfo:      callerInfo,
 		Repeatability:   0,
 		WaitFor:         nil,
@@ -256,7 +256,7 @@ func (c *Call) Unset() *Call {
 // calls have been called as expected. The referenced calls may be from the
 // same mock instance and/or other mock instances.
 //
-//	Mock.On("Do").Return(nil).Notbefore(
+//	Mock.On("Do").Return(nil).NotBefore(
 //	    Mock.On("Init").Return(nil)
 //	)
 func (c *Call) NotBefore(calls ...*Call) *Call {
@@ -273,6 +273,20 @@ func (c *Call) NotBefore(calls ...*Call) *Call {
 	return c
 }
 
+// InOrder defines the order in which the calls should be made
+//
+//	For example:
+//
+//	InOrder(
+//		Mock.On("init").Return(nil),
+//		Mock.On("Do").Return(nil),
+//	)
+func InOrder(calls ...*Call) {
+	for i := 1; i < len(calls); i++ {
+		calls[i].NotBefore(calls[i-1])
+	}
+}
+
 // Mock is the workhorse used to track activity on another object.
 // For an example of its usage, refer to the "Example Usage" section at the top
 // of this document.
@@ -351,7 +365,8 @@ func (m *Mock) On(methodName string, arguments ...interface{}) *Call {
 
 	m.mutex.Lock()
 	defer m.mutex.Unlock()
-	c := newCall(m, methodName, assert.CallerInfo(), arguments...)
+
+	c := newCall(m, methodName, assert.CallerInfo(), arguments, make([]interface{}, 0))
 	m.ExpectedCalls = append(m.ExpectedCalls, c)
 	return c
 }
@@ -491,11 +506,12 @@ func (m *Mock) MethodCalled(methodName string, arguments ...interface{}) Argumen
 		m.mutex.Unlock()
 
 		if closestCall != nil {
-			m.fail("\n\nmock: Unexpected Method Call\n-----------------------------\n\n%s\n\nThe closest call I have is: \n\n%s\n\n%s\nDiff: %s",
+			m.fail("\n\nmock: Unexpected Method Call\n-----------------------------\n\n%s\n\nThe closest call I have is: \n\n%s\n\n%s\nDiff: %s\nat: %s\n",
 				callString(methodName, arguments, true),
 				callString(methodName, closestCall.Arguments, true),
 				diffArguments(closestCall.Arguments, arguments),
 				strings.TrimSpace(mismatch),
+				assert.CallerInfo(),
 			)
 		} else {
 			m.fail("\nassert: mock: I don't know what to return because the method call was unexpected.\n\tEither do Mock.On(\"%s\").Return(...) first, or remove the %s() call.\n\tThis method was unexpected:\n\t\t%s\n\tat: %s", methodName, methodName, callString(methodName, arguments, true), assert.CallerInfo())
@@ -529,7 +545,7 @@ func (m *Mock) MethodCalled(methodName string, arguments ...interface{}) Argumen
 	call.totalCalls++
 
 	// add the call
-	m.Calls = append(m.Calls, *newCall(m, methodName, assert.CallerInfo(), arguments...))
+	m.Calls = append(m.Calls, *newCall(m, methodName, assert.CallerInfo(), arguments, call.ReturnArguments))
 	m.mutex.Unlock()
 
 	// block if specified
@@ -764,9 +780,17 @@ const (
 )
 
 // AnythingOfTypeArgument contains the type of an argument
-// for use when type checking.  Used in Diff and Assert.
+// for use when type checking.  Used in [Arguments.Diff] and [Arguments.Assert].
 //
-// Deprecated: this is an implementation detail that must not be used. Use [AnythingOfType] instead.
+// Deprecated: this is an implementation detail that must not be used. Use the [AnythingOfType] constructor instead, example:
+//
+//	m.On("Do", mock.AnythingOfType("string"))
+//
+// All explicit type declarations can be replaced with interface{} as is expected by [Mock.On], example:
+//
+//	func anyString interface{} {
+//		return mock.AnythingOfType("string")
+//	}
 type AnythingOfTypeArgument = anythingOfTypeArgument
 
 // anythingOfTypeArgument is a string that contains the type of an argument
@@ -780,53 +804,54 @@ type anythingOfTypeArgument string
 //
 // For example:
 //
-//	Assert(t, AnythingOfType("string"), AnythingOfType("int"))
+//	args.Assert(t, AnythingOfType("string"), AnythingOfType("int"))
 func AnythingOfType(t string) AnythingOfTypeArgument {
 	return anythingOfTypeArgument(t)
 }
 
 // IsTypeArgument is a struct that contains the type of an argument
-// for use when type checking.  This is an alternative to AnythingOfType.
-// Used in Diff and Assert.
+// for use when type checking.  This is an alternative to [AnythingOfType].
+// Used in [Arguments.Diff] and [Arguments.Assert].
 type IsTypeArgument struct {
 	t reflect.Type
 }
 
 // IsType returns an IsTypeArgument object containing the type to check for.
 // You can provide a zero-value of the type to check.  This is an
-// alternative to AnythingOfType.  Used in Diff and Assert.
+// alternative to [AnythingOfType].  Used in [Arguments.Diff] and [Arguments.Assert].
 //
 // For example:
-// Assert(t, IsType(""), IsType(0))
+//
+//	args.Assert(t, IsType(""), IsType(0))
 func IsType(t interface{}) *IsTypeArgument {
 	return &IsTypeArgument{t: reflect.TypeOf(t)}
 }
 
-// FunctionalOptionsArgument is a struct that contains the type and value of an functional option argument
-// for use when type checking.
+// FunctionalOptionsArgument contains a list of functional options arguments
+// expected for use when matching a list of arguments.
 type FunctionalOptionsArgument struct {
-	value interface{}
+	values []interface{}
 }
 
 // String returns the string representation of FunctionalOptionsArgument
 func (f *FunctionalOptionsArgument) String() string {
 	var name string
-	tValue := reflect.ValueOf(f.value)
-	if tValue.Len() > 0 {
-		name = "[]" + reflect.TypeOf(tValue.Index(0).Interface()).String()
+	if len(f.values) > 0 {
+		name = "[]" + reflect.TypeOf(f.values[0]).String()
 	}
 
-	return strings.Replace(fmt.Sprintf("%#v", f.value), "[]interface {}", name, 1)
+	return strings.Replace(fmt.Sprintf("%#v", f.values), "[]interface {}", name, 1)
 }
 
-// FunctionalOptions returns an FunctionalOptionsArgument object containing the functional option type
-// and the values to check of
+// FunctionalOptions returns an [FunctionalOptionsArgument] object containing
+// the expected functional-options to check for.
 //
 // For example:
-// Assert(t, FunctionalOptions("[]foo.FunctionalOption", foo.Opt1(), foo.Opt2()))
-func FunctionalOptions(value ...interface{}) *FunctionalOptionsArgument {
+//
+//	args.Assert(t, FunctionalOptions(foo.Opt1("strValue"), foo.Opt2(613)))
+func FunctionalOptions(values ...interface{}) *FunctionalOptionsArgument {
 	return &FunctionalOptionsArgument{
-		value: value,
+		values: values,
 	}
 }
 
@@ -873,10 +898,11 @@ func (f argumentMatcher) String() string {
 // and false otherwise.
 //
 // Example:
-// m.On("Do", MatchedBy(func(req *http.Request) bool { return req.Host == "example.com" }))
 //
-// |fn|, must be a function accepting a single argument (of the expected type)
-// which returns a bool. If |fn| doesn't match the required signature,
+//	m.On("Do", MatchedBy(func(req *http.Request) bool { return req.Host == "example.com" }))
+//
+// fn must be a function accepting a single argument (of the expected type)
+// which returns a bool. If fn doesn't match the required signature,
 // MatchedBy() panics.
 func MatchedBy(fn interface{}) argumentMatcher {
 	fnType := reflect.TypeOf(fn)
@@ -979,20 +1005,17 @@ func (args Arguments) Diff(objects []interface{}) (string, int) {
 					output = fmt.Sprintf("%s\t%d: FAIL:  type %s != type %s - %s\n", output, i, expected.t.Name(), actualT.Name(), actualFmt)
 				}
 			case *FunctionalOptionsArgument:
-				t := expected.value
-
 				var name string
-				tValue := reflect.ValueOf(t)
-				if tValue.Len() > 0 {
-					name = "[]" + reflect.TypeOf(tValue.Index(0).Interface()).String()
+				if len(expected.values) > 0 {
+					name = "[]" + reflect.TypeOf(expected.values[0]).String()
 				}
 
-				tName := reflect.TypeOf(t).Name()
-				if name != reflect.TypeOf(actual).String() && tValue.Len() != 0 {
+				const tName = "[]interface{}"
+				if name != reflect.TypeOf(actual).String() && len(expected.values) != 0 {
 					differences++
 					output = fmt.Sprintf("%s\t%d: FAIL:  type %s != type %s - %s\n", output, i, tName, reflect.TypeOf(actual).Name(), actualFmt)
 				} else {
-					if ef, af := assertOpts(t, actual); ef == "" && af == "" {
+					if ef, af := assertOpts(expected.values, actual); ef == "" && af == "" {
 						// match
 						output = fmt.Sprintf("%s\t%d: PASS:  %s == %s\n", output, i, tName, tName)
 					} else {
@@ -1092,7 +1115,7 @@ func (args Arguments) Error(index int) error {
 		return nil
 	}
 	if s, ok = obj.(error); !ok {
-		panic(fmt.Sprintf("assert: arguments: Error(%d) failed because object wasn't correct type: %v", index, args.Get(index)))
+		panic(fmt.Sprintf("assert: arguments: Error(%d) failed because object wasn't correct type: %v", index, obj))
 	}
 	return s
 }
@@ -1181,32 +1204,38 @@ type tHelper interface {
 func assertOpts(expected, actual interface{}) (expectedFmt, actualFmt string) {
 	expectedOpts := reflect.ValueOf(expected)
 	actualOpts := reflect.ValueOf(actual)
+
+	var expectedFuncs []*runtime.Func
 	var expectedNames []string
 	for i := 0; i < expectedOpts.Len(); i++ {
-		expectedNames = append(expectedNames, funcName(expectedOpts.Index(i).Interface()))
+		f := runtimeFunc(expectedOpts.Index(i).Interface())
+		expectedFuncs = append(expectedFuncs, f)
+		expectedNames = append(expectedNames, funcName(f))
 	}
+	var actualFuncs []*runtime.Func
 	var actualNames []string
 	for i := 0; i < actualOpts.Len(); i++ {
-		actualNames = append(actualNames, funcName(actualOpts.Index(i).Interface()))
+		f := runtimeFunc(actualOpts.Index(i).Interface())
+		actualFuncs = append(actualFuncs, f)
+		actualNames = append(actualNames, funcName(f))
 	}
-	if !assert.ObjectsAreEqual(expectedNames, actualNames) {
+
+	if expectedOpts.Len() != actualOpts.Len() {
 		expectedFmt = fmt.Sprintf("%v", expectedNames)
 		actualFmt = fmt.Sprintf("%v", actualNames)
 		return
 	}
 
 	for i := 0; i < expectedOpts.Len(); i++ {
-		expectedOpt := expectedOpts.Index(i).Interface()
-		actualOpt := actualOpts.Index(i).Interface()
-
-		expectedFunc := expectedNames[i]
-		actualFunc := actualNames[i]
-		if expectedFunc != actualFunc {
-			expectedFmt = expectedFunc
-			actualFmt = actualFunc
+		if !isFuncSame(expectedFuncs[i], actualFuncs[i]) {
+			expectedFmt = expectedNames[i]
+			actualFmt = actualNames[i]
 			return
 		}
 
+		expectedOpt := expectedOpts.Index(i).Interface()
+		actualOpt := actualOpts.Index(i).Interface()
+
 		ot := reflect.TypeOf(expectedOpt)
 		var expectedValues []reflect.Value
 		var actualValues []reflect.Value
@@ -1224,9 +1253,9 @@ func assertOpts(expected, actual interface{}) (expectedFmt, actualFmt string) {
 		reflect.ValueOf(actualOpt).Call(actualValues)
 
 		for i := 0; i < ot.NumIn(); i++ {
-			if !assert.ObjectsAreEqual(expectedValues[i].Interface(), actualValues[i].Interface()) {
-				expectedFmt = fmt.Sprintf("%s %+v", expectedNames[i], expectedValues[i].Interface())
-				actualFmt = fmt.Sprintf("%s %+v", expectedNames[i], actualValues[i].Interface())
+			if expectedArg, actualArg := expectedValues[i].Interface(), actualValues[i].Interface(); !assert.ObjectsAreEqual(expectedArg, actualArg) {
+				expectedFmt = fmt.Sprintf("%s(%T) -> %#v", expectedNames[i], expectedArg, expectedArg)
+				actualFmt = fmt.Sprintf("%s(%T) -> %#v", expectedNames[i], actualArg, actualArg)
 				return
 			}
 		}
@@ -1235,7 +1264,25 @@ func assertOpts(expected, actual interface{}) (expectedFmt, actualFmt string) {
 	return "", ""
 }
 
-func funcName(opt interface{}) string {
-	n := runtime.FuncForPC(reflect.ValueOf(opt).Pointer()).Name()
-	return strings.TrimSuffix(path.Base(n), path.Ext(n))
+func runtimeFunc(opt interface{}) *runtime.Func {
+	return runtime.FuncForPC(reflect.ValueOf(opt).Pointer())
+}
+
+func funcName(f *runtime.Func) string {
+	name := f.Name()
+	trimmed := strings.TrimSuffix(path.Base(name), path.Ext(name))
+	splitted := strings.Split(trimmed, ".")
+
+	if len(splitted) == 0 {
+		return trimmed
+	}
+
+	return splitted[len(splitted)-1]
+}
+
+func isFuncSame(f1, f2 *runtime.Func) bool {
+	f1File, f1Loc := f1.FileLine(f1.Entry())
+	f2File, f2Loc := f2.FileLine(f2.Entry())
+
+	return f1File == f2File && f1Loc == f2Loc
 }
diff --git a/vendor/github.com/stretchr/testify/require/require.go b/vendor/github.com/stretchr/testify/require/require.go
index 506a82f807..d8921950d7 100644
--- a/vendor/github.com/stretchr/testify/require/require.go
+++ b/vendor/github.com/stretchr/testify/require/require.go
@@ -34,9 +34,9 @@ func Conditionf(t TestingT, comp assert.Comparison, msg string, args ...interfac
 // Contains asserts that the specified string, list(array, slice...) or map contains the
 // specified substring or element.
 //
-//	assert.Contains(t, "Hello World", "World")
-//	assert.Contains(t, ["Hello", "World"], "World")
-//	assert.Contains(t, {"Hello": "World"}, "Hello")
+//	require.Contains(t, "Hello World", "World")
+//	require.Contains(t, ["Hello", "World"], "World")
+//	require.Contains(t, {"Hello": "World"}, "Hello")
 func Contains(t TestingT, s interface{}, contains interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -50,9 +50,9 @@ func Contains(t TestingT, s interface{}, contains interface{}, msgAndArgs ...int
 // Containsf asserts that the specified string, list(array, slice...) or map contains the
 // specified substring or element.
 //
-//	assert.Containsf(t, "Hello World", "World", "error message %s", "formatted")
-//	assert.Containsf(t, ["Hello", "World"], "World", "error message %s", "formatted")
-//	assert.Containsf(t, {"Hello": "World"}, "Hello", "error message %s", "formatted")
+//	require.Containsf(t, "Hello World", "World", "error message %s", "formatted")
+//	require.Containsf(t, ["Hello", "World"], "World", "error message %s", "formatted")
+//	require.Containsf(t, {"Hello": "World"}, "Hello", "error message %s", "formatted")
 func Containsf(t TestingT, s interface{}, contains interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -91,7 +91,7 @@ func DirExistsf(t TestingT, path string, msg string, args ...interface{}) {
 // listB(array, slice...) ignoring the order of the elements. If there are duplicate elements,
 // the number of appearances of each of them in both lists should match.
 //
-// assert.ElementsMatch(t, [1, 3, 2, 3], [1, 3, 3, 2])
+// require.ElementsMatch(t, [1, 3, 2, 3], [1, 3, 3, 2])
 func ElementsMatch(t TestingT, listA interface{}, listB interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -106,7 +106,7 @@ func ElementsMatch(t TestingT, listA interface{}, listB interface{}, msgAndArgs
 // listB(array, slice...) ignoring the order of the elements. If there are duplicate elements,
 // the number of appearances of each of them in both lists should match.
 //
-// assert.ElementsMatchf(t, [1, 3, 2, 3], [1, 3, 3, 2], "error message %s", "formatted")
+// require.ElementsMatchf(t, [1, 3, 2, 3], [1, 3, 3, 2], "error message %s", "formatted")
 func ElementsMatchf(t TestingT, listA interface{}, listB interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -120,7 +120,7 @@ func ElementsMatchf(t TestingT, listA interface{}, listB interface{}, msg string
 // Empty asserts that the specified object is empty.  I.e. nil, "", false, 0 or either
 // a slice or a channel with len == 0.
 //
-//	assert.Empty(t, obj)
+//	require.Empty(t, obj)
 func Empty(t TestingT, object interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -134,7 +134,7 @@ func Empty(t TestingT, object interface{}, msgAndArgs ...interface{}) {
 // Emptyf asserts that the specified object is empty.  I.e. nil, "", false, 0 or either
 // a slice or a channel with len == 0.
 //
-//	assert.Emptyf(t, obj, "error message %s", "formatted")
+//	require.Emptyf(t, obj, "error message %s", "formatted")
 func Emptyf(t TestingT, object interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -147,7 +147,7 @@ func Emptyf(t TestingT, object interface{}, msg string, args ...interface{}) {
 
 // Equal asserts that two objects are equal.
 //
-//	assert.Equal(t, 123, 123)
+//	require.Equal(t, 123, 123)
 //
 // Pointer variable equality is determined based on the equality of the
 // referenced values (as opposed to the memory addresses). Function equality
@@ -166,7 +166,7 @@ func Equal(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...i
 // and that it is equal to the provided error.
 //
 //	actualObj, err := SomeFunction()
-//	assert.EqualError(t, err,  expectedErrorString)
+//	require.EqualError(t, err,  expectedErrorString)
 func EqualError(t TestingT, theError error, errString string, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -181,7 +181,7 @@ func EqualError(t TestingT, theError error, errString string, msgAndArgs ...inte
 // and that it is equal to the provided error.
 //
 //	actualObj, err := SomeFunction()
-//	assert.EqualErrorf(t, err,  expectedErrorString, "error message %s", "formatted")
+//	require.EqualErrorf(t, err,  expectedErrorString, "error message %s", "formatted")
 func EqualErrorf(t TestingT, theError error, errString string, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -200,8 +200,8 @@ func EqualErrorf(t TestingT, theError error, errString string, msg string, args
 //		Exported     	int
 //		notExported   	int
 //	 }
-//	 assert.EqualExportedValues(t, S{1, 2}, S{1, 3}) => true
-//	 assert.EqualExportedValues(t, S{1, 2}, S{2, 3}) => false
+//	 require.EqualExportedValues(t, S{1, 2}, S{1, 3}) => true
+//	 require.EqualExportedValues(t, S{1, 2}, S{2, 3}) => false
 func EqualExportedValues(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -220,8 +220,8 @@ func EqualExportedValues(t TestingT, expected interface{}, actual interface{}, m
 //		Exported     	int
 //		notExported   	int
 //	 }
-//	 assert.EqualExportedValuesf(t, S{1, 2}, S{1, 3}, "error message %s", "formatted") => true
-//	 assert.EqualExportedValuesf(t, S{1, 2}, S{2, 3}, "error message %s", "formatted") => false
+//	 require.EqualExportedValuesf(t, S{1, 2}, S{1, 3}, "error message %s", "formatted") => true
+//	 require.EqualExportedValuesf(t, S{1, 2}, S{2, 3}, "error message %s", "formatted") => false
 func EqualExportedValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -232,10 +232,10 @@ func EqualExportedValuesf(t TestingT, expected interface{}, actual interface{},
 	t.FailNow()
 }
 
-// EqualValues asserts that two objects are equal or convertible to the same types
-// and equal.
+// EqualValues asserts that two objects are equal or convertible to the larger
+// type and equal.
 //
-//	assert.EqualValues(t, uint32(123), int32(123))
+//	require.EqualValues(t, uint32(123), int32(123))
 func EqualValues(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -246,10 +246,10 @@ func EqualValues(t TestingT, expected interface{}, actual interface{}, msgAndArg
 	t.FailNow()
 }
 
-// EqualValuesf asserts that two objects are equal or convertible to the same types
-// and equal.
+// EqualValuesf asserts that two objects are equal or convertible to the larger
+// type and equal.
 //
-//	assert.EqualValuesf(t, uint32(123), int32(123), "error message %s", "formatted")
+//	require.EqualValuesf(t, uint32(123), int32(123), "error message %s", "formatted")
 func EqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -262,7 +262,7 @@ func EqualValuesf(t TestingT, expected interface{}, actual interface{}, msg stri
 
 // Equalf asserts that two objects are equal.
 //
-//	assert.Equalf(t, 123, 123, "error message %s", "formatted")
+//	require.Equalf(t, 123, 123, "error message %s", "formatted")
 //
 // Pointer variable equality is determined based on the equality of the
 // referenced values (as opposed to the memory addresses). Function equality
@@ -280,8 +280,8 @@ func Equalf(t TestingT, expected interface{}, actual interface{}, msg string, ar
 // Error asserts that a function returned an error (i.e. not `nil`).
 //
 //	  actualObj, err := SomeFunction()
-//	  if assert.Error(t, err) {
-//		   assert.Equal(t, expectedError, err)
+//	  if require.Error(t, err) {
+//		   require.Equal(t, expectedError, err)
 //	  }
 func Error(t TestingT, err error, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
@@ -321,7 +321,7 @@ func ErrorAsf(t TestingT, err error, target interface{}, msg string, args ...int
 // and that the error contains the specified substring.
 //
 //	actualObj, err := SomeFunction()
-//	assert.ErrorContains(t, err,  expectedErrorSubString)
+//	require.ErrorContains(t, err,  expectedErrorSubString)
 func ErrorContains(t TestingT, theError error, contains string, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -336,7 +336,7 @@ func ErrorContains(t TestingT, theError error, contains string, msgAndArgs ...in
 // and that the error contains the specified substring.
 //
 //	actualObj, err := SomeFunction()
-//	assert.ErrorContainsf(t, err,  expectedErrorSubString, "error message %s", "formatted")
+//	require.ErrorContainsf(t, err,  expectedErrorSubString, "error message %s", "formatted")
 func ErrorContainsf(t TestingT, theError error, contains string, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -374,8 +374,8 @@ func ErrorIsf(t TestingT, err error, target error, msg string, args ...interface
 // Errorf asserts that a function returned an error (i.e. not `nil`).
 //
 //	  actualObj, err := SomeFunction()
-//	  if assert.Errorf(t, err, "error message %s", "formatted") {
-//		   assert.Equal(t, expectedErrorf, err)
+//	  if require.Errorf(t, err, "error message %s", "formatted") {
+//		   require.Equal(t, expectedErrorf, err)
 //	  }
 func Errorf(t TestingT, err error, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
@@ -390,7 +390,7 @@ func Errorf(t TestingT, err error, msg string, args ...interface{}) {
 // Eventually asserts that given condition will be met in waitFor time,
 // periodically checking target function each tick.
 //
-//	assert.Eventually(t, func() bool { return true; }, time.Second, 10*time.Millisecond)
+//	require.Eventually(t, func() bool { return true; }, time.Second, 10*time.Millisecond)
 func Eventually(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -415,10 +415,10 @@ func Eventually(t TestingT, condition func() bool, waitFor time.Duration, tick t
 //		time.Sleep(8*time.Second)
 //		externalValue = true
 //	}()
-//	assert.EventuallyWithT(t, func(c *assert.CollectT) {
+//	require.EventuallyWithT(t, func(c *require.CollectT) {
 //		// add assertions as needed; any assertion failure will fail the current tick
-//		assert.True(c, externalValue, "expected 'externalValue' to be true")
-//	}, 1*time.Second, 10*time.Second, "external state has not changed to 'true'; still false")
+//		require.True(c, externalValue, "expected 'externalValue' to be true")
+//	}, 10*time.Second, 1*time.Second, "external state has not changed to 'true'; still false")
 func EventuallyWithT(t TestingT, condition func(collect *assert.CollectT), waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -443,10 +443,10 @@ func EventuallyWithT(t TestingT, condition func(collect *assert.CollectT), waitF
 //		time.Sleep(8*time.Second)
 //		externalValue = true
 //	}()
-//	assert.EventuallyWithTf(t, func(c *assert.CollectT, "error message %s", "formatted") {
+//	require.EventuallyWithTf(t, func(c *require.CollectT, "error message %s", "formatted") {
 //		// add assertions as needed; any assertion failure will fail the current tick
-//		assert.True(c, externalValue, "expected 'externalValue' to be true")
-//	}, 1*time.Second, 10*time.Second, "external state has not changed to 'true'; still false")
+//		require.True(c, externalValue, "expected 'externalValue' to be true")
+//	}, 10*time.Second, 1*time.Second, "external state has not changed to 'true'; still false")
 func EventuallyWithTf(t TestingT, condition func(collect *assert.CollectT), waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -460,7 +460,7 @@ func EventuallyWithTf(t TestingT, condition func(collect *assert.CollectT), wait
 // Eventuallyf asserts that given condition will be met in waitFor time,
 // periodically checking target function each tick.
 //
-//	assert.Eventuallyf(t, func() bool { return true; }, time.Second, 10*time.Millisecond, "error message %s", "formatted")
+//	require.Eventuallyf(t, func() bool { return true; }, time.Second, 10*time.Millisecond, "error message %s", "formatted")
 func Eventuallyf(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -473,7 +473,7 @@ func Eventuallyf(t TestingT, condition func() bool, waitFor time.Duration, tick
 
 // Exactly asserts that two objects are equal in value and type.
 //
-//	assert.Exactly(t, int32(123), int64(123))
+//	require.Exactly(t, int32(123), int64(123))
 func Exactly(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -486,7 +486,7 @@ func Exactly(t TestingT, expected interface{}, actual interface{}, msgAndArgs ..
 
 // Exactlyf asserts that two objects are equal in value and type.
 //
-//	assert.Exactlyf(t, int32(123), int64(123), "error message %s", "formatted")
+//	require.Exactlyf(t, int32(123), int64(123), "error message %s", "formatted")
 func Exactlyf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -543,7 +543,7 @@ func Failf(t TestingT, failureMessage string, msg string, args ...interface{}) {
 
 // False asserts that the specified value is false.
 //
-//	assert.False(t, myBool)
+//	require.False(t, myBool)
 func False(t TestingT, value bool, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -556,7 +556,7 @@ func False(t TestingT, value bool, msgAndArgs ...interface{}) {
 
 // Falsef asserts that the specified value is false.
 //
-//	assert.Falsef(t, myBool, "error message %s", "formatted")
+//	require.Falsef(t, myBool, "error message %s", "formatted")
 func Falsef(t TestingT, value bool, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -593,9 +593,9 @@ func FileExistsf(t TestingT, path string, msg string, args ...interface{}) {
 
 // Greater asserts that the first element is greater than the second
 //
-//	assert.Greater(t, 2, 1)
-//	assert.Greater(t, float64(2), float64(1))
-//	assert.Greater(t, "b", "a")
+//	require.Greater(t, 2, 1)
+//	require.Greater(t, float64(2), float64(1))
+//	require.Greater(t, "b", "a")
 func Greater(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -608,10 +608,10 @@ func Greater(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface
 
 // GreaterOrEqual asserts that the first element is greater than or equal to the second
 //
-//	assert.GreaterOrEqual(t, 2, 1)
-//	assert.GreaterOrEqual(t, 2, 2)
-//	assert.GreaterOrEqual(t, "b", "a")
-//	assert.GreaterOrEqual(t, "b", "b")
+//	require.GreaterOrEqual(t, 2, 1)
+//	require.GreaterOrEqual(t, 2, 2)
+//	require.GreaterOrEqual(t, "b", "a")
+//	require.GreaterOrEqual(t, "b", "b")
 func GreaterOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -624,10 +624,10 @@ func GreaterOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...in
 
 // GreaterOrEqualf asserts that the first element is greater than or equal to the second
 //
-//	assert.GreaterOrEqualf(t, 2, 1, "error message %s", "formatted")
-//	assert.GreaterOrEqualf(t, 2, 2, "error message %s", "formatted")
-//	assert.GreaterOrEqualf(t, "b", "a", "error message %s", "formatted")
-//	assert.GreaterOrEqualf(t, "b", "b", "error message %s", "formatted")
+//	require.GreaterOrEqualf(t, 2, 1, "error message %s", "formatted")
+//	require.GreaterOrEqualf(t, 2, 2, "error message %s", "formatted")
+//	require.GreaterOrEqualf(t, "b", "a", "error message %s", "formatted")
+//	require.GreaterOrEqualf(t, "b", "b", "error message %s", "formatted")
 func GreaterOrEqualf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -640,9 +640,9 @@ func GreaterOrEqualf(t TestingT, e1 interface{}, e2 interface{}, msg string, arg
 
 // Greaterf asserts that the first element is greater than the second
 //
-//	assert.Greaterf(t, 2, 1, "error message %s", "formatted")
-//	assert.Greaterf(t, float64(2), float64(1), "error message %s", "formatted")
-//	assert.Greaterf(t, "b", "a", "error message %s", "formatted")
+//	require.Greaterf(t, 2, 1, "error message %s", "formatted")
+//	require.Greaterf(t, float64(2), float64(1), "error message %s", "formatted")
+//	require.Greaterf(t, "b", "a", "error message %s", "formatted")
 func Greaterf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -656,7 +656,7 @@ func Greaterf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...in
 // HTTPBodyContains asserts that a specified handler returns a
 // body that contains a string.
 //
-//	assert.HTTPBodyContains(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky")
+//	require.HTTPBodyContains(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky")
 //
 // Returns whether the assertion was successful (true) or not (false).
 func HTTPBodyContains(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) {
@@ -672,7 +672,7 @@ func HTTPBodyContains(t TestingT, handler http.HandlerFunc, method string, url s
 // HTTPBodyContainsf asserts that a specified handler returns a
 // body that contains a string.
 //
-//	assert.HTTPBodyContainsf(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted")
+//	require.HTTPBodyContainsf(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted")
 //
 // Returns whether the assertion was successful (true) or not (false).
 func HTTPBodyContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) {
@@ -688,7 +688,7 @@ func HTTPBodyContainsf(t TestingT, handler http.HandlerFunc, method string, url
 // HTTPBodyNotContains asserts that a specified handler returns a
 // body that does not contain a string.
 //
-//	assert.HTTPBodyNotContains(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky")
+//	require.HTTPBodyNotContains(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky")
 //
 // Returns whether the assertion was successful (true) or not (false).
 func HTTPBodyNotContains(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) {
@@ -704,7 +704,7 @@ func HTTPBodyNotContains(t TestingT, handler http.HandlerFunc, method string, ur
 // HTTPBodyNotContainsf asserts that a specified handler returns a
 // body that does not contain a string.
 //
-//	assert.HTTPBodyNotContainsf(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted")
+//	require.HTTPBodyNotContainsf(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted")
 //
 // Returns whether the assertion was successful (true) or not (false).
 func HTTPBodyNotContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) {
@@ -719,7 +719,7 @@ func HTTPBodyNotContainsf(t TestingT, handler http.HandlerFunc, method string, u
 
 // HTTPError asserts that a specified handler returns an error status code.
 //
-//	assert.HTTPError(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}}
+//	require.HTTPError(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}}
 //
 // Returns whether the assertion was successful (true) or not (false).
 func HTTPError(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) {
@@ -734,7 +734,7 @@ func HTTPError(t TestingT, handler http.HandlerFunc, method string, url string,
 
 // HTTPErrorf asserts that a specified handler returns an error status code.
 //
-//	assert.HTTPErrorf(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}}
+//	require.HTTPErrorf(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}}
 //
 // Returns whether the assertion was successful (true) or not (false).
 func HTTPErrorf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) {
@@ -749,7 +749,7 @@ func HTTPErrorf(t TestingT, handler http.HandlerFunc, method string, url string,
 
 // HTTPRedirect asserts that a specified handler returns a redirect status code.
 //
-//	assert.HTTPRedirect(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}}
+//	require.HTTPRedirect(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}}
 //
 // Returns whether the assertion was successful (true) or not (false).
 func HTTPRedirect(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) {
@@ -764,7 +764,7 @@ func HTTPRedirect(t TestingT, handler http.HandlerFunc, method string, url strin
 
 // HTTPRedirectf asserts that a specified handler returns a redirect status code.
 //
-//	assert.HTTPRedirectf(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}}
+//	require.HTTPRedirectf(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}}
 //
 // Returns whether the assertion was successful (true) or not (false).
 func HTTPRedirectf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) {
@@ -779,7 +779,7 @@ func HTTPRedirectf(t TestingT, handler http.HandlerFunc, method string, url stri
 
 // HTTPStatusCode asserts that a specified handler returns a specified status code.
 //
-//	assert.HTTPStatusCode(t, myHandler, "GET", "/notImplemented", nil, 501)
+//	require.HTTPStatusCode(t, myHandler, "GET", "/notImplemented", nil, 501)
 //
 // Returns whether the assertion was successful (true) or not (false).
 func HTTPStatusCode(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, statuscode int, msgAndArgs ...interface{}) {
@@ -794,7 +794,7 @@ func HTTPStatusCode(t TestingT, handler http.HandlerFunc, method string, url str
 
 // HTTPStatusCodef asserts that a specified handler returns a specified status code.
 //
-//	assert.HTTPStatusCodef(t, myHandler, "GET", "/notImplemented", nil, 501, "error message %s", "formatted")
+//	require.HTTPStatusCodef(t, myHandler, "GET", "/notImplemented", nil, 501, "error message %s", "formatted")
 //
 // Returns whether the assertion was successful (true) or not (false).
 func HTTPStatusCodef(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, statuscode int, msg string, args ...interface{}) {
@@ -809,7 +809,7 @@ func HTTPStatusCodef(t TestingT, handler http.HandlerFunc, method string, url st
 
 // HTTPSuccess asserts that a specified handler returns a success status code.
 //
-//	assert.HTTPSuccess(t, myHandler, "POST", "http://www.google.com", nil)
+//	require.HTTPSuccess(t, myHandler, "POST", "http://www.google.com", nil)
 //
 // Returns whether the assertion was successful (true) or not (false).
 func HTTPSuccess(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) {
@@ -824,7 +824,7 @@ func HTTPSuccess(t TestingT, handler http.HandlerFunc, method string, url string
 
 // HTTPSuccessf asserts that a specified handler returns a success status code.
 //
-//	assert.HTTPSuccessf(t, myHandler, "POST", "http://www.google.com", nil, "error message %s", "formatted")
+//	require.HTTPSuccessf(t, myHandler, "POST", "http://www.google.com", nil, "error message %s", "formatted")
 //
 // Returns whether the assertion was successful (true) or not (false).
 func HTTPSuccessf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) {
@@ -839,7 +839,7 @@ func HTTPSuccessf(t TestingT, handler http.HandlerFunc, method string, url strin
 
 // Implements asserts that an object is implemented by the specified interface.
 //
-//	assert.Implements(t, (*MyInterface)(nil), new(MyObject))
+//	require.Implements(t, (*MyInterface)(nil), new(MyObject))
 func Implements(t TestingT, interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -852,7 +852,7 @@ func Implements(t TestingT, interfaceObject interface{}, object interface{}, msg
 
 // Implementsf asserts that an object is implemented by the specified interface.
 //
-//	assert.Implementsf(t, (*MyInterface)(nil), new(MyObject), "error message %s", "formatted")
+//	require.Implementsf(t, (*MyInterface)(nil), new(MyObject), "error message %s", "formatted")
 func Implementsf(t TestingT, interfaceObject interface{}, object interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -865,7 +865,7 @@ func Implementsf(t TestingT, interfaceObject interface{}, object interface{}, ms
 
 // InDelta asserts that the two numerals are within delta of each other.
 //
-//	assert.InDelta(t, math.Pi, 22/7.0, 0.01)
+//	require.InDelta(t, math.Pi, 22/7.0, 0.01)
 func InDelta(t TestingT, expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -922,7 +922,7 @@ func InDeltaSlicef(t TestingT, expected interface{}, actual interface{}, delta f
 
 // InDeltaf asserts that the two numerals are within delta of each other.
 //
-//	assert.InDeltaf(t, math.Pi, 22/7.0, 0.01, "error message %s", "formatted")
+//	require.InDeltaf(t, math.Pi, 22/7.0, 0.01, "error message %s", "formatted")
 func InDeltaf(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -979,9 +979,9 @@ func InEpsilonf(t TestingT, expected interface{}, actual interface{}, epsilon fl
 
 // IsDecreasing asserts that the collection is decreasing
 //
-//	assert.IsDecreasing(t, []int{2, 1, 0})
-//	assert.IsDecreasing(t, []float{2, 1})
-//	assert.IsDecreasing(t, []string{"b", "a"})
+//	require.IsDecreasing(t, []int{2, 1, 0})
+//	require.IsDecreasing(t, []float{2, 1})
+//	require.IsDecreasing(t, []string{"b", "a"})
 func IsDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -994,9 +994,9 @@ func IsDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) {
 
 // IsDecreasingf asserts that the collection is decreasing
 //
-//	assert.IsDecreasingf(t, []int{2, 1, 0}, "error message %s", "formatted")
-//	assert.IsDecreasingf(t, []float{2, 1}, "error message %s", "formatted")
-//	assert.IsDecreasingf(t, []string{"b", "a"}, "error message %s", "formatted")
+//	require.IsDecreasingf(t, []int{2, 1, 0}, "error message %s", "formatted")
+//	require.IsDecreasingf(t, []float{2, 1}, "error message %s", "formatted")
+//	require.IsDecreasingf(t, []string{"b", "a"}, "error message %s", "formatted")
 func IsDecreasingf(t TestingT, object interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1009,9 +1009,9 @@ func IsDecreasingf(t TestingT, object interface{}, msg string, args ...interface
 
 // IsIncreasing asserts that the collection is increasing
 //
-//	assert.IsIncreasing(t, []int{1, 2, 3})
-//	assert.IsIncreasing(t, []float{1, 2})
-//	assert.IsIncreasing(t, []string{"a", "b"})
+//	require.IsIncreasing(t, []int{1, 2, 3})
+//	require.IsIncreasing(t, []float{1, 2})
+//	require.IsIncreasing(t, []string{"a", "b"})
 func IsIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1024,9 +1024,9 @@ func IsIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) {
 
 // IsIncreasingf asserts that the collection is increasing
 //
-//	assert.IsIncreasingf(t, []int{1, 2, 3}, "error message %s", "formatted")
-//	assert.IsIncreasingf(t, []float{1, 2}, "error message %s", "formatted")
-//	assert.IsIncreasingf(t, []string{"a", "b"}, "error message %s", "formatted")
+//	require.IsIncreasingf(t, []int{1, 2, 3}, "error message %s", "formatted")
+//	require.IsIncreasingf(t, []float{1, 2}, "error message %s", "formatted")
+//	require.IsIncreasingf(t, []string{"a", "b"}, "error message %s", "formatted")
 func IsIncreasingf(t TestingT, object interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1039,9 +1039,9 @@ func IsIncreasingf(t TestingT, object interface{}, msg string, args ...interface
 
 // IsNonDecreasing asserts that the collection is not decreasing
 //
-//	assert.IsNonDecreasing(t, []int{1, 1, 2})
-//	assert.IsNonDecreasing(t, []float{1, 2})
-//	assert.IsNonDecreasing(t, []string{"a", "b"})
+//	require.IsNonDecreasing(t, []int{1, 1, 2})
+//	require.IsNonDecreasing(t, []float{1, 2})
+//	require.IsNonDecreasing(t, []string{"a", "b"})
 func IsNonDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1054,9 +1054,9 @@ func IsNonDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{})
 
 // IsNonDecreasingf asserts that the collection is not decreasing
 //
-//	assert.IsNonDecreasingf(t, []int{1, 1, 2}, "error message %s", "formatted")
-//	assert.IsNonDecreasingf(t, []float{1, 2}, "error message %s", "formatted")
-//	assert.IsNonDecreasingf(t, []string{"a", "b"}, "error message %s", "formatted")
+//	require.IsNonDecreasingf(t, []int{1, 1, 2}, "error message %s", "formatted")
+//	require.IsNonDecreasingf(t, []float{1, 2}, "error message %s", "formatted")
+//	require.IsNonDecreasingf(t, []string{"a", "b"}, "error message %s", "formatted")
 func IsNonDecreasingf(t TestingT, object interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1069,9 +1069,9 @@ func IsNonDecreasingf(t TestingT, object interface{}, msg string, args ...interf
 
 // IsNonIncreasing asserts that the collection is not increasing
 //
-//	assert.IsNonIncreasing(t, []int{2, 1, 1})
-//	assert.IsNonIncreasing(t, []float{2, 1})
-//	assert.IsNonIncreasing(t, []string{"b", "a"})
+//	require.IsNonIncreasing(t, []int{2, 1, 1})
+//	require.IsNonIncreasing(t, []float{2, 1})
+//	require.IsNonIncreasing(t, []string{"b", "a"})
 func IsNonIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1084,9 +1084,9 @@ func IsNonIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{})
 
 // IsNonIncreasingf asserts that the collection is not increasing
 //
-//	assert.IsNonIncreasingf(t, []int{2, 1, 1}, "error message %s", "formatted")
-//	assert.IsNonIncreasingf(t, []float{2, 1}, "error message %s", "formatted")
-//	assert.IsNonIncreasingf(t, []string{"b", "a"}, "error message %s", "formatted")
+//	require.IsNonIncreasingf(t, []int{2, 1, 1}, "error message %s", "formatted")
+//	require.IsNonIncreasingf(t, []float{2, 1}, "error message %s", "formatted")
+//	require.IsNonIncreasingf(t, []string{"b", "a"}, "error message %s", "formatted")
 func IsNonIncreasingf(t TestingT, object interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1121,7 +1121,7 @@ func IsTypef(t TestingT, expectedType interface{}, object interface{}, msg strin
 
 // JSONEq asserts that two JSON strings are equivalent.
 //
-//	assert.JSONEq(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`)
+//	require.JSONEq(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`)
 func JSONEq(t TestingT, expected string, actual string, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1134,7 +1134,7 @@ func JSONEq(t TestingT, expected string, actual string, msgAndArgs ...interface{
 
 // JSONEqf asserts that two JSON strings are equivalent.
 //
-//	assert.JSONEqf(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`, "error message %s", "formatted")
+//	require.JSONEqf(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`, "error message %s", "formatted")
 func JSONEqf(t TestingT, expected string, actual string, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1148,7 +1148,7 @@ func JSONEqf(t TestingT, expected string, actual string, msg string, args ...int
 // Len asserts that the specified object has specific length.
 // Len also fails if the object has a type that len() not accept.
 //
-//	assert.Len(t, mySlice, 3)
+//	require.Len(t, mySlice, 3)
 func Len(t TestingT, object interface{}, length int, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1162,7 +1162,7 @@ func Len(t TestingT, object interface{}, length int, msgAndArgs ...interface{})
 // Lenf asserts that the specified object has specific length.
 // Lenf also fails if the object has a type that len() not accept.
 //
-//	assert.Lenf(t, mySlice, 3, "error message %s", "formatted")
+//	require.Lenf(t, mySlice, 3, "error message %s", "formatted")
 func Lenf(t TestingT, object interface{}, length int, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1175,9 +1175,9 @@ func Lenf(t TestingT, object interface{}, length int, msg string, args ...interf
 
 // Less asserts that the first element is less than the second
 //
-//	assert.Less(t, 1, 2)
-//	assert.Less(t, float64(1), float64(2))
-//	assert.Less(t, "a", "b")
+//	require.Less(t, 1, 2)
+//	require.Less(t, float64(1), float64(2))
+//	require.Less(t, "a", "b")
 func Less(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1190,10 +1190,10 @@ func Less(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{})
 
 // LessOrEqual asserts that the first element is less than or equal to the second
 //
-//	assert.LessOrEqual(t, 1, 2)
-//	assert.LessOrEqual(t, 2, 2)
-//	assert.LessOrEqual(t, "a", "b")
-//	assert.LessOrEqual(t, "b", "b")
+//	require.LessOrEqual(t, 1, 2)
+//	require.LessOrEqual(t, 2, 2)
+//	require.LessOrEqual(t, "a", "b")
+//	require.LessOrEqual(t, "b", "b")
 func LessOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1206,10 +1206,10 @@ func LessOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...inter
 
 // LessOrEqualf asserts that the first element is less than or equal to the second
 //
-//	assert.LessOrEqualf(t, 1, 2, "error message %s", "formatted")
-//	assert.LessOrEqualf(t, 2, 2, "error message %s", "formatted")
-//	assert.LessOrEqualf(t, "a", "b", "error message %s", "formatted")
-//	assert.LessOrEqualf(t, "b", "b", "error message %s", "formatted")
+//	require.LessOrEqualf(t, 1, 2, "error message %s", "formatted")
+//	require.LessOrEqualf(t, 2, 2, "error message %s", "formatted")
+//	require.LessOrEqualf(t, "a", "b", "error message %s", "formatted")
+//	require.LessOrEqualf(t, "b", "b", "error message %s", "formatted")
 func LessOrEqualf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1222,9 +1222,9 @@ func LessOrEqualf(t TestingT, e1 interface{}, e2 interface{}, msg string, args .
 
 // Lessf asserts that the first element is less than the second
 //
-//	assert.Lessf(t, 1, 2, "error message %s", "formatted")
-//	assert.Lessf(t, float64(1), float64(2), "error message %s", "formatted")
-//	assert.Lessf(t, "a", "b", "error message %s", "formatted")
+//	require.Lessf(t, 1, 2, "error message %s", "formatted")
+//	require.Lessf(t, float64(1), float64(2), "error message %s", "formatted")
+//	require.Lessf(t, "a", "b", "error message %s", "formatted")
 func Lessf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1237,8 +1237,8 @@ func Lessf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...inter
 
 // Negative asserts that the specified element is negative
 //
-//	assert.Negative(t, -1)
-//	assert.Negative(t, -1.23)
+//	require.Negative(t, -1)
+//	require.Negative(t, -1.23)
 func Negative(t TestingT, e interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1251,8 +1251,8 @@ func Negative(t TestingT, e interface{}, msgAndArgs ...interface{}) {
 
 // Negativef asserts that the specified element is negative
 //
-//	assert.Negativef(t, -1, "error message %s", "formatted")
-//	assert.Negativef(t, -1.23, "error message %s", "formatted")
+//	require.Negativef(t, -1, "error message %s", "formatted")
+//	require.Negativef(t, -1.23, "error message %s", "formatted")
 func Negativef(t TestingT, e interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1266,7 +1266,7 @@ func Negativef(t TestingT, e interface{}, msg string, args ...interface{}) {
 // Never asserts that the given condition doesn't satisfy in waitFor time,
 // periodically checking the target function each tick.
 //
-//	assert.Never(t, func() bool { return false; }, time.Second, 10*time.Millisecond)
+//	require.Never(t, func() bool { return false; }, time.Second, 10*time.Millisecond)
 func Never(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1280,7 +1280,7 @@ func Never(t TestingT, condition func() bool, waitFor time.Duration, tick time.D
 // Neverf asserts that the given condition doesn't satisfy in waitFor time,
 // periodically checking the target function each tick.
 //
-//	assert.Neverf(t, func() bool { return false; }, time.Second, 10*time.Millisecond, "error message %s", "formatted")
+//	require.Neverf(t, func() bool { return false; }, time.Second, 10*time.Millisecond, "error message %s", "formatted")
 func Neverf(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1293,7 +1293,7 @@ func Neverf(t TestingT, condition func() bool, waitFor time.Duration, tick time.
 
 // Nil asserts that the specified object is nil.
 //
-//	assert.Nil(t, err)
+//	require.Nil(t, err)
 func Nil(t TestingT, object interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1306,7 +1306,7 @@ func Nil(t TestingT, object interface{}, msgAndArgs ...interface{}) {
 
 // Nilf asserts that the specified object is nil.
 //
-//	assert.Nilf(t, err, "error message %s", "formatted")
+//	require.Nilf(t, err, "error message %s", "formatted")
 func Nilf(t TestingT, object interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1344,8 +1344,8 @@ func NoDirExistsf(t TestingT, path string, msg string, args ...interface{}) {
 // NoError asserts that a function returned no error (i.e. `nil`).
 //
 //	  actualObj, err := SomeFunction()
-//	  if assert.NoError(t, err) {
-//		   assert.Equal(t, expectedObj, actualObj)
+//	  if require.NoError(t, err) {
+//		   require.Equal(t, expectedObj, actualObj)
 //	  }
 func NoError(t TestingT, err error, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
@@ -1360,8 +1360,8 @@ func NoError(t TestingT, err error, msgAndArgs ...interface{}) {
 // NoErrorf asserts that a function returned no error (i.e. `nil`).
 //
 //	  actualObj, err := SomeFunction()
-//	  if assert.NoErrorf(t, err, "error message %s", "formatted") {
-//		   assert.Equal(t, expectedObj, actualObj)
+//	  if require.NoErrorf(t, err, "error message %s", "formatted") {
+//		   require.Equal(t, expectedObj, actualObj)
 //	  }
 func NoErrorf(t TestingT, err error, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
@@ -1400,9 +1400,9 @@ func NoFileExistsf(t TestingT, path string, msg string, args ...interface{}) {
 // NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the
 // specified substring or element.
 //
-//	assert.NotContains(t, "Hello World", "Earth")
-//	assert.NotContains(t, ["Hello", "World"], "Earth")
-//	assert.NotContains(t, {"Hello": "World"}, "Earth")
+//	require.NotContains(t, "Hello World", "Earth")
+//	require.NotContains(t, ["Hello", "World"], "Earth")
+//	require.NotContains(t, {"Hello": "World"}, "Earth")
 func NotContains(t TestingT, s interface{}, contains interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1416,9 +1416,9 @@ func NotContains(t TestingT, s interface{}, contains interface{}, msgAndArgs ...
 // NotContainsf asserts that the specified string, list(array, slice...) or map does NOT contain the
 // specified substring or element.
 //
-//	assert.NotContainsf(t, "Hello World", "Earth", "error message %s", "formatted")
-//	assert.NotContainsf(t, ["Hello", "World"], "Earth", "error message %s", "formatted")
-//	assert.NotContainsf(t, {"Hello": "World"}, "Earth", "error message %s", "formatted")
+//	require.NotContainsf(t, "Hello World", "Earth", "error message %s", "formatted")
+//	require.NotContainsf(t, ["Hello", "World"], "Earth", "error message %s", "formatted")
+//	require.NotContainsf(t, {"Hello": "World"}, "Earth", "error message %s", "formatted")
 func NotContainsf(t TestingT, s interface{}, contains interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1429,11 +1429,51 @@ func NotContainsf(t TestingT, s interface{}, contains interface{}, msg string, a
 	t.FailNow()
 }
 
+// NotElementsMatch asserts that the specified listA(array, slice...) is NOT equal to specified
+// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements,
+// the number of appearances of each of them in both lists should not match.
+// This is an inverse of ElementsMatch.
+//
+// require.NotElementsMatch(t, [1, 1, 2, 3], [1, 1, 2, 3]) -> false
+//
+// require.NotElementsMatch(t, [1, 1, 2, 3], [1, 2, 3]) -> true
+//
+// require.NotElementsMatch(t, [1, 2, 3], [1, 2, 4]) -> true
+func NotElementsMatch(t TestingT, listA interface{}, listB interface{}, msgAndArgs ...interface{}) {
+	if h, ok := t.(tHelper); ok {
+		h.Helper()
+	}
+	if assert.NotElementsMatch(t, listA, listB, msgAndArgs...) {
+		return
+	}
+	t.FailNow()
+}
+
+// NotElementsMatchf asserts that the specified listA(array, slice...) is NOT equal to specified
+// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements,
+// the number of appearances of each of them in both lists should not match.
+// This is an inverse of ElementsMatch.
+//
+// require.NotElementsMatchf(t, [1, 1, 2, 3], [1, 1, 2, 3], "error message %s", "formatted") -> false
+//
+// require.NotElementsMatchf(t, [1, 1, 2, 3], [1, 2, 3], "error message %s", "formatted") -> true
+//
+// require.NotElementsMatchf(t, [1, 2, 3], [1, 2, 4], "error message %s", "formatted") -> true
+func NotElementsMatchf(t TestingT, listA interface{}, listB interface{}, msg string, args ...interface{}) {
+	if h, ok := t.(tHelper); ok {
+		h.Helper()
+	}
+	if assert.NotElementsMatchf(t, listA, listB, msg, args...) {
+		return
+	}
+	t.FailNow()
+}
+
 // NotEmpty asserts that the specified object is NOT empty.  I.e. not nil, "", false, 0 or either
 // a slice or a channel with len == 0.
 //
-//	if assert.NotEmpty(t, obj) {
-//	  assert.Equal(t, "two", obj[1])
+//	if require.NotEmpty(t, obj) {
+//	  require.Equal(t, "two", obj[1])
 //	}
 func NotEmpty(t TestingT, object interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
@@ -1448,8 +1488,8 @@ func NotEmpty(t TestingT, object interface{}, msgAndArgs ...interface{}) {
 // NotEmptyf asserts that the specified object is NOT empty.  I.e. not nil, "", false, 0 or either
 // a slice or a channel with len == 0.
 //
-//	if assert.NotEmptyf(t, obj, "error message %s", "formatted") {
-//	  assert.Equal(t, "two", obj[1])
+//	if require.NotEmptyf(t, obj, "error message %s", "formatted") {
+//	  require.Equal(t, "two", obj[1])
 //	}
 func NotEmptyf(t TestingT, object interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
@@ -1463,7 +1503,7 @@ func NotEmptyf(t TestingT, object interface{}, msg string, args ...interface{})
 
 // NotEqual asserts that the specified values are NOT equal.
 //
-//	assert.NotEqual(t, obj1, obj2)
+//	require.NotEqual(t, obj1, obj2)
 //
 // Pointer variable equality is determined based on the equality of the
 // referenced values (as opposed to the memory addresses).
@@ -1479,7 +1519,7 @@ func NotEqual(t TestingT, expected interface{}, actual interface{}, msgAndArgs .
 
 // NotEqualValues asserts that two objects are not equal even when converted to the same type
 //
-//	assert.NotEqualValues(t, obj1, obj2)
+//	require.NotEqualValues(t, obj1, obj2)
 func NotEqualValues(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1492,7 +1532,7 @@ func NotEqualValues(t TestingT, expected interface{}, actual interface{}, msgAnd
 
 // NotEqualValuesf asserts that two objects are not equal even when converted to the same type
 //
-//	assert.NotEqualValuesf(t, obj1, obj2, "error message %s", "formatted")
+//	require.NotEqualValuesf(t, obj1, obj2, "error message %s", "formatted")
 func NotEqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1505,7 +1545,7 @@ func NotEqualValuesf(t TestingT, expected interface{}, actual interface{}, msg s
 
 // NotEqualf asserts that the specified values are NOT equal.
 //
-//	assert.NotEqualf(t, obj1, obj2, "error message %s", "formatted")
+//	require.NotEqualf(t, obj1, obj2, "error message %s", "formatted")
 //
 // Pointer variable equality is determined based on the equality of the
 // referenced values (as opposed to the memory addresses).
@@ -1519,7 +1559,31 @@ func NotEqualf(t TestingT, expected interface{}, actual interface{}, msg string,
 	t.FailNow()
 }
 
-// NotErrorIs asserts that at none of the errors in err's chain matches target.
+// NotErrorAs asserts that none of the errors in err's chain matches target,
+// but if so, sets target to that error value.
+func NotErrorAs(t TestingT, err error, target interface{}, msgAndArgs ...interface{}) {
+	if h, ok := t.(tHelper); ok {
+		h.Helper()
+	}
+	if assert.NotErrorAs(t, err, target, msgAndArgs...) {
+		return
+	}
+	t.FailNow()
+}
+
+// NotErrorAsf asserts that none of the errors in err's chain matches target,
+// but if so, sets target to that error value.
+func NotErrorAsf(t TestingT, err error, target interface{}, msg string, args ...interface{}) {
+	if h, ok := t.(tHelper); ok {
+		h.Helper()
+	}
+	if assert.NotErrorAsf(t, err, target, msg, args...) {
+		return
+	}
+	t.FailNow()
+}
+
+// NotErrorIs asserts that none of the errors in err's chain matches target.
 // This is a wrapper for errors.Is.
 func NotErrorIs(t TestingT, err error, target error, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
@@ -1531,7 +1595,7 @@ func NotErrorIs(t TestingT, err error, target error, msgAndArgs ...interface{})
 	t.FailNow()
 }
 
-// NotErrorIsf asserts that at none of the errors in err's chain matches target.
+// NotErrorIsf asserts that none of the errors in err's chain matches target.
 // This is a wrapper for errors.Is.
 func NotErrorIsf(t TestingT, err error, target error, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
@@ -1545,7 +1609,7 @@ func NotErrorIsf(t TestingT, err error, target error, msg string, args ...interf
 
 // NotImplements asserts that an object does not implement the specified interface.
 //
-//	assert.NotImplements(t, (*MyInterface)(nil), new(MyObject))
+//	require.NotImplements(t, (*MyInterface)(nil), new(MyObject))
 func NotImplements(t TestingT, interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1558,7 +1622,7 @@ func NotImplements(t TestingT, interfaceObject interface{}, object interface{},
 
 // NotImplementsf asserts that an object does not implement the specified interface.
 //
-//	assert.NotImplementsf(t, (*MyInterface)(nil), new(MyObject), "error message %s", "formatted")
+//	require.NotImplementsf(t, (*MyInterface)(nil), new(MyObject), "error message %s", "formatted")
 func NotImplementsf(t TestingT, interfaceObject interface{}, object interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1571,7 +1635,7 @@ func NotImplementsf(t TestingT, interfaceObject interface{}, object interface{},
 
 // NotNil asserts that the specified object is not nil.
 //
-//	assert.NotNil(t, err)
+//	require.NotNil(t, err)
 func NotNil(t TestingT, object interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1584,7 +1648,7 @@ func NotNil(t TestingT, object interface{}, msgAndArgs ...interface{}) {
 
 // NotNilf asserts that the specified object is not nil.
 //
-//	assert.NotNilf(t, err, "error message %s", "formatted")
+//	require.NotNilf(t, err, "error message %s", "formatted")
 func NotNilf(t TestingT, object interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1597,7 +1661,7 @@ func NotNilf(t TestingT, object interface{}, msg string, args ...interface{}) {
 
 // NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic.
 //
-//	assert.NotPanics(t, func(){ RemainCalm() })
+//	require.NotPanics(t, func(){ RemainCalm() })
 func NotPanics(t TestingT, f assert.PanicTestFunc, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1610,7 +1674,7 @@ func NotPanics(t TestingT, f assert.PanicTestFunc, msgAndArgs ...interface{}) {
 
 // NotPanicsf asserts that the code inside the specified PanicTestFunc does NOT panic.
 //
-//	assert.NotPanicsf(t, func(){ RemainCalm() }, "error message %s", "formatted")
+//	require.NotPanicsf(t, func(){ RemainCalm() }, "error message %s", "formatted")
 func NotPanicsf(t TestingT, f assert.PanicTestFunc, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1623,8 +1687,8 @@ func NotPanicsf(t TestingT, f assert.PanicTestFunc, msg string, args ...interfac
 
 // NotRegexp asserts that a specified regexp does not match a string.
 //
-//	assert.NotRegexp(t, regexp.MustCompile("starts"), "it's starting")
-//	assert.NotRegexp(t, "^start", "it's not starting")
+//	require.NotRegexp(t, regexp.MustCompile("starts"), "it's starting")
+//	require.NotRegexp(t, "^start", "it's not starting")
 func NotRegexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1637,8 +1701,8 @@ func NotRegexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interf
 
 // NotRegexpf asserts that a specified regexp does not match a string.
 //
-//	assert.NotRegexpf(t, regexp.MustCompile("starts"), "it's starting", "error message %s", "formatted")
-//	assert.NotRegexpf(t, "^start", "it's not starting", "error message %s", "formatted")
+//	require.NotRegexpf(t, regexp.MustCompile("starts"), "it's starting", "error message %s", "formatted")
+//	require.NotRegexpf(t, "^start", "it's not starting", "error message %s", "formatted")
 func NotRegexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1651,7 +1715,7 @@ func NotRegexpf(t TestingT, rx interface{}, str interface{}, msg string, args ..
 
 // NotSame asserts that two pointers do not reference the same object.
 //
-//	assert.NotSame(t, ptr1, ptr2)
+//	require.NotSame(t, ptr1, ptr2)
 //
 // Both arguments must be pointer variables. Pointer variable sameness is
 // determined based on the equality of both type and value.
@@ -1667,7 +1731,7 @@ func NotSame(t TestingT, expected interface{}, actual interface{}, msgAndArgs ..
 
 // NotSamef asserts that two pointers do not reference the same object.
 //
-//	assert.NotSamef(t, ptr1, ptr2, "error message %s", "formatted")
+//	require.NotSamef(t, ptr1, ptr2, "error message %s", "formatted")
 //
 // Both arguments must be pointer variables. Pointer variable sameness is
 // determined based on the equality of both type and value.
@@ -1685,8 +1749,8 @@ func NotSamef(t TestingT, expected interface{}, actual interface{}, msg string,
 // contain all elements given in the specified subset list(array, slice...) or
 // map.
 //
-//	assert.NotSubset(t, [1, 3, 4], [1, 2])
-//	assert.NotSubset(t, {"x": 1, "y": 2}, {"z": 3})
+//	require.NotSubset(t, [1, 3, 4], [1, 2])
+//	require.NotSubset(t, {"x": 1, "y": 2}, {"z": 3})
 func NotSubset(t TestingT, list interface{}, subset interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1701,8 +1765,8 @@ func NotSubset(t TestingT, list interface{}, subset interface{}, msgAndArgs ...i
 // contain all elements given in the specified subset list(array, slice...) or
 // map.
 //
-//	assert.NotSubsetf(t, [1, 3, 4], [1, 2], "error message %s", "formatted")
-//	assert.NotSubsetf(t, {"x": 1, "y": 2}, {"z": 3}, "error message %s", "formatted")
+//	require.NotSubsetf(t, [1, 3, 4], [1, 2], "error message %s", "formatted")
+//	require.NotSubsetf(t, {"x": 1, "y": 2}, {"z": 3}, "error message %s", "formatted")
 func NotSubsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1737,7 +1801,7 @@ func NotZerof(t TestingT, i interface{}, msg string, args ...interface{}) {
 
 // Panics asserts that the code inside the specified PanicTestFunc panics.
 //
-//	assert.Panics(t, func(){ GoCrazy() })
+//	require.Panics(t, func(){ GoCrazy() })
 func Panics(t TestingT, f assert.PanicTestFunc, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1752,7 +1816,7 @@ func Panics(t TestingT, f assert.PanicTestFunc, msgAndArgs ...interface{}) {
 // panics, and that the recovered panic value is an error that satisfies the
 // EqualError comparison.
 //
-//	assert.PanicsWithError(t, "crazy error", func(){ GoCrazy() })
+//	require.PanicsWithError(t, "crazy error", func(){ GoCrazy() })
 func PanicsWithError(t TestingT, errString string, f assert.PanicTestFunc, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1767,7 +1831,7 @@ func PanicsWithError(t TestingT, errString string, f assert.PanicTestFunc, msgAn
 // panics, and that the recovered panic value is an error that satisfies the
 // EqualError comparison.
 //
-//	assert.PanicsWithErrorf(t, "crazy error", func(){ GoCrazy() }, "error message %s", "formatted")
+//	require.PanicsWithErrorf(t, "crazy error", func(){ GoCrazy() }, "error message %s", "formatted")
 func PanicsWithErrorf(t TestingT, errString string, f assert.PanicTestFunc, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1781,7 +1845,7 @@ func PanicsWithErrorf(t TestingT, errString string, f assert.PanicTestFunc, msg
 // PanicsWithValue asserts that the code inside the specified PanicTestFunc panics, and that
 // the recovered panic value equals the expected panic value.
 //
-//	assert.PanicsWithValue(t, "crazy error", func(){ GoCrazy() })
+//	require.PanicsWithValue(t, "crazy error", func(){ GoCrazy() })
 func PanicsWithValue(t TestingT, expected interface{}, f assert.PanicTestFunc, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1795,7 +1859,7 @@ func PanicsWithValue(t TestingT, expected interface{}, f assert.PanicTestFunc, m
 // PanicsWithValuef asserts that the code inside the specified PanicTestFunc panics, and that
 // the recovered panic value equals the expected panic value.
 //
-//	assert.PanicsWithValuef(t, "crazy error", func(){ GoCrazy() }, "error message %s", "formatted")
+//	require.PanicsWithValuef(t, "crazy error", func(){ GoCrazy() }, "error message %s", "formatted")
 func PanicsWithValuef(t TestingT, expected interface{}, f assert.PanicTestFunc, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1808,7 +1872,7 @@ func PanicsWithValuef(t TestingT, expected interface{}, f assert.PanicTestFunc,
 
 // Panicsf asserts that the code inside the specified PanicTestFunc panics.
 //
-//	assert.Panicsf(t, func(){ GoCrazy() }, "error message %s", "formatted")
+//	require.Panicsf(t, func(){ GoCrazy() }, "error message %s", "formatted")
 func Panicsf(t TestingT, f assert.PanicTestFunc, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1821,8 +1885,8 @@ func Panicsf(t TestingT, f assert.PanicTestFunc, msg string, args ...interface{}
 
 // Positive asserts that the specified element is positive
 //
-//	assert.Positive(t, 1)
-//	assert.Positive(t, 1.23)
+//	require.Positive(t, 1)
+//	require.Positive(t, 1.23)
 func Positive(t TestingT, e interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1835,8 +1899,8 @@ func Positive(t TestingT, e interface{}, msgAndArgs ...interface{}) {
 
 // Positivef asserts that the specified element is positive
 //
-//	assert.Positivef(t, 1, "error message %s", "formatted")
-//	assert.Positivef(t, 1.23, "error message %s", "formatted")
+//	require.Positivef(t, 1, "error message %s", "formatted")
+//	require.Positivef(t, 1.23, "error message %s", "formatted")
 func Positivef(t TestingT, e interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1849,8 +1913,8 @@ func Positivef(t TestingT, e interface{}, msg string, args ...interface{}) {
 
 // Regexp asserts that a specified regexp matches a string.
 //
-//	assert.Regexp(t, regexp.MustCompile("start"), "it's starting")
-//	assert.Regexp(t, "start...$", "it's not starting")
+//	require.Regexp(t, regexp.MustCompile("start"), "it's starting")
+//	require.Regexp(t, "start...$", "it's not starting")
 func Regexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1863,8 +1927,8 @@ func Regexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface
 
 // Regexpf asserts that a specified regexp matches a string.
 //
-//	assert.Regexpf(t, regexp.MustCompile("start"), "it's starting", "error message %s", "formatted")
-//	assert.Regexpf(t, "start...$", "it's not starting", "error message %s", "formatted")
+//	require.Regexpf(t, regexp.MustCompile("start"), "it's starting", "error message %s", "formatted")
+//	require.Regexpf(t, "start...$", "it's not starting", "error message %s", "formatted")
 func Regexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1877,7 +1941,7 @@ func Regexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...in
 
 // Same asserts that two pointers reference the same object.
 //
-//	assert.Same(t, ptr1, ptr2)
+//	require.Same(t, ptr1, ptr2)
 //
 // Both arguments must be pointer variables. Pointer variable sameness is
 // determined based on the equality of both type and value.
@@ -1893,7 +1957,7 @@ func Same(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...in
 
 // Samef asserts that two pointers reference the same object.
 //
-//	assert.Samef(t, ptr1, ptr2, "error message %s", "formatted")
+//	require.Samef(t, ptr1, ptr2, "error message %s", "formatted")
 //
 // Both arguments must be pointer variables. Pointer variable sameness is
 // determined based on the equality of both type and value.
@@ -1910,8 +1974,8 @@ func Samef(t TestingT, expected interface{}, actual interface{}, msg string, arg
 // Subset asserts that the specified list(array, slice...) or map contains all
 // elements given in the specified subset list(array, slice...) or map.
 //
-//	assert.Subset(t, [1, 2, 3], [1, 2])
-//	assert.Subset(t, {"x": 1, "y": 2}, {"x": 1})
+//	require.Subset(t, [1, 2, 3], [1, 2])
+//	require.Subset(t, {"x": 1, "y": 2}, {"x": 1})
 func Subset(t TestingT, list interface{}, subset interface{}, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1925,8 +1989,8 @@ func Subset(t TestingT, list interface{}, subset interface{}, msgAndArgs ...inte
 // Subsetf asserts that the specified list(array, slice...) or map contains all
 // elements given in the specified subset list(array, slice...) or map.
 //
-//	assert.Subsetf(t, [1, 2, 3], [1, 2], "error message %s", "formatted")
-//	assert.Subsetf(t, {"x": 1, "y": 2}, {"x": 1}, "error message %s", "formatted")
+//	require.Subsetf(t, [1, 2, 3], [1, 2], "error message %s", "formatted")
+//	require.Subsetf(t, {"x": 1, "y": 2}, {"x": 1}, "error message %s", "formatted")
 func Subsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1939,7 +2003,7 @@ func Subsetf(t TestingT, list interface{}, subset interface{}, msg string, args
 
 // True asserts that the specified value is true.
 //
-//	assert.True(t, myBool)
+//	require.True(t, myBool)
 func True(t TestingT, value bool, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1952,7 +2016,7 @@ func True(t TestingT, value bool, msgAndArgs ...interface{}) {
 
 // Truef asserts that the specified value is true.
 //
-//	assert.Truef(t, myBool, "error message %s", "formatted")
+//	require.Truef(t, myBool, "error message %s", "formatted")
 func Truef(t TestingT, value bool, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1965,7 +2029,7 @@ func Truef(t TestingT, value bool, msg string, args ...interface{}) {
 
 // WithinDuration asserts that the two times are within duration delta of each other.
 //
-//	assert.WithinDuration(t, time.Now(), time.Now(), 10*time.Second)
+//	require.WithinDuration(t, time.Now(), time.Now(), 10*time.Second)
 func WithinDuration(t TestingT, expected time.Time, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1978,7 +2042,7 @@ func WithinDuration(t TestingT, expected time.Time, actual time.Time, delta time
 
 // WithinDurationf asserts that the two times are within duration delta of each other.
 //
-//	assert.WithinDurationf(t, time.Now(), time.Now(), 10*time.Second, "error message %s", "formatted")
+//	require.WithinDurationf(t, time.Now(), time.Now(), 10*time.Second, "error message %s", "formatted")
 func WithinDurationf(t TestingT, expected time.Time, actual time.Time, delta time.Duration, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -1991,7 +2055,7 @@ func WithinDurationf(t TestingT, expected time.Time, actual time.Time, delta tim
 
 // WithinRange asserts that a time is within a time range (inclusive).
 //
-//	assert.WithinRange(t, time.Now(), time.Now().Add(-time.Second), time.Now().Add(time.Second))
+//	require.WithinRange(t, time.Now(), time.Now().Add(-time.Second), time.Now().Add(time.Second))
 func WithinRange(t TestingT, actual time.Time, start time.Time, end time.Time, msgAndArgs ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
@@ -2004,7 +2068,7 @@ func WithinRange(t TestingT, actual time.Time, start time.Time, end time.Time, m
 
 // WithinRangef asserts that a time is within a time range (inclusive).
 //
-//	assert.WithinRangef(t, time.Now(), time.Now().Add(-time.Second), time.Now().Add(time.Second), "error message %s", "formatted")
+//	require.WithinRangef(t, time.Now(), time.Now().Add(-time.Second), time.Now().Add(time.Second), "error message %s", "formatted")
 func WithinRangef(t TestingT, actual time.Time, start time.Time, end time.Time, msg string, args ...interface{}) {
 	if h, ok := t.(tHelper); ok {
 		h.Helper()
diff --git a/vendor/github.com/stretchr/testify/require/require.go.tmpl b/vendor/github.com/stretchr/testify/require/require.go.tmpl
index 55e42ddebd..8b32836850 100644
--- a/vendor/github.com/stretchr/testify/require/require.go.tmpl
+++ b/vendor/github.com/stretchr/testify/require/require.go.tmpl
@@ -1,4 +1,4 @@
-{{.Comment}}
+{{ replace .Comment "assert." "require."}}
 func {{.DocInfo.Name}}(t TestingT, {{.Params}}) {
 	if h, ok := t.(tHelper); ok { h.Helper() }
 	if assert.{{.DocInfo.Name}}(t, {{.ForwardedParams}}) { return }
diff --git a/vendor/github.com/stretchr/testify/require/require_forward.go b/vendor/github.com/stretchr/testify/require/require_forward.go
index eee8310a5f..1bd87304f4 100644
--- a/vendor/github.com/stretchr/testify/require/require_forward.go
+++ b/vendor/github.com/stretchr/testify/require/require_forward.go
@@ -187,8 +187,8 @@ func (a *Assertions) EqualExportedValuesf(expected interface{}, actual interface
 	EqualExportedValuesf(a.t, expected, actual, msg, args...)
 }
 
-// EqualValues asserts that two objects are equal or convertible to the same types
-// and equal.
+// EqualValues asserts that two objects are equal or convertible to the larger
+// type and equal.
 //
 //	a.EqualValues(uint32(123), int32(123))
 func (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) {
@@ -198,8 +198,8 @@ func (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAn
 	EqualValues(a.t, expected, actual, msgAndArgs...)
 }
 
-// EqualValuesf asserts that two objects are equal or convertible to the same types
-// and equal.
+// EqualValuesf asserts that two objects are equal or convertible to the larger
+// type and equal.
 //
 //	a.EqualValuesf(uint32(123), int32(123), "error message %s", "formatted")
 func (a *Assertions) EqualValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) {
@@ -337,7 +337,7 @@ func (a *Assertions) Eventually(condition func() bool, waitFor time.Duration, ti
 //	a.EventuallyWithT(func(c *assert.CollectT) {
 //		// add assertions as needed; any assertion failure will fail the current tick
 //		assert.True(c, externalValue, "expected 'externalValue' to be true")
-//	}, 1*time.Second, 10*time.Second, "external state has not changed to 'true'; still false")
+//	}, 10*time.Second, 1*time.Second, "external state has not changed to 'true'; still false")
 func (a *Assertions) EventuallyWithT(condition func(collect *assert.CollectT), waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) {
 	if h, ok := a.t.(tHelper); ok {
 		h.Helper()
@@ -362,7 +362,7 @@ func (a *Assertions) EventuallyWithT(condition func(collect *assert.CollectT), w
 //	a.EventuallyWithTf(func(c *assert.CollectT, "error message %s", "formatted") {
 //		// add assertions as needed; any assertion failure will fail the current tick
 //		assert.True(c, externalValue, "expected 'externalValue' to be true")
-//	}, 1*time.Second, 10*time.Second, "external state has not changed to 'true'; still false")
+//	}, 10*time.Second, 1*time.Second, "external state has not changed to 'true'; still false")
 func (a *Assertions) EventuallyWithTf(condition func(collect *assert.CollectT), waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) {
 	if h, ok := a.t.(tHelper); ok {
 		h.Helper()
@@ -1129,6 +1129,40 @@ func (a *Assertions) NotContainsf(s interface{}, contains interface{}, msg strin
 	NotContainsf(a.t, s, contains, msg, args...)
 }
 
+// NotElementsMatch asserts that the specified listA(array, slice...) is NOT equal to specified
+// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements,
+// the number of appearances of each of them in both lists should not match.
+// This is an inverse of ElementsMatch.
+//
+// a.NotElementsMatch([1, 1, 2, 3], [1, 1, 2, 3]) -> false
+//
+// a.NotElementsMatch([1, 1, 2, 3], [1, 2, 3]) -> true
+//
+// a.NotElementsMatch([1, 2, 3], [1, 2, 4]) -> true
+func (a *Assertions) NotElementsMatch(listA interface{}, listB interface{}, msgAndArgs ...interface{}) {
+	if h, ok := a.t.(tHelper); ok {
+		h.Helper()
+	}
+	NotElementsMatch(a.t, listA, listB, msgAndArgs...)
+}
+
+// NotElementsMatchf asserts that the specified listA(array, slice...) is NOT equal to specified
+// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements,
+// the number of appearances of each of them in both lists should not match.
+// This is an inverse of ElementsMatch.
+//
+// a.NotElementsMatchf([1, 1, 2, 3], [1, 1, 2, 3], "error message %s", "formatted") -> false
+//
+// a.NotElementsMatchf([1, 1, 2, 3], [1, 2, 3], "error message %s", "formatted") -> true
+//
+// a.NotElementsMatchf([1, 2, 3], [1, 2, 4], "error message %s", "formatted") -> true
+func (a *Assertions) NotElementsMatchf(listA interface{}, listB interface{}, msg string, args ...interface{}) {
+	if h, ok := a.t.(tHelper); ok {
+		h.Helper()
+	}
+	NotElementsMatchf(a.t, listA, listB, msg, args...)
+}
+
 // NotEmpty asserts that the specified object is NOT empty.  I.e. not nil, "", false, 0 or either
 // a slice or a channel with len == 0.
 //
@@ -1201,7 +1235,25 @@ func (a *Assertions) NotEqualf(expected interface{}, actual interface{}, msg str
 	NotEqualf(a.t, expected, actual, msg, args...)
 }
 
-// NotErrorIs asserts that at none of the errors in err's chain matches target.
+// NotErrorAs asserts that none of the errors in err's chain matches target,
+// but if so, sets target to that error value.
+func (a *Assertions) NotErrorAs(err error, target interface{}, msgAndArgs ...interface{}) {
+	if h, ok := a.t.(tHelper); ok {
+		h.Helper()
+	}
+	NotErrorAs(a.t, err, target, msgAndArgs...)
+}
+
+// NotErrorAsf asserts that none of the errors in err's chain matches target,
+// but if so, sets target to that error value.
+func (a *Assertions) NotErrorAsf(err error, target interface{}, msg string, args ...interface{}) {
+	if h, ok := a.t.(tHelper); ok {
+		h.Helper()
+	}
+	NotErrorAsf(a.t, err, target, msg, args...)
+}
+
+// NotErrorIs asserts that none of the errors in err's chain matches target.
 // This is a wrapper for errors.Is.
 func (a *Assertions) NotErrorIs(err error, target error, msgAndArgs ...interface{}) {
 	if h, ok := a.t.(tHelper); ok {
@@ -1210,7 +1262,7 @@ func (a *Assertions) NotErrorIs(err error, target error, msgAndArgs ...interface
 	NotErrorIs(a.t, err, target, msgAndArgs...)
 }
 
-// NotErrorIsf asserts that at none of the errors in err's chain matches target.
+// NotErrorIsf asserts that none of the errors in err's chain matches target.
 // This is a wrapper for errors.Is.
 func (a *Assertions) NotErrorIsf(err error, target error, msg string, args ...interface{}) {
 	if h, ok := a.t.(tHelper); ok {
diff --git a/vendor/github.com/stretchr/testify/require/requirements.go b/vendor/github.com/stretchr/testify/require/requirements.go
index 91772dfeb9..6b7ce929eb 100644
--- a/vendor/github.com/stretchr/testify/require/requirements.go
+++ b/vendor/github.com/stretchr/testify/require/requirements.go
@@ -6,7 +6,7 @@ type TestingT interface {
 	FailNow()
 }
 
-type tHelper interface {
+type tHelper = interface {
 	Helper()
 }
 
diff --git a/vendor/golang.org/x/net/http2/config.go b/vendor/golang.org/x/net/http2/config.go
index de58dfb8dc..ca645d9a1a 100644
--- a/vendor/golang.org/x/net/http2/config.go
+++ b/vendor/golang.org/x/net/http2/config.go
@@ -60,7 +60,7 @@ func configFromServer(h1 *http.Server, h2 *Server) http2Config {
 	return conf
 }
 
-// configFromServer merges configuration settings from h2 and h2.t1.HTTP2
+// configFromTransport merges configuration settings from h2 and h2.t1.HTTP2
 // (the net/http Transport).
 func configFromTransport(h2 *Transport) http2Config {
 	conf := http2Config{
diff --git a/vendor/golang.org/x/net/http2/config_go124.go b/vendor/golang.org/x/net/http2/config_go124.go
index e3784123c8..5b516c55ff 100644
--- a/vendor/golang.org/x/net/http2/config_go124.go
+++ b/vendor/golang.org/x/net/http2/config_go124.go
@@ -13,7 +13,7 @@ func fillNetHTTPServerConfig(conf *http2Config, srv *http.Server) {
 	fillNetHTTPConfig(conf, srv.HTTP2)
 }
 
-// fillNetHTTPServerConfig sets fields in conf from tr.HTTP2.
+// fillNetHTTPTransportConfig sets fields in conf from tr.HTTP2.
 func fillNetHTTPTransportConfig(conf *http2Config, tr *http.Transport) {
 	fillNetHTTPConfig(conf, tr.HTTP2)
 }
diff --git a/vendor/golang.org/x/net/http2/transport.go b/vendor/golang.org/x/net/http2/transport.go
index 090d0e1bdb..b2e2ed3373 100644
--- a/vendor/golang.org/x/net/http2/transport.go
+++ b/vendor/golang.org/x/net/http2/transport.go
@@ -375,6 +375,7 @@ type ClientConn struct {
 	doNotReuse       bool       // whether conn is marked to not be reused for any future requests
 	closing          bool
 	closed           bool
+	closedOnIdle     bool                     // true if conn was closed for idleness
 	seenSettings     bool                     // true if we've seen a settings frame, false otherwise
 	seenSettingsChan chan struct{}            // closed when seenSettings is true or frame reading fails
 	wantSettingsAck  bool                     // we sent a SETTINGS frame and haven't heard back
@@ -1089,10 +1090,12 @@ func (cc *ClientConn) idleStateLocked() (st clientConnIdleState) {
 
 	// If this connection has never been used for a request and is closed,
 	// then let it take a request (which will fail).
+	// If the conn was closed for idleness, we're racing the idle timer;
+	// don't try to use the conn. (Issue #70515.)
 	//
 	// This avoids a situation where an error early in a connection's lifetime
 	// goes unreported.
-	if cc.nextStreamID == 1 && cc.streamsReserved == 0 && cc.closed {
+	if cc.nextStreamID == 1 && cc.streamsReserved == 0 && cc.closed && !cc.closedOnIdle {
 		st.canTakeNewRequest = true
 	}
 
@@ -1155,6 +1158,7 @@ func (cc *ClientConn) closeIfIdle() {
 		return
 	}
 	cc.closed = true
+	cc.closedOnIdle = true
 	nextID := cc.nextStreamID
 	// TODO: do clients send GOAWAY too? maybe? Just Close:
 	cc.mu.Unlock()
@@ -2434,9 +2438,12 @@ func (rl *clientConnReadLoop) cleanup() {
 	// This avoids a situation where new connections are constantly created,
 	// added to the pool, fail, and are removed from the pool, without any error
 	// being surfaced to the user.
-	const unusedWaitTime = 5 * time.Second
+	unusedWaitTime := 5 * time.Second
+	if cc.idleTimeout > 0 && unusedWaitTime > cc.idleTimeout {
+		unusedWaitTime = cc.idleTimeout
+	}
 	idleTime := cc.t.now().Sub(cc.lastActive)
-	if atomic.LoadUint32(&cc.atomicReused) == 0 && idleTime < unusedWaitTime {
+	if atomic.LoadUint32(&cc.atomicReused) == 0 && idleTime < unusedWaitTime && !cc.closedOnIdle {
 		cc.idleTimer = cc.t.afterFunc(unusedWaitTime-idleTime, func() {
 			cc.t.connPool().MarkDead(cc)
 		})
diff --git a/vendor/golang.org/x/sys/unix/syscall_dragonfly.go b/vendor/golang.org/x/sys/unix/syscall_dragonfly.go
index 97cb916f2c..be8c002070 100644
--- a/vendor/golang.org/x/sys/unix/syscall_dragonfly.go
+++ b/vendor/golang.org/x/sys/unix/syscall_dragonfly.go
@@ -246,6 +246,18 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e
 	return sendfile(outfd, infd, offset, count)
 }
 
+func Dup3(oldfd, newfd, flags int) error {
+	if oldfd == newfd || flags&^O_CLOEXEC != 0 {
+		return EINVAL
+	}
+	how := F_DUP2FD
+	if flags&O_CLOEXEC != 0 {
+		how = F_DUP2FD_CLOEXEC
+	}
+	_, err := fcntl(oldfd, how, newfd)
+	return err
+}
+
 /*
  * Exposed directly
  */
diff --git a/vendor/golang.org/x/sys/windows/dll_windows.go b/vendor/golang.org/x/sys/windows/dll_windows.go
index 4e613cf633..3ca814f54d 100644
--- a/vendor/golang.org/x/sys/windows/dll_windows.go
+++ b/vendor/golang.org/x/sys/windows/dll_windows.go
@@ -43,8 +43,8 @@ type DLL struct {
 // LoadDLL loads DLL file into memory.
 //
 // Warning: using LoadDLL without an absolute path name is subject to
-// DLL preloading attacks. To safely load a system DLL, use LazyDLL
-// with System set to true, or use LoadLibraryEx directly.
+// DLL preloading attacks. To safely load a system DLL, use [NewLazySystemDLL],
+// or use [LoadLibraryEx] directly.
 func LoadDLL(name string) (dll *DLL, err error) {
 	namep, err := UTF16PtrFromString(name)
 	if err != nil {
@@ -271,6 +271,9 @@ func (d *LazyDLL) NewProc(name string) *LazyProc {
 }
 
 // NewLazyDLL creates new LazyDLL associated with DLL file.
+//
+// Warning: using NewLazyDLL without an absolute path name is subject to
+// DLL preloading attacks. To safely load a system DLL, use [NewLazySystemDLL].
 func NewLazyDLL(name string) *LazyDLL {
 	return &LazyDLL{Name: name}
 }
@@ -410,7 +413,3 @@ func loadLibraryEx(name string, system bool) (*DLL, error) {
 	}
 	return &DLL{Name: name, Handle: h}, nil
 }
-
-type errString string
-
-func (s errString) Error() string { return string(s) }
diff --git a/vendor/golang.org/x/tools/cmd/goimports/doc.go b/vendor/golang.org/x/tools/cmd/goimports/doc.go
deleted file mode 100644
index 18a3ad448e..0000000000
--- a/vendor/golang.org/x/tools/cmd/goimports/doc.go
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2013 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.
-
-/*
-Command goimports updates your Go import lines,
-adding missing ones and removing unreferenced ones.
-
-	$ go install golang.org/x/tools/cmd/goimports@latest
-
-In addition to fixing imports, goimports also formats
-your code in the same style as gofmt so it can be used
-as a replacement for your editor's gofmt-on-save hook.
-
-For emacs, make sure you have the latest go-mode.el:
-
-	https://github.com/dominikh/go-mode.el
-
-Then in your .emacs file:
-
-	(setq gofmt-command "goimports")
-	(add-hook 'before-save-hook 'gofmt-before-save)
-
-For vim, set "gofmt_command" to "goimports":
-
-	https://golang.org/change/39c724dd7f252
-	https://golang.org/wiki/IDEsAndTextEditorPlugins
-	etc
-
-For GoSublime, follow the steps described here:
-
-	http://michaelwhatcott.com/gosublime-goimports/
-
-For other editors, you probably know what to do.
-
-To exclude directories in your $GOPATH from being scanned for Go
-files, goimports respects a configuration file at
-$GOPATH/src/.goimportsignore which may contain blank lines, comment
-lines (beginning with '#'), or lines naming a directory relative to
-the configuration file to ignore when scanning. No globbing or regex
-patterns are allowed. Use the "-v" verbose flag to verify it's
-working and see what goimports is doing.
-
-File bugs or feature requests at:
-
-	https://golang.org/issues/new?title=x/tools/cmd/goimports:+
-
-Happy hacking!
-*/
-package main // import "golang.org/x/tools/cmd/goimports"
diff --git a/vendor/golang.org/x/tools/cmd/goimports/goimports.go b/vendor/golang.org/x/tools/cmd/goimports/goimports.go
deleted file mode 100644
index dcb5023a2e..0000000000
--- a/vendor/golang.org/x/tools/cmd/goimports/goimports.go
+++ /dev/null
@@ -1,379 +0,0 @@
-// Copyright 2013 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 (
-	"bufio"
-	"bytes"
-	"errors"
-	"flag"
-	"fmt"
-	"go/scanner"
-	"io"
-	"log"
-	"os"
-	"os/exec"
-	"path/filepath"
-	"runtime"
-	"runtime/pprof"
-	"strings"
-
-	"golang.org/x/tools/internal/gocommand"
-	"golang.org/x/tools/internal/imports"
-)
-
-var (
-	// main operation modes
-	list   = flag.Bool("l", false, "list files whose formatting differs from goimport's")
-	write  = flag.Bool("w", false, "write result to (source) file instead of stdout")
-	doDiff = flag.Bool("d", false, "display diffs instead of rewriting files")
-	srcdir = flag.String("srcdir", "", "choose imports as if source code is from `dir`. When operating on a single file, dir may instead be the complete file name.")
-
-	verbose bool // verbose logging
-
-	cpuProfile     = flag.String("cpuprofile", "", "CPU profile output")
-	memProfile     = flag.String("memprofile", "", "memory profile output")
-	memProfileRate = flag.Int("memrate", 0, "if > 0, sets runtime.MemProfileRate")
-
-	options = &imports.Options{
-		TabWidth:  8,
-		TabIndent: true,
-		Comments:  true,
-		Fragment:  true,
-		Env: &imports.ProcessEnv{
-			GocmdRunner: &gocommand.Runner{},
-		},
-	}
-	exitCode = 0
-)
-
-func init() {
-	flag.BoolVar(&options.AllErrors, "e", false, "report all errors (not just the first 10 on different lines)")
-	flag.StringVar(&options.LocalPrefix, "local", "", "put imports beginning with this string after 3rd-party packages; comma-separated list")
-	flag.BoolVar(&options.FormatOnly, "format-only", false, "if true, don't fix imports and only format. In this mode, goimports is effectively gofmt, with the addition that imports are grouped into sections.")
-}
-
-func report(err error) {
-	scanner.PrintError(os.Stderr, err)
-	exitCode = 2
-}
-
-func usage() {
-	fmt.Fprintf(os.Stderr, "usage: goimports [flags] [path ...]\n")
-	flag.PrintDefaults()
-	os.Exit(2)
-}
-
-func isGoFile(f os.FileInfo) bool {
-	// ignore non-Go files
-	name := f.Name()
-	return !f.IsDir() && !strings.HasPrefix(name, ".") && strings.HasSuffix(name, ".go")
-}
-
-// argumentType is which mode goimports was invoked as.
-type argumentType int
-
-const (
-	// fromStdin means the user is piping their source into goimports.
-	fromStdin argumentType = iota
-
-	// singleArg is the common case from editors, when goimports is run on
-	// a single file.
-	singleArg
-
-	// multipleArg is when the user ran "goimports file1.go file2.go"
-	// or ran goimports on a directory tree.
-	multipleArg
-)
-
-func processFile(filename string, in io.Reader, out io.Writer, argType argumentType) error {
-	opt := options
-	if argType == fromStdin {
-		nopt := *options
-		nopt.Fragment = true
-		opt = &nopt
-	}
-
-	if in == nil {
-		f, err := os.Open(filename)
-		if err != nil {
-			return err
-		}
-		defer f.Close()
-		in = f
-	}
-
-	src, err := io.ReadAll(in)
-	if err != nil {
-		return err
-	}
-
-	target := filename
-	if *srcdir != "" {
-		// Determine whether the provided -srcdirc is a directory or file
-		// and then use it to override the target.
-		//
-		// See https://github.com/dominikh/go-mode.el/issues/146
-		if isFile(*srcdir) {
-			if argType == multipleArg {
-				return errors.New("-srcdir value can't be a file when passing multiple arguments or when walking directories")
-			}
-			target = *srcdir
-		} else if argType == singleArg && strings.HasSuffix(*srcdir, ".go") && !isDir(*srcdir) {
-			// For a file which doesn't exist on disk yet, but might shortly.
-			// e.g. user in editor opens $DIR/newfile.go and newfile.go doesn't yet exist on disk.
-			// The goimports on-save hook writes the buffer to a temp file
-			// first and runs goimports before the actual save to newfile.go.
-			// The editor's buffer is named "newfile.go" so that is passed to goimports as:
-			//      goimports -srcdir=/gopath/src/pkg/newfile.go /tmp/gofmtXXXXXXXX.go
-			// and then the editor reloads the result from the tmp file and writes
-			// it to newfile.go.
-			target = *srcdir
-		} else {
-			// Pretend that file is from *srcdir in order to decide
-			// visible imports correctly.
-			target = filepath.Join(*srcdir, filepath.Base(filename))
-		}
-	}
-
-	res, err := imports.Process(target, src, opt)
-	if err != nil {
-		return err
-	}
-
-	if !bytes.Equal(src, res) {
-		// formatting has changed
-		if *list {
-			fmt.Fprintln(out, filename)
-		}
-		if *write {
-			if argType == fromStdin {
-				// filename is ""
-				return errors.New("can't use -w on stdin")
-			}
-			// On Windows, we need to re-set the permissions from the file. See golang/go#38225.
-			var perms os.FileMode
-			if fi, err := os.Stat(filename); err == nil {
-				perms = fi.Mode() & os.ModePerm
-			}
-			err = os.WriteFile(filename, res, perms)
-			if err != nil {
-				return err
-			}
-		}
-		if *doDiff {
-			if argType == fromStdin {
-				filename = "stdin.go" // because .orig looks silly
-			}
-			data, err := diff(src, res, filename)
-			if err != nil {
-				return fmt.Errorf("computing diff: %s", err)
-			}
-			fmt.Printf("diff -u %s %s\n", filepath.ToSlash(filename+".orig"), filepath.ToSlash(filename))
-			out.Write(data)
-		}
-	}
-
-	if !*list && !*write && !*doDiff {
-		_, err = out.Write(res)
-	}
-
-	return err
-}
-
-func visitFile(path string, f os.FileInfo, err error) error {
-	if err == nil && isGoFile(f) {
-		err = processFile(path, nil, os.Stdout, multipleArg)
-	}
-	if err != nil {
-		report(err)
-	}
-	return nil
-}
-
-func walkDir(path string) {
-	filepath.Walk(path, visitFile)
-}
-
-func main() {
-	runtime.GOMAXPROCS(runtime.NumCPU())
-
-	// call gofmtMain in a separate function
-	// so that it can use defer and have them
-	// run before the exit.
-	gofmtMain()
-	os.Exit(exitCode)
-}
-
-// parseFlags parses command line flags and returns the paths to process.
-// It's a var so that custom implementations can replace it in other files.
-var parseFlags = func() []string {
-	flag.BoolVar(&verbose, "v", false, "verbose logging")
-
-	flag.Parse()
-	return flag.Args()
-}
-
-func bufferedFileWriter(dest string) (w io.Writer, close func()) {
-	f, err := os.Create(dest)
-	if err != nil {
-		log.Fatal(err)
-	}
-	bw := bufio.NewWriter(f)
-	return bw, func() {
-		if err := bw.Flush(); err != nil {
-			log.Fatalf("error flushing %v: %v", dest, err)
-		}
-		if err := f.Close(); err != nil {
-			log.Fatal(err)
-		}
-	}
-}
-
-func gofmtMain() {
-	flag.Usage = usage
-	paths := parseFlags()
-
-	if *cpuProfile != "" {
-		bw, flush := bufferedFileWriter(*cpuProfile)
-		pprof.StartCPUProfile(bw)
-		defer flush()
-		defer pprof.StopCPUProfile()
-	}
-	// doTrace is a conditionally compiled wrapper around runtime/trace. It is
-	// used to allow goimports to compile under gccgo, which does not support
-	// runtime/trace. See https://golang.org/issue/15544.
-	defer doTrace()()
-	if *memProfileRate > 0 {
-		runtime.MemProfileRate = *memProfileRate
-		bw, flush := bufferedFileWriter(*memProfile)
-		defer func() {
-			runtime.GC() // materialize all statistics
-			if err := pprof.WriteHeapProfile(bw); err != nil {
-				log.Fatal(err)
-			}
-			flush()
-		}()
-	}
-
-	if verbose {
-		log.SetFlags(log.LstdFlags | log.Lmicroseconds)
-		options.Env.Logf = log.Printf
-	}
-	if options.TabWidth < 0 {
-		fmt.Fprintf(os.Stderr, "negative tabwidth %d\n", options.TabWidth)
-		exitCode = 2
-		return
-	}
-
-	if len(paths) == 0 {
-		if err := processFile("", os.Stdin, os.Stdout, fromStdin); err != nil {
-			report(err)
-		}
-		return
-	}
-
-	argType := singleArg
-	if len(paths) > 1 {
-		argType = multipleArg
-	}
-
-	for _, path := range paths {
-		switch dir, err := os.Stat(path); {
-		case err != nil:
-			report(err)
-		case dir.IsDir():
-			walkDir(path)
-		default:
-			if err := processFile(path, nil, os.Stdout, argType); err != nil {
-				report(err)
-			}
-		}
-	}
-}
-
-func writeTempFile(dir, prefix string, data []byte) (string, error) {
-	file, err := os.CreateTemp(dir, prefix)
-	if err != nil {
-		return "", err
-	}
-	_, err = file.Write(data)
-	if err1 := file.Close(); err == nil {
-		err = err1
-	}
-	if err != nil {
-		os.Remove(file.Name())
-		return "", err
-	}
-	return file.Name(), nil
-}
-
-func diff(b1, b2 []byte, filename string) (data []byte, err error) {
-	f1, err := writeTempFile("", "gofmt", b1)
-	if err != nil {
-		return
-	}
-	defer os.Remove(f1)
-
-	f2, err := writeTempFile("", "gofmt", b2)
-	if err != nil {
-		return
-	}
-	defer os.Remove(f2)
-
-	cmd := "diff"
-	if runtime.GOOS == "plan9" {
-		cmd = "/bin/ape/diff"
-	}
-
-	data, err = exec.Command(cmd, "-u", f1, f2).CombinedOutput()
-	if len(data) > 0 {
-		// diff exits with a non-zero status when the files don't match.
-		// Ignore that failure as long as we get output.
-		return replaceTempFilename(data, filename)
-	}
-	return
-}
-
-// replaceTempFilename replaces temporary filenames in diff with actual one.
-//
-// --- /tmp/gofmt316145376	2017-02-03 19:13:00.280468375 -0500
-// +++ /tmp/gofmt617882815	2017-02-03 19:13:00.280468375 -0500
-// ...
-// ->
-// --- path/to/file.go.orig	2017-02-03 19:13:00.280468375 -0500
-// +++ path/to/file.go	2017-02-03 19:13:00.280468375 -0500
-// ...
-func replaceTempFilename(diff []byte, filename string) ([]byte, error) {
-	bs := bytes.SplitN(diff, []byte{'\n'}, 3)
-	if len(bs) < 3 {
-		return nil, fmt.Errorf("got unexpected diff for %s", filename)
-	}
-	// Preserve timestamps.
-	var t0, t1 []byte
-	if i := bytes.LastIndexByte(bs[0], '\t'); i != -1 {
-		t0 = bs[0][i:]
-	}
-	if i := bytes.LastIndexByte(bs[1], '\t'); i != -1 {
-		t1 = bs[1][i:]
-	}
-	// Always print filepath with slash separator.
-	f := filepath.ToSlash(filename)
-	bs[0] = []byte(fmt.Sprintf("--- %s%s", f+".orig", t0))
-	bs[1] = []byte(fmt.Sprintf("+++ %s%s", f, t1))
-	return bytes.Join(bs, []byte{'\n'}), nil
-}
-
-// isFile reports whether name is a file.
-func isFile(name string) bool {
-	fi, err := os.Stat(name)
-	return err == nil && fi.Mode().IsRegular()
-}
-
-// isDir reports whether name is a directory.
-func isDir(name string) bool {
-	fi, err := os.Stat(name)
-	return err == nil && fi.IsDir()
-}
diff --git a/vendor/golang.org/x/tools/cmd/goimports/goimports_gc.go b/vendor/golang.org/x/tools/cmd/goimports/goimports_gc.go
deleted file mode 100644
index 3326646d03..0000000000
--- a/vendor/golang.org/x/tools/cmd/goimports/goimports_gc.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2016 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 gc
-// +build gc
-
-package main
-
-import (
-	"flag"
-	"runtime/trace"
-)
-
-var traceProfile = flag.String("trace", "", "trace profile output")
-
-func doTrace() func() {
-	if *traceProfile != "" {
-		bw, flush := bufferedFileWriter(*traceProfile)
-		trace.Start(bw)
-		return func() {
-			trace.Stop()
-			flush()
-		}
-	}
-	return func() {}
-}
diff --git a/vendor/golang.org/x/tools/cmd/goimports/goimports_not_gc.go b/vendor/golang.org/x/tools/cmd/goimports/goimports_not_gc.go
deleted file mode 100644
index 344fe7576b..0000000000
--- a/vendor/golang.org/x/tools/cmd/goimports/goimports_not_gc.go
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2016 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 !gc
-// +build !gc
-
-package main
-
-func doTrace() func() {
-	return func() {}
-}
diff --git a/vendor/golang.org/x/tools/go/ast/astutil/imports.go b/vendor/golang.org/x/tools/go/ast/astutil/imports.go
index 18d1adb05d..a6b5ed0a89 100644
--- a/vendor/golang.org/x/tools/go/ast/astutil/imports.go
+++ b/vendor/golang.org/x/tools/go/ast/astutil/imports.go
@@ -344,7 +344,12 @@ func RewriteImport(fset *token.FileSet, f *ast.File, oldPath, newPath string) (r
 }
 
 // UsesImport reports whether a given import is used.
+// The provided File must have been parsed with syntactic object resolution
+// (not using go/parser.SkipObjectResolution).
 func UsesImport(f *ast.File, path string) (used bool) {
+	if f.Scope == nil {
+		panic("file f was not parsed with syntactic object resolution")
+	}
 	spec := importSpec(f, path)
 	if spec == nil {
 		return
diff --git a/vendor/golang.org/x/tools/go/ast/astutil/util.go b/vendor/golang.org/x/tools/go/ast/astutil/util.go
index 6bdcf70ac2..ca71e3e105 100644
--- a/vendor/golang.org/x/tools/go/ast/astutil/util.go
+++ b/vendor/golang.org/x/tools/go/ast/astutil/util.go
@@ -7,13 +7,5 @@ package astutil
 import "go/ast"
 
 // Unparen returns e with any enclosing parentheses stripped.
-// TODO(adonovan): use go1.22's ast.Unparen.
-func Unparen(e ast.Expr) ast.Expr {
-	for {
-		p, ok := e.(*ast.ParenExpr)
-		if !ok {
-			return e
-		}
-		e = p.X
-	}
-}
+// Deprecated: use [ast.Unparen].
+func Unparen(e ast.Expr) ast.Expr { return ast.Unparen(e) }
diff --git a/vendor/golang.org/x/tools/go/gcexportdata/gcexportdata.go b/vendor/golang.org/x/tools/go/gcexportdata/gcexportdata.go
index 137cc8df1d..65fe2628e9 100644
--- a/vendor/golang.org/x/tools/go/gcexportdata/gcexportdata.go
+++ b/vendor/golang.org/x/tools/go/gcexportdata/gcexportdata.go
@@ -2,22 +2,64 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// Package gcexportdata provides functions for locating, reading, and
-// writing export data files containing type information produced by the
-// gc compiler.  This package supports go1.7 export data format and all
-// later versions.
-//
-// Although it might seem convenient for this package to live alongside
-// go/types in the standard library, this would cause version skew
-// problems for developer tools that use it, since they must be able to
-// consume the outputs of the gc compiler both before and after a Go
-// update such as from Go 1.7 to Go 1.8.  Because this package lives in
-// golang.org/x/tools, sites can update their version of this repo some
-// time before the Go 1.8 release and rebuild and redeploy their
-// developer tools, which will then be able to consume both Go 1.7 and
-// Go 1.8 export data files, so they will work before and after the
-// Go update. (See discussion at https://golang.org/issue/15651.)
-package gcexportdata // import "golang.org/x/tools/go/gcexportdata"
+// Package gcexportdata provides functions for reading and writing
+// export data, which is a serialized description of the API of a Go
+// package including the names, kinds, types, and locations of all
+// exported declarations.
+//
+// The standard Go compiler (cmd/compile) writes an export data file
+// for each package it compiles, which it later reads when compiling
+// packages that import the earlier one. The compiler must thus
+// contain logic to both write and read export data.
+// (See the "Export" section in the cmd/compile/README file.)
+//
+// The [Read] function in this package can read files produced by the
+// compiler, producing [go/types] data structures. As a matter of
+// policy, Read supports export data files produced by only the last
+// two Go releases plus tip; see https://go.dev/issue/68898. The
+// export data files produced by the compiler contain additional
+// details related to generics, inlining, and other optimizations that
+// cannot be decoded by the [Read] function.
+//
+// In files written by the compiler, the export data is not at the
+// start of the file. Before calling Read, use [NewReader] to locate
+// the desired portion of the file.
+//
+// The [Write] function in this package encodes the exported API of a
+// Go package ([types.Package]) as a file. Such files can be later
+// decoded by Read, but cannot be consumed by the compiler.
+//
+// # Future changes
+//
+// Although Read supports the formats written by both Write and the
+// compiler, the two are quite different, and there is an open
+// proposal (https://go.dev/issue/69491) to separate these APIs.
+//
+// Under that proposal, this package would ultimately provide only the
+// Read operation for compiler export data, which must be defined in
+// this module (golang.org/x/tools), not in the standard library, to
+// avoid version skew for developer tools that need to read compiler
+// export data both before and after a Go release, such as from Go
+// 1.23 to Go 1.24. Because this package lives in the tools module,
+// clients can update their version of the module some time before the
+// Go 1.24 release and rebuild and redeploy their tools, which will
+// then be able to consume both Go 1.23 and Go 1.24 export data files,
+// so they will work before and after the Go update. (See discussion
+// at https://go.dev/issue/15651.)
+//
+// The operations to import and export [go/types] data structures
+// would be defined in the go/types package as Import and Export.
+// [Write] would (eventually) delegate to Export,
+// and [Read], when it detects a file produced by Export,
+// would delegate to Import.
+//
+// # Deprecations
+//
+// The [NewImporter] and [Find] functions are deprecated and should
+// not be used in new code. The [WriteBundle] and [ReadBundle]
+// functions are experimental, and there is an open proposal to
+// deprecate them (https://go.dev/issue/69573).
+package gcexportdata
 
 import (
 	"bufio"
@@ -64,24 +106,18 @@ func Find(importPath, srcDir string) (filename, path string) {
 // additional trailing data beyond the end of the export data.
 func NewReader(r io.Reader) (io.Reader, error) {
 	buf := bufio.NewReader(r)
-	_, size, err := gcimporter.FindExportData(buf)
+	size, err := gcimporter.FindExportData(buf)
 	if err != nil {
 		return nil, err
 	}
 
-	if size >= 0 {
-		// We were given an archive and found the __.PKGDEF in it.
-		// This tells us the size of the export data, and we don't
-		// need to return the entire file.
-		return &io.LimitedReader{
-			R: buf,
-			N: size,
-		}, nil
-	} else {
-		// We were given an object file. As such, we don't know how large
-		// the export data is and must return the entire file.
-		return buf, nil
-	}
+	// We were given an archive and found the __.PKGDEF in it.
+	// This tells us the size of the export data, and we don't
+	// need to return the entire file.
+	return &io.LimitedReader{
+		R: buf,
+		N: size,
+	}, nil
 }
 
 // readAll works the same way as io.ReadAll, but avoids allocations and copies
@@ -100,6 +136,11 @@ func readAll(r io.Reader) ([]byte, error) {
 // Read reads export data from in, decodes it, and returns type
 // information for the package.
 //
+// Read is capable of reading export data produced by [Write] at the
+// same source code version, or by the last two Go releases (plus tip)
+// of the standard Go compiler. Reading files from older compilers may
+// produce an error.
+//
 // The package path (effectively its linker symbol prefix) is
 // specified by path, since unlike the package name, this information
 // may not be recorded in the export data.
@@ -128,14 +169,26 @@ func Read(in io.Reader, fset *token.FileSet, imports map[string]*types.Package,
 	// (from "version"). Select appropriate importer.
 	if len(data) > 0 {
 		switch data[0] {
-		case 'v', 'c', 'd': // binary, till go1.10
+		case 'v', 'c', 'd':
+			// binary, produced by cmd/compile till go1.10
 			return nil, fmt.Errorf("binary (%c) import format is no longer supported", data[0])
 
-		case 'i': // indexed, till go1.19
+		case 'i':
+			// indexed, produced by cmd/compile till go1.19,
+			// and also by [Write].
+			//
+			// If proposal #69491 is accepted, go/types
+			// serialization will be implemented by
+			// types.Export, to which Write would eventually
+			// delegate (explicitly dropping any pretence at
+			// inter-version Write-Read compatibility).
+			// This [Read] function would delegate to types.Import
+			// when it detects that the file was produced by Export.
 			_, pkg, err := gcimporter.IImportData(fset, imports, data[1:], path)
 			return pkg, err
 
-		case 'u': // unified, from go1.20
+		case 'u':
+			// unified, produced by cmd/compile since go1.20
 			_, pkg, err := gcimporter.UImportData(fset, imports, data[1:], path)
 			return pkg, err
 
diff --git a/vendor/golang.org/x/tools/go/packages/doc.go b/vendor/golang.org/x/tools/go/packages/doc.go
index 3531ac8f5f..f1931d10ee 100644
--- a/vendor/golang.org/x/tools/go/packages/doc.go
+++ b/vendor/golang.org/x/tools/go/packages/doc.go
@@ -64,7 +64,7 @@ graph using the Imports fields.
 
 The Load function can be configured by passing a pointer to a Config as
 the first argument. A nil Config is equivalent to the zero Config, which
-causes Load to run in LoadFiles mode, collecting minimal information.
+causes Load to run in [LoadFiles] mode, collecting minimal information.
 See the documentation for type Config for details.
 
 As noted earlier, the Config.Mode controls the amount of detail
@@ -72,14 +72,14 @@ reported about the loaded packages. See the documentation for type LoadMode
 for details.
 
 Most tools should pass their command-line arguments (after any flags)
-uninterpreted to [Load], so that it can interpret them
+uninterpreted to Load, so that it can interpret them
 according to the conventions of the underlying build system.
 
 See the Example function for typical usage.
 
 # The driver protocol
 
-[Load] may be used to load Go packages even in Go projects that use
+Load may be used to load Go packages even in Go projects that use
 alternative build systems, by installing an appropriate "driver"
 program for the build system and specifying its location in the
 GOPACKAGESDRIVER environment variable.
@@ -97,6 +97,15 @@ JSON-encoded [DriverRequest] message providing additional information
 is written to the driver's standard input. The driver must write a
 JSON-encoded [DriverResponse] message to its standard output. (This
 message differs from the JSON schema produced by 'go list'.)
+
+The value of the PWD environment variable seen by the driver process
+is the preferred name of its working directory. (The working directory
+may have other aliases due to symbolic links; see the comment on the
+Dir field of [exec.Cmd] for related information.)
+When the driver process emits in its response the name of a file
+that is a descendant of this directory, it must use an absolute path
+that has the value of PWD as a prefix, to ensure that the returned
+filenames satisfy the original query.
 */
 package packages // import "golang.org/x/tools/go/packages"
 
diff --git a/vendor/golang.org/x/tools/go/packages/external.go b/vendor/golang.org/x/tools/go/packages/external.go
index 8f7afcb5df..91bd62e83b 100644
--- a/vendor/golang.org/x/tools/go/packages/external.go
+++ b/vendor/golang.org/x/tools/go/packages/external.go
@@ -13,6 +13,7 @@ import (
 	"fmt"
 	"os"
 	"os/exec"
+	"slices"
 	"strings"
 )
 
@@ -79,7 +80,7 @@ type DriverResponse struct {
 
 // driver is the type for functions that query the build system for the
 // packages named by the patterns.
-type driver func(cfg *Config, patterns ...string) (*DriverResponse, error)
+type driver func(cfg *Config, patterns []string) (*DriverResponse, error)
 
 // findExternalDriver returns the file path of a tool that supplies
 // the build system package structure, or "" if not found.
@@ -103,7 +104,7 @@ func findExternalDriver(cfg *Config) driver {
 			return nil
 		}
 	}
-	return func(cfg *Config, words ...string) (*DriverResponse, error) {
+	return func(cfg *Config, patterns []string) (*DriverResponse, error) {
 		req, err := json.Marshal(DriverRequest{
 			Mode:       cfg.Mode,
 			Env:        cfg.Env,
@@ -117,7 +118,7 @@ func findExternalDriver(cfg *Config) driver {
 
 		buf := new(bytes.Buffer)
 		stderr := new(bytes.Buffer)
-		cmd := exec.CommandContext(cfg.Context, tool, words...)
+		cmd := exec.CommandContext(cfg.Context, tool, patterns...)
 		cmd.Dir = cfg.Dir
 		// The cwd gets resolved to the real path. On Darwin, where
 		// /tmp is a symlink, this breaks anything that expects the
@@ -131,7 +132,7 @@ func findExternalDriver(cfg *Config) driver {
 		// command.
 		//
 		// (See similar trick in Invocation.run in ../../internal/gocommand/invoke.go)
-		cmd.Env = append(slicesClip(cfg.Env), "PWD="+cfg.Dir)
+		cmd.Env = append(slices.Clip(cfg.Env), "PWD="+cfg.Dir)
 		cmd.Stdin = bytes.NewReader(req)
 		cmd.Stdout = buf
 		cmd.Stderr = stderr
@@ -150,7 +151,3 @@ func findExternalDriver(cfg *Config) driver {
 		return &response, nil
 	}
 }
-
-// slicesClip removes unused capacity from the slice, returning s[:len(s):len(s)].
-// TODO(adonovan): use go1.21 slices.Clip.
-func slicesClip[S ~[]E, E any](s S) S { return s[:len(s):len(s)] }
diff --git a/vendor/golang.org/x/tools/go/packages/golist.go b/vendor/golang.org/x/tools/go/packages/golist.go
index 1a3a5b44f5..0458b4f9c4 100644
--- a/vendor/golang.org/x/tools/go/packages/golist.go
+++ b/vendor/golang.org/x/tools/go/packages/golist.go
@@ -80,6 +80,12 @@ type golistState struct {
 	cfg *Config
 	ctx context.Context
 
+	runner *gocommand.Runner
+
+	// overlay is the JSON file that encodes the Config.Overlay
+	// mapping, used by 'go list -overlay=...'.
+	overlay string
+
 	envOnce    sync.Once
 	goEnvError error
 	goEnv      map[string]string
@@ -127,7 +133,10 @@ func (state *golistState) mustGetEnv() map[string]string {
 // goListDriver uses the go list command to interpret the patterns and produce
 // the build system package structure.
 // See driver for more details.
-func goListDriver(cfg *Config, patterns ...string) (_ *DriverResponse, err error) {
+//
+// overlay is the JSON file that encodes the cfg.Overlay
+// mapping, used by 'go list -overlay=...'
+func goListDriver(cfg *Config, runner *gocommand.Runner, overlay string, patterns []string) (_ *DriverResponse, err error) {
 	// Make sure that any asynchronous go commands are killed when we return.
 	parentCtx := cfg.Context
 	if parentCtx == nil {
@@ -142,13 +151,15 @@ func goListDriver(cfg *Config, patterns ...string) (_ *DriverResponse, err error
 		cfg:        cfg,
 		ctx:        ctx,
 		vendorDirs: map[string]bool{},
+		overlay:    overlay,
+		runner:     runner,
 	}
 
 	// Fill in response.Sizes asynchronously if necessary.
-	if cfg.Mode&NeedTypesSizes != 0 || cfg.Mode&NeedTypes != 0 {
+	if cfg.Mode&NeedTypesSizes != 0 || cfg.Mode&(NeedTypes|NeedTypesInfo) != 0 {
 		errCh := make(chan error)
 		go func() {
-			compiler, arch, err := getSizesForArgs(ctx, state.cfgInvocation(), cfg.gocmdRunner)
+			compiler, arch, err := getSizesForArgs(ctx, state.cfgInvocation(), runner)
 			response.dr.Compiler = compiler
 			response.dr.Arch = arch
 			errCh <- err
@@ -311,6 +322,7 @@ type jsonPackage struct {
 	ImportPath        string
 	Dir               string
 	Name              string
+	Target            string
 	Export            string
 	GoFiles           []string
 	CompiledGoFiles   []string
@@ -494,13 +506,15 @@ func (state *golistState) createDriverResponse(words ...string) (*DriverResponse
 		pkg := &Package{
 			Name:            p.Name,
 			ID:              p.ImportPath,
+			Dir:             p.Dir,
+			Target:          p.Target,
 			GoFiles:         absJoin(p.Dir, p.GoFiles, p.CgoFiles),
 			CompiledGoFiles: absJoin(p.Dir, p.CompiledGoFiles),
 			OtherFiles:      absJoin(p.Dir, otherFiles(p)...),
 			EmbedFiles:      absJoin(p.Dir, p.EmbedFiles),
 			EmbedPatterns:   absJoin(p.Dir, p.EmbedPatterns),
 			IgnoredFiles:    absJoin(p.Dir, p.IgnoredGoFiles, p.IgnoredOtherFiles),
-			forTest:         p.ForTest,
+			ForTest:         p.ForTest,
 			depsErrors:      p.DepsErrors,
 			Module:          p.Module,
 		}
@@ -681,7 +695,7 @@ func (state *golistState) shouldAddFilenameFromError(p *jsonPackage) bool {
 // getGoVersion returns the effective minor version of the go command.
 func (state *golistState) getGoVersion() (int, error) {
 	state.goVersionOnce.Do(func() {
-		state.goVersion, state.goVersionError = gocommand.GoVersion(state.ctx, state.cfgInvocation(), state.cfg.gocmdRunner)
+		state.goVersion, state.goVersionError = gocommand.GoVersion(state.ctx, state.cfgInvocation(), state.runner)
 	})
 	return state.goVersion, state.goVersionError
 }
@@ -751,7 +765,7 @@ func jsonFlag(cfg *Config, goVersion int) string {
 		}
 	}
 	addFields("Name", "ImportPath", "Error") // These fields are always needed
-	if cfg.Mode&NeedFiles != 0 || cfg.Mode&NeedTypes != 0 {
+	if cfg.Mode&NeedFiles != 0 || cfg.Mode&(NeedTypes|NeedTypesInfo) != 0 {
 		addFields("Dir", "GoFiles", "IgnoredGoFiles", "IgnoredOtherFiles", "CFiles",
 			"CgoFiles", "CXXFiles", "MFiles", "HFiles", "FFiles", "SFiles",
 			"SwigFiles", "SwigCXXFiles", "SysoFiles")
@@ -759,7 +773,7 @@ func jsonFlag(cfg *Config, goVersion int) string {
 			addFields("TestGoFiles", "XTestGoFiles")
 		}
 	}
-	if cfg.Mode&NeedTypes != 0 {
+	if cfg.Mode&(NeedTypes|NeedTypesInfo) != 0 {
 		// CompiledGoFiles seems to be required for the test case TestCgoNoSyntax,
 		// even when -compiled isn't passed in.
 		// TODO(#52435): Should we make the test ask for -compiled, or automatically
@@ -784,7 +798,7 @@ func jsonFlag(cfg *Config, goVersion int) string {
 		// Request Dir in the unlikely case Export is not absolute.
 		addFields("Dir", "Export")
 	}
-	if cfg.Mode&needInternalForTest != 0 {
+	if cfg.Mode&NeedForTest != 0 {
 		addFields("ForTest")
 	}
 	if cfg.Mode&needInternalDepsErrors != 0 {
@@ -799,6 +813,9 @@ func jsonFlag(cfg *Config, goVersion int) string {
 	if cfg.Mode&NeedEmbedPatterns != 0 {
 		addFields("EmbedPatterns")
 	}
+	if cfg.Mode&NeedTarget != 0 {
+		addFields("Target")
+	}
 	return "-json=" + strings.Join(fields, ",")
 }
 
@@ -840,7 +857,7 @@ func (state *golistState) cfgInvocation() gocommand.Invocation {
 		Env:        cfg.Env,
 		Logf:       cfg.Logf,
 		WorkingDir: cfg.Dir,
-		Overlay:    cfg.goListOverlayFile,
+		Overlay:    state.overlay,
 	}
 }
 
@@ -851,11 +868,8 @@ func (state *golistState) invokeGo(verb string, args ...string) (*bytes.Buffer,
 	inv := state.cfgInvocation()
 	inv.Verb = verb
 	inv.Args = args
-	gocmdRunner := cfg.gocmdRunner
-	if gocmdRunner == nil {
-		gocmdRunner = &gocommand.Runner{}
-	}
-	stdout, stderr, friendlyErr, err := gocmdRunner.RunRaw(cfg.Context, inv)
+
+	stdout, stderr, friendlyErr, err := state.runner.RunRaw(cfg.Context, inv)
 	if err != nil {
 		// Check for 'go' executable not being found.
 		if ee, ok := err.(*exec.Error); ok && ee.Err == exec.ErrNotFound {
@@ -879,6 +893,12 @@ func (state *golistState) invokeGo(verb string, args ...string) (*bytes.Buffer,
 			return nil, friendlyErr
 		}
 
+		// Return an error if 'go list' failed due to missing tools in
+		// $GOROOT/pkg/tool/$GOOS_$GOARCH (#69606).
+		if len(stderr.String()) > 0 && strings.Contains(stderr.String(), `go: no such tool`) {
+			return nil, friendlyErr
+		}
+
 		// Is there an error running the C compiler in cgo? This will be reported in the "Error" field
 		// and should be suppressed by go list -e.
 		//
diff --git a/vendor/golang.org/x/tools/go/packages/loadmode_string.go b/vendor/golang.org/x/tools/go/packages/loadmode_string.go
index 5c080d21b5..69eec9f44d 100644
--- a/vendor/golang.org/x/tools/go/packages/loadmode_string.go
+++ b/vendor/golang.org/x/tools/go/packages/loadmode_string.go
@@ -9,49 +9,48 @@ import (
 	"strings"
 )
 
-var allModes = []LoadMode{
-	NeedName,
-	NeedFiles,
-	NeedCompiledGoFiles,
-	NeedImports,
-	NeedDeps,
-	NeedExportFile,
-	NeedTypes,
-	NeedSyntax,
-	NeedTypesInfo,
-	NeedTypesSizes,
+var modes = [...]struct {
+	mode LoadMode
+	name string
+}{
+	{NeedName, "NeedName"},
+	{NeedFiles, "NeedFiles"},
+	{NeedCompiledGoFiles, "NeedCompiledGoFiles"},
+	{NeedImports, "NeedImports"},
+	{NeedDeps, "NeedDeps"},
+	{NeedExportFile, "NeedExportFile"},
+	{NeedTypes, "NeedTypes"},
+	{NeedSyntax, "NeedSyntax"},
+	{NeedTypesInfo, "NeedTypesInfo"},
+	{NeedTypesSizes, "NeedTypesSizes"},
+	{NeedForTest, "NeedForTest"},
+	{NeedModule, "NeedModule"},
+	{NeedEmbedFiles, "NeedEmbedFiles"},
+	{NeedEmbedPatterns, "NeedEmbedPatterns"},
+	{NeedTarget, "NeedTarget"},
 }
 
-var modeStrings = []string{
-	"NeedName",
-	"NeedFiles",
-	"NeedCompiledGoFiles",
-	"NeedImports",
-	"NeedDeps",
-	"NeedExportFile",
-	"NeedTypes",
-	"NeedSyntax",
-	"NeedTypesInfo",
-	"NeedTypesSizes",
-}
-
-func (mod LoadMode) String() string {
-	m := mod
-	if m == 0 {
+func (mode LoadMode) String() string {
+	if mode == 0 {
 		return "LoadMode(0)"
 	}
 	var out []string
-	for i, x := range allModes {
-		if x > m {
-			break
+	// named bits
+	for _, item := range modes {
+		if (mode & item.mode) != 0 {
+			mode ^= item.mode
+			out = append(out, item.name)
 		}
-		if (m & x) != 0 {
-			out = append(out, modeStrings[i])
-			m = m ^ x
+	}
+	// unnamed residue
+	if mode != 0 {
+		if out == nil {
+			return fmt.Sprintf("LoadMode(%#x)", int(mode))
 		}
+		out = append(out, fmt.Sprintf("%#x", int(mode)))
 	}
-	if m != 0 {
-		out = append(out, "Unknown")
+	if len(out) == 1 {
+		return out[0]
 	}
-	return fmt.Sprintf("LoadMode(%s)", strings.Join(out, "|"))
+	return "(" + strings.Join(out, "|") + ")"
 }
diff --git a/vendor/golang.org/x/tools/go/packages/packages.go b/vendor/golang.org/x/tools/go/packages/packages.go
index 0b6bfaff80..0147d9080a 100644
--- a/vendor/golang.org/x/tools/go/packages/packages.go
+++ b/vendor/golang.org/x/tools/go/packages/packages.go
@@ -16,13 +16,13 @@ import (
 	"go/scanner"
 	"go/token"
 	"go/types"
-	"io"
 	"log"
 	"os"
 	"path/filepath"
 	"runtime"
 	"strings"
 	"sync"
+	"sync/atomic"
 	"time"
 
 	"golang.org/x/sync/errgroup"
@@ -31,7 +31,6 @@ import (
 	"golang.org/x/tools/internal/gocommand"
 	"golang.org/x/tools/internal/packagesinternal"
 	"golang.org/x/tools/internal/typesinternal"
-	"golang.org/x/tools/internal/versions"
 )
 
 // A LoadMode controls the amount of detail to return when loading.
@@ -44,19 +43,33 @@ import (
 // ID and Errors (if present) will always be filled.
 // [Load] may return more information than requested.
 //
+// The Mode flag is a union of several bits named NeedName,
+// NeedFiles, and so on, each of which determines whether
+// a given field of Package (Name, Files, etc) should be
+// populated.
+//
+// For convenience, we provide named constants for the most
+// common combinations of Need flags:
+//
+//	[LoadFiles]     lists of files in each package
+//	[LoadImports]   ... plus imports
+//	[LoadTypes]     ... plus type information
+//	[LoadSyntax]    ... plus type-annotated syntax
+//	[LoadAllSyntax] ... for all dependencies
+//
 // Unfortunately there are a number of open bugs related to
 // interactions among the LoadMode bits:
-// - https://github.com/golang/go/issues/56633
-// - https://github.com/golang/go/issues/56677
-// - https://github.com/golang/go/issues/58726
-// - https://github.com/golang/go/issues/63517
+//   - https://github.com/golang/go/issues/56633
+//   - https://github.com/golang/go/issues/56677
+//   - https://github.com/golang/go/issues/58726
+//   - https://github.com/golang/go/issues/63517
 type LoadMode int
 
 const (
 	// NeedName adds Name and PkgPath.
 	NeedName LoadMode = 1 << iota
 
-	// NeedFiles adds GoFiles and OtherFiles.
+	// NeedFiles adds Dir, GoFiles, OtherFiles, and IgnoredFiles
 	NeedFiles
 
 	// NeedCompiledGoFiles adds CompiledGoFiles.
@@ -78,7 +91,7 @@ const (
 	// NeedSyntax adds Syntax and Fset.
 	NeedSyntax
 
-	// NeedTypesInfo adds TypesInfo.
+	// NeedTypesInfo adds TypesInfo and Fset.
 	NeedTypesInfo
 
 	// NeedTypesSizes adds TypesSizes.
@@ -87,9 +100,10 @@ const (
 	// needInternalDepsErrors adds the internal deps errors field for use by gopls.
 	needInternalDepsErrors
 
-	// needInternalForTest adds the internal forTest field.
+	// NeedForTest adds ForTest.
+	//
 	// Tests must also be set on the context for this field to be populated.
-	needInternalForTest
+	NeedForTest
 
 	// typecheckCgo enables full support for type checking cgo. Requires Go 1.15+.
 	// Modifies CompiledGoFiles and Types, and has no effect on its own.
@@ -103,27 +117,27 @@ const (
 
 	// NeedEmbedPatterns adds EmbedPatterns.
 	NeedEmbedPatterns
+
+	// NeedTarget adds Target.
+	NeedTarget
+
+	// Be sure to update loadmode_string.go when adding new items!
 )
 
 const (
-	// Deprecated: LoadFiles exists for historical compatibility
-	// and should not be used. Please directly specify the needed fields using the Need values.
+	// LoadFiles loads the name and file names for the initial packages.
 	LoadFiles = NeedName | NeedFiles | NeedCompiledGoFiles
 
-	// Deprecated: LoadImports exists for historical compatibility
-	// and should not be used. Please directly specify the needed fields using the Need values.
+	// LoadImports loads the name, file names, and import mapping for the initial packages.
 	LoadImports = LoadFiles | NeedImports
 
-	// Deprecated: LoadTypes exists for historical compatibility
-	// and should not be used. Please directly specify the needed fields using the Need values.
+	// LoadTypes loads exported type information for the initial packages.
 	LoadTypes = LoadImports | NeedTypes | NeedTypesSizes
 
-	// Deprecated: LoadSyntax exists for historical compatibility
-	// and should not be used. Please directly specify the needed fields using the Need values.
+	// LoadSyntax loads typed syntax for the initial packages.
 	LoadSyntax = LoadTypes | NeedSyntax | NeedTypesInfo
 
-	// Deprecated: LoadAllSyntax exists for historical compatibility
-	// and should not be used. Please directly specify the needed fields using the Need values.
+	// LoadAllSyntax loads typed syntax for the initial packages and all dependencies.
 	LoadAllSyntax = LoadSyntax | NeedDeps
 
 	// Deprecated: NeedExportsFile is a historical misspelling of NeedExportFile.
@@ -133,13 +147,7 @@ const (
 // A Config specifies details about how packages should be loaded.
 // The zero value is a valid configuration.
 //
-// Calls to Load do not modify this struct.
-//
-// TODO(adonovan): #67702: this is currently false: in fact,
-// calls to [Load] do not modify the public fields of this struct, but
-// may modify hidden fields, so concurrent calls to [Load] must not
-// use the same Config. But perhaps we should reestablish the
-// documented invariant.
+// Calls to [Load] do not modify this struct.
 type Config struct {
 	// Mode controls the level of information returned for each package.
 	Mode LoadMode
@@ -170,19 +178,10 @@ type Config struct {
 	//
 	Env []string
 
-	// gocmdRunner guards go command calls from concurrency errors.
-	gocmdRunner *gocommand.Runner
-
 	// BuildFlags is a list of command-line flags to be passed through to
 	// the build system's query tool.
 	BuildFlags []string
 
-	// modFile will be used for -modfile in go command invocations.
-	modFile string
-
-	// modFlag will be used for -modfile in go command invocations.
-	modFlag string
-
 	// Fset provides source position information for syntax trees and types.
 	// If Fset is nil, Load will use a new fileset, but preserve Fset's value.
 	Fset *token.FileSet
@@ -229,21 +228,24 @@ type Config struct {
 	// drivers may vary in their level of support for overlays.
 	Overlay map[string][]byte
 
-	// goListOverlayFile is the JSON file that encodes the Overlay
-	// mapping, used by 'go list -overlay=...'
-	goListOverlayFile string
+	// -- Hidden configuration fields only for use in x/tools --
+
+	// modFile will be used for -modfile in go command invocations.
+	modFile string
+
+	// modFlag will be used for -modfile in go command invocations.
+	modFlag string
 }
 
 // Load loads and returns the Go packages named by the given patterns.
 //
-// Config specifies loading options;
-// nil behaves the same as an empty Config.
+// The cfg parameter specifies loading options; nil behaves the same as an empty [Config].
 //
 // The [Config.Mode] field is a set of bits that determine what kinds
 // of information should be computed and returned. Modes that require
 // more information tend to be slower. See [LoadMode] for details
 // and important caveats. Its zero value is equivalent to
-// NeedName | NeedFiles | NeedCompiledGoFiles.
+// [NeedName] | [NeedFiles] | [NeedCompiledGoFiles].
 //
 // Each call to Load returns a new set of [Package] instances.
 // The Packages and their Imports form a directed acyclic graph.
@@ -260,7 +262,7 @@ type Config struct {
 // Errors associated with a particular package are recorded in the
 // corresponding Package's Errors list, and do not cause Load to
 // return an error. Clients may need to handle such errors before
-// proceeding with further analysis. The PrintErrors function is
+// proceeding with further analysis. The [PrintErrors] function is
 // provided for convenient display of all errors.
 func Load(cfg *Config, patterns ...string) ([]*Package, error) {
 	ld := newLoader(cfg)
@@ -323,21 +325,24 @@ func defaultDriver(cfg *Config, patterns ...string) (*DriverResponse, bool, erro
 		} else if !response.NotHandled {
 			return response, true, nil
 		}
-		// (fall through)
+		// not handled: fall through
 	}
 
 	// go list fallback
-	//
+
 	// Write overlays once, as there are many calls
 	// to 'go list' (one per chunk plus others too).
-	overlay, cleanupOverlay, err := gocommand.WriteOverlays(cfg.Overlay)
+	overlayFile, cleanupOverlay, err := gocommand.WriteOverlays(cfg.Overlay)
 	if err != nil {
 		return nil, false, err
 	}
 	defer cleanupOverlay()
-	cfg.goListOverlayFile = overlay
 
-	response, err := callDriverOnChunks(goListDriver, cfg, chunks)
+	var runner gocommand.Runner // (shared across many 'go list' calls)
+	driver := func(cfg *Config, patterns []string) (*DriverResponse, error) {
+		return goListDriver(cfg, &runner, overlayFile, patterns)
+	}
+	response, err := callDriverOnChunks(driver, cfg, chunks)
 	if err != nil {
 		return nil, false, err
 	}
@@ -375,16 +380,14 @@ func splitIntoChunks(patterns []string, argMax int) ([][]string, error) {
 
 func callDriverOnChunks(driver driver, cfg *Config, chunks [][]string) (*DriverResponse, error) {
 	if len(chunks) == 0 {
-		return driver(cfg)
+		return driver(cfg, nil)
 	}
 	responses := make([]*DriverResponse, len(chunks))
 	errNotHandled := errors.New("driver returned NotHandled")
 	var g errgroup.Group
 	for i, chunk := range chunks {
-		i := i
-		chunk := chunk
 		g.Go(func() (err error) {
-			responses[i], err = driver(cfg, chunk...)
+			responses[i], err = driver(cfg, chunk)
 			if responses[i] != nil && responses[i].NotHandled {
 				err = errNotHandled
 			}
@@ -434,6 +437,12 @@ type Package struct {
 	// PkgPath is the package path as used by the go/types package.
 	PkgPath string
 
+	// Dir is the directory associated with the package, if it exists.
+	//
+	// For packages listed by the go command, this is the directory containing
+	// the package files.
+	Dir string
+
 	// Errors contains any errors encountered querying the metadata
 	// of the package, or while parsing or type-checking its files.
 	Errors []Error
@@ -473,6 +482,10 @@ type Package struct {
 	// information for the package as provided by the build system.
 	ExportFile string
 
+	// Target is the absolute install path of the .a file, for libraries,
+	// and of the executable file, for binaries.
+	Target string
+
 	// Imports maps import paths appearing in the package's Go source files
 	// to corresponding loaded Packages.
 	Imports map[string]*Package
@@ -521,8 +534,8 @@ type Package struct {
 
 	// -- internal --
 
-	// forTest is the package under test, if any.
-	forTest string
+	// ForTest is the package under test, if any.
+	ForTest string
 
 	// depsErrors is the DepsErrors field from the go list response, if any.
 	depsErrors []*packagesinternal.PackageError
@@ -551,9 +564,6 @@ type ModuleError struct {
 }
 
 func init() {
-	packagesinternal.GetForTest = func(p interface{}) string {
-		return p.(*Package).forTest
-	}
 	packagesinternal.GetDepsErrors = func(p interface{}) []*packagesinternal.PackageError {
 		return p.(*Package).depsErrors
 	}
@@ -565,7 +575,6 @@ func init() {
 	}
 	packagesinternal.TypecheckCgo = int(typecheckCgo)
 	packagesinternal.DepsErrors = int(needInternalDepsErrors)
-	packagesinternal.ForTest = int(needInternalForTest)
 }
 
 // An Error describes a problem with a package's metadata, syntax, or types.
@@ -681,18 +690,19 @@ func (p *Package) String() string { return p.ID }
 // loaderPackage augments Package with state used during the loading phase
 type loaderPackage struct {
 	*Package
-	importErrors map[string]error // maps each bad import to its error
-	loadOnce     sync.Once
-	color        uint8 // for cycle detection
-	needsrc      bool  // load from source (Mode >= LoadTypes)
-	needtypes    bool  // type information is either requested or depended on
-	initial      bool  // package was matched by a pattern
-	goVersion    int   // minor version number of go command on PATH
+	importErrors    map[string]error // maps each bad import to its error
+	preds           []*loaderPackage // packages that import this one
+	unfinishedSuccs atomic.Int32     // number of direct imports not yet loaded
+	color           uint8            // for cycle detection
+	needsrc         bool             // load from source (Mode >= LoadTypes)
+	needtypes       bool             // type information is either requested or depended on
+	initial         bool             // package was matched by a pattern
+	goVersion       int              // minor version number of go command on PATH
 }
 
 // loader holds the working state of a single call to load.
 type loader struct {
-	pkgs map[string]*loaderPackage
+	pkgs map[string]*loaderPackage // keyed by Package.ID
 	Config
 	sizes        types.Sizes // non-nil if needed by mode
 	parseCache   map[string]*parseValue
@@ -738,9 +748,6 @@ func newLoader(cfg *Config) *loader {
 	if ld.Config.Env == nil {
 		ld.Config.Env = os.Environ()
 	}
-	if ld.Config.gocmdRunner == nil {
-		ld.Config.gocmdRunner = &gocommand.Runner{}
-	}
 	if ld.Context == nil {
 		ld.Context = context.Background()
 	}
@@ -754,7 +761,7 @@ func newLoader(cfg *Config) *loader {
 	ld.requestedMode = ld.Mode
 	ld.Mode = impliedLoadMode(ld.Mode)
 
-	if ld.Mode&NeedTypes != 0 || ld.Mode&NeedSyntax != 0 {
+	if ld.Mode&(NeedSyntax|NeedTypes|NeedTypesInfo) != 0 {
 		if ld.Fset == nil {
 			ld.Fset = token.NewFileSet()
 		}
@@ -763,6 +770,7 @@ func newLoader(cfg *Config) *loader {
 		// because we load source if export data is missing.
 		if ld.ParseFile == nil {
 			ld.ParseFile = func(fset *token.FileSet, filename string, src []byte) (*ast.File, error) {
+				// We implicitly promise to keep doing ast.Object resolution. :(
 				const mode = parser.AllErrors | parser.ParseComments
 				return parser.ParseFile(fset, filename, src, mode)
 			}
@@ -794,7 +802,7 @@ func (ld *loader) refine(response *DriverResponse) ([]*Package, error) {
 		exportDataInvalid := len(ld.Overlay) > 0 || pkg.ExportFile == "" && pkg.PkgPath != "unsafe"
 		// This package needs type information if the caller requested types and the package is
 		// either a root, or it's a non-root and the user requested dependencies ...
-		needtypes := (ld.Mode&NeedTypes|NeedTypesInfo != 0 && (rootIndex >= 0 || ld.Mode&NeedDeps != 0))
+		needtypes := (ld.Mode&(NeedTypes|NeedTypesInfo) != 0 && (rootIndex >= 0 || ld.Mode&NeedDeps != 0))
 		// This package needs source if the call requested source (or types info, which implies source)
 		// and the package is either a root, or itas a non- root and the user requested dependencies...
 		needsrc := ((ld.Mode&(NeedSyntax|NeedTypesInfo) != 0 && (rootIndex >= 0 || ld.Mode&NeedDeps != 0)) ||
@@ -819,9 +827,10 @@ func (ld *loader) refine(response *DriverResponse) ([]*Package, error) {
 		}
 	}
 
-	if ld.Mode&NeedImports != 0 {
-		// Materialize the import graph.
-
+	// Materialize the import graph if it is needed (NeedImports),
+	// or if we'll be using loadPackages (Need{Syntax|Types|TypesInfo}).
+	var leaves []*loaderPackage // packages with no unfinished successors
+	if ld.Mode&(NeedImports|NeedSyntax|NeedTypes|NeedTypesInfo) != 0 {
 		const (
 			white = 0 // new
 			grey  = 1 // in progress
@@ -840,63 +849,76 @@ func (ld *loader) refine(response *DriverResponse) ([]*Package, error) {
 		// dependency on a package that does. These are the only packages
 		// for which we load source code.
 		var stack []*loaderPackage
-		var visit func(lpkg *loaderPackage) bool
-		visit = func(lpkg *loaderPackage) bool {
-			switch lpkg.color {
-			case black:
-				return lpkg.needsrc
-			case grey:
+		var visit func(from, lpkg *loaderPackage) bool
+		visit = func(from, lpkg *loaderPackage) bool {
+			if lpkg.color == grey {
 				panic("internal error: grey node")
 			}
-			lpkg.color = grey
-			stack = append(stack, lpkg) // push
-			stubs := lpkg.Imports       // the structure form has only stubs with the ID in the Imports
-			lpkg.Imports = make(map[string]*Package, len(stubs))
-			for importPath, ipkg := range stubs {
-				var importErr error
-				imp := ld.pkgs[ipkg.ID]
-				if imp == nil {
-					// (includes package "C" when DisableCgo)
-					importErr = fmt.Errorf("missing package: %q", ipkg.ID)
-				} else if imp.color == grey {
-					importErr = fmt.Errorf("import cycle: %s", stack)
+			if lpkg.color == white {
+				lpkg.color = grey
+				stack = append(stack, lpkg) // push
+				stubs := lpkg.Imports       // the structure form has only stubs with the ID in the Imports
+				lpkg.Imports = make(map[string]*Package, len(stubs))
+				for importPath, ipkg := range stubs {
+					var importErr error
+					imp := ld.pkgs[ipkg.ID]
+					if imp == nil {
+						// (includes package "C" when DisableCgo)
+						importErr = fmt.Errorf("missing package: %q", ipkg.ID)
+					} else if imp.color == grey {
+						importErr = fmt.Errorf("import cycle: %s", stack)
+					}
+					if importErr != nil {
+						if lpkg.importErrors == nil {
+							lpkg.importErrors = make(map[string]error)
+						}
+						lpkg.importErrors[importPath] = importErr
+						continue
+					}
+
+					if visit(lpkg, imp) {
+						lpkg.needsrc = true
+					}
+					lpkg.Imports[importPath] = imp.Package
 				}
-				if importErr != nil {
-					if lpkg.importErrors == nil {
-						lpkg.importErrors = make(map[string]error)
+
+				// -- postorder --
+
+				// Complete type information is required for the
+				// immediate dependencies of each source package.
+				if lpkg.needsrc && ld.Mode&NeedTypes != 0 {
+					for _, ipkg := range lpkg.Imports {
+						ld.pkgs[ipkg.ID].needtypes = true
 					}
-					lpkg.importErrors[importPath] = importErr
-					continue
 				}
 
-				if visit(imp) {
-					lpkg.needsrc = true
+				// NeedTypeSizes causes TypeSizes to be set even
+				// on packages for which types aren't needed.
+				if ld.Mode&NeedTypesSizes != 0 {
+					lpkg.TypesSizes = ld.sizes
 				}
-				lpkg.Imports[importPath] = imp.Package
-			}
 
-			// Complete type information is required for the
-			// immediate dependencies of each source package.
-			if lpkg.needsrc && ld.Mode&NeedTypes != 0 {
-				for _, ipkg := range lpkg.Imports {
-					ld.pkgs[ipkg.ID].needtypes = true
+				// Add packages with no imports directly to the queue of leaves.
+				if len(lpkg.Imports) == 0 {
+					leaves = append(leaves, lpkg)
 				}
+
+				stack = stack[:len(stack)-1] // pop
+				lpkg.color = black
 			}
 
-			// NeedTypeSizes causes TypeSizes to be set even
-			// on packages for which types aren't needed.
-			if ld.Mode&NeedTypesSizes != 0 {
-				lpkg.TypesSizes = ld.sizes
+			// Add edge from predecessor.
+			if from != nil {
+				from.unfinishedSuccs.Add(+1) // incref
+				lpkg.preds = append(lpkg.preds, from)
 			}
-			stack = stack[:len(stack)-1] // pop
-			lpkg.color = black
 
 			return lpkg.needsrc
 		}
 
 		// For each initial package, create its import DAG.
 		for _, lpkg := range initial {
-			visit(lpkg)
+			visit(nil, lpkg)
 		}
 
 	} else {
@@ -909,16 +931,45 @@ func (ld *loader) refine(response *DriverResponse) ([]*Package, error) {
 
 	// Load type data and syntax if needed, starting at
 	// the initial packages (roots of the import DAG).
-	if ld.Mode&NeedTypes != 0 || ld.Mode&NeedSyntax != 0 {
-		var wg sync.WaitGroup
-		for _, lpkg := range initial {
-			wg.Add(1)
-			go func(lpkg *loaderPackage) {
-				ld.loadRecursive(lpkg)
-				wg.Done()
-			}(lpkg)
+	if ld.Mode&(NeedSyntax|NeedTypes|NeedTypesInfo) != 0 {
+
+		// We avoid using g.SetLimit to limit concurrency as
+		// it makes g.Go stop accepting work, which prevents
+		// workers from enqeuing, and thus finishing, and thus
+		// allowing the group to make progress: deadlock.
+		//
+		// Instead we use the ioLimit and cpuLimit semaphores.
+		g, _ := errgroup.WithContext(ld.Context)
+
+		// enqueues adds a package to the type-checking queue.
+		// It must have no unfinished successors.
+		var enqueue func(*loaderPackage)
+		enqueue = func(lpkg *loaderPackage) {
+			g.Go(func() error {
+				// Parse and type-check.
+				ld.loadPackage(lpkg)
+
+				// Notify each waiting predecessor,
+				// and enqueue it when it becomes a leaf.
+				for _, pred := range lpkg.preds {
+					if pred.unfinishedSuccs.Add(-1) == 0 { // decref
+						enqueue(pred)
+					}
+				}
+
+				return nil
+			})
+		}
+
+		// Load leaves first, adding new packages
+		// to the queue as they become leaves.
+		for _, leaf := range leaves {
+			enqueue(leaf)
+		}
+
+		if err := g.Wait(); err != nil {
+			return nil, err // cancelled
 		}
-		wg.Wait()
 	}
 
 	// If the context is done, return its error and
@@ -965,7 +1016,7 @@ func (ld *loader) refine(response *DriverResponse) ([]*Package, error) {
 		if ld.requestedMode&NeedSyntax == 0 {
 			ld.pkgs[i].Syntax = nil
 		}
-		if ld.requestedMode&NeedTypes == 0 && ld.requestedMode&NeedSyntax == 0 {
+		if ld.requestedMode&(NeedSyntax|NeedTypes|NeedTypesInfo) == 0 {
 			ld.pkgs[i].Fset = nil
 		}
 		if ld.requestedMode&NeedTypesInfo == 0 {
@@ -982,31 +1033,10 @@ func (ld *loader) refine(response *DriverResponse) ([]*Package, error) {
 	return result, nil
 }
 
-// loadRecursive loads the specified package and its dependencies,
-// recursively, in parallel, in topological order.
-// It is atomic and idempotent.
-// Precondition: ld.Mode&NeedTypes.
-func (ld *loader) loadRecursive(lpkg *loaderPackage) {
-	lpkg.loadOnce.Do(func() {
-		// Load the direct dependencies, in parallel.
-		var wg sync.WaitGroup
-		for _, ipkg := range lpkg.Imports {
-			imp := ld.pkgs[ipkg.ID]
-			wg.Add(1)
-			go func(imp *loaderPackage) {
-				ld.loadRecursive(imp)
-				wg.Done()
-			}(imp)
-		}
-		wg.Wait()
-		ld.loadPackage(lpkg)
-	})
-}
-
-// loadPackage loads the specified package.
+// loadPackage loads/parses/typechecks the specified package.
 // It must be called only once per Package,
 // after immediate dependencies are loaded.
-// Precondition: ld.Mode & NeedTypes.
+// Precondition: ld.Mode&(NeedSyntax|NeedTypes|NeedTypesInfo) != 0.
 func (ld *loader) loadPackage(lpkg *loaderPackage) {
 	if lpkg.PkgPath == "unsafe" {
 		// Fill in the blanks to avoid surprises.
@@ -1042,6 +1072,10 @@ func (ld *loader) loadPackage(lpkg *loaderPackage) {
 	if !lpkg.needtypes && !lpkg.needsrc {
 		return
 	}
+
+	// TODO(adonovan): this condition looks wrong:
+	// I think it should be lpkg.needtypes && !lpg.needsrc,
+	// so that NeedSyntax without NeedTypes can be satisfied by export data.
 	if !lpkg.needsrc {
 		if err := ld.loadFromExportData(lpkg); err != nil {
 			lpkg.Errors = append(lpkg.Errors, Error{
@@ -1147,7 +1181,7 @@ func (ld *loader) loadPackage(lpkg *loaderPackage) {
 	}
 
 	lpkg.Syntax = files
-	if ld.Config.Mode&NeedTypes == 0 {
+	if ld.Config.Mode&(NeedTypes|NeedTypesInfo) == 0 {
 		return
 	}
 
@@ -1158,16 +1192,20 @@ func (ld *loader) loadPackage(lpkg *loaderPackage) {
 		return
 	}
 
-	lpkg.TypesInfo = &types.Info{
-		Types:      make(map[ast.Expr]types.TypeAndValue),
-		Defs:       make(map[*ast.Ident]types.Object),
-		Uses:       make(map[*ast.Ident]types.Object),
-		Implicits:  make(map[ast.Node]types.Object),
-		Instances:  make(map[*ast.Ident]types.Instance),
-		Scopes:     make(map[ast.Node]*types.Scope),
-		Selections: make(map[*ast.SelectorExpr]*types.Selection),
+	// Populate TypesInfo only if needed, as it
+	// causes the type checker to work much harder.
+	if ld.Config.Mode&NeedTypesInfo != 0 {
+		lpkg.TypesInfo = &types.Info{
+			Types:        make(map[ast.Expr]types.TypeAndValue),
+			Defs:         make(map[*ast.Ident]types.Object),
+			Uses:         make(map[*ast.Ident]types.Object),
+			Implicits:    make(map[ast.Node]types.Object),
+			Instances:    make(map[*ast.Ident]types.Instance),
+			Scopes:       make(map[ast.Node]*types.Scope),
+			Selections:   make(map[*ast.SelectorExpr]*types.Selection),
+			FileVersions: make(map[*ast.File]string),
+		}
 	}
-	versions.InitFileVersions(lpkg.TypesInfo)
 	lpkg.TypesSizes = ld.sizes
 
 	importer := importerFunc(func(path string) (*types.Package, error) {
@@ -1220,6 +1258,10 @@ func (ld *loader) loadPackage(lpkg *loaderPackage) {
 		}
 	}
 
+	// Type-checking is CPU intensive.
+	cpuLimit <- unit{}            // acquire a token
+	defer func() { <-cpuLimit }() // release a token
+
 	typErr := types.NewChecker(tc, ld.Fset, lpkg.Types, lpkg.TypesInfo).Files(lpkg.Syntax)
 	lpkg.importErrors = nil // no longer needed
 
@@ -1284,8 +1326,11 @@ type importerFunc func(path string) (*types.Package, error)
 func (f importerFunc) Import(path string) (*types.Package, error) { return f(path) }
 
 // We use a counting semaphore to limit
-// the number of parallel I/O calls per process.
-var ioLimit = make(chan bool, 20)
+// the number of parallel I/O calls or CPU threads per process.
+var (
+	ioLimit  = make(chan unit, 20)
+	cpuLimit = make(chan unit, runtime.GOMAXPROCS(0))
+)
 
 func (ld *loader) parseFile(filename string) (*ast.File, error) {
 	ld.parseCacheMu.Lock()
@@ -1302,20 +1347,28 @@ func (ld *loader) parseFile(filename string) (*ast.File, error) {
 
 		var src []byte
 		for f, contents := range ld.Config.Overlay {
+			// TODO(adonovan): Inefficient for large overlays.
+			// Do an exact name-based map lookup
+			// (for nonexistent files) followed by a
+			// FileID-based map lookup (for existing ones).
 			if sameFile(f, filename) {
 				src = contents
+				break
 			}
 		}
 		var err error
 		if src == nil {
-			ioLimit <- true // wait
+			ioLimit <- unit{} // acquire a token
 			src, err = os.ReadFile(filename)
-			<-ioLimit // signal
+			<-ioLimit // release a token
 		}
 		if err != nil {
 			v.err = err
 		} else {
+			// Parsing is CPU intensive.
+			cpuLimit <- unit{} // acquire a token
 			v.f, v.err = ld.ParseFile(ld.Fset, filename, src)
+			<-cpuLimit // release a token
 		}
 
 		close(v.ready)
@@ -1330,18 +1383,21 @@ func (ld *loader) parseFile(filename string) (*ast.File, error) {
 // Because files are scanned in parallel, the token.Pos
 // positions of the resulting ast.Files are not ordered.
 func (ld *loader) parseFiles(filenames []string) ([]*ast.File, []error) {
-	var wg sync.WaitGroup
-	n := len(filenames)
-	parsed := make([]*ast.File, n)
-	errors := make([]error, n)
-	for i, file := range filenames {
-		wg.Add(1)
-		go func(i int, filename string) {
+	var (
+		n      = len(filenames)
+		parsed = make([]*ast.File, n)
+		errors = make([]error, n)
+	)
+	var g errgroup.Group
+	for i, filename := range filenames {
+		// This creates goroutines unnecessarily in the
+		// cache-hit case, but that case is uncommon.
+		g.Go(func() error {
 			parsed[i], errors[i] = ld.parseFile(filename)
-			wg.Done()
-		}(i, file)
+			return nil
+		})
 	}
-	wg.Wait()
+	g.Wait()
 
 	// Eliminate nils, preserving order.
 	var o int
@@ -1512,4 +1568,4 @@ func usesExportData(cfg *Config) bool {
 	return cfg.Mode&NeedExportFile != 0 || cfg.Mode&NeedTypes != 0 && cfg.Mode&NeedDeps == 0
 }
 
-var _ interface{} = io.Discard // assert build toolchain is go1.16 or later
+type unit struct{}
diff --git a/vendor/golang.org/x/tools/go/types/objectpath/objectpath.go b/vendor/golang.org/x/tools/go/types/objectpath/objectpath.go
index 9ada177758..16ed3c1780 100644
--- a/vendor/golang.org/x/tools/go/types/objectpath/objectpath.go
+++ b/vendor/golang.org/x/tools/go/types/objectpath/objectpath.go
@@ -228,7 +228,7 @@ func (enc *Encoder) For(obj types.Object) (Path, error) {
 	//    Reject obviously non-viable cases.
 	switch obj := obj.(type) {
 	case *types.TypeName:
-		if _, ok := aliases.Unalias(obj.Type()).(*types.TypeParam); !ok {
+		if _, ok := types.Unalias(obj.Type()).(*types.TypeParam); !ok {
 			// With the exception of type parameters, only package-level type names
 			// have a path.
 			return "", fmt.Errorf("no path for %v", obj)
@@ -280,26 +280,26 @@ func (enc *Encoder) For(obj types.Object) (Path, error) {
 		path = append(path, opType)
 
 		T := o.Type()
-		if alias, ok := T.(*aliases.Alias); ok {
-			if r := findTypeParam(obj, aliases.TypeParams(alias), path, opTypeParam, nil); r != nil {
+		if alias, ok := T.(*types.Alias); ok {
+			if r := findTypeParam(obj, aliases.TypeParams(alias), path, opTypeParam); r != nil {
 				return Path(r), nil
 			}
-			if r := find(obj, aliases.Rhs(alias), append(path, opRhs), nil); r != nil {
+			if r := find(obj, aliases.Rhs(alias), append(path, opRhs)); r != nil {
 				return Path(r), nil
 			}
 
 		} else if tname.IsAlias() {
 			// legacy alias
-			if r := find(obj, T, path, nil); r != nil {
+			if r := find(obj, T, path); r != nil {
 				return Path(r), nil
 			}
 
 		} else if named, ok := T.(*types.Named); ok {
 			// defined (named) type
-			if r := findTypeParam(obj, named.TypeParams(), path, opTypeParam, nil); r != nil {
+			if r := findTypeParam(obj, named.TypeParams(), path, opTypeParam); r != nil {
 				return Path(r), nil
 			}
-			if r := find(obj, named.Underlying(), append(path, opUnderlying), nil); r != nil {
+			if r := find(obj, named.Underlying(), append(path, opUnderlying)); r != nil {
 				return Path(r), nil
 			}
 		}
@@ -312,7 +312,7 @@ func (enc *Encoder) For(obj types.Object) (Path, error) {
 		if _, ok := o.(*types.TypeName); !ok {
 			if o.Exported() {
 				// exported non-type (const, var, func)
-				if r := find(obj, o.Type(), append(path, opType), nil); r != nil {
+				if r := find(obj, o.Type(), append(path, opType)); r != nil {
 					return Path(r), nil
 				}
 			}
@@ -320,7 +320,7 @@ func (enc *Encoder) For(obj types.Object) (Path, error) {
 		}
 
 		// Inspect declared methods of defined types.
-		if T, ok := aliases.Unalias(o.Type()).(*types.Named); ok {
+		if T, ok := types.Unalias(o.Type()).(*types.Named); ok {
 			path = append(path, opType)
 			// The method index here is always with respect
 			// to the underlying go/types data structures,
@@ -332,7 +332,7 @@ func (enc *Encoder) For(obj types.Object) (Path, error) {
 				if m == obj {
 					return Path(path2), nil // found declared method
 				}
-				if r := find(obj, m.Type(), append(path2, opType), nil); r != nil {
+				if r := find(obj, m.Type(), append(path2, opType)); r != nil {
 					return Path(r), nil
 				}
 			}
@@ -447,46 +447,64 @@ func (enc *Encoder) concreteMethod(meth *types.Func) (Path, bool) {
 //
 // The seen map is used to short circuit cycles through type parameters. If
 // nil, it will be allocated as necessary.
-func find(obj types.Object, T types.Type, path []byte, seen map[*types.TypeName]bool) []byte {
+//
+// The seenMethods map is used internally to short circuit cycles through
+// interface methods, such as occur in the following example:
+//
+//	type I interface { f() interface{I} }
+//
+// See golang/go#68046 for details.
+func find(obj types.Object, T types.Type, path []byte) []byte {
+	return (&finder{obj: obj}).find(T, path)
+}
+
+// finder closes over search state for a call to find.
+type finder struct {
+	obj             types.Object             // the sought object
+	seenTParamNames map[*types.TypeName]bool // for cycle breaking through type parameters
+	seenMethods     map[*types.Func]bool     // for cycle breaking through recursive interfaces
+}
+
+func (f *finder) find(T types.Type, path []byte) []byte {
 	switch T := T.(type) {
-	case *aliases.Alias:
-		return find(obj, aliases.Unalias(T), path, seen)
+	case *types.Alias:
+		return f.find(types.Unalias(T), path)
 	case *types.Basic, *types.Named:
 		// Named types belonging to pkg were handled already,
 		// so T must belong to another package. No path.
 		return nil
 	case *types.Pointer:
-		return find(obj, T.Elem(), append(path, opElem), seen)
+		return f.find(T.Elem(), append(path, opElem))
 	case *types.Slice:
-		return find(obj, T.Elem(), append(path, opElem), seen)
+		return f.find(T.Elem(), append(path, opElem))
 	case *types.Array:
-		return find(obj, T.Elem(), append(path, opElem), seen)
+		return f.find(T.Elem(), append(path, opElem))
 	case *types.Chan:
-		return find(obj, T.Elem(), append(path, opElem), seen)
+		return f.find(T.Elem(), append(path, opElem))
 	case *types.Map:
-		if r := find(obj, T.Key(), append(path, opKey), seen); r != nil {
+		if r := f.find(T.Key(), append(path, opKey)); r != nil {
 			return r
 		}
-		return find(obj, T.Elem(), append(path, opElem), seen)
+		return f.find(T.Elem(), append(path, opElem))
 	case *types.Signature:
-		if r := findTypeParam(obj, T.RecvTypeParams(), path, opRecvTypeParam, nil); r != nil {
+		if r := f.findTypeParam(T.RecvTypeParams(), path, opRecvTypeParam); r != nil {
 			return r
 		}
-		if r := findTypeParam(obj, T.TypeParams(), path, opTypeParam, seen); r != nil {
+		if r := f.findTypeParam(T.TypeParams(), path, opTypeParam); r != nil {
 			return r
 		}
-		if r := find(obj, T.Params(), append(path, opParams), seen); r != nil {
+		if r := f.find(T.Params(), append(path, opParams)); r != nil {
 			return r
 		}
-		return find(obj, T.Results(), append(path, opResults), seen)
+		return f.find(T.Results(), append(path, opResults))
 	case *types.Struct:
 		for i := 0; i < T.NumFields(); i++ {
 			fld := T.Field(i)
 			path2 := appendOpArg(path, opField, i)
-			if fld == obj {
+			if fld == f.obj {
 				return path2 // found field var
 			}
-			if r := find(obj, fld.Type(), append(path2, opType), seen); r != nil {
+			if r := f.find(fld.Type(), append(path2, opType)); r != nil {
 				return r
 			}
 		}
@@ -495,10 +513,10 @@ func find(obj types.Object, T types.Type, path []byte, seen map[*types.TypeName]
 		for i := 0; i < T.Len(); i++ {
 			v := T.At(i)
 			path2 := appendOpArg(path, opAt, i)
-			if v == obj {
+			if v == f.obj {
 				return path2 // found param/result var
 			}
-			if r := find(obj, v.Type(), append(path2, opType), seen); r != nil {
+			if r := f.find(v.Type(), append(path2, opType)); r != nil {
 				return r
 			}
 		}
@@ -506,28 +524,35 @@ func find(obj types.Object, T types.Type, path []byte, seen map[*types.TypeName]
 	case *types.Interface:
 		for i := 0; i < T.NumMethods(); i++ {
 			m := T.Method(i)
+			if f.seenMethods[m] {
+				return nil
+			}
 			path2 := appendOpArg(path, opMethod, i)
-			if m == obj {
+			if m == f.obj {
 				return path2 // found interface method
 			}
-			if r := find(obj, m.Type(), append(path2, opType), seen); r != nil {
+			if f.seenMethods == nil {
+				f.seenMethods = make(map[*types.Func]bool)
+			}
+			f.seenMethods[m] = true
+			if r := f.find(m.Type(), append(path2, opType)); r != nil {
 				return r
 			}
 		}
 		return nil
 	case *types.TypeParam:
 		name := T.Obj()
-		if name == obj {
-			return append(path, opObj)
-		}
-		if seen[name] {
+		if f.seenTParamNames[name] {
 			return nil
 		}
-		if seen == nil {
-			seen = make(map[*types.TypeName]bool)
+		if name == f.obj {
+			return append(path, opObj)
 		}
-		seen[name] = true
-		if r := find(obj, T.Constraint(), append(path, opConstraint), seen); r != nil {
+		if f.seenTParamNames == nil {
+			f.seenTParamNames = make(map[*types.TypeName]bool)
+		}
+		f.seenTParamNames[name] = true
+		if r := f.find(T.Constraint(), append(path, opConstraint)); r != nil {
 			return r
 		}
 		return nil
@@ -535,11 +560,15 @@ func find(obj types.Object, T types.Type, path []byte, seen map[*types.TypeName]
 	panic(T)
 }
 
-func findTypeParam(obj types.Object, list *types.TypeParamList, path []byte, op byte, seen map[*types.TypeName]bool) []byte {
+func findTypeParam(obj types.Object, list *types.TypeParamList, path []byte, op byte) []byte {
+	return (&finder{obj: obj}).findTypeParam(list, path, op)
+}
+
+func (f *finder) findTypeParam(list *types.TypeParamList, path []byte, op byte) []byte {
 	for i := 0; i < list.Len(); i++ {
 		tparam := list.At(i)
 		path2 := appendOpArg(path, op, i)
-		if r := find(obj, tparam, path2, seen); r != nil {
+		if r := f.find(tparam, path2); r != nil {
 			return r
 		}
 	}
@@ -626,7 +655,7 @@ func Object(pkg *types.Package, p Path) (types.Object, error) {
 
 		// Inv: t != nil, obj == nil
 
-		t = aliases.Unalias(t)
+		t = types.Unalias(t)
 		switch code {
 		case opElem:
 			hasElem, ok := t.(hasElem) // Pointer, Slice, Array, Chan, Map
@@ -664,7 +693,7 @@ func Object(pkg *types.Package, p Path) (types.Object, error) {
 			t = named.Underlying()
 
 		case opRhs:
-			if alias, ok := t.(*aliases.Alias); ok {
+			if alias, ok := t.(*types.Alias); ok {
 				t = aliases.Rhs(alias)
 			} else if false && aliases.Enabled() {
 				// The Enabled check is too expensive, so for now we
diff --git a/vendor/golang.org/x/tools/go/types/typeutil/callee.go b/vendor/golang.org/x/tools/go/types/typeutil/callee.go
index 90dc541adf..754380351e 100644
--- a/vendor/golang.org/x/tools/go/types/typeutil/callee.go
+++ b/vendor/golang.org/x/tools/go/types/typeutil/callee.go
@@ -8,7 +8,6 @@ import (
 	"go/ast"
 	"go/types"
 
-	"golang.org/x/tools/go/ast/astutil"
 	"golang.org/x/tools/internal/typeparams"
 )
 
@@ -17,7 +16,7 @@ import (
 //
 // Functions and methods may potentially have type parameters.
 func Callee(info *types.Info, call *ast.CallExpr) types.Object {
-	fun := astutil.Unparen(call.Fun)
+	fun := ast.Unparen(call.Fun)
 
 	// Look through type instantiation if necessary.
 	isInstance := false
diff --git a/vendor/golang.org/x/tools/go/types/typeutil/map.go b/vendor/golang.org/x/tools/go/types/typeutil/map.go
index a92f80dd2d..93b3090c68 100644
--- a/vendor/golang.org/x/tools/go/types/typeutil/map.go
+++ b/vendor/golang.org/x/tools/go/types/typeutil/map.go
@@ -2,31 +2,35 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// Package typeutil defines various utilities for types, such as Map,
-// a mapping from types.Type to any values.
-package typeutil // import "golang.org/x/tools/go/types/typeutil"
+// Package typeutil defines various utilities for types, such as [Map],
+// a hash table that maps [types.Type] to any value.
+package typeutil
 
 import (
 	"bytes"
 	"fmt"
 	"go/types"
-	"reflect"
+	"hash/maphash"
+	"unsafe"
 
-	"golang.org/x/tools/internal/aliases"
 	"golang.org/x/tools/internal/typeparams"
 )
 
 // Map is a hash-table-based mapping from types (types.Type) to
-// arbitrary any values.  The concrete types that implement
+// arbitrary values.  The concrete types that implement
 // the Type interface are pointers.  Since they are not canonicalized,
 // == cannot be used to check for equivalence, and thus we cannot
 // simply use a Go map.
 //
 // Just as with map[K]V, a nil *Map is a valid empty map.
 //
-// Not thread-safe.
+// Read-only map operations ([Map.At], [Map.Len], and so on) may
+// safely be called concurrently.
+//
+// TODO(adonovan): deprecate in favor of https://go.dev/issues/69420
+// and 69559, if the latter proposals for a generic hash-map type and
+// a types.Hash function are accepted.
 type Map struct {
-	hasher Hasher             // shared by many Maps
 	table  map[uint32][]entry // maps hash to bucket; entry.key==nil means unused
 	length int                // number of map entries
 }
@@ -37,35 +41,17 @@ type entry struct {
 	value any
 }
 
-// SetHasher sets the hasher used by Map.
-//
-// All Hashers are functionally equivalent but contain internal state
-// used to cache the results of hashing previously seen types.
-//
-// A single Hasher created by MakeHasher() may be shared among many
-// Maps.  This is recommended if the instances have many keys in
-// common, as it will amortize the cost of hash computation.
-//
-// A Hasher may grow without bound as new types are seen.  Even when a
-// type is deleted from the map, the Hasher never shrinks, since other
-// types in the map may reference the deleted type indirectly.
+// SetHasher has no effect.
 //
-// Hashers are not thread-safe, and read-only operations such as
-// Map.Lookup require updates to the hasher, so a full Mutex lock (not a
-// read-lock) is require around all Map operations if a shared
-// hasher is accessed from multiple threads.
-//
-// If SetHasher is not called, the Map will create a private hasher at
-// the first call to Insert.
-func (m *Map) SetHasher(hasher Hasher) {
-	m.hasher = hasher
-}
+// It is a relic of an optimization that is no longer profitable. Do
+// not use [Hasher], [MakeHasher], or [SetHasher] in new code.
+func (m *Map) SetHasher(Hasher) {}
 
 // Delete removes the entry with the given key, if any.
 // It returns true if the entry was found.
 func (m *Map) Delete(key types.Type) bool {
 	if m != nil && m.table != nil {
-		hash := m.hasher.Hash(key)
+		hash := hash(key)
 		bucket := m.table[hash]
 		for i, e := range bucket {
 			if e.key != nil && types.Identical(key, e.key) {
@@ -84,7 +70,7 @@ func (m *Map) Delete(key types.Type) bool {
 // The result is nil if the entry is not present.
 func (m *Map) At(key types.Type) any {
 	if m != nil && m.table != nil {
-		for _, e := range m.table[m.hasher.Hash(key)] {
+		for _, e := range m.table[hash(key)] {
 			if e.key != nil && types.Identical(key, e.key) {
 				return e.value
 			}
@@ -97,7 +83,7 @@ func (m *Map) At(key types.Type) any {
 // and returns the previous entry, if any.
 func (m *Map) Set(key types.Type, value any) (prev any) {
 	if m.table != nil {
-		hash := m.hasher.Hash(key)
+		hash := hash(key)
 		bucket := m.table[hash]
 		var hole *entry
 		for i, e := range bucket {
@@ -116,10 +102,7 @@ func (m *Map) Set(key types.Type, value any) (prev any) {
 			m.table[hash] = append(bucket, entry{key, value})
 		}
 	} else {
-		if m.hasher.memo == nil {
-			m.hasher = MakeHasher()
-		}
-		hash := m.hasher.Hash(key)
+		hash := hash(key)
 		m.table = map[uint32][]entry{hash: {entry{key, value}}}
 	}
 
@@ -196,53 +179,35 @@ func (m *Map) KeysString() string {
 	return m.toString(false)
 }
 
-////////////////////////////////////////////////////////////////////////
-// Hasher
-
-// A Hasher maps each type to its hash value.
-// For efficiency, a hasher uses memoization; thus its memory
-// footprint grows monotonically over time.
-// Hashers are not thread-safe.
-// Hashers have reference semantics.
-// Call MakeHasher to create a Hasher.
-type Hasher struct {
-	memo map[types.Type]uint32
-
-	// ptrMap records pointer identity.
-	ptrMap map[any]uint32
-
-	// sigTParams holds type parameters from the signature being hashed.
-	// Signatures are considered identical modulo renaming of type parameters, so
-	// within the scope of a signature type the identity of the signature's type
-	// parameters is just their index.
-	//
-	// Since the language does not currently support referring to uninstantiated
-	// generic types or functions, and instantiated signatures do not have type
-	// parameter lists, we should never encounter a second non-empty type
-	// parameter list when hashing a generic signature.
-	sigTParams *types.TypeParamList
-}
+// -- Hasher --
 
-// MakeHasher returns a new Hasher instance.
-func MakeHasher() Hasher {
-	return Hasher{
-		memo:       make(map[types.Type]uint32),
-		ptrMap:     make(map[any]uint32),
-		sigTParams: nil,
-	}
+// hash returns the hash of type t.
+// TODO(adonovan): replace by types.Hash when Go proposal #69420 is accepted.
+func hash(t types.Type) uint32 {
+	return theHasher.Hash(t)
 }
 
+// A Hasher provides a [Hasher.Hash] method to map a type to its hash value.
+// Hashers are stateless, and all are equivalent.
+type Hasher struct{}
+
+var theHasher Hasher
+
+// MakeHasher returns Hasher{}.
+// Hashers are stateless; all are equivalent.
+func MakeHasher() Hasher { return theHasher }
+
 // Hash computes a hash value for the given type t such that
 // Identical(t, t') => Hash(t) == Hash(t').
 func (h Hasher) Hash(t types.Type) uint32 {
-	hash, ok := h.memo[t]
-	if !ok {
-		hash = h.hashFor(t)
-		h.memo[t] = hash
-	}
-	return hash
+	return hasher{inGenericSig: false}.hash(t)
 }
 
+// hasher holds the state of a single Hash traversal: whether we are
+// inside the signature of a generic function; this is used to
+// optimize [hasher.hashTypeParam].
+type hasher struct{ inGenericSig bool }
+
 // hashString computes the Fowler–Noll–Vo hash of s.
 func hashString(s string) uint32 {
 	var h uint32
@@ -253,21 +218,21 @@ func hashString(s string) uint32 {
 	return h
 }
 
-// hashFor computes the hash of t.
-func (h Hasher) hashFor(t types.Type) uint32 {
+// hash computes the hash of t.
+func (h hasher) hash(t types.Type) uint32 {
 	// See Identical for rationale.
 	switch t := t.(type) {
 	case *types.Basic:
 		return uint32(t.Kind())
 
-	case *aliases.Alias:
-		return h.Hash(aliases.Unalias(t))
+	case *types.Alias:
+		return h.hash(types.Unalias(t))
 
 	case *types.Array:
-		return 9043 + 2*uint32(t.Len()) + 3*h.Hash(t.Elem())
+		return 9043 + 2*uint32(t.Len()) + 3*h.hash(t.Elem())
 
 	case *types.Slice:
-		return 9049 + 2*h.Hash(t.Elem())
+		return 9049 + 2*h.hash(t.Elem())
 
 	case *types.Struct:
 		var hash uint32 = 9059
@@ -278,12 +243,12 @@ func (h Hasher) hashFor(t types.Type) uint32 {
 			}
 			hash += hashString(t.Tag(i))
 			hash += hashString(f.Name()) // (ignore f.Pkg)
-			hash += h.Hash(f.Type())
+			hash += h.hash(f.Type())
 		}
 		return hash
 
 	case *types.Pointer:
-		return 9067 + 2*h.Hash(t.Elem())
+		return 9067 + 2*h.hash(t.Elem())
 
 	case *types.Signature:
 		var hash uint32 = 9091
@@ -291,33 +256,11 @@ func (h Hasher) hashFor(t types.Type) uint32 {
 			hash *= 8863
 		}
 
-		// Use a separate hasher for types inside of the signature, where type
-		// parameter identity is modified to be (index, constraint). We must use a
-		// new memo for this hasher as type identity may be affected by this
-		// masking. For example, in func[T any](*T), the identity of *T depends on
-		// whether we are mapping the argument in isolation, or recursively as part
-		// of hashing the signature.
-		//
-		// We should never encounter a generic signature while hashing another
-		// generic signature, but defensively set sigTParams only if h.mask is
-		// unset.
 		tparams := t.TypeParams()
-		if h.sigTParams == nil && tparams.Len() != 0 {
-			h = Hasher{
-				// There may be something more efficient than discarding the existing
-				// memo, but it would require detecting whether types are 'tainted' by
-				// references to type parameters.
-				memo: make(map[types.Type]uint32),
-				// Re-using ptrMap ensures that pointer identity is preserved in this
-				// hasher.
-				ptrMap:     h.ptrMap,
-				sigTParams: tparams,
-			}
-		}
-
-		for i := 0; i < tparams.Len(); i++ {
+		for i := range tparams.Len() {
+			h.inGenericSig = true
 			tparam := tparams.At(i)
-			hash += 7 * h.Hash(tparam.Constraint())
+			hash += 7 * h.hash(tparam.Constraint())
 		}
 
 		return hash + 3*h.hashTuple(t.Params()) + 5*h.hashTuple(t.Results())
@@ -351,17 +294,17 @@ func (h Hasher) hashFor(t types.Type) uint32 {
 		return hash
 
 	case *types.Map:
-		return 9109 + 2*h.Hash(t.Key()) + 3*h.Hash(t.Elem())
+		return 9109 + 2*h.hash(t.Key()) + 3*h.hash(t.Elem())
 
 	case *types.Chan:
-		return 9127 + 2*uint32(t.Dir()) + 3*h.Hash(t.Elem())
+		return 9127 + 2*uint32(t.Dir()) + 3*h.hash(t.Elem())
 
 	case *types.Named:
-		hash := h.hashPtr(t.Obj())
+		hash := h.hashTypeName(t.Obj())
 		targs := t.TypeArgs()
 		for i := 0; i < targs.Len(); i++ {
 			targ := targs.At(i)
-			hash += 2 * h.Hash(targ)
+			hash += 2 * h.hash(targ)
 		}
 		return hash
 
@@ -375,17 +318,17 @@ func (h Hasher) hashFor(t types.Type) uint32 {
 	panic(fmt.Sprintf("%T: %v", t, t))
 }
 
-func (h Hasher) hashTuple(tuple *types.Tuple) uint32 {
+func (h hasher) hashTuple(tuple *types.Tuple) uint32 {
 	// See go/types.identicalTypes for rationale.
 	n := tuple.Len()
 	hash := 9137 + 2*uint32(n)
-	for i := 0; i < n; i++ {
-		hash += 3 * h.Hash(tuple.At(i).Type())
+	for i := range n {
+		hash += 3 * h.hash(tuple.At(i).Type())
 	}
 	return hash
 }
 
-func (h Hasher) hashUnion(t *types.Union) uint32 {
+func (h hasher) hashUnion(t *types.Union) uint32 {
 	// Hash type restrictions.
 	terms, err := typeparams.UnionTermSet(t)
 	// if err != nil t has invalid type restrictions. Fall back on a non-zero
@@ -396,11 +339,11 @@ func (h Hasher) hashUnion(t *types.Union) uint32 {
 	return h.hashTermSet(terms)
 }
 
-func (h Hasher) hashTermSet(terms []*types.Term) uint32 {
+func (h hasher) hashTermSet(terms []*types.Term) uint32 {
 	hash := 9157 + 2*uint32(len(terms))
 	for _, term := range terms {
 		// term order is not significant.
-		termHash := h.Hash(term.Type())
+		termHash := h.hash(term.Type())
 		if term.Tilde() {
 			termHash *= 9161
 		}
@@ -409,36 +352,42 @@ func (h Hasher) hashTermSet(terms []*types.Term) uint32 {
 	return hash
 }
 
-// hashTypeParam returns a hash of the type parameter t, with a hash value
-// depending on whether t is contained in h.sigTParams.
-//
-// If h.sigTParams is set and contains t, then we are in the process of hashing
-// a signature, and the hash value of t must depend only on t's index and
-// constraint: signatures are considered identical modulo type parameter
-// renaming. To avoid infinite recursion, we only hash the type parameter
-// index, and rely on types.Identical to handle signatures where constraints
-// are not identical.
-//
-// Otherwise the hash of t depends only on t's pointer identity.
-func (h Hasher) hashTypeParam(t *types.TypeParam) uint32 {
-	if h.sigTParams != nil {
-		i := t.Index()
-		if i >= 0 && i < h.sigTParams.Len() && t == h.sigTParams.At(i) {
-			return 9173 + 3*uint32(i)
-		}
+// hashTypeParam returns the hash of a type parameter.
+func (h hasher) hashTypeParam(t *types.TypeParam) uint32 {
+	// Within the signature of a generic function, TypeParams are
+	// identical if they have the same index and constraint, so we
+	// hash them based on index.
+	//
+	// When we are outside a generic function, free TypeParams are
+	// identical iff they are the same object, so we can use a
+	// more discriminating hash consistent with object identity.
+	// This optimization saves [Map] about 4% when hashing all the
+	// types.Info.Types in the forward closure of net/http.
+	if !h.inGenericSig {
+		// Optimization: outside a generic function signature,
+		// use a more discrimating hash consistent with object identity.
+		return h.hashTypeName(t.Obj())
 	}
-	return h.hashPtr(t.Obj())
+	return 9173 + 3*uint32(t.Index())
 }
 
-// hashPtr hashes the pointer identity of ptr. It uses h.ptrMap to ensure that
-// pointers values are not dependent on the GC.
-func (h Hasher) hashPtr(ptr any) uint32 {
-	if hash, ok := h.ptrMap[ptr]; ok {
-		return hash
-	}
-	hash := uint32(reflect.ValueOf(ptr).Pointer())
-	h.ptrMap[ptr] = hash
-	return hash
+var theSeed = maphash.MakeSeed()
+
+// hashTypeName hashes the pointer of tname.
+func (hasher) hashTypeName(tname *types.TypeName) uint32 {
+	// Since types.Identical uses == to compare TypeNames,
+	// the Hash function uses maphash.Comparable.
+	// TODO(adonovan): or will, when it becomes available in go1.24.
+	// In the meantime we use the pointer's numeric value.
+	//
+	//   hash := maphash.Comparable(theSeed, tname)
+	//
+	// (Another approach would be to hash the name and package
+	// path, and whether or not it is a package-level typename. It
+	// is rare for a package to define multiple local types with
+	// the same name.)
+	hash := uintptr(unsafe.Pointer(tname))
+	return uint32(hash ^ (hash >> 32))
 }
 
 // shallowHash computes a hash of t without looking at any of its
@@ -455,14 +404,14 @@ func (h Hasher) hashPtr(ptr any) uint32 {
 // include m itself; there is no mention of the named type X that
 // might help us break the cycle.
 // (See comment in go/types.identical, case *Interface, for more.)
-func (h Hasher) shallowHash(t types.Type) uint32 {
+func (h hasher) shallowHash(t types.Type) uint32 {
 	// t is the type of an interface method (Signature),
 	// its params or results (Tuples), or their immediate
 	// elements (mostly Slice, Pointer, Basic, Named),
 	// so there's no need to optimize anything else.
 	switch t := t.(type) {
-	case *aliases.Alias:
-		return h.shallowHash(aliases.Unalias(t))
+	case *types.Alias:
+		return h.shallowHash(types.Unalias(t))
 
 	case *types.Signature:
 		var hash uint32 = 604171
@@ -476,7 +425,7 @@ func (h Hasher) shallowHash(t types.Type) uint32 {
 	case *types.Tuple:
 		n := t.Len()
 		hash := 9137 + 2*uint32(n)
-		for i := 0; i < n; i++ {
+		for i := range n {
 			hash += 53471161 * h.shallowHash(t.At(i).Type())
 		}
 		return hash
@@ -509,10 +458,10 @@ func (h Hasher) shallowHash(t types.Type) uint32 {
 		return 9127
 
 	case *types.Named:
-		return h.hashPtr(t.Obj())
+		return h.hashTypeName(t.Obj())
 
 	case *types.TypeParam:
-		return h.hashPtr(t.Obj())
+		return h.hashTypeParam(t)
 	}
 	panic(fmt.Sprintf("shallowHash: %T: %v", t, t))
 }
diff --git a/vendor/golang.org/x/tools/go/types/typeutil/methodsetcache.go b/vendor/golang.org/x/tools/go/types/typeutil/methodsetcache.go
index bd71aafaaa..f7666028fe 100644
--- a/vendor/golang.org/x/tools/go/types/typeutil/methodsetcache.go
+++ b/vendor/golang.org/x/tools/go/types/typeutil/methodsetcache.go
@@ -9,8 +9,6 @@ package typeutil
 import (
 	"go/types"
 	"sync"
-
-	"golang.org/x/tools/internal/aliases"
 )
 
 // A MethodSetCache records the method set of each type T for which
@@ -34,12 +32,12 @@ func (cache *MethodSetCache) MethodSet(T types.Type) *types.MethodSet {
 	cache.mu.Lock()
 	defer cache.mu.Unlock()
 
-	switch T := aliases.Unalias(T).(type) {
+	switch T := types.Unalias(T).(type) {
 	case *types.Named:
 		return cache.lookupNamed(T).value
 
 	case *types.Pointer:
-		if N, ok := aliases.Unalias(T.Elem()).(*types.Named); ok {
+		if N, ok := types.Unalias(T.Elem()).(*types.Named); ok {
 			return cache.lookupNamed(N).pointer
 		}
 	}
diff --git a/vendor/golang.org/x/tools/go/types/typeutil/ui.go b/vendor/golang.org/x/tools/go/types/typeutil/ui.go
index a0c1a60ac0..9dda6a25df 100644
--- a/vendor/golang.org/x/tools/go/types/typeutil/ui.go
+++ b/vendor/golang.org/x/tools/go/types/typeutil/ui.go
@@ -8,8 +8,6 @@ package typeutil
 
 import (
 	"go/types"
-
-	"golang.org/x/tools/internal/aliases"
 )
 
 // IntuitiveMethodSet returns the intuitive method set of a type T,
@@ -28,7 +26,7 @@ import (
 // The order of the result is as for types.MethodSet(T).
 func IntuitiveMethodSet(T types.Type, msets *MethodSetCache) []*types.Selection {
 	isPointerToConcrete := func(T types.Type) bool {
-		ptr, ok := aliases.Unalias(T).(*types.Pointer)
+		ptr, ok := types.Unalias(T).(*types.Pointer)
 		return ok && !types.IsInterface(ptr.Elem())
 	}
 
diff --git a/vendor/golang.org/x/tools/internal/aliases/aliases.go b/vendor/golang.org/x/tools/internal/aliases/aliases.go
index f7798e3354..b9425f5a20 100644
--- a/vendor/golang.org/x/tools/internal/aliases/aliases.go
+++ b/vendor/golang.org/x/tools/internal/aliases/aliases.go
@@ -28,7 +28,7 @@ import (
 func NewAlias(enabled bool, pos token.Pos, pkg *types.Package, name string, rhs types.Type, tparams []*types.TypeParam) *types.TypeName {
 	if enabled {
 		tname := types.NewTypeName(pos, pkg, name, nil)
-		newAlias(tname, rhs, tparams)
+		SetTypeParams(types.NewAlias(tname, rhs), tparams)
 		return tname
 	}
 	if len(tparams) > 0 {
diff --git a/vendor/golang.org/x/tools/internal/aliases/aliases_go121.go b/vendor/golang.org/x/tools/internal/aliases/aliases_go121.go
deleted file mode 100644
index a775fcc4be..0000000000
--- a/vendor/golang.org/x/tools/internal/aliases/aliases_go121.go
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2024 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 !go1.22
-// +build !go1.22
-
-package aliases
-
-import (
-	"go/types"
-)
-
-// Alias is a placeholder for a go/types.Alias for <=1.21.
-// It will never be created by go/types.
-type Alias struct{}
-
-func (*Alias) String() string                                { panic("unreachable") }
-func (*Alias) Underlying() types.Type                        { panic("unreachable") }
-func (*Alias) Obj() *types.TypeName                          { panic("unreachable") }
-func Rhs(alias *Alias) types.Type                            { panic("unreachable") }
-func TypeParams(alias *Alias) *types.TypeParamList           { panic("unreachable") }
-func SetTypeParams(alias *Alias, tparams []*types.TypeParam) { panic("unreachable") }
-func TypeArgs(alias *Alias) *types.TypeList                  { panic("unreachable") }
-func Origin(alias *Alias) *Alias                             { panic("unreachable") }
-
-// Unalias returns the type t for go <=1.21.
-func Unalias(t types.Type) types.Type { return t }
-
-func newAlias(name *types.TypeName, rhs types.Type, tparams []*types.TypeParam) *Alias {
-	panic("unreachable")
-}
-
-// Enabled reports whether [NewAlias] should create [types.Alias] types.
-//
-// Before go1.22, this function always returns false.
-func Enabled() bool { return false }
diff --git a/vendor/golang.org/x/tools/internal/aliases/aliases_go122.go b/vendor/golang.org/x/tools/internal/aliases/aliases_go122.go
index 31c159e42e..7716a3331d 100644
--- a/vendor/golang.org/x/tools/internal/aliases/aliases_go122.go
+++ b/vendor/golang.org/x/tools/internal/aliases/aliases_go122.go
@@ -2,9 +2,6 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build go1.22
-// +build go1.22
-
 package aliases
 
 import (
@@ -14,22 +11,19 @@ import (
 	"go/types"
 )
 
-// Alias is an alias of types.Alias.
-type Alias = types.Alias
-
 // Rhs returns the type on the right-hand side of the alias declaration.
-func Rhs(alias *Alias) types.Type {
+func Rhs(alias *types.Alias) types.Type {
 	if alias, ok := any(alias).(interface{ Rhs() types.Type }); ok {
 		return alias.Rhs() // go1.23+
 	}
 
 	// go1.22's Alias didn't have the Rhs method,
 	// so Unalias is the best we can do.
-	return Unalias(alias)
+	return types.Unalias(alias)
 }
 
 // TypeParams returns the type parameter list of the alias.
-func TypeParams(alias *Alias) *types.TypeParamList {
+func TypeParams(alias *types.Alias) *types.TypeParamList {
 	if alias, ok := any(alias).(interface{ TypeParams() *types.TypeParamList }); ok {
 		return alias.TypeParams() // go1.23+
 	}
@@ -37,7 +31,7 @@ func TypeParams(alias *Alias) *types.TypeParamList {
 }
 
 // SetTypeParams sets the type parameters of the alias type.
-func SetTypeParams(alias *Alias, tparams []*types.TypeParam) {
+func SetTypeParams(alias *types.Alias, tparams []*types.TypeParam) {
 	if alias, ok := any(alias).(interface {
 		SetTypeParams(tparams []*types.TypeParam)
 	}); ok {
@@ -48,7 +42,7 @@ func SetTypeParams(alias *Alias, tparams []*types.TypeParam) {
 }
 
 // TypeArgs returns the type arguments used to instantiate the Alias type.
-func TypeArgs(alias *Alias) *types.TypeList {
+func TypeArgs(alias *types.Alias) *types.TypeList {
 	if alias, ok := any(alias).(interface{ TypeArgs() *types.TypeList }); ok {
 		return alias.TypeArgs() // go1.23+
 	}
@@ -57,25 +51,13 @@ func TypeArgs(alias *Alias) *types.TypeList {
 
 // Origin returns the generic Alias type of which alias is an instance.
 // If alias is not an instance of a generic alias, Origin returns alias.
-func Origin(alias *Alias) *Alias {
+func Origin(alias *types.Alias) *types.Alias {
 	if alias, ok := any(alias).(interface{ Origin() *types.Alias }); ok {
 		return alias.Origin() // go1.23+
 	}
 	return alias // not an instance of a generic alias (go1.22)
 }
 
-// Unalias is a wrapper of types.Unalias.
-func Unalias(t types.Type) types.Type { return types.Unalias(t) }
-
-// newAlias is an internal alias around types.NewAlias.
-// Direct usage is discouraged as the moment.
-// Try to use NewAlias instead.
-func newAlias(tname *types.TypeName, rhs types.Type, tparams []*types.TypeParam) *Alias {
-	a := types.NewAlias(tname, rhs)
-	SetTypeParams(a, tparams)
-	return a
-}
-
 // Enabled reports whether [NewAlias] should create [types.Alias] types.
 //
 // This function is expensive! Call it sparingly.
@@ -91,7 +73,7 @@ func Enabled() bool {
 	//     many tests. Therefore any attempt to cache the result
 	//     is just incorrect.
 	fset := token.NewFileSet()
-	f, _ := parser.ParseFile(fset, "a.go", "package p; type A = int", 0)
+	f, _ := parser.ParseFile(fset, "a.go", "package p; type A = int", parser.SkipObjectResolution)
 	pkg, _ := new(types.Config).Check("p", fset, []*ast.File{f}, nil)
 	_, enabled := pkg.Scope().Lookup("A").Type().(*types.Alias)
 	return enabled
diff --git a/vendor/golang.org/x/tools/internal/gcimporter/bimport.go b/vendor/golang.org/x/tools/internal/gcimporter/bimport.go
index d98b0db2a9..d79a605ed1 100644
--- a/vendor/golang.org/x/tools/internal/gcimporter/bimport.go
+++ b/vendor/golang.org/x/tools/internal/gcimporter/bimport.go
@@ -87,64 +87,3 @@ func chanDir(d int) types.ChanDir {
 		return 0
 	}
 }
-
-var predeclOnce sync.Once
-var predecl []types.Type // initialized lazily
-
-func predeclared() []types.Type {
-	predeclOnce.Do(func() {
-		// initialize lazily to be sure that all
-		// elements have been initialized before
-		predecl = []types.Type{ // basic types
-			types.Typ[types.Bool],
-			types.Typ[types.Int],
-			types.Typ[types.Int8],
-			types.Typ[types.Int16],
-			types.Typ[types.Int32],
-			types.Typ[types.Int64],
-			types.Typ[types.Uint],
-			types.Typ[types.Uint8],
-			types.Typ[types.Uint16],
-			types.Typ[types.Uint32],
-			types.Typ[types.Uint64],
-			types.Typ[types.Uintptr],
-			types.Typ[types.Float32],
-			types.Typ[types.Float64],
-			types.Typ[types.Complex64],
-			types.Typ[types.Complex128],
-			types.Typ[types.String],
-
-			// basic type aliases
-			types.Universe.Lookup("byte").Type(),
-			types.Universe.Lookup("rune").Type(),
-
-			// error
-			types.Universe.Lookup("error").Type(),
-
-			// untyped types
-			types.Typ[types.UntypedBool],
-			types.Typ[types.UntypedInt],
-			types.Typ[types.UntypedRune],
-			types.Typ[types.UntypedFloat],
-			types.Typ[types.UntypedComplex],
-			types.Typ[types.UntypedString],
-			types.Typ[types.UntypedNil],
-
-			// package unsafe
-			types.Typ[types.UnsafePointer],
-
-			// invalid type
-			types.Typ[types.Invalid], // only appears in packages with errors
-
-			// used internally by gc; never used by this package or in .a files
-			anyType{},
-		}
-		predecl = append(predecl, additionalPredeclared()...)
-	})
-	return predecl
-}
-
-type anyType struct{}
-
-func (t anyType) Underlying() types.Type { return t }
-func (t anyType) String() string         { return "any" }
diff --git a/vendor/golang.org/x/tools/internal/gcimporter/exportdata.go b/vendor/golang.org/x/tools/internal/gcimporter/exportdata.go
index f6437feb1c..5662a311da 100644
--- a/vendor/golang.org/x/tools/internal/gcimporter/exportdata.go
+++ b/vendor/golang.org/x/tools/internal/gcimporter/exportdata.go
@@ -2,49 +2,183 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// This file is a copy of $GOROOT/src/go/internal/gcimporter/exportdata.go.
-
-// This file implements FindExportData.
+// This file should be kept in sync with $GOROOT/src/internal/exportdata/exportdata.go.
+// This file also additionally implements FindExportData for gcexportdata.NewReader.
 
 package gcimporter
 
 import (
 	"bufio"
+	"bytes"
+	"errors"
 	"fmt"
+	"go/build"
 	"io"
-	"strconv"
+	"os"
+	"os/exec"
+	"path/filepath"
 	"strings"
+	"sync"
 )
 
-func readGopackHeader(r *bufio.Reader) (name string, size int64, err error) {
-	// See $GOROOT/include/ar.h.
-	hdr := make([]byte, 16+12+6+6+8+10+2)
-	_, err = io.ReadFull(r, hdr)
+// FindExportData positions the reader r at the beginning of the
+// export data section of an underlying cmd/compile created archive
+// file by reading from it. The reader must be positioned at the
+// start of the file before calling this function.
+// This returns the length of the export data in bytes.
+//
+// This function is needed by [gcexportdata.Read], which must
+// accept inputs produced by the last two releases of cmd/compile,
+// plus tip.
+func FindExportData(r *bufio.Reader) (size int64, err error) {
+	arsize, err := FindPackageDefinition(r)
+	if err != nil {
+		return
+	}
+	size = int64(arsize)
+
+	objapi, headers, err := ReadObjectHeaders(r)
 	if err != nil {
 		return
 	}
-	// leave for debugging
-	if false {
-		fmt.Printf("header: %s", hdr)
+	size -= int64(len(objapi))
+	for _, h := range headers {
+		size -= int64(len(h))
+	}
+
+	// Check for the binary export data section header "$$B\n".
+	// TODO(taking): Unify with ReadExportDataHeader so that it stops at the 'u' instead of reading
+	line, err := r.ReadSlice('\n')
+	if err != nil {
+		return
+	}
+	hdr := string(line)
+	if hdr != "$$B\n" {
+		err = fmt.Errorf("unknown export data header: %q", hdr)
+		return
 	}
-	s := strings.TrimSpace(string(hdr[16+12+6+6+8:][:10]))
-	length, err := strconv.Atoi(s)
-	size = int64(length)
-	if err != nil || hdr[len(hdr)-2] != '`' || hdr[len(hdr)-1] != '\n' {
-		err = fmt.Errorf("invalid archive header")
+	size -= int64(len(hdr))
+
+	// For files with a binary export data header "$$B\n",
+	// these are always terminated by an end-of-section marker "\n$$\n".
+	// So the last bytes must always be this constant.
+	//
+	// The end-of-section marker is not a part of the export data itself.
+	// Do not include these in size.
+	//
+	// It would be nice to have sanity check that the final bytes after
+	// the export data are indeed the end-of-section marker. The split
+	// of gcexportdata.NewReader and gcexportdata.Read make checking this
+	// ugly so gcimporter gives up enforcing this. The compiler and go/types
+	// importer do enforce this, which seems good enough.
+	const endofsection = "\n$$\n"
+	size -= int64(len(endofsection))
+
+	if size < 0 {
+		err = fmt.Errorf("invalid size (%d) in the archive file: %d bytes remain without section headers (recompile package)", arsize, size)
 		return
 	}
-	name = strings.TrimSpace(string(hdr[:16]))
+
 	return
 }
 
-// FindExportData positions the reader r at the beginning of the
-// export data section of an underlying GC-created object/archive
-// file by reading from it. The reader must be positioned at the
-// start of the file before calling this function. The hdr result
-// is the string before the export data, either "$$" or "$$B".
-// The size result is the length of the export data in bytes, or -1 if not known.
-func FindExportData(r *bufio.Reader) (hdr string, size int64, err error) {
+// ReadUnified reads the contents of the unified export data from a reader r
+// that contains the contents of a GC-created archive file.
+//
+// On success, the reader will be positioned after the end-of-section marker "\n$$\n".
+//
+// Supported GC-created archive files have 4 layers of nesting:
+//   - An archive file containing a package definition file.
+//   - The package definition file contains headers followed by a data section.
+//     Headers are lines (≤ 4kb) that do not start with "$$".
+//   - The data section starts with "$$B\n" followed by export data followed
+//     by an end of section marker "\n$$\n". (The section start "$$\n" is no
+//     longer supported.)
+//   - The export data starts with a format byte ('u') followed by the  in
+//     the given format. (See ReadExportDataHeader for older formats.)
+//
+// Putting this together, the bytes in a GC-created archive files are expected
+// to look like the following.
+// See cmd/internal/archive for more details on ar file headers.
+//
+// | \n             | ar file signature
+// | __.PKGDEF...size...\n | ar header for __.PKGDEF including size.
+// | go object <...>\n     | objabi header
+// | \n  | other headers such as build id
+// | $$B\n                 | binary format marker
+// | u\n             | unified export 
+// | $$\n                  | end-of-section marker
+// | [optional padding]    | padding byte (0x0A) if size is odd
+// | [ar file header]      | other ar files
+// | [ar file data]        |
+func ReadUnified(r *bufio.Reader) (data []byte, err error) {
+	// We historically guaranteed headers at the default buffer size (4096) work.
+	// This ensures we can use ReadSlice throughout.
+	const minBufferSize = 4096
+	r = bufio.NewReaderSize(r, minBufferSize)
+
+	size, err := FindPackageDefinition(r)
+	if err != nil {
+		return
+	}
+	n := size
+
+	objapi, headers, err := ReadObjectHeaders(r)
+	if err != nil {
+		return
+	}
+	n -= len(objapi)
+	for _, h := range headers {
+		n -= len(h)
+	}
+
+	hdrlen, err := ReadExportDataHeader(r)
+	if err != nil {
+		return
+	}
+	n -= hdrlen
+
+	// size also includes the end of section marker. Remove that many bytes from the end.
+	const marker = "\n$$\n"
+	n -= len(marker)
+
+	if n < 0 {
+		err = fmt.Errorf("invalid size (%d) in the archive file: %d bytes remain without section headers (recompile package)", size, n)
+		return
+	}
+
+	// Read n bytes from buf.
+	data = make([]byte, n)
+	_, err = io.ReadFull(r, data)
+	if err != nil {
+		return
+	}
+
+	// Check for marker at the end.
+	var suffix [len(marker)]byte
+	_, err = io.ReadFull(r, suffix[:])
+	if err != nil {
+		return
+	}
+	if s := string(suffix[:]); s != marker {
+		err = fmt.Errorf("read %q instead of end-of-section marker (%q)", s, marker)
+		return
+	}
+
+	return
+}
+
+// FindPackageDefinition positions the reader r at the beginning of a package
+// definition file ("__.PKGDEF") within a GC-created archive by reading
+// from it, and returns the size of the package definition file in the archive.
+//
+// The reader must be positioned at the start of the archive file before calling
+// this function, and "__.PKGDEF" is assumed to be the first file in the archive.
+//
+// See cmd/internal/archive for details on the archive format.
+func FindPackageDefinition(r *bufio.Reader) (size int, err error) {
+	// Uses ReadSlice to limit risk of malformed inputs.
+
 	// Read first line to make sure this is an object file.
 	line, err := r.ReadSlice('\n')
 	if err != nil {
@@ -52,48 +186,236 @@ func FindExportData(r *bufio.Reader) (hdr string, size int64, err error) {
 		return
 	}
 
-	if string(line) == "!\n" {
-		// Archive file. Scan to __.PKGDEF.
-		var name string
-		if name, size, err = readGopackHeader(r); err != nil {
-			return
-		}
+	// Is the first line an archive file signature?
+	if string(line) != "!\n" {
+		err = fmt.Errorf("not the start of an archive file (%q)", line)
+		return
+	}
+
+	// package export block should be first
+	size = readArchiveHeader(r, "__.PKGDEF")
+	if size <= 0 {
+		err = fmt.Errorf("not a package file")
+		return
+	}
+
+	return
+}
 
-		// First entry should be __.PKGDEF.
-		if name != "__.PKGDEF" {
-			err = fmt.Errorf("go archive is missing __.PKGDEF")
+// ReadObjectHeaders reads object headers from the reader. Object headers are
+// lines that do not start with an end-of-section marker "$$". The first header
+// is the objabi header. On success, the reader will be positioned at the beginning
+// of the end-of-section marker.
+//
+// It returns an error if any header does not fit in r.Size() bytes.
+func ReadObjectHeaders(r *bufio.Reader) (objapi string, headers []string, err error) {
+	// line is a temporary buffer for headers.
+	// Use bounded reads (ReadSlice, Peek) to limit risk of malformed inputs.
+	var line []byte
+
+	// objapi header should be the first line
+	if line, err = r.ReadSlice('\n'); err != nil {
+		err = fmt.Errorf("can't find export data (%v)", err)
+		return
+	}
+	objapi = string(line)
+
+	// objapi header begins with "go object ".
+	if !strings.HasPrefix(objapi, "go object ") {
+		err = fmt.Errorf("not a go object file: %s", objapi)
+		return
+	}
+
+	// process remaining object header lines
+	for {
+		// check for an end of section marker "$$"
+		line, err = r.Peek(2)
+		if err != nil {
 			return
 		}
+		if string(line) == "$$" {
+			return // stop
+		}
 
-		// Read first line of __.PKGDEF data, so that line
-		// is once again the first line of the input.
-		if line, err = r.ReadSlice('\n'); err != nil {
-			err = fmt.Errorf("can't find export data (%v)", err)
+		// read next header
+		line, err = r.ReadSlice('\n')
+		if err != nil {
 			return
 		}
-		size -= int64(len(line))
+		headers = append(headers, string(line))
 	}
+}
 
-	// Now at __.PKGDEF in archive or still at beginning of file.
-	// Either way, line should begin with "go object ".
-	if !strings.HasPrefix(string(line), "go object ") {
-		err = fmt.Errorf("not a Go object file")
+// ReadExportDataHeader reads the export data header and format from r.
+// It returns the number of bytes read, or an error if the format is no longer
+// supported or it failed to read.
+//
+// The only currently supported format is binary export data in the
+// unified export format.
+func ReadExportDataHeader(r *bufio.Reader) (n int, err error) {
+	// Read export data header.
+	line, err := r.ReadSlice('\n')
+	if err != nil {
 		return
 	}
 
-	// Skip over object header to export data.
-	// Begins after first line starting with $$.
-	for line[0] != '$' {
-		if line, err = r.ReadSlice('\n'); err != nil {
-			err = fmt.Errorf("can't find export data (%v)", err)
+	hdr := string(line)
+	switch hdr {
+	case "$$\n":
+		err = fmt.Errorf("old textual export format no longer supported (recompile package)")
+		return
+
+	case "$$B\n":
+		var format byte
+		format, err = r.ReadByte()
+		if err != nil {
 			return
 		}
-		size -= int64(len(line))
-	}
-	hdr = string(line)
-	if size < 0 {
-		size = -1
+		// The unified export format starts with a 'u'.
+		switch format {
+		case 'u':
+		default:
+			// Older no longer supported export formats include:
+			// indexed export format which started with an 'i'; and
+			// the older binary export format which started with a 'c',
+			// 'd', or 'v' (from "version").
+			err = fmt.Errorf("binary export format %q is no longer supported (recompile package)", format)
+			return
+		}
+
+	default:
+		err = fmt.Errorf("unknown export data header: %q", hdr)
+		return
 	}
 
+	n = len(hdr) + 1 // + 1 is for 'u'
 	return
 }
+
+// FindPkg returns the filename and unique package id for an import
+// path based on package information provided by build.Import (using
+// the build.Default build.Context). A relative srcDir is interpreted
+// relative to the current working directory.
+//
+// FindPkg is only used in tests within x/tools.
+func FindPkg(path, srcDir string) (filename, id string, err error) {
+	// TODO(taking): Move internal/exportdata.FindPkg into its own file,
+	// and then this copy into a _test package.
+	if path == "" {
+		return "", "", errors.New("path is empty")
+	}
+
+	var noext string
+	switch {
+	default:
+		// "x" -> "$GOPATH/pkg/$GOOS_$GOARCH/x.ext", "x"
+		// Don't require the source files to be present.
+		if abs, err := filepath.Abs(srcDir); err == nil { // see issue 14282
+			srcDir = abs
+		}
+		var bp *build.Package
+		bp, err = build.Import(path, srcDir, build.FindOnly|build.AllowBinary)
+		if bp.PkgObj == "" {
+			if bp.Goroot && bp.Dir != "" {
+				filename, err = lookupGorootExport(bp.Dir)
+				if err == nil {
+					_, err = os.Stat(filename)
+				}
+				if err == nil {
+					return filename, bp.ImportPath, nil
+				}
+			}
+			goto notfound
+		} else {
+			noext = strings.TrimSuffix(bp.PkgObj, ".a")
+		}
+		id = bp.ImportPath
+
+	case build.IsLocalImport(path):
+		// "./x" -> "/this/directory/x.ext", "/this/directory/x"
+		noext = filepath.Join(srcDir, path)
+		id = noext
+
+	case filepath.IsAbs(path):
+		// for completeness only - go/build.Import
+		// does not support absolute imports
+		// "/x" -> "/x.ext", "/x"
+		noext = path
+		id = path
+	}
+
+	if false { // for debugging
+		if path != id {
+			fmt.Printf("%s -> %s\n", path, id)
+		}
+	}
+
+	// try extensions
+	for _, ext := range pkgExts {
+		filename = noext + ext
+		f, statErr := os.Stat(filename)
+		if statErr == nil && !f.IsDir() {
+			return filename, id, nil
+		}
+		if err == nil {
+			err = statErr
+		}
+	}
+
+notfound:
+	if err == nil {
+		return "", path, fmt.Errorf("can't find import: %q", path)
+	}
+	return "", path, fmt.Errorf("can't find import: %q: %w", path, err)
+}
+
+var pkgExts = [...]string{".a", ".o"} // a file from the build cache will have no extension
+
+var exportMap sync.Map // package dir → func() (string, error)
+
+// lookupGorootExport returns the location of the export data
+// (normally found in the build cache, but located in GOROOT/pkg
+// in prior Go releases) for the package located in pkgDir.
+//
+// (We use the package's directory instead of its import path
+// mainly to simplify handling of the packages in src/vendor
+// and cmd/vendor.)
+//
+// lookupGorootExport is only used in tests within x/tools.
+func lookupGorootExport(pkgDir string) (string, error) {
+	f, ok := exportMap.Load(pkgDir)
+	if !ok {
+		var (
+			listOnce   sync.Once
+			exportPath string
+			err        error
+		)
+		f, _ = exportMap.LoadOrStore(pkgDir, func() (string, error) {
+			listOnce.Do(func() {
+				cmd := exec.Command(filepath.Join(build.Default.GOROOT, "bin", "go"), "list", "-export", "-f", "{{.Export}}", pkgDir)
+				cmd.Dir = build.Default.GOROOT
+				cmd.Env = append(os.Environ(), "PWD="+cmd.Dir, "GOROOT="+build.Default.GOROOT)
+				var output []byte
+				output, err = cmd.Output()
+				if err != nil {
+					if ee, ok := err.(*exec.ExitError); ok && len(ee.Stderr) > 0 {
+						err = errors.New(string(ee.Stderr))
+					}
+					return
+				}
+
+				exports := strings.Split(string(bytes.TrimSpace(output)), "\n")
+				if len(exports) != 1 {
+					err = fmt.Errorf("go list reported %d exports; expected 1", len(exports))
+					return
+				}
+
+				exportPath = exports[0]
+			})
+
+			return exportPath, err
+		})
+	}
+
+	return f.(func() (string, error))()
+}
diff --git a/vendor/golang.org/x/tools/internal/gcimporter/gcimporter.go b/vendor/golang.org/x/tools/internal/gcimporter/gcimporter.go
index 39df91124a..3dbd21d1b9 100644
--- a/vendor/golang.org/x/tools/internal/gcimporter/gcimporter.go
+++ b/vendor/golang.org/x/tools/internal/gcimporter/gcimporter.go
@@ -23,17 +23,11 @@ package gcimporter // import "golang.org/x/tools/internal/gcimporter"
 
 import (
 	"bufio"
-	"bytes"
 	"fmt"
-	"go/build"
 	"go/token"
 	"go/types"
 	"io"
 	"os"
-	"os/exec"
-	"path/filepath"
-	"strings"
-	"sync"
 )
 
 const (
@@ -45,125 +39,14 @@ const (
 	trace = false
 )
 
-var exportMap sync.Map // package dir → func() (string, bool)
-
-// lookupGorootExport returns the location of the export data
-// (normally found in the build cache, but located in GOROOT/pkg
-// in prior Go releases) for the package located in pkgDir.
-//
-// (We use the package's directory instead of its import path
-// mainly to simplify handling of the packages in src/vendor
-// and cmd/vendor.)
-func lookupGorootExport(pkgDir string) (string, bool) {
-	f, ok := exportMap.Load(pkgDir)
-	if !ok {
-		var (
-			listOnce   sync.Once
-			exportPath string
-		)
-		f, _ = exportMap.LoadOrStore(pkgDir, func() (string, bool) {
-			listOnce.Do(func() {
-				cmd := exec.Command("go", "list", "-export", "-f", "{{.Export}}", pkgDir)
-				cmd.Dir = build.Default.GOROOT
-				var output []byte
-				output, err := cmd.Output()
-				if err != nil {
-					return
-				}
-
-				exports := strings.Split(string(bytes.TrimSpace(output)), "\n")
-				if len(exports) != 1 {
-					return
-				}
-
-				exportPath = exports[0]
-			})
-
-			return exportPath, exportPath != ""
-		})
-	}
-
-	return f.(func() (string, bool))()
-}
-
-var pkgExts = [...]string{".a", ".o"}
-
-// FindPkg returns the filename and unique package id for an import
-// path based on package information provided by build.Import (using
-// the build.Default build.Context). A relative srcDir is interpreted
-// relative to the current working directory.
-// If no file was found, an empty filename is returned.
-func FindPkg(path, srcDir string) (filename, id string) {
-	if path == "" {
-		return
-	}
-
-	var noext string
-	switch {
-	default:
-		// "x" -> "$GOPATH/pkg/$GOOS_$GOARCH/x.ext", "x"
-		// Don't require the source files to be present.
-		if abs, err := filepath.Abs(srcDir); err == nil { // see issue 14282
-			srcDir = abs
-		}
-		bp, _ := build.Import(path, srcDir, build.FindOnly|build.AllowBinary)
-		if bp.PkgObj == "" {
-			var ok bool
-			if bp.Goroot && bp.Dir != "" {
-				filename, ok = lookupGorootExport(bp.Dir)
-			}
-			if !ok {
-				id = path // make sure we have an id to print in error message
-				return
-			}
-		} else {
-			noext = strings.TrimSuffix(bp.PkgObj, ".a")
-			id = bp.ImportPath
-		}
-
-	case build.IsLocalImport(path):
-		// "./x" -> "/this/directory/x.ext", "/this/directory/x"
-		noext = filepath.Join(srcDir, path)
-		id = noext
-
-	case filepath.IsAbs(path):
-		// for completeness only - go/build.Import
-		// does not support absolute imports
-		// "/x" -> "/x.ext", "/x"
-		noext = path
-		id = path
-	}
-
-	if false { // for debugging
-		if path != id {
-			fmt.Printf("%s -> %s\n", path, id)
-		}
-	}
-
-	if filename != "" {
-		if f, err := os.Stat(filename); err == nil && !f.IsDir() {
-			return
-		}
-	}
-
-	// try extensions
-	for _, ext := range pkgExts {
-		filename = noext + ext
-		if f, err := os.Stat(filename); err == nil && !f.IsDir() {
-			return
-		}
-	}
-
-	filename = "" // not found
-	return
-}
-
 // Import imports a gc-generated package given its import path and srcDir, adds
 // the corresponding package object to the packages map, and returns the object.
 // The packages map must contain all packages already imported.
-func Import(packages map[string]*types.Package, path, srcDir string, lookup func(path string) (io.ReadCloser, error)) (pkg *types.Package, err error) {
+//
+// Import is only used in tests.
+func Import(fset *token.FileSet, packages map[string]*types.Package, path, srcDir string, lookup func(path string) (io.ReadCloser, error)) (pkg *types.Package, err error) {
 	var rc io.ReadCloser
-	var filename, id string
+	var id string
 	if lookup != nil {
 		// With custom lookup specified, assume that caller has
 		// converted path to a canonical import path for use in the map.
@@ -182,12 +65,13 @@ func Import(packages map[string]*types.Package, path, srcDir string, lookup func
 		}
 		rc = f
 	} else {
-		filename, id = FindPkg(path, srcDir)
+		var filename string
+		filename, id, err = FindPkg(path, srcDir)
 		if filename == "" {
 			if path == "unsafe" {
 				return types.Unsafe, nil
 			}
-			return nil, fmt.Errorf("can't find import: %q", id)
+			return nil, err
 		}
 
 		// no need to re-import if the package was imported completely before
@@ -210,57 +94,15 @@ func Import(packages map[string]*types.Package, path, srcDir string, lookup func
 	}
 	defer rc.Close()
 
-	var hdr string
-	var size int64
 	buf := bufio.NewReader(rc)
-	if hdr, size, err = FindExportData(buf); err != nil {
+	data, err := ReadUnified(buf)
+	if err != nil {
+		err = fmt.Errorf("import %q: %v", path, err)
 		return
 	}
 
-	switch hdr {
-	case "$$B\n":
-		var data []byte
-		data, err = io.ReadAll(buf)
-		if err != nil {
-			break
-		}
-
-		// TODO(gri): allow clients of go/importer to provide a FileSet.
-		// Or, define a new standard go/types/gcexportdata package.
-		fset := token.NewFileSet()
-
-		// Select appropriate importer.
-		if len(data) > 0 {
-			switch data[0] {
-			case 'v', 'c', 'd': // binary, till go1.10
-				return nil, fmt.Errorf("binary (%c) import format is no longer supported", data[0])
-
-			case 'i': // indexed, till go1.19
-				_, pkg, err := IImportData(fset, packages, data[1:], id)
-				return pkg, err
-
-			case 'u': // unified, from go1.20
-				_, pkg, err := UImportData(fset, packages, data[1:size], id)
-				return pkg, err
-
-			default:
-				l := len(data)
-				if l > 10 {
-					l = 10
-				}
-				return nil, fmt.Errorf("unexpected export data with prefix %q for path %s", string(data[:l]), id)
-			}
-		}
-
-	default:
-		err = fmt.Errorf("unknown export data header: %q", hdr)
-	}
+	// unified: emitted by cmd/compile since go1.20.
+	_, pkg, err = UImportData(fset, packages, data, id)
 
 	return
 }
-
-type byPath []*types.Package
-
-func (a byPath) Len() int           { return len(a) }
-func (a byPath) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
-func (a byPath) Less(i, j int) bool { return a[i].Path() < a[j].Path() }
diff --git a/vendor/golang.org/x/tools/internal/gcimporter/iexport.go b/vendor/golang.org/x/tools/internal/gcimporter/iexport.go
index 5f283281a2..7dfc31a37d 100644
--- a/vendor/golang.org/x/tools/internal/gcimporter/iexport.go
+++ b/vendor/golang.org/x/tools/internal/gcimporter/iexport.go
@@ -242,11 +242,30 @@ import (
 
 	"golang.org/x/tools/go/types/objectpath"
 	"golang.org/x/tools/internal/aliases"
-	"golang.org/x/tools/internal/tokeninternal"
 )
 
 // IExportShallow encodes "shallow" export data for the specified package.
 //
+// For types, we use "shallow" export data. Historically, the Go
+// compiler always produced a summary of the types for a given package
+// that included types from other packages that it indirectly
+// referenced: "deep" export data. This had the advantage that the
+// compiler (and analogous tools such as gopls) need only load one
+// file per direct import.  However, it meant that the files tended to
+// get larger based on the level of the package in the import
+// graph. For example, higher-level packages in the kubernetes module
+// have over 1MB of "deep" export data, even when they have almost no
+// content of their own, merely because they mention a major type that
+// references many others. In pathological cases the export data was
+// 300x larger than the source for a package due to this quadratic
+// growth.
+//
+// "Shallow" export data means that the serialized types describe only
+// a single package. If those types mention types from other packages,
+// the type checker may need to request additional packages beyond
+// just the direct imports. Type information for the entire transitive
+// closure of imports is provided (lazily) by the DAG.
+//
 // No promises are made about the encoding other than that it can be decoded by
 // the same version of IIExportShallow. If you plan to save export data in the
 // file system, be sure to include a cryptographic digest of the executable in
@@ -269,8 +288,8 @@ func IExportShallow(fset *token.FileSet, pkg *types.Package, reportf ReportFunc)
 }
 
 // IImportShallow decodes "shallow" types.Package data encoded by
-// IExportShallow in the same executable. This function cannot import data from
-// cmd/compile or gcexportdata.Write.
+// [IExportShallow] in the same executable. This function cannot import data
+// from cmd/compile or gcexportdata.Write.
 //
 // The importer calls getPackages to obtain package symbols for all
 // packages mentioned in the export data, including the one being
@@ -441,7 +460,7 @@ func (p *iexporter) encodeFile(w *intWriter, file *token.File, needed []uint64)
 	// Sort the set of needed offsets. Duplicates are harmless.
 	sort.Slice(needed, func(i, j int) bool { return needed[i] < needed[j] })
 
-	lines := tokeninternal.GetLines(file) // byte offset of each line start
+	lines := file.Lines() // byte offset of each line start
 	w.uint64(uint64(len(lines)))
 
 	// Rather than record the entire array of line start offsets,
@@ -725,13 +744,13 @@ func (p *iexporter) doDecl(obj types.Object) {
 	case *types.TypeName:
 		t := obj.Type()
 
-		if tparam, ok := aliases.Unalias(t).(*types.TypeParam); ok {
+		if tparam, ok := types.Unalias(t).(*types.TypeParam); ok {
 			w.tag(typeParamTag)
 			w.pos(obj.Pos())
 			constraint := tparam.Constraint()
 			if p.version >= iexportVersionGo1_18 {
 				implicit := false
-				if iface, _ := aliases.Unalias(constraint).(*types.Interface); iface != nil {
+				if iface, _ := types.Unalias(constraint).(*types.Interface); iface != nil {
 					implicit = iface.IsImplicit()
 				}
 				w.bool(implicit)
@@ -741,7 +760,7 @@ func (p *iexporter) doDecl(obj types.Object) {
 		}
 
 		if obj.IsAlias() {
-			alias, materialized := t.(*aliases.Alias) // may fail when aliases are not enabled
+			alias, materialized := t.(*types.Alias) // may fail when aliases are not enabled
 
 			var tparams *types.TypeParamList
 			if materialized {
@@ -975,7 +994,7 @@ func (w *exportWriter) doTyp(t types.Type, pkg *types.Package) {
 		}()
 	}
 	switch t := t.(type) {
-	case *aliases.Alias:
+	case *types.Alias:
 		if targs := aliases.TypeArgs(t); targs.Len() > 0 {
 			w.startType(instanceType)
 			w.pos(t.Obj().Pos())
@@ -1091,7 +1110,7 @@ func (w *exportWriter) doTyp(t types.Type, pkg *types.Package) {
 		for i := 0; i < n; i++ {
 			ft := t.EmbeddedType(i)
 			tPkg := pkg
-			if named, _ := aliases.Unalias(ft).(*types.Named); named != nil {
+			if named, _ := types.Unalias(ft).(*types.Named); named != nil {
 				w.pos(named.Obj().Pos())
 			} else {
 				w.pos(token.NoPos)
diff --git a/vendor/golang.org/x/tools/internal/gcimporter/iimport.go b/vendor/golang.org/x/tools/internal/gcimporter/iimport.go
index ed2d562959..69b1d697cb 100644
--- a/vendor/golang.org/x/tools/internal/gcimporter/iimport.go
+++ b/vendor/golang.org/x/tools/internal/gcimporter/iimport.go
@@ -5,8 +5,6 @@
 // Indexed package import.
 // See iexport.go for the export data format.
 
-// This file is a copy of $GOROOT/src/go/internal/gcimporter/iimport.go.
-
 package gcimporter
 
 import (
@@ -53,6 +51,7 @@ const (
 	iexportVersionPosCol   = 1
 	iexportVersionGo1_18   = 2
 	iexportVersionGenerics = 2
+	iexportVersion         = iexportVersionGenerics
 
 	iexportVersionCurrent = 2
 )
@@ -540,7 +539,7 @@ func canReuse(def *types.Named, rhs types.Type) bool {
 	if def == nil {
 		return true
 	}
-	iface, _ := aliases.Unalias(rhs).(*types.Interface)
+	iface, _ := types.Unalias(rhs).(*types.Interface)
 	if iface == nil {
 		return true
 	}
@@ -557,6 +556,14 @@ type importReader struct {
 	prevColumn int64
 }
 
+// markBlack is redefined in iimport_go123.go, to work around golang/go#69912.
+//
+// If TypeNames are not marked black (in the sense of go/types cycle
+// detection), they may be mutated when dot-imported. Fix this by punching a
+// hole through the type, when compiling with Go 1.23. (The bug has been fixed
+// for 1.24, but the fix was not worth back-porting).
+var markBlack = func(name *types.TypeName) {}
+
 func (r *importReader) obj(name string) {
 	tag := r.byte()
 	pos := r.pos()
@@ -569,6 +576,7 @@ func (r *importReader) obj(name string) {
 		}
 		typ := r.typ()
 		obj := aliases.NewAlias(r.p.aliases, pos, r.currPkg, name, typ, tparams)
+		markBlack(obj) // workaround for golang/go#69912
 		r.declare(obj)
 
 	case constTag:
@@ -589,6 +597,9 @@ func (r *importReader) obj(name string) {
 		// declaration before recursing.
 		obj := types.NewTypeName(pos, r.currPkg, name, nil)
 		named := types.NewNamed(obj, nil, nil)
+
+		markBlack(obj) // workaround for golang/go#69912
+
 		// Declare obj before calling r.tparamList, so the new type name is recognized
 		// if used in the constraint of one of its own typeparams (see #48280).
 		r.declare(obj)
@@ -615,7 +626,7 @@ func (r *importReader) obj(name string) {
 				if targs.Len() > 0 {
 					rparams = make([]*types.TypeParam, targs.Len())
 					for i := range rparams {
-						rparams[i] = aliases.Unalias(targs.At(i)).(*types.TypeParam)
+						rparams[i] = types.Unalias(targs.At(i)).(*types.TypeParam)
 					}
 				}
 				msig := r.signature(recv, rparams, nil)
@@ -645,7 +656,7 @@ func (r *importReader) obj(name string) {
 		}
 		constraint := r.typ()
 		if implicit {
-			iface, _ := aliases.Unalias(constraint).(*types.Interface)
+			iface, _ := types.Unalias(constraint).(*types.Interface)
 			if iface == nil {
 				errorf("non-interface constraint marked implicit")
 			}
@@ -852,7 +863,7 @@ func (r *importReader) typ() types.Type {
 }
 
 func isInterface(t types.Type) bool {
-	_, ok := aliases.Unalias(t).(*types.Interface)
+	_, ok := types.Unalias(t).(*types.Interface)
 	return ok
 }
 
@@ -959,7 +970,7 @@ func (r *importReader) doType(base *types.Named) (res types.Type) {
 			methods[i] = method
 		}
 
-		typ := newInterface(methods, embeddeds)
+		typ := types.NewInterfaceType(methods, embeddeds)
 		r.p.interfaceList = append(r.p.interfaceList, typ)
 		return typ
 
@@ -1051,7 +1062,7 @@ func (r *importReader) tparamList() []*types.TypeParam {
 	for i := range xs {
 		// Note: the standard library importer is tolerant of nil types here,
 		// though would panic in SetTypeParams.
-		xs[i] = aliases.Unalias(r.typ()).(*types.TypeParam)
+		xs[i] = types.Unalias(r.typ()).(*types.TypeParam)
 	}
 	return xs
 }
@@ -1098,3 +1109,9 @@ func (r *importReader) byte() byte {
 	}
 	return x
 }
+
+type byPath []*types.Package
+
+func (a byPath) Len() int           { return len(a) }
+func (a byPath) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
+func (a byPath) Less(i, j int) bool { return a[i].Path() < a[j].Path() }
diff --git a/vendor/golang.org/x/tools/internal/gcimporter/iimport_go122.go b/vendor/golang.org/x/tools/internal/gcimporter/iimport_go122.go
new file mode 100644
index 0000000000..7586bfaca6
--- /dev/null
+++ b/vendor/golang.org/x/tools/internal/gcimporter/iimport_go122.go
@@ -0,0 +1,53 @@
+// Copyright 2024 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 go1.22 && !go1.24
+
+package gcimporter
+
+import (
+	"go/token"
+	"go/types"
+	"unsafe"
+)
+
+// TODO(rfindley): delete this workaround once go1.24 is assured.
+
+func init() {
+	// Update markBlack so that it correctly sets the color
+	// of imported TypeNames.
+	//
+	// See the doc comment for markBlack for details.
+
+	type color uint32
+	const (
+		white color = iota
+		black
+		grey
+	)
+	type object struct {
+		_      *types.Scope
+		_      token.Pos
+		_      *types.Package
+		_      string
+		_      types.Type
+		_      uint32
+		color_ color
+		_      token.Pos
+	}
+	type typeName struct {
+		object
+	}
+
+	// If the size of types.TypeName changes, this will fail to compile.
+	const delta = int64(unsafe.Sizeof(typeName{})) - int64(unsafe.Sizeof(types.TypeName{}))
+	var _ [-delta * delta]int
+
+	markBlack = func(obj *types.TypeName) {
+		type uP = unsafe.Pointer
+		var ptr *typeName
+		*(*uP)(uP(&ptr)) = uP(obj)
+		ptr.color_ = black
+	}
+}
diff --git a/vendor/golang.org/x/tools/internal/gcimporter/newInterface10.go b/vendor/golang.org/x/tools/internal/gcimporter/newInterface10.go
deleted file mode 100644
index 8b163e3d05..0000000000
--- a/vendor/golang.org/x/tools/internal/gcimporter/newInterface10.go
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2018 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 !go1.11
-// +build !go1.11
-
-package gcimporter
-
-import "go/types"
-
-func newInterface(methods []*types.Func, embeddeds []types.Type) *types.Interface {
-	named := make([]*types.Named, len(embeddeds))
-	for i, e := range embeddeds {
-		var ok bool
-		named[i], ok = e.(*types.Named)
-		if !ok {
-			panic("embedding of non-defined interfaces in interfaces is not supported before Go 1.11")
-		}
-	}
-	return types.NewInterface(methods, named)
-}
diff --git a/vendor/golang.org/x/tools/internal/gcimporter/newInterface11.go b/vendor/golang.org/x/tools/internal/gcimporter/newInterface11.go
deleted file mode 100644
index 49984f40fd..0000000000
--- a/vendor/golang.org/x/tools/internal/gcimporter/newInterface11.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2018 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 go1.11
-// +build go1.11
-
-package gcimporter
-
-import "go/types"
-
-func newInterface(methods []*types.Func, embeddeds []types.Type) *types.Interface {
-	return types.NewInterfaceType(methods, embeddeds)
-}
diff --git a/vendor/golang.org/x/tools/internal/gcimporter/predeclared.go b/vendor/golang.org/x/tools/internal/gcimporter/predeclared.go
new file mode 100644
index 0000000000..907c8557a5
--- /dev/null
+++ b/vendor/golang.org/x/tools/internal/gcimporter/predeclared.go
@@ -0,0 +1,91 @@
+// Copyright 2024 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 gcimporter
+
+import (
+	"go/types"
+	"sync"
+)
+
+// predecl is a cache for the predeclared types in types.Universe.
+//
+// Cache a distinct result based on the runtime value of any.
+// The pointer value of the any type varies based on GODEBUG settings.
+var predeclMu sync.Mutex
+var predecl map[types.Type][]types.Type
+
+func predeclared() []types.Type {
+	anyt := types.Universe.Lookup("any").Type()
+
+	predeclMu.Lock()
+	defer predeclMu.Unlock()
+
+	if pre, ok := predecl[anyt]; ok {
+		return pre
+	}
+
+	if predecl == nil {
+		predecl = make(map[types.Type][]types.Type)
+	}
+
+	decls := []types.Type{ // basic types
+		types.Typ[types.Bool],
+		types.Typ[types.Int],
+		types.Typ[types.Int8],
+		types.Typ[types.Int16],
+		types.Typ[types.Int32],
+		types.Typ[types.Int64],
+		types.Typ[types.Uint],
+		types.Typ[types.Uint8],
+		types.Typ[types.Uint16],
+		types.Typ[types.Uint32],
+		types.Typ[types.Uint64],
+		types.Typ[types.Uintptr],
+		types.Typ[types.Float32],
+		types.Typ[types.Float64],
+		types.Typ[types.Complex64],
+		types.Typ[types.Complex128],
+		types.Typ[types.String],
+
+		// basic type aliases
+		types.Universe.Lookup("byte").Type(),
+		types.Universe.Lookup("rune").Type(),
+
+		// error
+		types.Universe.Lookup("error").Type(),
+
+		// untyped types
+		types.Typ[types.UntypedBool],
+		types.Typ[types.UntypedInt],
+		types.Typ[types.UntypedRune],
+		types.Typ[types.UntypedFloat],
+		types.Typ[types.UntypedComplex],
+		types.Typ[types.UntypedString],
+		types.Typ[types.UntypedNil],
+
+		// package unsafe
+		types.Typ[types.UnsafePointer],
+
+		// invalid type
+		types.Typ[types.Invalid], // only appears in packages with errors
+
+		// used internally by gc; never used by this package or in .a files
+		anyType{},
+
+		// comparable
+		types.Universe.Lookup("comparable").Type(),
+
+		// any
+		anyt,
+	}
+
+	predecl[anyt] = decls
+	return decls
+}
+
+type anyType struct{}
+
+func (t anyType) Underlying() types.Type { return t }
+func (t anyType) String() string         { return "any" }
diff --git a/vendor/golang.org/x/tools/internal/gcimporter/support.go b/vendor/golang.org/x/tools/internal/gcimporter/support.go
new file mode 100644
index 0000000000..4af810dc41
--- /dev/null
+++ b/vendor/golang.org/x/tools/internal/gcimporter/support.go
@@ -0,0 +1,30 @@
+// Copyright 2024 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 gcimporter
+
+import (
+	"bufio"
+	"io"
+	"strconv"
+	"strings"
+)
+
+// Copy of $GOROOT/src/cmd/internal/archive.ReadHeader.
+func readArchiveHeader(b *bufio.Reader, name string) int {
+	// architecture-independent object file output
+	const HeaderSize = 60
+
+	var buf [HeaderSize]byte
+	if _, err := io.ReadFull(b, buf[:]); err != nil {
+		return -1
+	}
+	aname := strings.Trim(string(buf[0:16]), " ")
+	if !strings.HasPrefix(aname, name) {
+		return -1
+	}
+	asize := strings.Trim(string(buf[48:58]), " ")
+	i, _ := strconv.Atoi(asize)
+	return i
+}
diff --git a/vendor/golang.org/x/tools/internal/gcimporter/support_go118.go b/vendor/golang.org/x/tools/internal/gcimporter/support_go118.go
deleted file mode 100644
index 0cd3b91b65..0000000000
--- a/vendor/golang.org/x/tools/internal/gcimporter/support_go118.go
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2021 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 gcimporter
-
-import "go/types"
-
-const iexportVersion = iexportVersionGenerics
-
-// additionalPredeclared returns additional predeclared types in go.1.18.
-func additionalPredeclared() []types.Type {
-	return []types.Type{
-		// comparable
-		types.Universe.Lookup("comparable").Type(),
-
-		// any
-		types.Universe.Lookup("any").Type(),
-	}
-}
-
-// See cmd/compile/internal/types.SplitVargenSuffix.
-func splitVargenSuffix(name string) (base, suffix string) {
-	i := len(name)
-	for i > 0 && name[i-1] >= '0' && name[i-1] <= '9' {
-		i--
-	}
-	const dot = "·"
-	if i >= len(dot) && name[i-len(dot):i] == dot {
-		i -= len(dot)
-		return name[:i], name[i:]
-	}
-	return name, ""
-}
diff --git a/vendor/golang.org/x/tools/internal/gcimporter/unified_no.go b/vendor/golang.org/x/tools/internal/gcimporter/unified_no.go
deleted file mode 100644
index 38b624cada..0000000000
--- a/vendor/golang.org/x/tools/internal/gcimporter/unified_no.go
+++ /dev/null
@@ -1,10 +0,0 @@
-// 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 !goexperiment.unified
-// +build !goexperiment.unified
-
-package gcimporter
-
-const unifiedIR = false
diff --git a/vendor/golang.org/x/tools/internal/gcimporter/unified_yes.go b/vendor/golang.org/x/tools/internal/gcimporter/unified_yes.go
deleted file mode 100644
index b5118d0b3a..0000000000
--- a/vendor/golang.org/x/tools/internal/gcimporter/unified_yes.go
+++ /dev/null
@@ -1,10 +0,0 @@
-// 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 goexperiment.unified
-// +build goexperiment.unified
-
-package gcimporter
-
-const unifiedIR = true
diff --git a/vendor/golang.org/x/tools/internal/gcimporter/ureader_yes.go b/vendor/golang.org/x/tools/internal/gcimporter/ureader_yes.go
index f0742f5404..6cdab448ec 100644
--- a/vendor/golang.org/x/tools/internal/gcimporter/ureader_yes.go
+++ b/vendor/golang.org/x/tools/internal/gcimporter/ureader_yes.go
@@ -11,7 +11,6 @@ import (
 	"go/token"
 	"go/types"
 	"sort"
-	"strings"
 
 	"golang.org/x/tools/internal/aliases"
 	"golang.org/x/tools/internal/pkgbits"
@@ -71,7 +70,6 @@ func UImportData(fset *token.FileSet, imports map[string]*types.Package, data []
 	}
 
 	s := string(data)
-	s = s[:strings.LastIndex(s, "\n$$\n")]
 	input := pkgbits.NewPkgDecoder(path, s)
 	pkg = readUnifiedPackage(fset, nil, imports, input)
 	return
@@ -266,7 +264,12 @@ func (pr *pkgReader) pkgIdx(idx pkgbits.Index) *types.Package {
 func (r *reader) doPkg() *types.Package {
 	path := r.String()
 	switch path {
-	case "":
+	// cmd/compile emits path="main" for main packages because
+	// that's the linker symbol prefix it used; but we need
+	// the package's path as it would be reported by go list,
+	// hence "main" below.
+	// See test at go/packages.TestMainPackagePathInModeTypes.
+	case "", "main":
 		path = r.p.PkgPath()
 	case "builtin":
 		return nil // universe
@@ -562,7 +565,7 @@ func (pr *pkgReader) objIdx(idx pkgbits.Index) (*types.Package, string) {
 				// If the underlying type is an interface, we need to
 				// duplicate its methods so we can replace the receiver
 				// parameter's type (#49906).
-				if iface, ok := aliases.Unalias(underlying).(*types.Interface); ok && iface.NumExplicitMethods() != 0 {
+				if iface, ok := types.Unalias(underlying).(*types.Interface); ok && iface.NumExplicitMethods() != 0 {
 					methods := make([]*types.Func, iface.NumExplicitMethods())
 					for i := range methods {
 						fn := iface.ExplicitMethod(i)
@@ -738,3 +741,17 @@ func pkgScope(pkg *types.Package) *types.Scope {
 	}
 	return types.Universe
 }
+
+// See cmd/compile/internal/types.SplitVargenSuffix.
+func splitVargenSuffix(name string) (base, suffix string) {
+	i := len(name)
+	for i > 0 && name[i-1] >= '0' && name[i-1] <= '9' {
+		i--
+	}
+	const dot = "·"
+	if i >= len(dot) && name[i-len(dot):i] == dot {
+		i -= len(dot)
+		return name[:i], name[i:]
+	}
+	return name, ""
+}
diff --git a/vendor/golang.org/x/tools/internal/gocommand/invoke.go b/vendor/golang.org/x/tools/internal/gocommand/invoke.go
index 2e59ff8558..e333efc87f 100644
--- a/vendor/golang.org/x/tools/internal/gocommand/invoke.go
+++ b/vendor/golang.org/x/tools/internal/gocommand/invoke.go
@@ -16,7 +16,6 @@ import (
 	"os"
 	"os/exec"
 	"path/filepath"
-	"reflect"
 	"regexp"
 	"runtime"
 	"strconv"
@@ -250,16 +249,13 @@ func (i *Invocation) run(ctx context.Context, stdout, stderr io.Writer) error {
 	cmd.Stdout = stdout
 	cmd.Stderr = stderr
 
-	// cmd.WaitDelay was added only in go1.20 (see #50436).
-	if waitDelay := reflect.ValueOf(cmd).Elem().FieldByName("WaitDelay"); waitDelay.IsValid() {
-		// https://go.dev/issue/59541: don't wait forever copying stderr
-		// after the command has exited.
-		// After CL 484741 we copy stdout manually, so we we'll stop reading that as
-		// soon as ctx is done. However, we also don't want to wait around forever
-		// for stderr. Give a much-longer-than-reasonable delay and then assume that
-		// something has wedged in the kernel or runtime.
-		waitDelay.Set(reflect.ValueOf(30 * time.Second))
-	}
+	// https://go.dev/issue/59541: don't wait forever copying stderr
+	// after the command has exited.
+	// After CL 484741 we copy stdout manually, so we we'll stop reading that as
+	// soon as ctx is done. However, we also don't want to wait around forever
+	// for stderr. Give a much-longer-than-reasonable delay and then assume that
+	// something has wedged in the kernel or runtime.
+	cmd.WaitDelay = 30 * time.Second
 
 	// The cwd gets resolved to the real path. On Darwin, where
 	// /tmp is a symlink, this breaks anything that expects the
diff --git a/vendor/golang.org/x/tools/internal/imports/fix.go b/vendor/golang.org/x/tools/internal/imports/fix.go
index dc7d50a7a4..5ae576977a 100644
--- a/vendor/golang.org/x/tools/internal/imports/fix.go
+++ b/vendor/golang.org/x/tools/internal/imports/fix.go
@@ -27,7 +27,6 @@ import (
 	"unicode"
 	"unicode/utf8"
 
-	"golang.org/x/sync/errgroup"
 	"golang.org/x/tools/go/ast/astutil"
 	"golang.org/x/tools/internal/event"
 	"golang.org/x/tools/internal/gocommand"
@@ -91,18 +90,6 @@ type ImportFix struct {
 	Relevance float64 // see pkg
 }
 
-// An ImportInfo represents a single import statement.
-type ImportInfo struct {
-	ImportPath string // import path, e.g. "crypto/rand".
-	Name       string // import name, e.g. "crand", or "" if none.
-}
-
-// A packageInfo represents what's known about a package.
-type packageInfo struct {
-	name    string          // real package name, if known.
-	exports map[string]bool // known exports.
-}
-
 // parseOtherFiles parses all the Go files in srcDir except filename, including
 // test files if filename looks like a test.
 //
@@ -131,7 +118,7 @@ func parseOtherFiles(ctx context.Context, fset *token.FileSet, srcDir, filename
 			continue
 		}
 
-		f, err := parser.ParseFile(fset, filepath.Join(srcDir, fi.Name()), nil, 0)
+		f, err := parser.ParseFile(fset, filepath.Join(srcDir, fi.Name()), nil, parser.SkipObjectResolution)
 		if err != nil {
 			continue
 		}
@@ -162,8 +149,8 @@ func addGlobals(f *ast.File, globals map[string]bool) {
 
 // collectReferences builds a map of selector expressions, from
 // left hand side (X) to a set of right hand sides (Sel).
-func collectReferences(f *ast.File) references {
-	refs := references{}
+func collectReferences(f *ast.File) References {
+	refs := References{}
 
 	var visitor visitFn
 	visitor = func(node ast.Node) ast.Visitor {
@@ -233,7 +220,7 @@ func (p *pass) findMissingImport(pkg string, syms map[string]bool) *ImportInfo {
 
 		allFound := true
 		for right := range syms {
-			if !pkgInfo.exports[right] {
+			if !pkgInfo.Exports[right] {
 				allFound = false
 				break
 			}
@@ -246,11 +233,6 @@ func (p *pass) findMissingImport(pkg string, syms map[string]bool) *ImportInfo {
 	return nil
 }
 
-// references is set of references found in a Go file. The first map key is the
-// left hand side of a selector expression, the second key is the right hand
-// side, and the value should always be true.
-type references map[string]map[string]bool
-
 // A pass contains all the inputs and state necessary to fix a file's imports.
 // It can be modified in some ways during use; see comments below.
 type pass struct {
@@ -258,27 +240,29 @@ type pass struct {
 	fset                 *token.FileSet // fset used to parse f and its siblings.
 	f                    *ast.File      // the file being fixed.
 	srcDir               string         // the directory containing f.
-	env                  *ProcessEnv    // the environment to use for go commands, etc.
-	loadRealPackageNames bool           // if true, load package names from disk rather than guessing them.
-	otherFiles           []*ast.File    // sibling files.
+	logf                 func(string, ...any)
+	source               Source      // the environment to use for go commands, etc.
+	loadRealPackageNames bool        // if true, load package names from disk rather than guessing them.
+	otherFiles           []*ast.File // sibling files.
+	goroot               string
 
 	// Intermediate state, generated by load.
 	existingImports map[string][]*ImportInfo
-	allRefs         references
-	missingRefs     references
+	allRefs         References
+	missingRefs     References
 
 	// Inputs to fix. These can be augmented between successive fix calls.
 	lastTry       bool                    // indicates that this is the last call and fix should clean up as best it can.
 	candidates    []*ImportInfo           // candidate imports in priority order.
-	knownPackages map[string]*packageInfo // information about all known packages.
+	knownPackages map[string]*PackageInfo // information about all known packages.
 }
 
 // loadPackageNames saves the package names for everything referenced by imports.
-func (p *pass) loadPackageNames(imports []*ImportInfo) error {
-	if p.env.Logf != nil {
-		p.env.Logf("loading package names for %v packages", len(imports))
+func (p *pass) loadPackageNames(ctx context.Context, imports []*ImportInfo) error {
+	if p.logf != nil {
+		p.logf("loading package names for %v packages", len(imports))
 		defer func() {
-			p.env.Logf("done loading package names for %v packages", len(imports))
+			p.logf("done loading package names for %v packages", len(imports))
 		}()
 	}
 	var unknown []string
@@ -289,20 +273,17 @@ func (p *pass) loadPackageNames(imports []*ImportInfo) error {
 		unknown = append(unknown, imp.ImportPath)
 	}
 
-	resolver, err := p.env.GetResolver()
-	if err != nil {
-		return err
-	}
-
-	names, err := resolver.loadPackageNames(unknown, p.srcDir)
+	names, err := p.source.LoadPackageNames(ctx, p.srcDir, unknown)
 	if err != nil {
 		return err
 	}
 
+	// TODO(rfindley): revisit this. Why do we need to store known packages with
+	// no exports? The inconsistent data is confusing.
 	for path, name := range names {
-		p.knownPackages[path] = &packageInfo{
-			name:    name,
-			exports: map[string]bool{},
+		p.knownPackages[path] = &PackageInfo{
+			Name:    name,
+			Exports: map[string]bool{},
 		}
 	}
 	return nil
@@ -330,8 +311,8 @@ func (p *pass) importIdentifier(imp *ImportInfo) string {
 		return imp.Name
 	}
 	known := p.knownPackages[imp.ImportPath]
-	if known != nil && known.name != "" {
-		return withoutVersion(known.name)
+	if known != nil && known.Name != "" {
+		return withoutVersion(known.Name)
 	}
 	return ImportPathToAssumedName(imp.ImportPath)
 }
@@ -339,9 +320,9 @@ func (p *pass) importIdentifier(imp *ImportInfo) string {
 // load reads in everything necessary to run a pass, and reports whether the
 // file already has all the imports it needs. It fills in p.missingRefs with the
 // file's missing symbols, if any, or removes unused imports if not.
-func (p *pass) load() ([]*ImportFix, bool) {
-	p.knownPackages = map[string]*packageInfo{}
-	p.missingRefs = references{}
+func (p *pass) load(ctx context.Context) ([]*ImportFix, bool) {
+	p.knownPackages = map[string]*PackageInfo{}
+	p.missingRefs = References{}
 	p.existingImports = map[string][]*ImportInfo{}
 
 	// Load basic information about the file in question.
@@ -364,9 +345,11 @@ func (p *pass) load() ([]*ImportFix, bool) {
 	// f's imports by the identifier they introduce.
 	imports := collectImports(p.f)
 	if p.loadRealPackageNames {
-		err := p.loadPackageNames(append(imports, p.candidates...))
+		err := p.loadPackageNames(ctx, append(imports, p.candidates...))
 		if err != nil {
-			p.env.logf("loading package names: %v", err)
+			if p.logf != nil {
+				p.logf("loading package names: %v", err)
+			}
 			return nil, false
 		}
 	}
@@ -535,9 +518,10 @@ func (p *pass) assumeSiblingImportsValid() {
 					// We have the stdlib in memory; no need to guess.
 					rights = symbolNameSet(m)
 				}
-				p.addCandidate(imp, &packageInfo{
+				// TODO(rfindley): we should set package name here, for consistency.
+				p.addCandidate(imp, &PackageInfo{
 					// no name; we already know it.
-					exports: rights,
+					Exports: rights,
 				})
 			}
 		}
@@ -546,14 +530,14 @@ func (p *pass) assumeSiblingImportsValid() {
 
 // addCandidate adds a candidate import to p, and merges in the information
 // in pkg.
-func (p *pass) addCandidate(imp *ImportInfo, pkg *packageInfo) {
+func (p *pass) addCandidate(imp *ImportInfo, pkg *PackageInfo) {
 	p.candidates = append(p.candidates, imp)
 	if existing, ok := p.knownPackages[imp.ImportPath]; ok {
-		if existing.name == "" {
-			existing.name = pkg.name
+		if existing.Name == "" {
+			existing.Name = pkg.Name
 		}
-		for export := range pkg.exports {
-			existing.exports[export] = true
+		for export := range pkg.Exports {
+			existing.Exports[export] = true
 		}
 	} else {
 		p.knownPackages[imp.ImportPath] = pkg
@@ -581,19 +565,42 @@ func fixImportsDefault(fset *token.FileSet, f *ast.File, filename string, env *P
 // getFixes gets the import fixes that need to be made to f in order to fix the imports.
 // It does not modify the ast.
 func getFixes(ctx context.Context, fset *token.FileSet, f *ast.File, filename string, env *ProcessEnv) ([]*ImportFix, error) {
+	source, err := NewProcessEnvSource(env, filename, f.Name.Name)
+	if err != nil {
+		return nil, err
+	}
+	goEnv, err := env.goEnv()
+	if err != nil {
+		return nil, err
+	}
+	return getFixesWithSource(ctx, fset, f, filename, goEnv["GOROOT"], env.logf, source)
+}
+
+func getFixesWithSource(ctx context.Context, fset *token.FileSet, f *ast.File, filename string, goroot string, logf func(string, ...any), source Source) ([]*ImportFix, error) {
+	// This logic is defensively duplicated from getFixes.
 	abs, err := filepath.Abs(filename)
 	if err != nil {
 		return nil, err
 	}
 	srcDir := filepath.Dir(abs)
-	env.logf("fixImports(filename=%q), abs=%q, srcDir=%q ...", filename, abs, srcDir)
+
+	if logf != nil {
+		logf("fixImports(filename=%q), srcDir=%q ...", filename, abs, srcDir)
+	}
 
 	// First pass: looking only at f, and using the naive algorithm to
 	// derive package names from import paths, see if the file is already
 	// complete. We can't add any imports yet, because we don't know
 	// if missing references are actually package vars.
-	p := &pass{fset: fset, f: f, srcDir: srcDir, env: env}
-	if fixes, done := p.load(); done {
+	p := &pass{
+		fset:   fset,
+		f:      f,
+		srcDir: srcDir,
+		logf:   logf,
+		goroot: goroot,
+		source: source,
+	}
+	if fixes, done := p.load(ctx); done {
 		return fixes, nil
 	}
 
@@ -605,7 +612,7 @@ func getFixes(ctx context.Context, fset *token.FileSet, f *ast.File, filename st
 	// Second pass: add information from other files in the same package,
 	// like their package vars and imports.
 	p.otherFiles = otherFiles
-	if fixes, done := p.load(); done {
+	if fixes, done := p.load(ctx); done {
 		return fixes, nil
 	}
 
@@ -618,10 +625,17 @@ func getFixes(ctx context.Context, fset *token.FileSet, f *ast.File, filename st
 
 	// Third pass: get real package names where we had previously used
 	// the naive algorithm.
-	p = &pass{fset: fset, f: f, srcDir: srcDir, env: env}
+	p = &pass{
+		fset:   fset,
+		f:      f,
+		srcDir: srcDir,
+		logf:   logf,
+		goroot: goroot,
+		source: p.source, // safe to reuse, as it's just a wrapper around env
+	}
 	p.loadRealPackageNames = true
 	p.otherFiles = otherFiles
-	if fixes, done := p.load(); done {
+	if fixes, done := p.load(ctx); done {
 		return fixes, nil
 	}
 
@@ -835,7 +849,7 @@ func GetPackageExports(ctx context.Context, wrapped func(PackageExport), searchP
 			return true
 		},
 		dirFound: func(pkg *pkg) bool {
-			return pkgIsCandidate(filename, references{searchPkg: nil}, pkg)
+			return pkgIsCandidate(filename, References{searchPkg: nil}, pkg)
 		},
 		packageNameLoaded: func(pkg *pkg) bool {
 			return pkg.packageName == searchPkg
@@ -1086,11 +1100,7 @@ func (e *ProcessEnv) invokeGo(ctx context.Context, verb string, args ...string)
 	return e.GocmdRunner.Run(ctx, inv)
 }
 
-func addStdlibCandidates(pass *pass, refs references) error {
-	goenv, err := pass.env.goEnv()
-	if err != nil {
-		return err
-	}
+func addStdlibCandidates(pass *pass, refs References) error {
 	localbase := func(nm string) string {
 		ans := path.Base(nm)
 		if ans[0] == 'v' {
@@ -1105,13 +1115,13 @@ func addStdlibCandidates(pass *pass, refs references) error {
 	}
 	add := func(pkg string) {
 		// Prevent self-imports.
-		if path.Base(pkg) == pass.f.Name.Name && filepath.Join(goenv["GOROOT"], "src", pkg) == pass.srcDir {
+		if path.Base(pkg) == pass.f.Name.Name && filepath.Join(pass.goroot, "src", pkg) == pass.srcDir {
 			return
 		}
 		exports := symbolNameSet(stdlib.PackageSymbols[pkg])
 		pass.addCandidate(
 			&ImportInfo{ImportPath: pkg},
-			&packageInfo{name: localbase(pkg), exports: exports})
+			&PackageInfo{Name: localbase(pkg), Exports: exports})
 	}
 	for left := range refs {
 		if left == "rand" {
@@ -1175,91 +1185,14 @@ type scanCallback struct {
 	exportsLoaded func(pkg *pkg, exports []stdlib.Symbol)
 }
 
-func addExternalCandidates(ctx context.Context, pass *pass, refs references, filename string) error {
+func addExternalCandidates(ctx context.Context, pass *pass, refs References, filename string) error {
 	ctx, done := event.Start(ctx, "imports.addExternalCandidates")
 	defer done()
 
-	var mu sync.Mutex
-	found := make(map[string][]pkgDistance)
-	callback := &scanCallback{
-		rootFound: func(gopathwalk.Root) bool {
-			return true // We want everything.
-		},
-		dirFound: func(pkg *pkg) bool {
-			return pkgIsCandidate(filename, refs, pkg)
-		},
-		packageNameLoaded: func(pkg *pkg) bool {
-			if _, want := refs[pkg.packageName]; !want {
-				return false
-			}
-			if pkg.dir == pass.srcDir && pass.f.Name.Name == pkg.packageName {
-				// The candidate is in the same directory and has the
-				// same package name. Don't try to import ourselves.
-				return false
-			}
-			if !canUse(filename, pkg.dir) {
-				return false
-			}
-			mu.Lock()
-			defer mu.Unlock()
-			found[pkg.packageName] = append(found[pkg.packageName], pkgDistance{pkg, distance(pass.srcDir, pkg.dir)})
-			return false // We'll do our own loading after we sort.
-		},
-	}
-	resolver, err := pass.env.GetResolver()
+	results, err := pass.source.ResolveReferences(ctx, filename, refs)
 	if err != nil {
 		return err
 	}
-	if err = resolver.scan(ctx, callback); err != nil {
-		return err
-	}
-
-	// Search for imports matching potential package references.
-	type result struct {
-		imp *ImportInfo
-		pkg *packageInfo
-	}
-	results := make([]*result, len(refs))
-
-	g, ctx := errgroup.WithContext(ctx)
-
-	searcher := symbolSearcher{
-		logf:        pass.env.logf,
-		srcDir:      pass.srcDir,
-		xtest:       strings.HasSuffix(pass.f.Name.Name, "_test"),
-		loadExports: resolver.loadExports,
-	}
-
-	i := 0
-	for pkgName, symbols := range refs {
-		index := i // claim an index in results
-		i++
-		pkgName := pkgName
-		symbols := symbols
-
-		g.Go(func() error {
-			found, err := searcher.search(ctx, found[pkgName], pkgName, symbols)
-			if err != nil {
-				return err
-			}
-			if found == nil {
-				return nil // No matching package.
-			}
-
-			imp := &ImportInfo{
-				ImportPath: found.importPathShort,
-			}
-			pkg := &packageInfo{
-				name:    pkgName,
-				exports: symbols,
-			}
-			results[index] = &result{imp, pkg}
-			return nil
-		})
-	}
-	if err := g.Wait(); err != nil {
-		return err
-	}
 
 	for _, result := range results {
 		if result == nil {
@@ -1267,7 +1200,7 @@ func addExternalCandidates(ctx context.Context, pass *pass, refs references, fil
 		}
 		// Don't offer completions that would shadow predeclared
 		// names, such as github.com/coreos/etcd/error.
-		if types.Universe.Lookup(result.pkg.name) != nil { // predeclared
+		if types.Universe.Lookup(result.Package.Name) != nil { // predeclared
 			// Ideally we would skip this candidate only
 			// if the predeclared name is actually
 			// referenced by the file, but that's a lot
@@ -1276,7 +1209,7 @@ func addExternalCandidates(ctx context.Context, pass *pass, refs references, fil
 			// user before long.
 			continue
 		}
-		pass.addCandidate(result.imp, result.pkg)
+		pass.addCandidate(result.Import, result.Package)
 	}
 	return nil
 }
@@ -1620,6 +1553,7 @@ func loadExportsFromFiles(ctx context.Context, env *ProcessEnv, dir string, incl
 		}
 
 		fullFile := filepath.Join(dir, fi.Name())
+		// Legacy ast.Object resolution is needed here.
 		f, err := parser.ParseFile(fset, fullFile, nil, 0)
 		if err != nil {
 			env.logf("error parsing %v: %v", fullFile, err)
@@ -1800,7 +1734,7 @@ func (s *symbolSearcher) searchOne(ctx context.Context, c pkgDistance, symbols m
 // filename is the file being formatted.
 // pkgIdent is the package being searched for, like "client" (if
 // searching for "client.New")
-func pkgIsCandidate(filename string, refs references, pkg *pkg) bool {
+func pkgIsCandidate(filename string, refs References, pkg *pkg) bool {
 	// Check "internal" and "vendor" visibility:
 	if !canUse(filename, pkg.dir) {
 		return false
diff --git a/vendor/golang.org/x/tools/internal/imports/imports.go b/vendor/golang.org/x/tools/internal/imports/imports.go
index f83465520a..2215a12880 100644
--- a/vendor/golang.org/x/tools/internal/imports/imports.go
+++ b/vendor/golang.org/x/tools/internal/imports/imports.go
@@ -47,7 +47,14 @@ type Options struct {
 // Process implements golang.org/x/tools/imports.Process with explicit context in opt.Env.
 func Process(filename string, src []byte, opt *Options) (formatted []byte, err error) {
 	fileSet := token.NewFileSet()
-	file, adjust, err := parse(fileSet, filename, src, opt)
+	var parserMode parser.Mode
+	if opt.Comments {
+		parserMode |= parser.ParseComments
+	}
+	if opt.AllErrors {
+		parserMode |= parser.AllErrors
+	}
+	file, adjust, err := parse(fileSet, filename, src, parserMode, opt.Fragment)
 	if err != nil {
 		return nil, err
 	}
@@ -66,17 +73,19 @@ func Process(filename string, src []byte, opt *Options) (formatted []byte, err e
 //
 // Note that filename's directory influences which imports can be chosen,
 // so it is important that filename be accurate.
-func FixImports(ctx context.Context, filename string, src []byte, opt *Options) (fixes []*ImportFix, err error) {
+func FixImports(ctx context.Context, filename string, src []byte, goroot string, logf func(string, ...any), source Source) (fixes []*ImportFix, err error) {
 	ctx, done := event.Start(ctx, "imports.FixImports")
 	defer done()
 
 	fileSet := token.NewFileSet()
-	file, _, err := parse(fileSet, filename, src, opt)
+	// TODO(rfindley): these default values for ParseComments and AllErrors were
+	// extracted from gopls, but are they even needed?
+	file, _, err := parse(fileSet, filename, src, parser.ParseComments|parser.AllErrors, true)
 	if err != nil {
 		return nil, err
 	}
 
-	return getFixes(ctx, fileSet, file, filename, opt.Env)
+	return getFixesWithSource(ctx, fileSet, file, filename, goroot, logf, source)
 }
 
 // ApplyFixes applies all of the fixes to the file and formats it. extraMode
@@ -86,7 +95,7 @@ func ApplyFixes(fixes []*ImportFix, filename string, src []byte, opt *Options, e
 	// Don't use parse() -- we don't care about fragments or statement lists
 	// here, and we need to work with unparseable files.
 	fileSet := token.NewFileSet()
-	parserMode := parser.Mode(0)
+	parserMode := parser.SkipObjectResolution
 	if opt.Comments {
 		parserMode |= parser.ParseComments
 	}
@@ -114,7 +123,7 @@ func ApplyFixes(fixes []*ImportFix, filename string, src []byte, opt *Options, e
 // formatted file, and returns the postpocessed result.
 func formatFile(fset *token.FileSet, file *ast.File, src []byte, adjust func(orig []byte, src []byte) []byte, opt *Options) ([]byte, error) {
 	mergeImports(file)
-	sortImports(opt.LocalPrefix, fset.File(file.Pos()), file)
+	sortImports(opt.LocalPrefix, fset.File(file.FileStart), file)
 	var spacesBefore []string // import paths we need spaces before
 	for _, impSection := range astutil.Imports(fset, file) {
 		// Within each block of contiguous imports, see if any
@@ -164,13 +173,9 @@ func formatFile(fset *token.FileSet, file *ast.File, src []byte, adjust func(ori
 
 // parse parses src, which was read from filename,
 // as a Go source file or statement list.
-func parse(fset *token.FileSet, filename string, src []byte, opt *Options) (*ast.File, func(orig, src []byte) []byte, error) {
-	parserMode := parser.Mode(0)
-	if opt.Comments {
-		parserMode |= parser.ParseComments
-	}
-	if opt.AllErrors {
-		parserMode |= parser.AllErrors
+func parse(fset *token.FileSet, filename string, src []byte, parserMode parser.Mode, fragment bool) (*ast.File, func(orig, src []byte) []byte, error) {
+	if parserMode&parser.SkipObjectResolution != 0 {
+		panic("legacy ast.Object resolution is required")
 	}
 
 	// Try as whole source file.
@@ -181,7 +186,7 @@ func parse(fset *token.FileSet, filename string, src []byte, opt *Options) (*ast
 	// If the error is that the source file didn't begin with a
 	// package line and we accept fragmented input, fall through to
 	// try as a source fragment.  Stop and return on any other error.
-	if !opt.Fragment || !strings.Contains(err.Error(), "expected 'package'") {
+	if !fragment || !strings.Contains(err.Error(), "expected 'package'") {
 		return nil, nil, err
 	}
 
diff --git a/vendor/golang.org/x/tools/internal/imports/source.go b/vendor/golang.org/x/tools/internal/imports/source.go
new file mode 100644
index 0000000000..cbe4f3c5ba
--- /dev/null
+++ b/vendor/golang.org/x/tools/internal/imports/source.go
@@ -0,0 +1,63 @@
+// Copyright 2024 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 imports
+
+import "context"
+
+// These types document the APIs below.
+//
+// TODO(rfindley): consider making these defined types rather than aliases.
+type (
+	ImportPath  = string
+	PackageName = string
+	Symbol      = string
+
+	// References is set of References found in a Go file. The first map key is the
+	// left hand side of a selector expression, the second key is the right hand
+	// side, and the value should always be true.
+	References = map[PackageName]map[Symbol]bool
+)
+
+// A Result satisfies a missing import.
+//
+// The Import field describes the missing import spec, and the Package field
+// summarizes the package exports.
+type Result struct {
+	Import  *ImportInfo
+	Package *PackageInfo
+}
+
+// An ImportInfo represents a single import statement.
+type ImportInfo struct {
+	ImportPath string // import path, e.g. "crypto/rand".
+	Name       string // import name, e.g. "crand", or "" if none.
+}
+
+// A PackageInfo represents what's known about a package.
+type PackageInfo struct {
+	Name    string          // package name in the package declaration, if known
+	Exports map[string]bool // set of names of known package level sortSymbols
+}
+
+// A Source provides imports to satisfy unresolved references in the file being
+// fixed.
+type Source interface {
+	// LoadPackageNames queries PackageName information for the requested import
+	// paths, when operating from the provided srcDir.
+	//
+	// TODO(rfindley): try to refactor to remove this operation.
+	LoadPackageNames(ctx context.Context, srcDir string, paths []ImportPath) (map[ImportPath]PackageName, error)
+
+	// ResolveReferences asks the Source for the best package name to satisfy
+	// each of the missing references, in the context of fixing the given
+	// filename.
+	//
+	// Returns a map from package name to a [Result] for that package name that
+	// provides the required symbols. Keys may be omitted in the map if no
+	// candidates satisfy all missing references for that package name. It is up
+	// to each data source to select the best result for each entry in the
+	// missing map.
+	ResolveReferences(ctx context.Context, filename string, missing References) ([]*Result, error)
+}
diff --git a/vendor/golang.org/x/tools/internal/imports/source_env.go b/vendor/golang.org/x/tools/internal/imports/source_env.go
new file mode 100644
index 0000000000..d14abaa319
--- /dev/null
+++ b/vendor/golang.org/x/tools/internal/imports/source_env.go
@@ -0,0 +1,129 @@
+// Copyright 2024 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 imports
+
+import (
+	"context"
+	"path/filepath"
+	"strings"
+	"sync"
+
+	"golang.org/x/sync/errgroup"
+	"golang.org/x/tools/internal/gopathwalk"
+)
+
+// ProcessEnvSource implements the [Source] interface using the legacy
+// [ProcessEnv] abstraction.
+type ProcessEnvSource struct {
+	env      *ProcessEnv
+	srcDir   string
+	filename string
+	pkgName  string
+}
+
+// NewProcessEnvSource returns a [ProcessEnvSource] wrapping the given
+// env, to be used for fixing imports in the file with name filename in package
+// named pkgName.
+func NewProcessEnvSource(env *ProcessEnv, filename, pkgName string) (*ProcessEnvSource, error) {
+	abs, err := filepath.Abs(filename)
+	if err != nil {
+		return nil, err
+	}
+	srcDir := filepath.Dir(abs)
+	return &ProcessEnvSource{
+		env:      env,
+		srcDir:   srcDir,
+		filename: filename,
+		pkgName:  pkgName,
+	}, nil
+}
+
+func (s *ProcessEnvSource) LoadPackageNames(ctx context.Context, srcDir string, unknown []string) (map[string]string, error) {
+	r, err := s.env.GetResolver()
+	if err != nil {
+		return nil, err
+	}
+	return r.loadPackageNames(unknown, srcDir)
+}
+
+func (s *ProcessEnvSource) ResolveReferences(ctx context.Context, filename string, refs map[string]map[string]bool) ([]*Result, error) {
+	var mu sync.Mutex
+	found := make(map[string][]pkgDistance)
+	callback := &scanCallback{
+		rootFound: func(gopathwalk.Root) bool {
+			return true // We want everything.
+		},
+		dirFound: func(pkg *pkg) bool {
+			return pkgIsCandidate(filename, refs, pkg)
+		},
+		packageNameLoaded: func(pkg *pkg) bool {
+			if _, want := refs[pkg.packageName]; !want {
+				return false
+			}
+			if pkg.dir == s.srcDir && s.pkgName == pkg.packageName {
+				// The candidate is in the same directory and has the
+				// same package name. Don't try to import ourselves.
+				return false
+			}
+			if !canUse(filename, pkg.dir) {
+				return false
+			}
+			mu.Lock()
+			defer mu.Unlock()
+			found[pkg.packageName] = append(found[pkg.packageName], pkgDistance{pkg, distance(s.srcDir, pkg.dir)})
+			return false // We'll do our own loading after we sort.
+		},
+	}
+	resolver, err := s.env.GetResolver()
+	if err != nil {
+		return nil, err
+	}
+	if err := resolver.scan(ctx, callback); err != nil {
+		return nil, err
+	}
+
+	g, ctx := errgroup.WithContext(ctx)
+
+	searcher := symbolSearcher{
+		logf:        s.env.logf,
+		srcDir:      s.srcDir,
+		xtest:       strings.HasSuffix(s.pkgName, "_test"),
+		loadExports: resolver.loadExports,
+	}
+
+	var resultMu sync.Mutex
+	results := make(map[string]*Result, len(refs))
+	for pkgName, symbols := range refs {
+		g.Go(func() error {
+			found, err := searcher.search(ctx, found[pkgName], pkgName, symbols)
+			if err != nil {
+				return err
+			}
+			if found == nil {
+				return nil // No matching package.
+			}
+
+			imp := &ImportInfo{
+				ImportPath: found.importPathShort,
+			}
+			pkg := &PackageInfo{
+				Name:    pkgName,
+				Exports: symbols,
+			}
+			resultMu.Lock()
+			results[pkgName] = &Result{Import: imp, Package: pkg}
+			resultMu.Unlock()
+			return nil
+		})
+	}
+	if err := g.Wait(); err != nil {
+		return nil, err
+	}
+	var ans []*Result
+	for _, x := range results {
+		ans = append(ans, x)
+	}
+	return ans, nil
+}
diff --git a/vendor/golang.org/x/tools/internal/imports/source_modindex.go b/vendor/golang.org/x/tools/internal/imports/source_modindex.go
new file mode 100644
index 0000000000..05229f06ce
--- /dev/null
+++ b/vendor/golang.org/x/tools/internal/imports/source_modindex.go
@@ -0,0 +1,103 @@
+// Copyright 2024 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 imports
+
+import (
+	"context"
+	"sync"
+	"time"
+
+	"golang.org/x/tools/internal/modindex"
+)
+
+// This code is here rather than in the modindex package
+// to avoid import loops
+
+// implements Source using modindex, so only for module cache.
+//
+// this is perhaps over-engineered. A new Index is read at first use.
+// And then Update is called after every 15 minutes, and a new Index
+// is read if the index changed. It is not clear the Mutex is needed.
+type IndexSource struct {
+	modcachedir string
+	mutex       sync.Mutex
+	ix          *modindex.Index
+	expires     time.Time
+}
+
+// create a new Source. Called from NewView in cache/session.go.
+func NewIndexSource(cachedir string) *IndexSource {
+	return &IndexSource{modcachedir: cachedir}
+}
+
+func (s *IndexSource) LoadPackageNames(ctx context.Context, srcDir string, paths []ImportPath) (map[ImportPath]PackageName, error) {
+	/// This is used by goimports to resolve the package names of imports of the
+	// current package, which is irrelevant for the module cache.
+	return nil, nil
+}
+
+func (s *IndexSource) ResolveReferences(ctx context.Context, filename string, missing References) ([]*Result, error) {
+	if err := s.maybeReadIndex(); err != nil {
+		return nil, err
+	}
+	var cs []modindex.Candidate
+	for pkg, nms := range missing {
+		for nm := range nms {
+			x := s.ix.Lookup(pkg, nm, false)
+			cs = append(cs, x...)
+		}
+	}
+	found := make(map[string]*Result)
+	for _, c := range cs {
+		var x *Result
+		if x = found[c.ImportPath]; x == nil {
+			x = &Result{
+				Import: &ImportInfo{
+					ImportPath: c.ImportPath,
+					Name:       "",
+				},
+				Package: &PackageInfo{
+					Name:    c.PkgName,
+					Exports: make(map[string]bool),
+				},
+			}
+			found[c.ImportPath] = x
+		}
+		x.Package.Exports[c.Name] = true
+	}
+	var ans []*Result
+	for _, x := range found {
+		ans = append(ans, x)
+	}
+	return ans, nil
+}
+
+func (s *IndexSource) maybeReadIndex() error {
+	s.mutex.Lock()
+	defer s.mutex.Unlock()
+
+	var readIndex bool
+	if time.Now().After(s.expires) {
+		ok, err := modindex.Update(s.modcachedir)
+		if err != nil {
+			return err
+		}
+		if ok {
+			readIndex = true
+		}
+	}
+
+	if readIndex || s.ix == nil {
+		ix, err := modindex.ReadIndex(s.modcachedir)
+		if err != nil {
+			return err
+		}
+		s.ix = ix
+		// for now refresh every 15 minutes
+		s.expires = time.Now().Add(time.Minute * 15)
+	}
+
+	return nil
+}
diff --git a/vendor/golang.org/x/tools/internal/modindex/directories.go b/vendor/golang.org/x/tools/internal/modindex/directories.go
new file mode 100644
index 0000000000..1e1a02f239
--- /dev/null
+++ b/vendor/golang.org/x/tools/internal/modindex/directories.go
@@ -0,0 +1,135 @@
+// Copyright 2024 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 modindex
+
+import (
+	"fmt"
+	"log"
+	"os"
+	"path/filepath"
+	"regexp"
+	"slices"
+	"strings"
+	"sync"
+	"time"
+
+	"golang.org/x/mod/semver"
+	"golang.org/x/tools/internal/gopathwalk"
+)
+
+type directory struct {
+	path       Relpath
+	importPath string
+	version    string // semantic version
+	syms       []symbol
+}
+
+// filterDirs groups the directories by import path,
+// sorting the ones with the same import path by semantic version,
+// most recent first.
+func byImportPath(dirs []Relpath) (map[string][]*directory, error) {
+	ans := make(map[string][]*directory) // key is import path
+	for _, d := range dirs {
+		ip, sv, err := DirToImportPathVersion(d)
+		if err != nil {
+			return nil, err
+		}
+		ans[ip] = append(ans[ip], &directory{
+			path:       d,
+			importPath: ip,
+			version:    sv,
+		})
+	}
+	for k, v := range ans {
+		semanticSort(v)
+		ans[k] = v
+	}
+	return ans, nil
+}
+
+// sort the directories by semantic version, latest first
+func semanticSort(v []*directory) {
+	slices.SortFunc(v, func(l, r *directory) int {
+		if n := semver.Compare(l.version, r.version); n != 0 {
+			return -n // latest first
+		}
+		return strings.Compare(string(l.path), string(r.path))
+	})
+}
+
+// modCacheRegexp splits a relpathpath into module, module version, and package.
+var modCacheRegexp = regexp.MustCompile(`(.*)@([^/\\]*)(.*)`)
+
+// DirToImportPathVersion computes import path and semantic version
+func DirToImportPathVersion(dir Relpath) (string, string, error) {
+	m := modCacheRegexp.FindStringSubmatch(string(dir))
+	// m[1] is the module path
+	// m[2] is the version major.minor.patch(-
 1 && flds[1][1] == 'D',
+			}
+			if px.Type == Func {
+				n, err := strconv.Atoi(flds[2])
+				if err != nil {
+					continue // should never happen
+				}
+				px.Results = int16(n)
+				if len(flds) >= 4 {
+					sig := strings.Split(flds[3], " ")
+					for i := 0; i < len(sig); i++ {
+						// $ cannot otherwise occur. removing the spaces
+						// almost works, but for chan struct{}, e.g.
+						sig[i] = strings.Replace(sig[i], "$", " ", -1)
+					}
+					px.Sig = toFields(sig)
+				}
+			}
+			ans = append(ans, px)
+		}
+	}
+	return ans
+}
+
+func toFields(sig []string) []Field {
+	ans := make([]Field, len(sig)/2)
+	for i := 0; i < len(ans); i++ {
+		ans[i] = Field{Arg: sig[2*i], Type: sig[2*i+1]}
+	}
+	return ans
+}
+
+// benchmarks show this is measurably better than strings.Split
+// split into first 4 fields separated by single space
+func fastSplit(x string) []string {
+	ans := make([]string, 0, 4)
+	nxt := 0
+	start := 0
+	for i := 0; i < len(x); i++ {
+		if x[i] != ' ' {
+			continue
+		}
+		ans = append(ans, x[start:i])
+		nxt++
+		start = i + 1
+		if nxt >= 3 {
+			break
+		}
+	}
+	ans = append(ans, x[start:])
+	return ans
+}
+
+func asLexType(c byte) LexType {
+	switch c {
+	case 'C':
+		return Const
+	case 'V':
+		return Var
+	case 'T':
+		return Type
+	case 'F':
+		return Func
+	}
+	return -1
+}
diff --git a/vendor/golang.org/x/tools/internal/modindex/modindex.go b/vendor/golang.org/x/tools/internal/modindex/modindex.go
new file mode 100644
index 0000000000..355a53e71a
--- /dev/null
+++ b/vendor/golang.org/x/tools/internal/modindex/modindex.go
@@ -0,0 +1,164 @@
+// Copyright 2024 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 modindex contains code for building and searching an index to
+// the Go module cache. The directory containing the index, returned by
+// IndexDir(), contains a file index-name- that contains the name
+// of the current index. We believe writing that short file is atomic.
+// ReadIndex reads that file to get the file name of the index.
+// WriteIndex writes an index with a unique name and then
+// writes that name into a new version of index-name-.
+// ( stands for the CurrentVersion of the index format.)
+package modindex
+
+import (
+	"path/filepath"
+	"slices"
+	"strings"
+	"time"
+
+	"golang.org/x/mod/semver"
+)
+
+// Create always creates a new index for the go module cache that is in cachedir.
+func Create(cachedir string) error {
+	_, err := indexModCache(cachedir, true)
+	return err
+}
+
+// Update the index for the go module cache that is in cachedir,
+// If there is no existing index it will build one.
+// If there are changed directories since the last index, it will
+// write a new one and return true. Otherwise it returns false.
+func Update(cachedir string) (bool, error) {
+	return indexModCache(cachedir, false)
+}
+
+// indexModCache writes an index current as of when it is called.
+// If clear is true the index is constructed from all of GOMODCACHE
+// otherwise the index is constructed from the last previous index
+// and the updates to the cache. It returns true if it wrote an index,
+// false otherwise.
+func indexModCache(cachedir string, clear bool) (bool, error) {
+	cachedir, err := filepath.Abs(cachedir)
+	if err != nil {
+		return false, err
+	}
+	cd := Abspath(cachedir)
+	future := time.Now().Add(24 * time.Hour) // safely in the future
+	ok, err := modindexTimed(future, cd, clear)
+	if err != nil {
+		return false, err
+	}
+	return ok, nil
+}
+
+// modindexTimed writes an index current as of onlyBefore.
+// If clear is true the index is constructed from all of GOMODCACHE
+// otherwise the index is constructed from the last previous index
+// and all the updates to the cache before onlyBefore.
+// It returns true if it wrote a new index, false if it wrote nothing.
+func modindexTimed(onlyBefore time.Time, cachedir Abspath, clear bool) (bool, error) {
+	var curIndex *Index
+	if !clear {
+		var err error
+		curIndex, err = ReadIndex(string(cachedir))
+		if clear && err != nil {
+			return false, err
+		}
+		// TODO(pjw): check that most of those directories still exist
+	}
+	cfg := &work{
+		onlyBefore: onlyBefore,
+		oldIndex:   curIndex,
+		cacheDir:   cachedir,
+	}
+	if curIndex != nil {
+		cfg.onlyAfter = curIndex.Changed
+	}
+	if err := cfg.buildIndex(); err != nil {
+		return false, err
+	}
+	if len(cfg.newIndex.Entries) == 0 && curIndex != nil {
+		// no changes from existing curIndex, don't write a new index
+		return false, nil
+	}
+	if err := cfg.writeIndex(); err != nil {
+		return false, err
+	}
+	return true, nil
+}
+
+type work struct {
+	onlyBefore time.Time // do not use directories later than this
+	onlyAfter  time.Time // only interested in directories after this
+	// directories from before onlyAfter come from oldIndex
+	oldIndex *Index
+	newIndex *Index
+	cacheDir Abspath
+}
+
+func (w *work) buildIndex() error {
+	// The effective date of the new index should be at least
+	// slightly earlier than when the directories are scanned
+	// so set it now.
+	w.newIndex = &Index{Changed: time.Now(), Cachedir: w.cacheDir}
+	dirs := findDirs(string(w.cacheDir), w.onlyAfter, w.onlyBefore)
+	if len(dirs) == 0 {
+		return nil
+	}
+	newdirs, err := byImportPath(dirs)
+	if err != nil {
+		return err
+	}
+	// for each import path it might occur only in newdirs,
+	// only in w.oldIndex, or in both.
+	// If it occurs in both, use the semantically later one
+	if w.oldIndex != nil {
+		for _, e := range w.oldIndex.Entries {
+			found, ok := newdirs[e.ImportPath]
+			if !ok {
+				w.newIndex.Entries = append(w.newIndex.Entries, e)
+				continue // use this one, there is no new one
+			}
+			if semver.Compare(found[0].version, e.Version) > 0 {
+				// use the new one
+			} else {
+				// use the old one, forget the new one
+				w.newIndex.Entries = append(w.newIndex.Entries, e)
+				delete(newdirs, e.ImportPath)
+			}
+		}
+	}
+	// get symbol information for all the new diredtories
+	getSymbols(w.cacheDir, newdirs)
+	// assemble the new index entries
+	for k, v := range newdirs {
+		d := v[0]
+		pkg, names := processSyms(d.syms)
+		if pkg == "" {
+			continue // PJW: does this ever happen?
+		}
+		entry := Entry{
+			PkgName:    pkg,
+			Dir:        d.path,
+			ImportPath: k,
+			Version:    d.version,
+			Names:      names,
+		}
+		w.newIndex.Entries = append(w.newIndex.Entries, entry)
+	}
+	// sort the entries in the new index
+	slices.SortFunc(w.newIndex.Entries, func(l, r Entry) int {
+		if n := strings.Compare(l.PkgName, r.PkgName); n != 0 {
+			return n
+		}
+		return strings.Compare(l.ImportPath, r.ImportPath)
+	})
+	return nil
+}
+
+func (w *work) writeIndex() error {
+	return writeIndex(w.cacheDir, w.newIndex)
+}
diff --git a/vendor/golang.org/x/tools/internal/modindex/symbols.go b/vendor/golang.org/x/tools/internal/modindex/symbols.go
new file mode 100644
index 0000000000..33bf2641f7
--- /dev/null
+++ b/vendor/golang.org/x/tools/internal/modindex/symbols.go
@@ -0,0 +1,217 @@
+// Copyright 2024 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 modindex
+
+import (
+	"fmt"
+	"go/ast"
+	"go/parser"
+	"go/token"
+	"go/types"
+	"os"
+	"path/filepath"
+	"slices"
+	"strings"
+
+	"golang.org/x/sync/errgroup"
+)
+
+// The name of a symbol contains information about the symbol:
+//  T for types, TD if the type is deprecated
+//  C for consts, CD if the const is deprecated
+//  V for vars, VD if the var is deprecated
+// and for funcs:  F  ( )*
+// any spaces in  are replaced by $s so that the fields
+// of the name are space separated. F is replaced by FD if the func
+// is deprecated.
+type symbol struct {
+	pkg  string // name of the symbols's package
+	name string // declared name
+	kind string // T, C, V, or F
+	sig  string // signature information, for F
+}
+
+// find the symbols for the best directories
+func getSymbols(cd Abspath, dirs map[string][]*directory) {
+	var g errgroup.Group
+	g.SetLimit(-1) // maybe throttle this some day
+	for _, vv := range dirs {
+		// throttling some day?
+		d := vv[0]
+		g.Go(func() error {
+			thedir := filepath.Join(string(cd), string(d.path))
+			mode := parser.SkipObjectResolution | parser.ParseComments
+
+			fi, err := os.ReadDir(thedir)
+			if err != nil {
+				return nil // log this someday?
+			}
+			for _, fx := range fi {
+				if !strings.HasSuffix(fx.Name(), ".go") || strings.HasSuffix(fx.Name(), "_test.go") {
+					continue
+				}
+				fname := filepath.Join(thedir, fx.Name())
+				tr, err := parser.ParseFile(token.NewFileSet(), fname, nil, mode)
+				if err != nil {
+					continue // ignore errors, someday log them?
+				}
+				d.syms = append(d.syms, getFileExports(tr)...)
+			}
+			return nil
+		})
+	}
+	g.Wait()
+}
+
+func getFileExports(f *ast.File) []symbol {
+	pkg := f.Name.Name
+	if pkg == "main" {
+		return nil
+	}
+	var ans []symbol
+	// should we look for //go:build ignore?
+	for _, decl := range f.Decls {
+		switch decl := decl.(type) {
+		case *ast.FuncDecl:
+			if decl.Recv != nil {
+				// ignore methods, as we are completing package selections
+				continue
+			}
+			name := decl.Name.Name
+			dtype := decl.Type
+			// not looking at dtype.TypeParams. That is, treating
+			// generic functions just like non-generic ones.
+			sig := dtype.Params
+			kind := "F"
+			if isDeprecated(decl.Doc) {
+				kind += "D"
+			}
+			result := []string{fmt.Sprintf("%d", dtype.Results.NumFields())}
+			for _, x := range sig.List {
+				// This code creates a string representing the type.
+				// TODO(pjw): it may be fragile:
+				// 1. x.Type could be nil, perhaps in ill-formed code
+				// 2. ExprString might someday change incompatibly to
+				//    include struct tags, which can be arbitrary strings
+				if x.Type == nil {
+					// Can this happen without a parse error? (Files with parse
+					// errors are ignored in getSymbols)
+					continue // maybe report this someday
+				}
+				tp := types.ExprString(x.Type)
+				if len(tp) == 0 {
+					// Can this happen?
+					continue // maybe report this someday
+				}
+				// This is only safe if ExprString never returns anything with a $
+				// The only place a $ can occur seems to be in a struct tag, which
+				// can be an arbitrary string literal, and ExprString does not presently
+				// print struct tags. So for this to happen the type of a formal parameter
+				// has to be a explict struct, e.g. foo(x struct{a int "$"}) and ExprString
+				// would have to show the struct tag. Even testing for this case seems
+				// a waste of effort, but let's not ignore such pathologies
+				if strings.Contains(tp, "$") {
+					continue
+				}
+				tp = strings.Replace(tp, " ", "$", -1)
+				if len(x.Names) == 0 {
+					result = append(result, "_")
+					result = append(result, tp)
+				} else {
+					for _, y := range x.Names {
+						result = append(result, y.Name)
+						result = append(result, tp)
+					}
+				}
+			}
+			sigs := strings.Join(result, " ")
+			if s := newsym(pkg, name, kind, sigs); s != nil {
+				ans = append(ans, *s)
+			}
+		case *ast.GenDecl:
+			depr := isDeprecated(decl.Doc)
+			switch decl.Tok {
+			case token.CONST, token.VAR:
+				tp := "V"
+				if decl.Tok == token.CONST {
+					tp = "C"
+				}
+				if depr {
+					tp += "D"
+				}
+				for _, sp := range decl.Specs {
+					for _, x := range sp.(*ast.ValueSpec).Names {
+						if s := newsym(pkg, x.Name, tp, ""); s != nil {
+							ans = append(ans, *s)
+						}
+					}
+				}
+			case token.TYPE:
+				tp := "T"
+				if depr {
+					tp += "D"
+				}
+				for _, sp := range decl.Specs {
+					if s := newsym(pkg, sp.(*ast.TypeSpec).Name.Name, tp, ""); s != nil {
+						ans = append(ans, *s)
+					}
+				}
+			}
+		}
+	}
+	return ans
+}
+
+func newsym(pkg, name, kind, sig string) *symbol {
+	if len(name) == 0 || !ast.IsExported(name) {
+		return nil
+	}
+	sym := symbol{pkg: pkg, name: name, kind: kind, sig: sig}
+	return &sym
+}
+
+func isDeprecated(doc *ast.CommentGroup) bool {
+	if doc == nil {
+		return false
+	}
+	// go.dev/wiki/Deprecated Paragraph starting 'Deprecated:'
+	// This code fails for /* Deprecated: */, but it's the code from
+	// gopls/internal/analysis/deprecated
+	lines := strings.Split(doc.Text(), "\n\n")
+	for _, line := range lines {
+		if strings.HasPrefix(line, "Deprecated:") {
+			return true
+		}
+	}
+	return false
+}
+
+// return the package name and the value for the symbols.
+// if there are multiple packages, choose one arbitrarily
+// the returned slice is sorted lexicographically
+func processSyms(syms []symbol) (string, []string) {
+	if len(syms) == 0 {
+		return "", nil
+	}
+	slices.SortFunc(syms, func(l, r symbol) int {
+		return strings.Compare(l.name, r.name)
+	})
+	pkg := syms[0].pkg
+	var names []string
+	for _, s := range syms {
+		var nx string
+		if s.pkg == pkg {
+			if s.sig != "" {
+				nx = fmt.Sprintf("%s %s %s", s.name, s.kind, s.sig)
+			} else {
+				nx = fmt.Sprintf("%s %s", s.name, s.kind)
+			}
+			names = append(names, nx)
+		} else {
+			continue // PJW: do we want to keep track of these?
+		}
+	}
+	return pkg, names
+}
diff --git a/vendor/golang.org/x/tools/internal/modindex/types.go b/vendor/golang.org/x/tools/internal/modindex/types.go
new file mode 100644
index 0000000000..ece4488630
--- /dev/null
+++ b/vendor/golang.org/x/tools/internal/modindex/types.go
@@ -0,0 +1,25 @@
+// Copyright 2024 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 modindex
+
+import (
+	"strings"
+)
+
+// some special types to avoid confusions
+
+// distinguish various types of directory names. It's easy to get confused.
+type Abspath string // absolute paths
+type Relpath string // paths with GOMODCACHE prefix removed
+
+func toRelpath(cachedir Abspath, s string) Relpath {
+	if strings.HasPrefix(s, string(cachedir)) {
+		if s == string(cachedir) {
+			return Relpath("")
+		}
+		return Relpath(s[len(cachedir)+1:])
+	}
+	return Relpath(s)
+}
diff --git a/vendor/golang.org/x/tools/internal/packagesinternal/packages.go b/vendor/golang.org/x/tools/internal/packagesinternal/packages.go
index 44719de173..66e69b4389 100644
--- a/vendor/golang.org/x/tools/internal/packagesinternal/packages.go
+++ b/vendor/golang.org/x/tools/internal/packagesinternal/packages.go
@@ -5,7 +5,6 @@
 // Package packagesinternal exposes internal-only fields from go/packages.
 package packagesinternal
 
-var GetForTest = func(p interface{}) string { return "" }
 var GetDepsErrors = func(p interface{}) []*PackageError { return nil }
 
 type PackageError struct {
@@ -16,7 +15,6 @@ type PackageError struct {
 
 var TypecheckCgo int
 var DepsErrors int // must be set as a LoadMode to call GetDepsErrors
-var ForTest int    // must be set as a LoadMode to call GetForTest
 
 var SetModFlag = func(config interface{}, value string) {}
 var SetModFile = func(config interface{}, value string) {}
diff --git a/vendor/golang.org/x/tools/internal/stdlib/manifest.go b/vendor/golang.org/x/tools/internal/stdlib/manifest.go
index cdaac9ab34..9f0b871ff6 100644
--- a/vendor/golang.org/x/tools/internal/stdlib/manifest.go
+++ b/vendor/golang.org/x/tools/internal/stdlib/manifest.go
@@ -268,6 +268,8 @@ var PackageSymbols = map[string][]Symbol{
 		{"ErrTooLarge", Var, 0},
 		{"Fields", Func, 0},
 		{"FieldsFunc", Func, 0},
+		{"FieldsFuncSeq", Func, 24},
+		{"FieldsSeq", Func, 24},
 		{"HasPrefix", Func, 0},
 		{"HasSuffix", Func, 0},
 		{"Index", Func, 0},
@@ -280,6 +282,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"LastIndexAny", Func, 0},
 		{"LastIndexByte", Func, 5},
 		{"LastIndexFunc", Func, 0},
+		{"Lines", Func, 24},
 		{"Map", Func, 0},
 		{"MinRead", Const, 0},
 		{"NewBuffer", Func, 0},
@@ -293,7 +296,9 @@ var PackageSymbols = map[string][]Symbol{
 		{"Split", Func, 0},
 		{"SplitAfter", Func, 0},
 		{"SplitAfterN", Func, 0},
+		{"SplitAfterSeq", Func, 24},
 		{"SplitN", Func, 0},
+		{"SplitSeq", Func, 24},
 		{"Title", Func, 0},
 		{"ToLower", Func, 0},
 		{"ToLowerSpecial", Func, 0},
@@ -535,6 +540,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"NewCTR", Func, 0},
 		{"NewGCM", Func, 2},
 		{"NewGCMWithNonceSize", Func, 5},
+		{"NewGCMWithRandomNonce", Func, 24},
 		{"NewGCMWithTagSize", Func, 11},
 		{"NewOFB", Func, 0},
 		{"Stream", Type, 0},
@@ -673,6 +679,14 @@ var PackageSymbols = map[string][]Symbol{
 		{"Unmarshal", Func, 0},
 		{"UnmarshalCompressed", Func, 15},
 	},
+	"crypto/fips140": {
+		{"Enabled", Func, 24},
+	},
+	"crypto/hkdf": {
+		{"Expand", Func, 24},
+		{"Extract", Func, 24},
+		{"Key", Func, 24},
+	},
 	"crypto/hmac": {
 		{"Equal", Func, 1},
 		{"New", Func, 0},
@@ -683,11 +697,43 @@ var PackageSymbols = map[string][]Symbol{
 		{"Size", Const, 0},
 		{"Sum", Func, 2},
 	},
+	"crypto/mlkem": {
+		{"(*DecapsulationKey1024).Bytes", Method, 24},
+		{"(*DecapsulationKey1024).Decapsulate", Method, 24},
+		{"(*DecapsulationKey1024).EncapsulationKey", Method, 24},
+		{"(*DecapsulationKey768).Bytes", Method, 24},
+		{"(*DecapsulationKey768).Decapsulate", Method, 24},
+		{"(*DecapsulationKey768).EncapsulationKey", Method, 24},
+		{"(*EncapsulationKey1024).Bytes", Method, 24},
+		{"(*EncapsulationKey1024).Encapsulate", Method, 24},
+		{"(*EncapsulationKey768).Bytes", Method, 24},
+		{"(*EncapsulationKey768).Encapsulate", Method, 24},
+		{"CiphertextSize1024", Const, 24},
+		{"CiphertextSize768", Const, 24},
+		{"DecapsulationKey1024", Type, 24},
+		{"DecapsulationKey768", Type, 24},
+		{"EncapsulationKey1024", Type, 24},
+		{"EncapsulationKey768", Type, 24},
+		{"EncapsulationKeySize1024", Const, 24},
+		{"EncapsulationKeySize768", Const, 24},
+		{"GenerateKey1024", Func, 24},
+		{"GenerateKey768", Func, 24},
+		{"NewDecapsulationKey1024", Func, 24},
+		{"NewDecapsulationKey768", Func, 24},
+		{"NewEncapsulationKey1024", Func, 24},
+		{"NewEncapsulationKey768", Func, 24},
+		{"SeedSize", Const, 24},
+		{"SharedKeySize", Const, 24},
+	},
+	"crypto/pbkdf2": {
+		{"Key", Func, 24},
+	},
 	"crypto/rand": {
 		{"Int", Func, 0},
 		{"Prime", Func, 0},
 		{"Read", Func, 0},
 		{"Reader", Var, 0},
+		{"Text", Func, 24},
 	},
 	"crypto/rc4": {
 		{"(*Cipher).Reset", Method, 0},
@@ -766,6 +812,39 @@ var PackageSymbols = map[string][]Symbol{
 		{"Sum224", Func, 2},
 		{"Sum256", Func, 2},
 	},
+	"crypto/sha3": {
+		{"(*SHA3).AppendBinary", Method, 24},
+		{"(*SHA3).BlockSize", Method, 24},
+		{"(*SHA3).MarshalBinary", Method, 24},
+		{"(*SHA3).Reset", Method, 24},
+		{"(*SHA3).Size", Method, 24},
+		{"(*SHA3).Sum", Method, 24},
+		{"(*SHA3).UnmarshalBinary", Method, 24},
+		{"(*SHA3).Write", Method, 24},
+		{"(*SHAKE).AppendBinary", Method, 24},
+		{"(*SHAKE).BlockSize", Method, 24},
+		{"(*SHAKE).MarshalBinary", Method, 24},
+		{"(*SHAKE).Read", Method, 24},
+		{"(*SHAKE).Reset", Method, 24},
+		{"(*SHAKE).UnmarshalBinary", Method, 24},
+		{"(*SHAKE).Write", Method, 24},
+		{"New224", Func, 24},
+		{"New256", Func, 24},
+		{"New384", Func, 24},
+		{"New512", Func, 24},
+		{"NewCSHAKE128", Func, 24},
+		{"NewCSHAKE256", Func, 24},
+		{"NewSHAKE128", Func, 24},
+		{"NewSHAKE256", Func, 24},
+		{"SHA3", Type, 24},
+		{"SHAKE", Type, 24},
+		{"Sum224", Func, 24},
+		{"Sum256", Func, 24},
+		{"Sum384", Func, 24},
+		{"Sum512", Func, 24},
+		{"SumSHAKE128", Func, 24},
+		{"SumSHAKE256", Func, 24},
+	},
 	"crypto/sha512": {
 		{"BlockSize", Const, 0},
 		{"New", Func, 0},
@@ -788,6 +867,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"ConstantTimeEq", Func, 0},
 		{"ConstantTimeLessOrEq", Func, 2},
 		{"ConstantTimeSelect", Func, 0},
+		{"WithDataIndependentTiming", Func, 24},
 		{"XORBytes", Func, 20},
 	},
 	"crypto/tls": {
@@ -864,6 +944,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"ClientHelloInfo", Type, 4},
 		{"ClientHelloInfo.CipherSuites", Field, 4},
 		{"ClientHelloInfo.Conn", Field, 8},
+		{"ClientHelloInfo.Extensions", Field, 24},
 		{"ClientHelloInfo.ServerName", Field, 4},
 		{"ClientHelloInfo.SignatureSchemes", Field, 8},
 		{"ClientHelloInfo.SupportedCurves", Field, 4},
@@ -881,6 +962,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"Config.CurvePreferences", Field, 3},
 		{"Config.DynamicRecordSizingDisabled", Field, 7},
 		{"Config.EncryptedClientHelloConfigList", Field, 23},
+		{"Config.EncryptedClientHelloKeys", Field, 24},
 		{"Config.EncryptedClientHelloRejectionVerify", Field, 23},
 		{"Config.GetCertificate", Field, 4},
 		{"Config.GetClientCertificate", Field, 8},
@@ -934,6 +1016,10 @@ var PackageSymbols = map[string][]Symbol{
 		{"ECHRejectionError", Type, 23},
 		{"ECHRejectionError.RetryConfigList", Field, 23},
 		{"Ed25519", Const, 13},
+		{"EncryptedClientHelloKey", Type, 24},
+		{"EncryptedClientHelloKey.Config", Field, 24},
+		{"EncryptedClientHelloKey.PrivateKey", Field, 24},
+		{"EncryptedClientHelloKey.SendAsRetry", Field, 24},
 		{"InsecureCipherSuites", Func, 14},
 		{"Listen", Func, 0},
 		{"LoadX509KeyPair", Func, 0},
@@ -1032,6 +1118,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"VersionTLS12", Const, 2},
 		{"VersionTLS13", Const, 12},
 		{"X25519", Const, 8},
+		{"X25519MLKEM768", Const, 24},
 		{"X509KeyPair", Func, 0},
 	},
 	"crypto/x509": {
@@ -1056,6 +1143,8 @@ var PackageSymbols = map[string][]Symbol{
 		{"(ConstraintViolationError).Error", Method, 0},
 		{"(HostnameError).Error", Method, 0},
 		{"(InsecureAlgorithmError).Error", Method, 6},
+		{"(OID).AppendBinary", Method, 24},
+		{"(OID).AppendText", Method, 24},
 		{"(OID).Equal", Method, 22},
 		{"(OID).EqualASN1OID", Method, 22},
 		{"(OID).MarshalBinary", Method, 23},
@@ -1084,6 +1173,10 @@ var PackageSymbols = map[string][]Symbol{
 		{"Certificate.Extensions", Field, 2},
 		{"Certificate.ExtraExtensions", Field, 2},
 		{"Certificate.IPAddresses", Field, 1},
+		{"Certificate.InhibitAnyPolicy", Field, 24},
+		{"Certificate.InhibitAnyPolicyZero", Field, 24},
+		{"Certificate.InhibitPolicyMapping", Field, 24},
+		{"Certificate.InhibitPolicyMappingZero", Field, 24},
 		{"Certificate.IsCA", Field, 0},
 		{"Certificate.Issuer", Field, 0},
 		{"Certificate.IssuingCertificateURL", Field, 2},
@@ -1100,6 +1193,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"Certificate.PermittedURIDomains", Field, 10},
 		{"Certificate.Policies", Field, 22},
 		{"Certificate.PolicyIdentifiers", Field, 0},
+		{"Certificate.PolicyMappings", Field, 24},
 		{"Certificate.PublicKey", Field, 0},
 		{"Certificate.PublicKeyAlgorithm", Field, 0},
 		{"Certificate.Raw", Field, 0},
@@ -1107,6 +1201,8 @@ var PackageSymbols = map[string][]Symbol{
 		{"Certificate.RawSubject", Field, 0},
 		{"Certificate.RawSubjectPublicKeyInfo", Field, 0},
 		{"Certificate.RawTBSCertificate", Field, 0},
+		{"Certificate.RequireExplicitPolicy", Field, 24},
+		{"Certificate.RequireExplicitPolicyZero", Field, 24},
 		{"Certificate.SerialNumber", Field, 0},
 		{"Certificate.Signature", Field, 0},
 		{"Certificate.SignatureAlgorithm", Field, 0},
@@ -1198,6 +1294,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"NameConstraintsWithoutSANs", Const, 10},
 		{"NameMismatch", Const, 8},
 		{"NewCertPool", Func, 0},
+		{"NoValidChains", Const, 24},
 		{"NotAuthorizedToSign", Const, 0},
 		{"OID", Type, 22},
 		{"OIDFromInts", Func, 22},
@@ -1219,6 +1316,9 @@ var PackageSymbols = map[string][]Symbol{
 		{"ParsePKCS8PrivateKey", Func, 0},
 		{"ParsePKIXPublicKey", Func, 0},
 		{"ParseRevocationList", Func, 19},
+		{"PolicyMapping", Type, 24},
+		{"PolicyMapping.IssuerDomainPolicy", Field, 24},
+		{"PolicyMapping.SubjectDomainPolicy", Field, 24},
 		{"PublicKeyAlgorithm", Type, 0},
 		{"PureEd25519", Const, 13},
 		{"RSA", Const, 0},
@@ -1265,6 +1365,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"UnknownPublicKeyAlgorithm", Const, 0},
 		{"UnknownSignatureAlgorithm", Const, 0},
 		{"VerifyOptions", Type, 0},
+		{"VerifyOptions.CertificatePolicies", Field, 24},
 		{"VerifyOptions.CurrentTime", Field, 0},
 		{"VerifyOptions.DNSName", Field, 0},
 		{"VerifyOptions.Intermediates", Field, 0},
@@ -1975,6 +2076,8 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*File).DynString", Method, 1},
 		{"(*File).DynValue", Method, 21},
 		{"(*File).DynamicSymbols", Method, 4},
+		{"(*File).DynamicVersionNeeds", Method, 24},
+		{"(*File).DynamicVersions", Method, 24},
 		{"(*File).ImportedLibraries", Method, 0},
 		{"(*File).ImportedSymbols", Method, 0},
 		{"(*File).Section", Method, 0},
@@ -2240,6 +2343,19 @@ var PackageSymbols = map[string][]Symbol{
 		{"DynFlag", Type, 0},
 		{"DynFlag1", Type, 21},
 		{"DynTag", Type, 0},
+		{"DynamicVersion", Type, 24},
+		{"DynamicVersion.Deps", Field, 24},
+		{"DynamicVersion.Flags", Field, 24},
+		{"DynamicVersion.Index", Field, 24},
+		{"DynamicVersion.Name", Field, 24},
+		{"DynamicVersionDep", Type, 24},
+		{"DynamicVersionDep.Dep", Field, 24},
+		{"DynamicVersionDep.Flags", Field, 24},
+		{"DynamicVersionDep.Index", Field, 24},
+		{"DynamicVersionFlag", Type, 24},
+		{"DynamicVersionNeed", Type, 24},
+		{"DynamicVersionNeed.Name", Field, 24},
+		{"DynamicVersionNeed.Needs", Field, 24},
 		{"EI_ABIVERSION", Const, 0},
 		{"EI_CLASS", Const, 0},
 		{"EI_DATA", Const, 0},
@@ -3726,8 +3842,19 @@ var PackageSymbols = map[string][]Symbol{
 		{"Symbol.Size", Field, 0},
 		{"Symbol.Value", Field, 0},
 		{"Symbol.Version", Field, 13},
+		{"Symbol.VersionIndex", Field, 24},
+		{"Symbol.VersionScope", Field, 24},
+		{"SymbolVersionScope", Type, 24},
 		{"Type", Type, 0},
+		{"VER_FLG_BASE", Const, 24},
+		{"VER_FLG_INFO", Const, 24},
+		{"VER_FLG_WEAK", Const, 24},
 		{"Version", Type, 0},
+		{"VersionScopeGlobal", Const, 24},
+		{"VersionScopeHidden", Const, 24},
+		{"VersionScopeLocal", Const, 24},
+		{"VersionScopeNone", Const, 24},
+		{"VersionScopeSpecific", Const, 24},
 	},
 	"debug/gosym": {
 		{"(*DecodingError).Error", Method, 0},
@@ -4453,8 +4580,10 @@ var PackageSymbols = map[string][]Symbol{
 		{"FS", Type, 16},
 	},
 	"encoding": {
+		{"BinaryAppender", Type, 24},
 		{"BinaryMarshaler", Type, 2},
 		{"BinaryUnmarshaler", Type, 2},
+		{"TextAppender", Type, 24},
 		{"TextMarshaler", Type, 2},
 		{"TextUnmarshaler", Type, 2},
 	},
@@ -5984,13 +6113,16 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*Interface).Complete", Method, 5},
 		{"(*Interface).Embedded", Method, 5},
 		{"(*Interface).EmbeddedType", Method, 11},
+		{"(*Interface).EmbeddedTypes", Method, 24},
 		{"(*Interface).Empty", Method, 5},
 		{"(*Interface).ExplicitMethod", Method, 5},
+		{"(*Interface).ExplicitMethods", Method, 24},
 		{"(*Interface).IsComparable", Method, 18},
 		{"(*Interface).IsImplicit", Method, 18},
 		{"(*Interface).IsMethodSet", Method, 18},
 		{"(*Interface).MarkImplicit", Method, 18},
 		{"(*Interface).Method", Method, 5},
+		{"(*Interface).Methods", Method, 24},
 		{"(*Interface).NumEmbeddeds", Method, 5},
 		{"(*Interface).NumExplicitMethods", Method, 5},
 		{"(*Interface).NumMethods", Method, 5},
@@ -6011,9 +6143,11 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*MethodSet).At", Method, 5},
 		{"(*MethodSet).Len", Method, 5},
 		{"(*MethodSet).Lookup", Method, 5},
+		{"(*MethodSet).Methods", Method, 24},
 		{"(*MethodSet).String", Method, 5},
 		{"(*Named).AddMethod", Method, 5},
 		{"(*Named).Method", Method, 5},
+		{"(*Named).Methods", Method, 24},
 		{"(*Named).NumMethods", Method, 5},
 		{"(*Named).Obj", Method, 5},
 		{"(*Named).Origin", Method, 18},
@@ -6054,6 +6188,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*Pointer).String", Method, 5},
 		{"(*Pointer).Underlying", Method, 5},
 		{"(*Scope).Child", Method, 5},
+		{"(*Scope).Children", Method, 24},
 		{"(*Scope).Contains", Method, 5},
 		{"(*Scope).End", Method, 5},
 		{"(*Scope).Innermost", Method, 5},
@@ -6089,6 +6224,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*StdSizes).Offsetsof", Method, 5},
 		{"(*StdSizes).Sizeof", Method, 5},
 		{"(*Struct).Field", Method, 5},
+		{"(*Struct).Fields", Method, 24},
 		{"(*Struct).NumFields", Method, 5},
 		{"(*Struct).String", Method, 5},
 		{"(*Struct).Tag", Method, 5},
@@ -6100,8 +6236,10 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*Tuple).Len", Method, 5},
 		{"(*Tuple).String", Method, 5},
 		{"(*Tuple).Underlying", Method, 5},
+		{"(*Tuple).Variables", Method, 24},
 		{"(*TypeList).At", Method, 18},
 		{"(*TypeList).Len", Method, 18},
+		{"(*TypeList).Types", Method, 24},
 		{"(*TypeName).Exported", Method, 5},
 		{"(*TypeName).Id", Method, 5},
 		{"(*TypeName).IsAlias", Method, 9},
@@ -6119,9 +6257,11 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*TypeParam).Underlying", Method, 18},
 		{"(*TypeParamList).At", Method, 18},
 		{"(*TypeParamList).Len", Method, 18},
+		{"(*TypeParamList).TypeParams", Method, 24},
 		{"(*Union).Len", Method, 18},
 		{"(*Union).String", Method, 18},
 		{"(*Union).Term", Method, 18},
+		{"(*Union).Terms", Method, 24},
 		{"(*Union).Underlying", Method, 18},
 		{"(*Var).Anonymous", Method, 5},
 		{"(*Var).Embedded", Method, 11},
@@ -6392,10 +6532,12 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*Hash).WriteByte", Method, 14},
 		{"(*Hash).WriteString", Method, 14},
 		{"Bytes", Func, 19},
+		{"Comparable", Func, 24},
 		{"Hash", Type, 14},
 		{"MakeSeed", Func, 14},
 		{"Seed", Type, 14},
 		{"String", Func, 19},
+		{"WriteComparable", Func, 24},
 	},
 	"html": {
 		{"EscapeString", Func, 0},
@@ -7082,6 +7224,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*JSONHandler).WithGroup", Method, 21},
 		{"(*Level).UnmarshalJSON", Method, 21},
 		{"(*Level).UnmarshalText", Method, 21},
+		{"(*LevelVar).AppendText", Method, 24},
 		{"(*LevelVar).Level", Method, 21},
 		{"(*LevelVar).MarshalText", Method, 21},
 		{"(*LevelVar).Set", Method, 21},
@@ -7110,6 +7253,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"(Attr).Equal", Method, 21},
 		{"(Attr).String", Method, 21},
 		{"(Kind).String", Method, 21},
+		{"(Level).AppendText", Method, 24},
 		{"(Level).Level", Method, 21},
 		{"(Level).MarshalJSON", Method, 21},
 		{"(Level).MarshalText", Method, 21},
@@ -7140,6 +7284,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"Debug", Func, 21},
 		{"DebugContext", Func, 21},
 		{"Default", Func, 21},
+		{"DiscardHandler", Var, 24},
 		{"Duration", Func, 21},
 		{"DurationValue", Func, 21},
 		{"Error", Func, 21},
@@ -7375,6 +7520,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*Float).Acc", Method, 5},
 		{"(*Float).Add", Method, 5},
 		{"(*Float).Append", Method, 5},
+		{"(*Float).AppendText", Method, 24},
 		{"(*Float).Cmp", Method, 5},
 		{"(*Float).Copy", Method, 5},
 		{"(*Float).Float32", Method, 5},
@@ -7421,6 +7567,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*Int).And", Method, 0},
 		{"(*Int).AndNot", Method, 0},
 		{"(*Int).Append", Method, 6},
+		{"(*Int).AppendText", Method, 24},
 		{"(*Int).Binomial", Method, 0},
 		{"(*Int).Bit", Method, 0},
 		{"(*Int).BitLen", Method, 0},
@@ -7477,6 +7624,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*Int).Xor", Method, 0},
 		{"(*Rat).Abs", Method, 0},
 		{"(*Rat).Add", Method, 0},
+		{"(*Rat).AppendText", Method, 24},
 		{"(*Rat).Cmp", Method, 0},
 		{"(*Rat).Denom", Method, 0},
 		{"(*Rat).Float32", Method, 4},
@@ -7659,11 +7807,13 @@ var PackageSymbols = map[string][]Symbol{
 		{"Zipf", Type, 0},
 	},
 	"math/rand/v2": {
+		{"(*ChaCha8).AppendBinary", Method, 24},
 		{"(*ChaCha8).MarshalBinary", Method, 22},
 		{"(*ChaCha8).Read", Method, 23},
 		{"(*ChaCha8).Seed", Method, 22},
 		{"(*ChaCha8).Uint64", Method, 22},
 		{"(*ChaCha8).UnmarshalBinary", Method, 22},
+		{"(*PCG).AppendBinary", Method, 24},
 		{"(*PCG).MarshalBinary", Method, 22},
 		{"(*PCG).Seed", Method, 22},
 		{"(*PCG).Uint64", Method, 22},
@@ -7931,6 +8081,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*UnixListener).SyscallConn", Method, 10},
 		{"(Flags).String", Method, 0},
 		{"(HardwareAddr).String", Method, 0},
+		{"(IP).AppendText", Method, 24},
 		{"(IP).DefaultMask", Method, 0},
 		{"(IP).Equal", Method, 0},
 		{"(IP).IsGlobalUnicast", Method, 0},
@@ -8131,6 +8282,9 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*MaxBytesError).Error", Method, 19},
 		{"(*ProtocolError).Error", Method, 0},
 		{"(*ProtocolError).Is", Method, 21},
+		{"(*Protocols).SetHTTP1", Method, 24},
+		{"(*Protocols).SetHTTP2", Method, 24},
+		{"(*Protocols).SetUnencryptedHTTP2", Method, 24},
 		{"(*Request).AddCookie", Method, 0},
 		{"(*Request).BasicAuth", Method, 4},
 		{"(*Request).Clone", Method, 13},
@@ -8190,6 +8344,10 @@ var PackageSymbols = map[string][]Symbol{
 		{"(Header).Values", Method, 14},
 		{"(Header).Write", Method, 0},
 		{"(Header).WriteSubset", Method, 0},
+		{"(Protocols).HTTP1", Method, 24},
+		{"(Protocols).HTTP2", Method, 24},
+		{"(Protocols).String", Method, 24},
+		{"(Protocols).UnencryptedHTTP2", Method, 24},
 		{"AllowQuerySemicolons", Func, 17},
 		{"CanonicalHeaderKey", Func, 0},
 		{"Client", Type, 0},
@@ -8252,6 +8410,18 @@ var PackageSymbols = map[string][]Symbol{
 		{"FileSystem", Type, 0},
 		{"Flusher", Type, 0},
 		{"Get", Func, 0},
+		{"HTTP2Config", Type, 24},
+		{"HTTP2Config.CountError", Field, 24},
+		{"HTTP2Config.MaxConcurrentStreams", Field, 24},
+		{"HTTP2Config.MaxDecoderHeaderTableSize", Field, 24},
+		{"HTTP2Config.MaxEncoderHeaderTableSize", Field, 24},
+		{"HTTP2Config.MaxReadFrameSize", Field, 24},
+		{"HTTP2Config.MaxReceiveBufferPerConnection", Field, 24},
+		{"HTTP2Config.MaxReceiveBufferPerStream", Field, 24},
+		{"HTTP2Config.PermitProhibitedCipherSuites", Field, 24},
+		{"HTTP2Config.PingTimeout", Field, 24},
+		{"HTTP2Config.SendPingTimeout", Field, 24},
+		{"HTTP2Config.WriteByteTimeout", Field, 24},
 		{"Handle", Func, 0},
 		{"HandleFunc", Func, 0},
 		{"Handler", Type, 0},
@@ -8292,6 +8462,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"PostForm", Func, 0},
 		{"ProtocolError", Type, 0},
 		{"ProtocolError.ErrorString", Field, 0},
+		{"Protocols", Type, 24},
 		{"ProxyFromEnvironment", Func, 0},
 		{"ProxyURL", Func, 0},
 		{"PushOptions", Type, 8},
@@ -8361,9 +8532,11 @@ var PackageSymbols = map[string][]Symbol{
 		{"Server.ConnState", Field, 3},
 		{"Server.DisableGeneralOptionsHandler", Field, 20},
 		{"Server.ErrorLog", Field, 3},
+		{"Server.HTTP2", Field, 24},
 		{"Server.Handler", Field, 0},
 		{"Server.IdleTimeout", Field, 8},
 		{"Server.MaxHeaderBytes", Field, 0},
+		{"Server.Protocols", Field, 24},
 		{"Server.ReadHeaderTimeout", Field, 8},
 		{"Server.ReadTimeout", Field, 0},
 		{"Server.TLSConfig", Field, 0},
@@ -8453,12 +8626,14 @@ var PackageSymbols = map[string][]Symbol{
 		{"Transport.ExpectContinueTimeout", Field, 6},
 		{"Transport.ForceAttemptHTTP2", Field, 13},
 		{"Transport.GetProxyConnectHeader", Field, 16},
+		{"Transport.HTTP2", Field, 24},
 		{"Transport.IdleConnTimeout", Field, 7},
 		{"Transport.MaxConnsPerHost", Field, 11},
 		{"Transport.MaxIdleConns", Field, 7},
 		{"Transport.MaxIdleConnsPerHost", Field, 0},
 		{"Transport.MaxResponseHeaderBytes", Field, 7},
 		{"Transport.OnProxyConnectResponse", Field, 20},
+		{"Transport.Protocols", Field, 24},
 		{"Transport.Proxy", Field, 0},
 		{"Transport.ProxyConnectHeader", Field, 8},
 		{"Transport.ReadBufferSize", Field, 13},
@@ -8646,6 +8821,8 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*AddrPort).UnmarshalText", Method, 18},
 		{"(*Prefix).UnmarshalBinary", Method, 18},
 		{"(*Prefix).UnmarshalText", Method, 18},
+		{"(Addr).AppendBinary", Method, 24},
+		{"(Addr).AppendText", Method, 24},
 		{"(Addr).AppendTo", Method, 18},
 		{"(Addr).As16", Method, 18},
 		{"(Addr).As4", Method, 18},
@@ -8676,6 +8853,8 @@ var PackageSymbols = map[string][]Symbol{
 		{"(Addr).WithZone", Method, 18},
 		{"(Addr).Zone", Method, 18},
 		{"(AddrPort).Addr", Method, 18},
+		{"(AddrPort).AppendBinary", Method, 24},
+		{"(AddrPort).AppendText", Method, 24},
 		{"(AddrPort).AppendTo", Method, 18},
 		{"(AddrPort).Compare", Method, 22},
 		{"(AddrPort).IsValid", Method, 18},
@@ -8684,6 +8863,8 @@ var PackageSymbols = map[string][]Symbol{
 		{"(AddrPort).Port", Method, 18},
 		{"(AddrPort).String", Method, 18},
 		{"(Prefix).Addr", Method, 18},
+		{"(Prefix).AppendBinary", Method, 24},
+		{"(Prefix).AppendText", Method, 24},
 		{"(Prefix).AppendTo", Method, 18},
 		{"(Prefix).Bits", Method, 18},
 		{"(Prefix).Contains", Method, 18},
@@ -8868,6 +9049,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*Error).Temporary", Method, 6},
 		{"(*Error).Timeout", Method, 6},
 		{"(*Error).Unwrap", Method, 13},
+		{"(*URL).AppendBinary", Method, 24},
 		{"(*URL).EscapedFragment", Method, 15},
 		{"(*URL).EscapedPath", Method, 5},
 		{"(*URL).Hostname", Method, 8},
@@ -8967,6 +9149,17 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*ProcessState).SysUsage", Method, 0},
 		{"(*ProcessState).SystemTime", Method, 0},
 		{"(*ProcessState).UserTime", Method, 0},
+		{"(*Root).Close", Method, 24},
+		{"(*Root).Create", Method, 24},
+		{"(*Root).FS", Method, 24},
+		{"(*Root).Lstat", Method, 24},
+		{"(*Root).Mkdir", Method, 24},
+		{"(*Root).Name", Method, 24},
+		{"(*Root).Open", Method, 24},
+		{"(*Root).OpenFile", Method, 24},
+		{"(*Root).OpenRoot", Method, 24},
+		{"(*Root).Remove", Method, 24},
+		{"(*Root).Stat", Method, 24},
 		{"(*SyscallError).Error", Method, 0},
 		{"(*SyscallError).Timeout", Method, 10},
 		{"(*SyscallError).Unwrap", Method, 13},
@@ -9060,6 +9253,8 @@ var PackageSymbols = map[string][]Symbol{
 		{"O_WRONLY", Const, 0},
 		{"Open", Func, 0},
 		{"OpenFile", Func, 0},
+		{"OpenInRoot", Func, 24},
+		{"OpenRoot", Func, 24},
 		{"PathError", Type, 0},
 		{"PathError.Err", Field, 0},
 		{"PathError.Op", Field, 0},
@@ -9081,6 +9276,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"Remove", Func, 0},
 		{"RemoveAll", Func, 0},
 		{"Rename", Func, 0},
+		{"Root", Type, 24},
 		{"SEEK_CUR", Const, 0},
 		{"SEEK_END", Const, 0},
 		{"SEEK_SET", Const, 0},
@@ -9422,6 +9618,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"Zero", Func, 0},
 	},
 	"regexp": {
+		{"(*Regexp).AppendText", Method, 24},
 		{"(*Regexp).Copy", Method, 6},
 		{"(*Regexp).Expand", Method, 0},
 		{"(*Regexp).ExpandString", Method, 0},
@@ -9602,6 +9799,8 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*StackRecord).Stack", Method, 0},
 		{"(*TypeAssertionError).Error", Method, 0},
 		{"(*TypeAssertionError).RuntimeError", Method, 0},
+		{"(Cleanup).Stop", Method, 24},
+		{"AddCleanup", Func, 24},
 		{"BlockProfile", Func, 1},
 		{"BlockProfileRecord", Type, 1},
 		{"BlockProfileRecord.Count", Field, 1},
@@ -9612,6 +9811,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"Caller", Func, 0},
 		{"Callers", Func, 0},
 		{"CallersFrames", Func, 7},
+		{"Cleanup", Type, 24},
 		{"Compiler", Const, 0},
 		{"Error", Type, 0},
 		{"Frame", Type, 7},
@@ -9974,6 +10174,8 @@ var PackageSymbols = map[string][]Symbol{
 		{"EqualFold", Func, 0},
 		{"Fields", Func, 0},
 		{"FieldsFunc", Func, 0},
+		{"FieldsFuncSeq", Func, 24},
+		{"FieldsSeq", Func, 24},
 		{"HasPrefix", Func, 0},
 		{"HasSuffix", Func, 0},
 		{"Index", Func, 0},
@@ -9986,6 +10188,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"LastIndexAny", Func, 0},
 		{"LastIndexByte", Func, 5},
 		{"LastIndexFunc", Func, 0},
+		{"Lines", Func, 24},
 		{"Map", Func, 0},
 		{"NewReader", Func, 0},
 		{"NewReplacer", Func, 0},
@@ -9997,7 +10200,9 @@ var PackageSymbols = map[string][]Symbol{
 		{"Split", Func, 0},
 		{"SplitAfter", Func, 0},
 		{"SplitAfterN", Func, 0},
+		{"SplitAfterSeq", Func, 24},
 		{"SplitN", Func, 0},
+		{"SplitSeq", Func, 24},
 		{"Title", Func, 0},
 		{"ToLower", Func, 0},
 		{"ToLowerSpecial", Func, 0},
@@ -16413,7 +16618,9 @@ var PackageSymbols = map[string][]Symbol{
 		{"ValueOf", Func, 0},
 	},
 	"testing": {
+		{"(*B).Chdir", Method, 24},
 		{"(*B).Cleanup", Method, 14},
+		{"(*B).Context", Method, 24},
 		{"(*B).Elapsed", Method, 20},
 		{"(*B).Error", Method, 0},
 		{"(*B).Errorf", Method, 0},
@@ -16425,6 +16632,7 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*B).Helper", Method, 9},
 		{"(*B).Log", Method, 0},
 		{"(*B).Logf", Method, 0},
+		{"(*B).Loop", Method, 24},
 		{"(*B).Name", Method, 8},
 		{"(*B).ReportAllocs", Method, 1},
 		{"(*B).ReportMetric", Method, 13},
@@ -16442,7 +16650,9 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*B).StopTimer", Method, 0},
 		{"(*B).TempDir", Method, 15},
 		{"(*F).Add", Method, 18},
+		{"(*F).Chdir", Method, 24},
 		{"(*F).Cleanup", Method, 18},
+		{"(*F).Context", Method, 24},
 		{"(*F).Error", Method, 18},
 		{"(*F).Errorf", Method, 18},
 		{"(*F).Fail", Method, 18},
@@ -16463,7 +16673,9 @@ var PackageSymbols = map[string][]Symbol{
 		{"(*F).TempDir", Method, 18},
 		{"(*M).Run", Method, 4},
 		{"(*PB).Next", Method, 3},
+		{"(*T).Chdir", Method, 24},
 		{"(*T).Cleanup", Method, 14},
+		{"(*T).Context", Method, 24},
 		{"(*T).Deadline", Method, 15},
 		{"(*T).Error", Method, 0},
 		{"(*T).Errorf", Method, 0},
@@ -16954,7 +17166,9 @@ var PackageSymbols = map[string][]Symbol{
 		{"(Time).Add", Method, 0},
 		{"(Time).AddDate", Method, 0},
 		{"(Time).After", Method, 0},
+		{"(Time).AppendBinary", Method, 24},
 		{"(Time).AppendFormat", Method, 5},
+		{"(Time).AppendText", Method, 24},
 		{"(Time).Before", Method, 0},
 		{"(Time).Clock", Method, 0},
 		{"(Time).Compare", Method, 20},
@@ -17428,4 +17642,9 @@ var PackageSymbols = map[string][]Symbol{
 		{"String", Func, 0},
 		{"StringData", Func, 0},
 	},
+	"weak": {
+		{"(Pointer).Value", Method, 24},
+		{"Make", Func, 24},
+		{"Pointer", Type, 24},
+	},
 }
diff --git a/vendor/golang.org/x/tools/internal/tokeninternal/tokeninternal.go b/vendor/golang.org/x/tools/internal/tokeninternal/tokeninternal.go
deleted file mode 100644
index ff9437a36c..0000000000
--- a/vendor/golang.org/x/tools/internal/tokeninternal/tokeninternal.go
+++ /dev/null
@@ -1,137 +0,0 @@
-// Copyright 2023 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 tokeninternal provides access to some internal features of the token
-// package.
-package tokeninternal
-
-import (
-	"fmt"
-	"go/token"
-	"sort"
-	"sync"
-	"unsafe"
-)
-
-// GetLines returns the table of line-start offsets from a token.File.
-func GetLines(file *token.File) []int {
-	// token.File has a Lines method on Go 1.21 and later.
-	if file, ok := (interface{})(file).(interface{ Lines() []int }); ok {
-		return file.Lines()
-	}
-
-	// This declaration must match that of token.File.
-	// This creates a risk of dependency skew.
-	// For now we check that the size of the two
-	// declarations is the same, on the (fragile) assumption
-	// that future changes would add fields.
-	type tokenFile119 struct {
-		_     string
-		_     int
-		_     int
-		mu    sync.Mutex // we're not complete monsters
-		lines []int
-		_     []struct{}
-	}
-
-	if unsafe.Sizeof(*file) != unsafe.Sizeof(tokenFile119{}) {
-		panic("unexpected token.File size")
-	}
-	var ptr *tokenFile119
-	type uP = unsafe.Pointer
-	*(*uP)(uP(&ptr)) = uP(file)
-	ptr.mu.Lock()
-	defer ptr.mu.Unlock()
-	return ptr.lines
-}
-
-// AddExistingFiles adds the specified files to the FileSet if they
-// are not already present. It panics if any pair of files in the
-// resulting FileSet would overlap.
-func AddExistingFiles(fset *token.FileSet, files []*token.File) {
-	// Punch through the FileSet encapsulation.
-	type tokenFileSet struct {
-		// This type remained essentially consistent from go1.16 to go1.21.
-		mutex sync.RWMutex
-		base  int
-		files []*token.File
-		_     *token.File // changed to atomic.Pointer[token.File] in go1.19
-	}
-
-	// If the size of token.FileSet changes, this will fail to compile.
-	const delta = int64(unsafe.Sizeof(tokenFileSet{})) - int64(unsafe.Sizeof(token.FileSet{}))
-	var _ [-delta * delta]int
-
-	type uP = unsafe.Pointer
-	var ptr *tokenFileSet
-	*(*uP)(uP(&ptr)) = uP(fset)
-	ptr.mutex.Lock()
-	defer ptr.mutex.Unlock()
-
-	// Merge and sort.
-	newFiles := append(ptr.files, files...)
-	sort.Slice(newFiles, func(i, j int) bool {
-		return newFiles[i].Base() < newFiles[j].Base()
-	})
-
-	// Reject overlapping files.
-	// Discard adjacent identical files.
-	out := newFiles[:0]
-	for i, file := range newFiles {
-		if i > 0 {
-			prev := newFiles[i-1]
-			if file == prev {
-				continue
-			}
-			if prev.Base()+prev.Size()+1 > file.Base() {
-				panic(fmt.Sprintf("file %s (%d-%d) overlaps with file %s (%d-%d)",
-					prev.Name(), prev.Base(), prev.Base()+prev.Size(),
-					file.Name(), file.Base(), file.Base()+file.Size()))
-			}
-		}
-		out = append(out, file)
-	}
-	newFiles = out
-
-	ptr.files = newFiles
-
-	// Advance FileSet.Base().
-	if len(newFiles) > 0 {
-		last := newFiles[len(newFiles)-1]
-		newBase := last.Base() + last.Size() + 1
-		if ptr.base < newBase {
-			ptr.base = newBase
-		}
-	}
-}
-
-// FileSetFor returns a new FileSet containing a sequence of new Files with
-// the same base, size, and line as the input files, for use in APIs that
-// require a FileSet.
-//
-// Precondition: the input files must be non-overlapping, and sorted in order
-// of their Base.
-func FileSetFor(files ...*token.File) *token.FileSet {
-	fset := token.NewFileSet()
-	for _, f := range files {
-		f2 := fset.AddFile(f.Name(), f.Base(), f.Size())
-		lines := GetLines(f)
-		f2.SetLines(lines)
-	}
-	return fset
-}
-
-// CloneFileSet creates a new FileSet holding all files in fset. It does not
-// create copies of the token.Files in fset: they are added to the resulting
-// FileSet unmodified.
-func CloneFileSet(fset *token.FileSet) *token.FileSet {
-	var files []*token.File
-	fset.Iterate(func(f *token.File) bool {
-		files = append(files, f)
-		return true
-	})
-	newFileSet := token.NewFileSet()
-	AddExistingFiles(newFileSet, files)
-	return newFileSet
-}
diff --git a/vendor/golang.org/x/tools/internal/typeparams/common.go b/vendor/golang.org/x/tools/internal/typeparams/common.go
index 89bd256dc6..cdae2b8e81 100644
--- a/vendor/golang.org/x/tools/internal/typeparams/common.go
+++ b/vendor/golang.org/x/tools/internal/typeparams/common.go
@@ -16,8 +16,6 @@ import (
 	"go/ast"
 	"go/token"
 	"go/types"
-
-	"golang.org/x/tools/internal/aliases"
 )
 
 // UnpackIndexExpr extracts data from AST nodes that represent index
@@ -65,78 +63,6 @@ func PackIndexExpr(x ast.Expr, lbrack token.Pos, indices []ast.Expr, rbrack toke
 
 // IsTypeParam reports whether t is a type parameter (or an alias of one).
 func IsTypeParam(t types.Type) bool {
-	_, ok := aliases.Unalias(t).(*types.TypeParam)
+	_, ok := types.Unalias(t).(*types.TypeParam)
 	return ok
 }
-
-// GenericAssignableTo is a generalization of types.AssignableTo that
-// implements the following rule for uninstantiated generic types:
-//
-// If V and T are generic named types, then V is considered assignable to T if,
-// for every possible instantiation of V[A_1, ..., A_N], the instantiation
-// T[A_1, ..., A_N] is valid and V[A_1, ..., A_N] implements T[A_1, ..., A_N].
-//
-// If T has structural constraints, they must be satisfied by V.
-//
-// For example, consider the following type declarations:
-//
-//	type Interface[T any] interface {
-//		Accept(T)
-//	}
-//
-//	type Container[T any] struct {
-//		Element T
-//	}
-//
-//	func (c Container[T]) Accept(t T) { c.Element = t }
-//
-// In this case, GenericAssignableTo reports that instantiations of Container
-// are assignable to the corresponding instantiation of Interface.
-func GenericAssignableTo(ctxt *types.Context, V, T types.Type) bool {
-	V = aliases.Unalias(V)
-	T = aliases.Unalias(T)
-
-	// If V and T are not both named, or do not have matching non-empty type
-	// parameter lists, fall back on types.AssignableTo.
-
-	VN, Vnamed := V.(*types.Named)
-	TN, Tnamed := T.(*types.Named)
-	if !Vnamed || !Tnamed {
-		return types.AssignableTo(V, T)
-	}
-
-	vtparams := VN.TypeParams()
-	ttparams := TN.TypeParams()
-	if vtparams.Len() == 0 || vtparams.Len() != ttparams.Len() || VN.TypeArgs().Len() != 0 || TN.TypeArgs().Len() != 0 {
-		return types.AssignableTo(V, T)
-	}
-
-	// V and T have the same (non-zero) number of type params. Instantiate both
-	// with the type parameters of V. This must always succeed for V, and will
-	// succeed for T if and only if the type set of each type parameter of V is a
-	// subset of the type set of the corresponding type parameter of T, meaning
-	// that every instantiation of V corresponds to a valid instantiation of T.
-
-	// Minor optimization: ensure we share a context across the two
-	// instantiations below.
-	if ctxt == nil {
-		ctxt = types.NewContext()
-	}
-
-	var targs []types.Type
-	for i := 0; i < vtparams.Len(); i++ {
-		targs = append(targs, vtparams.At(i))
-	}
-
-	vinst, err := types.Instantiate(ctxt, V, targs, true)
-	if err != nil {
-		panic("type parameters should satisfy their own constraints")
-	}
-
-	tinst, err := types.Instantiate(ctxt, T, targs, true)
-	if err != nil {
-		return false
-	}
-
-	return types.AssignableTo(vinst, tinst)
-}
diff --git a/vendor/golang.org/x/tools/internal/typeparams/free.go b/vendor/golang.org/x/tools/internal/typeparams/free.go
index a1d138226c..0ade5c2949 100644
--- a/vendor/golang.org/x/tools/internal/typeparams/free.go
+++ b/vendor/golang.org/x/tools/internal/typeparams/free.go
@@ -37,8 +37,20 @@ func (w *Free) Has(typ types.Type) (res bool) {
 	case nil, *types.Basic: // TODO(gri) should nil be handled here?
 		break
 
-	case *aliases.Alias:
-		return w.Has(aliases.Unalias(t))
+	case *types.Alias:
+		if aliases.TypeParams(t).Len() > aliases.TypeArgs(t).Len() {
+			return true // This is an uninstantiated Alias.
+		}
+		// The expansion of an alias can have free type parameters,
+		// whether or not the alias itself has type parameters:
+		//
+		//   func _[K comparable]() {
+		//     type Set      = map[K]bool // free(Set)      = {K}
+		//     type MapTo[V] = map[K]V    // free(Map[foo]) = {V}
+		//   }
+		//
+		// So, we must Unalias.
+		return w.Has(types.Unalias(t))
 
 	case *types.Array:
 		return w.Has(t.Elem())
@@ -98,9 +110,8 @@ func (w *Free) Has(typ types.Type) (res bool) {
 
 	case *types.Named:
 		args := t.TypeArgs()
-		// TODO(taking): this does not match go/types/infer.go. Check with rfindley.
 		if params := t.TypeParams(); params.Len() > args.Len() {
-			return true
+			return true // this is an uninstantiated named type.
 		}
 		for i, n := 0, args.Len(); i < n; i++ {
 			if w.Has(args.At(i)) {
diff --git a/vendor/golang.org/x/tools/internal/typesinternal/element.go b/vendor/golang.org/x/tools/internal/typesinternal/element.go
new file mode 100644
index 0000000000..4957f02164
--- /dev/null
+++ b/vendor/golang.org/x/tools/internal/typesinternal/element.go
@@ -0,0 +1,133 @@
+// Copyright 2024 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 typesinternal
+
+import (
+	"fmt"
+	"go/types"
+
+	"golang.org/x/tools/go/types/typeutil"
+)
+
+// ForEachElement calls f for type T and each type reachable from its
+// type through reflection. It does this by recursively stripping off
+// type constructors; in addition, for each named type N, the type *N
+// is added to the result as it may have additional methods.
+//
+// The caller must provide an initially empty set used to de-duplicate
+// identical types, potentially across multiple calls to ForEachElement.
+// (Its final value holds all the elements seen, matching the arguments
+// passed to f.)
+//
+// TODO(adonovan): share/harmonize with go/callgraph/rta.
+func ForEachElement(rtypes *typeutil.Map, msets *typeutil.MethodSetCache, T types.Type, f func(types.Type)) {
+	var visit func(T types.Type, skip bool)
+	visit = func(T types.Type, skip bool) {
+		if !skip {
+			if seen, _ := rtypes.Set(T, true).(bool); seen {
+				return // de-dup
+			}
+
+			f(T) // notify caller of new element type
+		}
+
+		// Recursion over signatures of each method.
+		tmset := msets.MethodSet(T)
+		for i := 0; i < tmset.Len(); i++ {
+			sig := tmset.At(i).Type().(*types.Signature)
+			// It is tempting to call visit(sig, false)
+			// but, as noted in golang.org/cl/65450043,
+			// the Signature.Recv field is ignored by
+			// types.Identical and typeutil.Map, which
+			// is confusing at best.
+			//
+			// More importantly, the true signature rtype
+			// reachable from a method using reflection
+			// has no receiver but an extra ordinary parameter.
+			// For the Read method of io.Reader we want:
+			//   func(Reader, []byte) (int, error)
+			// but here sig is:
+			//   func([]byte) (int, error)
+			// with .Recv = Reader (though it is hard to
+			// notice because it doesn't affect Signature.String
+			// or types.Identical).
+			//
+			// TODO(adonovan): construct and visit the correct
+			// non-method signature with an extra parameter
+			// (though since unnamed func types have no methods
+			// there is essentially no actual demand for this).
+			//
+			// TODO(adonovan): document whether or not it is
+			// safe to skip non-exported methods (as RTA does).
+			visit(sig.Params(), true)  // skip the Tuple
+			visit(sig.Results(), true) // skip the Tuple
+		}
+
+		switch T := T.(type) {
+		case *types.Alias:
+			visit(types.Unalias(T), skip) // emulates the pre-Alias behavior
+
+		case *types.Basic:
+			// nop
+
+		case *types.Interface:
+			// nop---handled by recursion over method set.
+
+		case *types.Pointer:
+			visit(T.Elem(), false)
+
+		case *types.Slice:
+			visit(T.Elem(), false)
+
+		case *types.Chan:
+			visit(T.Elem(), false)
+
+		case *types.Map:
+			visit(T.Key(), false)
+			visit(T.Elem(), false)
+
+		case *types.Signature:
+			if T.Recv() != nil {
+				panic(fmt.Sprintf("Signature %s has Recv %s", T, T.Recv()))
+			}
+			visit(T.Params(), true)  // skip the Tuple
+			visit(T.Results(), true) // skip the Tuple
+
+		case *types.Named:
+			// A pointer-to-named type can be derived from a named
+			// type via reflection.  It may have methods too.
+			visit(types.NewPointer(T), false)
+
+			// Consider 'type T struct{S}' where S has methods.
+			// Reflection provides no way to get from T to struct{S},
+			// only to S, so the method set of struct{S} is unwanted,
+			// so set 'skip' flag during recursion.
+			visit(T.Underlying(), true) // skip the unnamed type
+
+		case *types.Array:
+			visit(T.Elem(), false)
+
+		case *types.Struct:
+			for i, n := 0, T.NumFields(); i < n; i++ {
+				// TODO(adonovan): document whether or not
+				// it is safe to skip non-exported fields.
+				visit(T.Field(i).Type(), false)
+			}
+
+		case *types.Tuple:
+			for i, n := 0, T.Len(); i < n; i++ {
+				visit(T.At(i).Type(), false)
+			}
+
+		case *types.TypeParam, *types.Union:
+			// forEachReachable must not be called on parameterized types.
+			panic(T)
+
+		default:
+			panic(T)
+		}
+	}
+	visit(T, false)
+}
diff --git a/vendor/golang.org/x/tools/internal/typesinternal/qualifier.go b/vendor/golang.org/x/tools/internal/typesinternal/qualifier.go
new file mode 100644
index 0000000000..b64f714eb3
--- /dev/null
+++ b/vendor/golang.org/x/tools/internal/typesinternal/qualifier.go
@@ -0,0 +1,46 @@
+// Copyright 2024 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 typesinternal
+
+import (
+	"go/ast"
+	"go/types"
+	"strconv"
+)
+
+// FileQualifier returns a [types.Qualifier] function that qualifies
+// imported symbols appropriately based on the import environment of a given
+// file.
+// If the same package is imported multiple times, the last appearance is
+// recorded.
+func FileQualifier(f *ast.File, pkg *types.Package) types.Qualifier {
+	// Construct mapping of import paths to their defined names.
+	// It is only necessary to look at renaming imports.
+	imports := make(map[string]string)
+	for _, imp := range f.Imports {
+		if imp.Name != nil && imp.Name.Name != "_" {
+			path, _ := strconv.Unquote(imp.Path.Value)
+			imports[path] = imp.Name.Name
+		}
+	}
+
+	// Define qualifier to replace full package paths with names of the imports.
+	return func(p *types.Package) string {
+		if p == nil || p == pkg {
+			return ""
+		}
+
+		if name, ok := imports[p.Path()]; ok {
+			if name == "." {
+				return ""
+			} else {
+				return name
+			}
+		}
+
+		// If there is no local renaming, fall back to the package name.
+		return p.Name()
+	}
+}
diff --git a/vendor/golang.org/x/tools/internal/typesinternal/recv.go b/vendor/golang.org/x/tools/internal/typesinternal/recv.go
index fea7c8b75e..e54accc69a 100644
--- a/vendor/golang.org/x/tools/internal/typesinternal/recv.go
+++ b/vendor/golang.org/x/tools/internal/typesinternal/recv.go
@@ -6,20 +6,20 @@ package typesinternal
 
 import (
 	"go/types"
-
-	"golang.org/x/tools/internal/aliases"
 )
 
 // ReceiverNamed returns the named type (if any) associated with the
 // type of recv, which may be of the form N or *N, or aliases thereof.
 // It also reports whether a Pointer was present.
+//
+// The named result may be nil in ill-typed code.
 func ReceiverNamed(recv *types.Var) (isPtr bool, named *types.Named) {
 	t := recv.Type()
-	if ptr, ok := aliases.Unalias(t).(*types.Pointer); ok {
+	if ptr, ok := types.Unalias(t).(*types.Pointer); ok {
 		isPtr = true
 		t = ptr.Elem()
 	}
-	named, _ = aliases.Unalias(t).(*types.Named)
+	named, _ = types.Unalias(t).(*types.Named)
 	return
 }
 
@@ -36,7 +36,7 @@ func ReceiverNamed(recv *types.Var) (isPtr bool, named *types.Named) {
 // indirection from the type, regardless of named types (analogous to
 // a LOAD instruction).
 func Unpointer(t types.Type) types.Type {
-	if ptr, ok := aliases.Unalias(t).(*types.Pointer); ok {
+	if ptr, ok := types.Unalias(t).(*types.Pointer); ok {
 		return ptr.Elem()
 	}
 	return t
diff --git a/vendor/golang.org/x/tools/internal/typesinternal/types.go b/vendor/golang.org/x/tools/internal/typesinternal/types.go
index 8392328612..a93d51f988 100644
--- a/vendor/golang.org/x/tools/internal/typesinternal/types.go
+++ b/vendor/golang.org/x/tools/internal/typesinternal/types.go
@@ -11,6 +11,8 @@ import (
 	"go/types"
 	"reflect"
 	"unsafe"
+
+	"golang.org/x/tools/internal/aliases"
 )
 
 func SetUsesCgo(conf *types.Config) bool {
@@ -63,3 +65,58 @@ func NameRelativeTo(pkg *types.Package) types.Qualifier {
 		return other.Name()
 	}
 }
+
+// A NamedOrAlias is a [types.Type] that is named (as
+// defined by the spec) and capable of bearing type parameters: it
+// abstracts aliases ([types.Alias]) and defined types
+// ([types.Named]).
+//
+// Every type declared by an explicit "type" declaration is a
+// NamedOrAlias. (Built-in type symbols may additionally
+// have type [types.Basic], which is not a NamedOrAlias,
+// though the spec regards them as "named".)
+//
+// NamedOrAlias cannot expose the Origin method, because
+// [types.Alias.Origin] and [types.Named.Origin] have different
+// (covariant) result types; use [Origin] instead.
+type NamedOrAlias interface {
+	types.Type
+	Obj() *types.TypeName
+	// TODO(hxjiang): add method TypeArgs() *types.TypeList after stop supporting go1.22.
+}
+
+// TypeParams is a light shim around t.TypeParams().
+// (go/types.Alias).TypeParams requires >= 1.23.
+func TypeParams(t NamedOrAlias) *types.TypeParamList {
+	switch t := t.(type) {
+	case *types.Alias:
+		return aliases.TypeParams(t)
+	case *types.Named:
+		return t.TypeParams()
+	}
+	return nil
+}
+
+// TypeArgs is a light shim around t.TypeArgs().
+// (go/types.Alias).TypeArgs requires >= 1.23.
+func TypeArgs(t NamedOrAlias) *types.TypeList {
+	switch t := t.(type) {
+	case *types.Alias:
+		return aliases.TypeArgs(t)
+	case *types.Named:
+		return t.TypeArgs()
+	}
+	return nil
+}
+
+// Origin returns the generic type of the Named or Alias type t if it
+// is instantiated, otherwise it returns t.
+func Origin(t NamedOrAlias) NamedOrAlias {
+	switch t := t.(type) {
+	case *types.Alias:
+		return aliases.Origin(t)
+	case *types.Named:
+		return t.Origin()
+	}
+	return t
+}
diff --git a/vendor/golang.org/x/tools/internal/typesinternal/zerovalue.go b/vendor/golang.org/x/tools/internal/typesinternal/zerovalue.go
new file mode 100644
index 0000000000..d272949c17
--- /dev/null
+++ b/vendor/golang.org/x/tools/internal/typesinternal/zerovalue.go
@@ -0,0 +1,392 @@
+// Copyright 2024 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 typesinternal
+
+import (
+	"fmt"
+	"go/ast"
+	"go/token"
+	"go/types"
+	"strings"
+)
+
+// ZeroString returns the string representation of the zero value for any type t.
+// The boolean result indicates whether the type is or contains an invalid type
+// or a non-basic (constraint) interface type.
+//
+// Even for invalid input types, ZeroString may return a partially correct
+// string representation. The caller should use the returned isValid boolean
+// to determine the validity of the expression.
+//
+// When assigning to a wider type (such as 'any'), it's the caller's
+// responsibility to handle any necessary type conversions.
+//
+// This string can be used on the right-hand side of an assignment where the
+// left-hand side has that explicit type.
+// References to named types are qualified by an appropriate (optional)
+// qualifier function.
+// Exception: This does not apply to tuples. Their string representation is
+// informational only and cannot be used in an assignment.
+//
+// See [ZeroExpr] for a variant that returns an [ast.Expr].
+func ZeroString(t types.Type, qual types.Qualifier) (_ string, isValid bool) {
+	switch t := t.(type) {
+	case *types.Basic:
+		switch {
+		case t.Info()&types.IsBoolean != 0:
+			return "false", true
+		case t.Info()&types.IsNumeric != 0:
+			return "0", true
+		case t.Info()&types.IsString != 0:
+			return `""`, true
+		case t.Kind() == types.UnsafePointer:
+			fallthrough
+		case t.Kind() == types.UntypedNil:
+			return "nil", true
+		case t.Kind() == types.Invalid:
+			return "invalid", false
+		default:
+			panic(fmt.Sprintf("ZeroString for unexpected type %v", t))
+		}
+
+	case *types.Pointer, *types.Slice, *types.Chan, *types.Map, *types.Signature:
+		return "nil", true
+
+	case *types.Interface:
+		if !t.IsMethodSet() {
+			return "invalid", false
+		}
+		return "nil", true
+
+	case *types.Named:
+		switch under := t.Underlying().(type) {
+		case *types.Struct, *types.Array:
+			return types.TypeString(t, qual) + "{}", true
+		default:
+			return ZeroString(under, qual)
+		}
+
+	case *types.Alias:
+		switch t.Underlying().(type) {
+		case *types.Struct, *types.Array:
+			return types.TypeString(t, qual) + "{}", true
+		default:
+			// A type parameter can have alias but alias type's underlying type
+			// can never be a type parameter.
+			// Use types.Unalias to preserve the info of type parameter instead
+			// of call Underlying() going right through and get the underlying
+			// type of the type parameter which is always an interface.
+			return ZeroString(types.Unalias(t), qual)
+		}
+
+	case *types.Array, *types.Struct:
+		return types.TypeString(t, qual) + "{}", true
+
+	case *types.TypeParam:
+		// Assumes func new is not shadowed.
+		return "*new(" + types.TypeString(t, qual) + ")", true
+
+	case *types.Tuple:
+		// Tuples are not normal values.
+		// We are currently format as "(t[0], ..., t[n])". Could be something else.
+		isValid := true
+		components := make([]string, t.Len())
+		for i := 0; i < t.Len(); i++ {
+			comp, ok := ZeroString(t.At(i).Type(), qual)
+
+			components[i] = comp
+			isValid = isValid && ok
+		}
+		return "(" + strings.Join(components, ", ") + ")", isValid
+
+	case *types.Union:
+		// Variables of these types cannot be created, so it makes
+		// no sense to ask for their zero value.
+		panic(fmt.Sprintf("invalid type for a variable: %v", t))
+
+	default:
+		panic(t) // unreachable.
+	}
+}
+
+// ZeroExpr returns the ast.Expr representation of the zero value for any type t.
+// The boolean result indicates whether the type is or contains an invalid type
+// or a non-basic (constraint) interface type.
+//
+// Even for invalid input types, ZeroExpr may return a partially correct ast.Expr
+// representation. The caller should use the returned isValid boolean to determine
+// the validity of the expression.
+//
+// This function is designed for types suitable for variables and should not be
+// used with Tuple or Union types.References to named types are qualified by an
+// appropriate (optional) qualifier function.
+//
+// See [ZeroString] for a variant that returns a string.
+func ZeroExpr(t types.Type, qual types.Qualifier) (_ ast.Expr, isValid bool) {
+	switch t := t.(type) {
+	case *types.Basic:
+		switch {
+		case t.Info()&types.IsBoolean != 0:
+			return &ast.Ident{Name: "false"}, true
+		case t.Info()&types.IsNumeric != 0:
+			return &ast.BasicLit{Kind: token.INT, Value: "0"}, true
+		case t.Info()&types.IsString != 0:
+			return &ast.BasicLit{Kind: token.STRING, Value: `""`}, true
+		case t.Kind() == types.UnsafePointer:
+			fallthrough
+		case t.Kind() == types.UntypedNil:
+			return ast.NewIdent("nil"), true
+		case t.Kind() == types.Invalid:
+			return &ast.BasicLit{Kind: token.STRING, Value: `"invalid"`}, false
+		default:
+			panic(fmt.Sprintf("ZeroExpr for unexpected type %v", t))
+		}
+
+	case *types.Pointer, *types.Slice, *types.Chan, *types.Map, *types.Signature:
+		return ast.NewIdent("nil"), true
+
+	case *types.Interface:
+		if !t.IsMethodSet() {
+			return &ast.BasicLit{Kind: token.STRING, Value: `"invalid"`}, false
+		}
+		return ast.NewIdent("nil"), true
+
+	case *types.Named:
+		switch under := t.Underlying().(type) {
+		case *types.Struct, *types.Array:
+			return &ast.CompositeLit{
+				Type: TypeExpr(t, qual),
+			}, true
+		default:
+			return ZeroExpr(under, qual)
+		}
+
+	case *types.Alias:
+		switch t.Underlying().(type) {
+		case *types.Struct, *types.Array:
+			return &ast.CompositeLit{
+				Type: TypeExpr(t, qual),
+			}, true
+		default:
+			return ZeroExpr(types.Unalias(t), qual)
+		}
+
+	case *types.Array, *types.Struct:
+		return &ast.CompositeLit{
+			Type: TypeExpr(t, qual),
+		}, true
+
+	case *types.TypeParam:
+		return &ast.StarExpr{ // *new(T)
+			X: &ast.CallExpr{
+				// Assumes func new is not shadowed.
+				Fun: ast.NewIdent("new"),
+				Args: []ast.Expr{
+					ast.NewIdent(t.Obj().Name()),
+				},
+			},
+		}, true
+
+	case *types.Tuple:
+		// Unlike ZeroString, there is no ast.Expr can express tuple by
+		// "(t[0], ..., t[n])".
+		panic(fmt.Sprintf("invalid type for a variable: %v", t))
+
+	case *types.Union:
+		// Variables of these types cannot be created, so it makes
+		// no sense to ask for their zero value.
+		panic(fmt.Sprintf("invalid type for a variable: %v", t))
+
+	default:
+		panic(t) // unreachable.
+	}
+}
+
+// IsZeroExpr uses simple syntactic heuristics to report whether expr
+// is a obvious zero value, such as 0, "", nil, or false.
+// It cannot do better without type information.
+func IsZeroExpr(expr ast.Expr) bool {
+	switch e := expr.(type) {
+	case *ast.BasicLit:
+		return e.Value == "0" || e.Value == `""`
+	case *ast.Ident:
+		return e.Name == "nil" || e.Name == "false"
+	default:
+		return false
+	}
+}
+
+// TypeExpr returns syntax for the specified type. References to named types
+// are qualified by an appropriate (optional) qualifier function.
+// It may panic for types such as Tuple or Union.
+func TypeExpr(t types.Type, qual types.Qualifier) ast.Expr {
+	switch t := t.(type) {
+	case *types.Basic:
+		switch t.Kind() {
+		case types.UnsafePointer:
+			return &ast.SelectorExpr{X: ast.NewIdent(qual(types.NewPackage("unsafe", "unsafe"))), Sel: ast.NewIdent("Pointer")}
+		default:
+			return ast.NewIdent(t.Name())
+		}
+
+	case *types.Pointer:
+		return &ast.UnaryExpr{
+			Op: token.MUL,
+			X:  TypeExpr(t.Elem(), qual),
+		}
+
+	case *types.Array:
+		return &ast.ArrayType{
+			Len: &ast.BasicLit{
+				Kind:  token.INT,
+				Value: fmt.Sprintf("%d", t.Len()),
+			},
+			Elt: TypeExpr(t.Elem(), qual),
+		}
+
+	case *types.Slice:
+		return &ast.ArrayType{
+			Elt: TypeExpr(t.Elem(), qual),
+		}
+
+	case *types.Map:
+		return &ast.MapType{
+			Key:   TypeExpr(t.Key(), qual),
+			Value: TypeExpr(t.Elem(), qual),
+		}
+
+	case *types.Chan:
+		dir := ast.ChanDir(t.Dir())
+		if t.Dir() == types.SendRecv {
+			dir = ast.SEND | ast.RECV
+		}
+		return &ast.ChanType{
+			Dir:   dir,
+			Value: TypeExpr(t.Elem(), qual),
+		}
+
+	case *types.Signature:
+		var params []*ast.Field
+		for i := 0; i < t.Params().Len(); i++ {
+			params = append(params, &ast.Field{
+				Type: TypeExpr(t.Params().At(i).Type(), qual),
+				Names: []*ast.Ident{
+					{
+						Name: t.Params().At(i).Name(),
+					},
+				},
+			})
+		}
+		if t.Variadic() {
+			last := params[len(params)-1]
+			last.Type = &ast.Ellipsis{Elt: last.Type.(*ast.ArrayType).Elt}
+		}
+		var returns []*ast.Field
+		for i := 0; i < t.Results().Len(); i++ {
+			returns = append(returns, &ast.Field{
+				Type: TypeExpr(t.Results().At(i).Type(), qual),
+			})
+		}
+		return &ast.FuncType{
+			Params: &ast.FieldList{
+				List: params,
+			},
+			Results: &ast.FieldList{
+				List: returns,
+			},
+		}
+
+	case *types.TypeParam:
+		pkgName := qual(t.Obj().Pkg())
+		if pkgName == "" || t.Obj().Pkg() == nil {
+			return ast.NewIdent(t.Obj().Name())
+		}
+		return &ast.SelectorExpr{
+			X:   ast.NewIdent(pkgName),
+			Sel: ast.NewIdent(t.Obj().Name()),
+		}
+
+	// types.TypeParam also implements interface NamedOrAlias. To differentiate,
+	// case TypeParam need to be present before case NamedOrAlias.
+	// TODO(hxjiang): remove this comment once TypeArgs() is added to interface
+	// NamedOrAlias.
+	case NamedOrAlias:
+		var expr ast.Expr = ast.NewIdent(t.Obj().Name())
+		if pkgName := qual(t.Obj().Pkg()); pkgName != "." && pkgName != "" {
+			expr = &ast.SelectorExpr{
+				X:   ast.NewIdent(pkgName),
+				Sel: expr.(*ast.Ident),
+			}
+		}
+
+		// TODO(hxjiang): call t.TypeArgs after adding method TypeArgs() to
+		// typesinternal.NamedOrAlias.
+		if hasTypeArgs, ok := t.(interface{ TypeArgs() *types.TypeList }); ok {
+			if typeArgs := hasTypeArgs.TypeArgs(); typeArgs != nil && typeArgs.Len() > 0 {
+				var indices []ast.Expr
+				for i := range typeArgs.Len() {
+					indices = append(indices, TypeExpr(typeArgs.At(i), qual))
+				}
+				expr = &ast.IndexListExpr{
+					X:       expr,
+					Indices: indices,
+				}
+			}
+		}
+
+		return expr
+
+	case *types.Struct:
+		return ast.NewIdent(t.String())
+
+	case *types.Interface:
+		return ast.NewIdent(t.String())
+
+	case *types.Union:
+		if t.Len() == 0 {
+			panic("Union type should have at least one term")
+		}
+		// Same as go/ast, the return expression will put last term in the
+		// Y field at topmost level of BinaryExpr.
+		// For union of type "float32 | float64 | int64", the structure looks
+		// similar to:
+		// {
+		// 	X: {
+		// 		X: float32,
+		// 		Op: |
+		// 		Y: float64,
+		// 	}
+		// 	Op: |,
+		// 	Y: int64,
+		// }
+		var union ast.Expr
+		for i := range t.Len() {
+			term := t.Term(i)
+			termExpr := TypeExpr(term.Type(), qual)
+			if term.Tilde() {
+				termExpr = &ast.UnaryExpr{
+					Op: token.TILDE,
+					X:  termExpr,
+				}
+			}
+			if i == 0 {
+				union = termExpr
+			} else {
+				union = &ast.BinaryExpr{
+					X:  union,
+					Op: token.OR,
+					Y:  termExpr,
+				}
+			}
+		}
+		return union
+
+	case *types.Tuple:
+		panic("invalid input type types.Tuple")
+
+	default:
+		panic("unreachable")
+	}
+}
diff --git a/vendor/golang.org/x/tools/internal/versions/constraint.go b/vendor/golang.org/x/tools/internal/versions/constraint.go
deleted file mode 100644
index 179063d484..0000000000
--- a/vendor/golang.org/x/tools/internal/versions/constraint.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2024 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 versions
-
-import "go/build/constraint"
-
-// ConstraintGoVersion is constraint.GoVersion (if built with go1.21+).
-// Otherwise nil.
-//
-// Deprecate once x/tools is after go1.21.
-var ConstraintGoVersion func(x constraint.Expr) string
diff --git a/vendor/golang.org/x/tools/internal/versions/constraint_go121.go b/vendor/golang.org/x/tools/internal/versions/constraint_go121.go
deleted file mode 100644
index 38011407d5..0000000000
--- a/vendor/golang.org/x/tools/internal/versions/constraint_go121.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2024 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 go1.21
-// +build go1.21
-
-package versions
-
-import "go/build/constraint"
-
-func init() {
-	ConstraintGoVersion = constraint.GoVersion
-}
diff --git a/vendor/golang.org/x/tools/internal/versions/toolchain.go b/vendor/golang.org/x/tools/internal/versions/toolchain.go
deleted file mode 100644
index 377bf7a53b..0000000000
--- a/vendor/golang.org/x/tools/internal/versions/toolchain.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2024 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 versions
-
-// toolchain is maximum version (<1.22) that the go toolchain used
-// to build the current tool is known to support.
-//
-// When a tool is built with >=1.22, the value of toolchain is unused.
-//
-// x/tools does not support building with go <1.18. So we take this
-// as the minimum possible maximum.
-var toolchain string = Go1_18
diff --git a/vendor/golang.org/x/tools/internal/versions/toolchain_go119.go b/vendor/golang.org/x/tools/internal/versions/toolchain_go119.go
deleted file mode 100644
index f65beed9d8..0000000000
--- a/vendor/golang.org/x/tools/internal/versions/toolchain_go119.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2024 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 go1.19
-// +build go1.19
-
-package versions
-
-func init() {
-	if Compare(toolchain, Go1_19) < 0 {
-		toolchain = Go1_19
-	}
-}
diff --git a/vendor/golang.org/x/tools/internal/versions/toolchain_go120.go b/vendor/golang.org/x/tools/internal/versions/toolchain_go120.go
deleted file mode 100644
index 1a9efa126c..0000000000
--- a/vendor/golang.org/x/tools/internal/versions/toolchain_go120.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2024 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 go1.20
-// +build go1.20
-
-package versions
-
-func init() {
-	if Compare(toolchain, Go1_20) < 0 {
-		toolchain = Go1_20
-	}
-}
diff --git a/vendor/golang.org/x/tools/internal/versions/toolchain_go121.go b/vendor/golang.org/x/tools/internal/versions/toolchain_go121.go
deleted file mode 100644
index b7ef216dfe..0000000000
--- a/vendor/golang.org/x/tools/internal/versions/toolchain_go121.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2024 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 go1.21
-// +build go1.21
-
-package versions
-
-func init() {
-	if Compare(toolchain, Go1_21) < 0 {
-		toolchain = Go1_21
-	}
-}
diff --git a/vendor/golang.org/x/tools/internal/versions/types.go b/vendor/golang.org/x/tools/internal/versions/types.go
index 562eef21fa..0fc10ce4eb 100644
--- a/vendor/golang.org/x/tools/internal/versions/types.go
+++ b/vendor/golang.org/x/tools/internal/versions/types.go
@@ -5,15 +5,29 @@
 package versions
 
 import (
+	"go/ast"
 	"go/types"
 )
 
-// GoVersion returns the Go version of the type package.
-// It returns zero if no version can be determined.
-func GoVersion(pkg *types.Package) string {
-	// TODO(taking): x/tools can call GoVersion() [from 1.21] after 1.25.
-	if pkg, ok := any(pkg).(interface{ GoVersion() string }); ok {
-		return pkg.GoVersion()
+// FileVersion returns a file's Go version.
+// The reported version is an unknown Future version if a
+// version cannot be determined.
+func FileVersion(info *types.Info, file *ast.File) string {
+	// In tools built with Go >= 1.22, the Go version of a file
+	// follow a cascades of sources:
+	// 1) types.Info.FileVersion, which follows the cascade:
+	//   1.a) file version (ast.File.GoVersion),
+	//   1.b) the package version (types.Config.GoVersion), or
+	// 2) is some unknown Future version.
+	//
+	// File versions require a valid package version to be provided to types
+	// in Config.GoVersion. Config.GoVersion is either from the package's module
+	// or the toolchain (go run). This value should be provided by go/packages
+	// or unitchecker.Config.GoVersion.
+	if v := info.FileVersions[file]; IsValid(v) {
+		return v
 	}
-	return ""
+	// Note: we could instead return runtime.Version() [if valid].
+	// This would act as a max version on what a tool can support.
+	return Future
 }
diff --git a/vendor/golang.org/x/tools/internal/versions/types_go121.go b/vendor/golang.org/x/tools/internal/versions/types_go121.go
deleted file mode 100644
index b4345d3349..0000000000
--- a/vendor/golang.org/x/tools/internal/versions/types_go121.go
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2023 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 !go1.22
-// +build !go1.22
-
-package versions
-
-import (
-	"go/ast"
-	"go/types"
-)
-
-// FileVersion returns a language version (<=1.21) derived from runtime.Version()
-// or an unknown future version.
-func FileVersion(info *types.Info, file *ast.File) string {
-	// In x/tools built with Go <= 1.21, we do not have Info.FileVersions
-	// available. We use a go version derived from the toolchain used to
-	// compile the tool by default.
-	// This will be <= go1.21. We take this as the maximum version that
-	// this tool can support.
-	//
-	// There are no features currently in x/tools that need to tell fine grained
-	// differences for versions <1.22.
-	return toolchain
-}
-
-// InitFileVersions is a noop when compiled with this Go version.
-func InitFileVersions(*types.Info) {}
diff --git a/vendor/golang.org/x/tools/internal/versions/types_go122.go b/vendor/golang.org/x/tools/internal/versions/types_go122.go
deleted file mode 100644
index aac5db62c9..0000000000
--- a/vendor/golang.org/x/tools/internal/versions/types_go122.go
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2023 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 go1.22
-// +build go1.22
-
-package versions
-
-import (
-	"go/ast"
-	"go/types"
-)
-
-// FileVersion returns a file's Go version.
-// The reported version is an unknown Future version if a
-// version cannot be determined.
-func FileVersion(info *types.Info, file *ast.File) string {
-	// In tools built with Go >= 1.22, the Go version of a file
-	// follow a cascades of sources:
-	// 1) types.Info.FileVersion, which follows the cascade:
-	//   1.a) file version (ast.File.GoVersion),
-	//   1.b) the package version (types.Config.GoVersion), or
-	// 2) is some unknown Future version.
-	//
-	// File versions require a valid package version to be provided to types
-	// in Config.GoVersion. Config.GoVersion is either from the package's module
-	// or the toolchain (go run). This value should be provided by go/packages
-	// or unitchecker.Config.GoVersion.
-	if v := info.FileVersions[file]; IsValid(v) {
-		return v
-	}
-	// Note: we could instead return runtime.Version() [if valid].
-	// This would act as a max version on what a tool can support.
-	return Future
-}
-
-// InitFileVersions initializes info to record Go versions for Go files.
-func InitFileVersions(info *types.Info) {
-	info.FileVersions = make(map[*ast.File]string)
-}
diff --git a/vendor/modules.txt b/vendor/modules.txt
index 536ae7ce51..222f16b10d 100644
--- a/vendor/modules.txt
+++ b/vendor/modules.txt
@@ -68,8 +68,6 @@ github.com/hashicorp/hcl/json/token
 github.com/inconshreveable/mousetrap
 # github.com/jstemmer/go-junit-report v1.0.0
 ## explicit; go 1.2
-github.com/jstemmer/go-junit-report
-github.com/jstemmer/go-junit-report/formatter
 github.com/jstemmer/go-junit-report/parser
 # github.com/klauspost/cpuid/v2 v2.2.5
 ## explicit; go 1.15
@@ -80,11 +78,8 @@ github.com/lufia/plan9stats
 # github.com/magiconair/properties v1.8.7
 ## explicit; go 1.19
 github.com/magiconair/properties
-# github.com/maxbrunsfeld/counterfeiter/v6 v6.8.1
-## explicit; go 1.20
-github.com/maxbrunsfeld/counterfeiter/v6
-github.com/maxbrunsfeld/counterfeiter/v6/arguments
-github.com/maxbrunsfeld/counterfeiter/v6/command
+# github.com/maxbrunsfeld/counterfeiter/v6 v6.11.2
+## explicit; go 1.23
 github.com/maxbrunsfeld/counterfeiter/v6/generator
 # github.com/mitchellh/mapstructure v1.5.0
 ## explicit; go 1.14
@@ -107,7 +102,7 @@ github.com/nginx/agent/sdk/v2/proto
 github.com/nginx/agent/sdk/v2/proto/common
 github.com/nginx/agent/sdk/v2/proto/events
 github.com/nginx/agent/sdk/v2/zip
-# github.com/nginxinc/nginx-go-crossplane v0.4.48
+# github.com/nginxinc/nginx-go-crossplane v0.4.70
 ## explicit; go 1.19
 github.com/nginxinc/nginx-go-crossplane
 # github.com/nginxinc/nginx-plus-go-client/v2 v2.0.1
@@ -226,9 +221,10 @@ github.com/spf13/viper/internal/features
 # github.com/stretchr/objx v0.5.2
 ## explicit; go 1.20
 github.com/stretchr/objx
-# github.com/stretchr/testify v1.9.0
+# github.com/stretchr/testify v1.10.0
 ## explicit; go 1.17
 github.com/stretchr/testify/assert
+github.com/stretchr/testify/assert/yaml
 github.com/stretchr/testify/mock
 github.com/stretchr/testify/require
 # github.com/subosito/gotenv v1.6.0
@@ -271,12 +267,12 @@ golang.org/x/exp/slices
 golang.org/x/exp/slog
 golang.org/x/exp/slog/internal
 golang.org/x/exp/slog/internal/buffer
-# golang.org/x/mod v0.21.0
+# golang.org/x/mod v0.22.0
 ## explicit; go 1.22.0
 golang.org/x/mod/internal/lazyregexp
 golang.org/x/mod/module
 golang.org/x/mod/semver
-# golang.org/x/net v0.33.0
+# golang.org/x/net v0.34.0
 ## explicit; go 1.18
 golang.org/x/net/http/httpguts
 golang.org/x/net/http2
@@ -289,7 +285,7 @@ golang.org/x/net/trace
 ## explicit; go 1.18
 golang.org/x/sync/errgroup
 golang.org/x/sync/singleflight
-# golang.org/x/sys v0.28.0
+# golang.org/x/sys v0.29.0
 ## explicit; go 1.18
 golang.org/x/sys/unix
 golang.org/x/sys/windows
@@ -312,9 +308,8 @@ golang.org/x/text/secure/bidirule
 golang.org/x/text/transform
 golang.org/x/text/unicode/bidi
 golang.org/x/text/unicode/norm
-# golang.org/x/tools v0.25.0
+# golang.org/x/tools v0.29.0
 ## explicit; go 1.22.0
-golang.org/x/tools/cmd/goimports
 golang.org/x/tools/go/ast/astutil
 golang.org/x/tools/go/gcexportdata
 golang.org/x/tools/go/packages
@@ -330,10 +325,10 @@ golang.org/x/tools/internal/gcimporter
 golang.org/x/tools/internal/gocommand
 golang.org/x/tools/internal/gopathwalk
 golang.org/x/tools/internal/imports
+golang.org/x/tools/internal/modindex
 golang.org/x/tools/internal/packagesinternal
 golang.org/x/tools/internal/pkgbits
 golang.org/x/tools/internal/stdlib
-golang.org/x/tools/internal/tokeninternal
 golang.org/x/tools/internal/typeparams
 golang.org/x/tools/internal/typesinternal
 golang.org/x/tools/internal/versions