Repository navigation
Commit ff8d63a
Release/event gateway 1.3 (#7336)
* bump event gateway version to 1.3
* generate 1.3 references
* docs(event-gateway): backport schema.metadata expression fields to 1.3 (#6801)
* feat(event-gateway): mask field policy guides (#7133)
* docs(event-gateway): mask field policy guide
* docs(event-gateway): mask fields selected by schema registry tags guide
* Feat/add mask fields policies (#7195)
* chore(egw): add mask-fields produce and consume policies
* fix(ewg): render min version as part of the title in plugin policy examples
* refactor(automated-tests): extract URL-mode selection
Extraction now follows the same pattern, files that are meant to be
skipped are skipeed both when using --product and not.
* fix(egw): how-to, run it as part of the test and add cleanup setps
* chore(egw): add tools/event-gateway-policy-examples-validator
Tool that validates existing policy examples agains the corresponding
schema in the api spec
* Update event-gateway minimum version in how-to
Update minimum version for event-gateway to 1.1.0.
* feat(event-gateway): add {% quickstart %} block
Adds a standalone Liquid block/drop pair that renders the canonical
Event Gateway quickstart instructions (script, exported gateway ID,
demo-only note), with an optional env map and test-step declaration.
No page calls it yet; that's tickets 03-05.
* refactor(event-gateway): rename quickstart block, build command in Liquid
Renames {% quickstart %} to {% event_gateway_quickstart %} and moves
the curl command construction out of the Ruby drop and into
snippet.md, iterating over the env map directly. The drop is now
limited to parsing env/section and building the test-step payload,
with the script URL, network name, and control-plane name hardcoded
in the template since this block is Event Gateway-specific.
* feat(automated-tests): run quickstart steps in the test harness
Adds a `quickstart` step handler that composes a page's env flags onto
the runtime's base quickstart command, runs it, and persists every
`export NAME=VALUE` line it prints for later steps. The Konnect Event
Gateway runtime gains that base command plus a reset-time wipe of files
a previous test file generated.
* feat(event-gateway): render observability guide quickstart from shared block
Renders the OTel quickstart command from {% event_gateway_quickstart %}
with the four OTel env flags, so the copy-pasted command and the
harness-run command come from the same source.
* fix(how-to): add class="content" to egw so it renders the correct
spacing
* chore(egw): replace hardcoded eventgateway quickstart script invocations
with the block
* feat(event-gateway): render prerequisite quickstart from shared block
Uses the event_gateway_quickstart block with section: none so the
prerequisite's wording can no longer drift from the other call sites,
while staying inert to the test harness (no data-test-step emitted).
* test(event-gateway): move quickstart command-content specs to snippet.md
Content-shape assertions for the curl command (env formatting, special
characters) belong at the snippet.md render seam, not the Liquid block
seam, matching the claude-code snippet_spec.rb pattern. The block spec
keeps only block-wiring behavior: test-declaration emission, malformed
YAML, and markdown output_format. Also drops a leftover byebug
breakpoint and its now-incorrect expectation.
* fix(egw): refactor egw quickstart snippet and fix section handling
* chore(egw): update how-tos with missing test markup, cleanup steps and
run them as part of the test suite
* fix(egw): delete directory url and specify in which section it should be
run - cleanup -
* refactor(egw): how we render the quickstart script and the prereqs
Make the docker-compose-start.md prereq blocks and have the extractor
run them, not all the how-tos need this so running them always was
causing issues with clusters defined in specific how-tos.
* refactor(automated-test): how event-gateway runs the setup/cleanup/reset
cycle
A file that runs the quickstart itself (a `quickstart` liquid tag in its steps)
provisions its own gateway, and usually its own cluster too. The runtime only provisions
a kafka cluster and quickstart script when the file declares no quickstart of its own.
* chore(automated-tests): Make the test fail when the cleanup step fails
* chore(automated-test): add openssl and other deps to the docker image
and sleep for 5s after creating the egw to give it time to be ready
* fix(egw): generate a v3 mTLS client certificate in the backend cluster how-to
`openssl x509 -req` produces a version 1 certificate when it receives no
extensions. Event Gateway rejects a v1 client certificate with
"invalid peer certificate: UnsupportedCertVersion", so the mTLS handshake
to the broker fails and kafkactl reports "run out of available brokers".
Sign the client certificate with an extension file, as the broker
certificates already do, to make it a v3 certificate. OpenSSL 3.2 and later
add key identifier extensions by default, which hides the problem, but
OpenSSL 3.0 is still the version on Ubuntu 24.04, Debian 12 and RHEL 9.
* chore(egw): run egw automated tests every wednesday
* fix(how-to): use `body_file` to upload a file using curl in how-to
* copyedit policies and add diagrams
* hide quickstart from vale
* fix diagram
---------
Co-authored-by: lena-larionova <lena.larionova@konghq.com>
* Apply batched suggestions from code review
Co-authored-by: lena-larionova <54370747+lena-larionova@users.noreply.github.com>
---------
Co-authored-by: Fabian Rodriguez <fabian.rodriguez@konghq.com>
Co-authored-by: lena-larionova <lena.larionova@konghq.com>
Co-authored-by: lena-larionova <54370747+lena-larionova@users.noreply.github.com>
* pull latest metrics and bootstrap schema for event gateway 1.3 (#7290)
* add AWS IAM to supported backend cluster auth types (#7289)
* feat(keg): Record transcode policies (#7268)
* record transcode policy docs + examples
* add transcode to dictionary
* how-to guide for record transcode consume policy
* add deserializer to dictionary
* chore: add extract command and remove unneeded command to attach the
conatiner to a network, it's already part of it
* Add TestSection concern for the request-block test-phase attribute
One drop-level definition of the section-to-attribute map, shared by
every block that needs to declare which automated-test phase it
belongs to.
* Wire TestSection into Validations::Base
Validations::Base now includes the shared concern instead of its own
section reader, and rejects an unrecognized section at construction
time, before validate_yaml!.
* Wire TestSection into the three standalone request drops
KonnectApiRequest, ControlPlaneRequest and HttpRequest now validate
section at construction time and drop it from the instruction config,
matching Validations::Base.
* Add section-aware shared examples for dual-topology content divs
Covers the prereqs and cleanup cases for both a konnect-only div and
a dual-topology block, asserting the other test attributes stay
absent and the attribute value stays unchanged from the step case.
Not yet used by any block spec until the templates print
config.test_attribute.
* Print config.test_attribute in konnect_api_request.html
Drops the hand-written section conditional and the dead duplicate
data-test-step="block" attribute (kramdown already discarded it), and
switches the block spec to the section-aware shared example. Full
suite: 1386 -> 1391 examples, 0 failures both times.
* Print config.test_attribute in control_plane_request.html
Both topology divs now select the test attribute from the drop
instead of hardcoding data-test-step, so section: prereqs/cleanup
takes effect for {% control_plane_request %} too.
* Print config.test_attribute in the request-check validation template
Keeps unless config.skip as the outer condition, printing the section
attribute inside it instead of hardcoding data-test-step. Also covers
skip together with section: skip still suppresses the attribute
entirely.
* Print config.test_attribute in http_request.html
Keeps block as the attribute value, only the attribute name now comes
from the drop, so {% http_request %} accepts section: prereqs/cleanup
like the other request blocks.
* Print config.test_attribute in custom-command and env-variables templates
env-variables already printed the same JSON value on both branches, so
this is a straightforward attribute-name swap. custom-command's
prereqs branch previously hardcoded the literal "block" while its step
branch printed the JSON instruction; per explicit direction, it now
always prints the JSON value, matching the new spec's invariant that
the attribute value doesn't change with the section. Only one page
(app/_how-tos/ai-gateway/v1/compare-llm-models-accuracy.md) sets
section: prereqs on {% validation custom-command %}; the automated
test runner already treats a JSON value as a validation to parse and
dispatch, same as it does for the step case today.
* Rename the singular section: prereq to prereqs, rejected by the concern
EventGatewayQuickstart drops its own section/test_attribute in favor
of the shared TestSection concern, which only accepts the plural. The
one page that set the singular moves to it in the same commit.
* chore(tests): add missing extract from validation and remove
auth-headers and directories when resetting ai-gatewat and event-gateway
how-tos just in case, so we always start with a clean set.
* feat(event-gw): request rule validator policy guide
* chore(how-to): update how-to so it can be run as part of the automated
tests
* feat(event-gateway): Request rule validator policy (#7303)
* draft of request rule validator
* fix(egw): request-rule-policy example so it's valida against the spec
and tested it against .tech
* Update app/_event_gateway_policies/request-rule-validator/index.md
Co-authored-by: Jakub Dyszkiewicz <jakub.dyszkiewicz@gmail.com>
---------
Co-authored-by: Fabian Rodriguez <fabian.rodriguez@konghq.com>
Co-authored-by: Jakub Dyszkiewicz <jakub.dyszkiewicz@gmail.com>
* docs(event-gateway): add reference to Confluent schema reference docs (#7415)
* feat(event-gateway): CEL support in KEG (#7285)
* CEL support in KEG
* copyedit and remove legacy examples
* Update app/event-gateway/entities/policy.md
Co-authored-by: Mattia Lavacca <lavacca.mattia@gmail.com>
* add some details from the API spec
* add missing 1.3 fields and examples
---------
Co-authored-by: Mattia Lavacca <lavacca.mattia@gmail.com>
* feat(event-gateway): encrypt fields selected by schema registry tags (#7387)
* feat(event-gateway): encrypt fields selected by schema registry tags guide
* Apply copyedits
Co-authored-by: lena-larionova <54370747+lena-larionova@users.noreply.github.com>
---------
Co-authored-by: lena-larionova <54370747+lena-larionova@users.noreply.github.com>
* feat(event-gw): log level explanation (#7404)
* feat(event-gw): log level explanation
* Apply copyedits
Co-authored-by: lena-larionova <54370747+lena-larionova@users.noreply.github.com>
---------
Co-authored-by: lena-larionova <54370747+lena-larionova@users.noreply.github.com>
* feat(event-gw): more rule validator policy examples (#7403)
* feat(event-gw): more rule validator policy examples
* Apply copyedits
Co-authored-by: lena-larionova <54370747+lena-larionova@users.noreply.github.com>
---------
Co-authored-by: lena-larionova <54370747+lena-larionova@users.noreply.github.com>
* docs(event-gateway): add guide for producing JSON to Avro (#7416)
* docs(event-gateway): add guide for producing JSON to Avro
* fix: quotes
* Apply copyedits + quote fix
Co-authored-by: lena-larionova <54370747+lena-larionova@users.noreply.github.com>
---------
Co-authored-by: lena-larionova <54370747+lena-larionova@users.noreply.github.com>
* docs(event-gw): clarify max wait time in example (#7598)
* docs(event-gw): clarify max wait time in example
* Update app/_event_gateway_policies/request-rule-validator/examples/enforce-produce-fetch-settings.yml
Co-authored-by: kong-ksai[bot] <313415923+kong-ksai[bot]@users.noreply.github.com>
---------
Co-authored-by: kong-ksai[bot] <313415923+kong-ksai[bot]@users.noreply.github.com>
* docs(event-gw): link related resources (#7599)
* feat(event-gateway) Protobuf support (#7302)
* docs for protobuf support
* Apply batched suggestions from code review
Co-authored-by: tomek-labuk <tomasz.labuk@konghq.com>
* revert changes to record transcode policies
* add version tag to schema validation doc
* add supported schema formats to schema validation policy pages
* fix typos
Co-authored-by: kong-ksai[bot] <313415923+kong-ksai[bot]@users.noreply.github.com>
---------
Co-authored-by: tomek-labuk <tomasz.labuk@konghq.com>
Co-authored-by: kong-ksai[bot] <313415923+kong-ksai[bot]@users.noreply.github.com>
* fix(gh-actions): set the correct min_version to both egw and aigw
* chore(egw): add support for setting the egw image when running the
automated-tests
* fix(automated-tests): force-reveal accordion panels before extracting blocks
The accordion binds its click handler on DOMContentLoaded, but extraction
navigates with waitUntil: "domcontentloaded" and clicks the trigger
immediately, so the handler may not be bound yet. A click on an unbound
trigger leaves the panel hidden and every [data-test-prereq] block
inside is silently skipped, so the generated instruction file loses the
how-to's prerequisite commands (e.g. the Kafka compose stack) and the
test only fails later on a missing docker network.
Reveal each item's panels directly (mirroring revealHiddenTabPanel)
instead of trusting the trigger click, in both extractPrereqs and
extractCleanup.
* fix(automated-tests): install cosign and regctl in the runtime image
The verify-image-signatures-and-attestations how-to runs cosign and regctl
steps inside the runtime container, but neither tool was installed, so the
test failed with 'cosign: command not found'. Install both, pinned and
checksum-verified, following the existing kubectl/helm/k3d/yq pattern.
cosign is pinned to the latest v2 (2.6.5) because the how-to uses
--new-bundle-format=true, which was introduced in 2.4.0 and is not
guaranteed to still exist as a flag in v3.
* docs(event-gateway): clarify mask fields failure modes and schema tag selection (#7375)
Co-authored-by: lena-larionova <54370747+lena-larionova@users.noreply.github.com>
* docs(event-gateway): aws iam backend cluster auth (#7412)
Co-authored-by: Charly Molter <charly.molter@konghq.com>
Co-authored-by: lena-larionova <54370747+lena-larionova@users.noreply.github.com>
* chore(event-gateway): Internal release changelog + skill update (#7673)
* modify release changelog skill to support event gateway
* better categorization of policies
* improve grouping rules
* apply fixes from ksai review
* update link in comment
* Apply batched suggestions from code review
Co-authored-by: tomek-labuk <tomasz.labuk@konghq.com>
Co-authored-by: lena-larionova <54370747+lena-larionova@users.noreply.github.com>
* clean up the skill a bit more
---------
Co-authored-by: tomek-labuk <tomasz.labuk@konghq.com>
* feat(event-gw): fix mask field guide and improve request rule validator (#7690)
* update generated refs (#7699)
* chore(event-gateway): 1.3 changelog and breaking changes (#7697)
* add links to changelog and add missing breaking changes entries for 1.3 and 1.2
* appease linters
* Update app/event-gateway/changelog.md
Co-authored-by: Diana <75819066+cloudjumpercat@users.noreply.github.com>
* Update app/event-gateway/changelog.md
Co-authored-by: kong-ksai[bot] <313415923+kong-ksai[bot]@users.noreply.github.com>
---------
Co-authored-by: Diana <75819066+cloudjumpercat@users.noreply.github.com>
Co-authored-by: kong-ksai[bot] <313415923+kong-ksai[bot]@users.noreply.github.com>
* feat(egw): fix nesting of transcoding policies (#7714)
* feat(event-gw): remove mentions of protobuf (#7713)
* feat(event-gw): backfill missing policies (#7715)
* feat(event-gw): backfill missing policies
* apply suggestion
Co-authored-by: kong-ksai[bot] <313415923+kong-ksai[bot]@users.noreply.github.com>
---------
Co-authored-by: lena-larionova <54370747+lena-larionova@users.noreply.github.com>
Co-authored-by: kong-ksai[bot] <313415923+kong-ksai[bot]@users.noreply.github.com>
* feat(egw): add `schema_validation` `any` (#7657)
* docs(egw): add `schema_validation` `any`
* docs: reduce duplication
* Apply style + grammar copyedits
Co-authored-by: lena-larionova <54370747+lena-larionova@users.noreply.github.com>
* update dictionary
---------
Co-authored-by: lena-larionova <54370747+lena-larionova@users.noreply.github.com>
---------
Co-authored-by: lena-larionova <lena.larionova@konghq.com>
Co-authored-by: Joshua Schmid <joshua.schmid@konghq.com>
Co-authored-by: Jakub Dyszkiewicz <jakub.dyszkiewicz@gmail.com>
Co-authored-by: lena-larionova <54370747+lena-larionova@users.noreply.github.com>
Co-authored-by: Mike Beaumont <mjboamail@gmail.com>
Co-authored-by: Mattia Lavacca <lavacca.mattia@gmail.com>
Co-authored-by: kong-ksai[bot] <313415923+kong-ksai[bot]@users.noreply.github.com>
Co-authored-by: tomek-labuk <tomasz.labuk@konghq.com>
Co-authored-by: Charly Molter <charly.molter@konghq.com>
Co-authored-by: Diana <75819066+cloudjumpercat@users.noreply.github.com>1 parent e3b8f78 commit ff8d63a
141 files changed
Lines changed: 9091 additions & 549 deletions
File tree
- .claude/skills/release-changelog
- products
- .github
- styles/base
- workflows
- app
- _data
- event-gateway-bootstrap-schema
- products
- _event_gateway_policies
- acl
- examples
- decrypt-fields
- encrypt-fields
- examples
- mask-fields-consume
- examples
- mask-fields-produce
- examples
- modify-headers
- examples
- record-transcode-consume
- examples
- record-transcode-produce
- examples
- request-rule-validator
- examples
- schema-validation-consume
- examples
- schema-validation-produce
- examples
- skip-record
- examples
- _how-tos/event-gateway
- _includes
- event_gateway_policies
- how-tos
- event-gateway-quickstart
- validations
- custom-command
- env-variables
- request-check
- knep
- md/identity
- prereqs
- products
- _indices
- _landing_pages
- _plugins
- blocks
- drops
- concerns
- validations
- _references/event-gateway/1.3
- event-gateway
- entities
- gateway/plugins
- docs/release-changelog
- event-gateway
- gateway
- spec
- app
- _includes/how-tos/event-gateway-quickstart
- _plugins
- blocks
- validations
- drops
- concerns
- support/tags
- tools
- automated-tests
- config
- docker
- fixtures/how-tos/event-gateway
- v1
- instructions
- event-gateway-policy-examples-validator
- new-pages-changelog
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Large diffs are not rendered by default.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
112 | 112 | | |
113 | 113 | | |
114 | 114 | | |
| 115 | + | |
115 | 116 | | |
116 | 117 | | |
117 | 118 | | |
| |||
212 | 213 | | |
213 | 214 | | |
214 | 215 | | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
215 | 219 | | |
216 | 220 | | |
217 | 221 | | |
| |||
412 | 416 | | |
413 | 417 | | |
414 | 418 | | |
| 419 | + | |
415 | 420 | | |
416 | 421 | | |
417 | 422 | | |
| |||
582 | 587 | | |
583 | 588 | | |
584 | 589 | | |
| 590 | + | |
| 591 | + | |
585 | 592 | | |
586 | 593 | | |
587 | 594 | | |
| |||
825 | 832 | | |
826 | 833 | | |
827 | 834 | | |
| 835 | + | |
828 | 836 | | |
829 | 837 | | |
830 | 838 | | |
| |||
868 | 876 | | |
869 | 877 | | |
870 | 878 | | |
| 879 | + | |
| 880 | + | |
871 | 881 | | |
872 | 882 | | |
| 883 | + | |
873 | 884 | | |
874 | 885 | | |
875 | 886 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
9 | 9 | | |
10 | 10 | | |
11 | 11 | | |
12 | | - | |
13 | | - | |
| 12 | + | |
| 13 | + | |
14 | 14 | | |
15 | 15 | | |
16 | 16 | | |
| |||
71 | 71 | | |
72 | 72 | | |
73 | 73 | | |
74 | | - | |
75 | | - | |
| 74 | + | |
| 75 | + | |
76 | 76 | | |
77 | | - | |
78 | | - | |
| 77 | + | |
| 78 | + | |
79 | 79 | | |
80 | 80 | | |
81 | 81 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2 | 2 | | |
3 | 3 | | |
4 | 4 | | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
5 | 9 | | |
6 | 10 | | |
7 | 11 | | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
8 | 15 | | |
9 | | - | |
| 16 | + | |
10 | 17 | | |
11 | 18 | | |
12 | 19 | | |
| |||
55 | 62 | | |
56 | 63 | | |
57 | 64 | | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
58 | 77 | | |
59 | 78 | | |
60 | 79 | | |
61 | 80 | | |
62 | 81 | | |
63 | 82 | | |
64 | 83 | | |
| 84 | + | |
| 85 | + | |
65 | 86 | | |
66 | 87 | | |
67 | 88 | | |
| |||
76 | 97 | | |
77 | 98 | | |
78 | 99 | | |
79 | | - | |
| 100 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
0 commit comments