Commit af511d8
feat: stack-level retry defaults + registry-retry docs + CI flakes (#2987)
* docs: document GOAWAY provider-registry retry scenario
Extend the component retry docs with the HTTP/2 GOAWAY provider-registry
failure mode and cross-link with the terraform cache docs, so users know
`retry:` (not the registry cache) is what recovers a batch of components
that all hit a transient registry connectivity blip at once.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
* docs: rewrite GOAWAY retry docs in ASD-STE100 style
Simplify the new provider-registry-failure prose from the previous
commit into short, active, single-idea sentences per ASD-STE100
conventions, with no loss of information.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
* docs: add retry-policy mixin use-case, fix stale mixins link
- Add a "Mixins for Retry Policies" use-case to howto/mixins.mdx,
showing how overrides.retry shares one retry policy across
components that don't have a common base component.
- Fix howto/mixins.mdx's "Learn Design Pattern" link: it pointed to
/design-patterns/component-catalog/with-mixins, which was
repurposed into the Component Archetypes page and explicitly says
"This is NOT Mixins". Point it at the actual mixins design-pattern
page instead.
- Document `retry` as a supported overrides.* field in
component-overrides.mdx (already implemented in
internal/exec/stack_processor_process_stacks_helpers_overrides.go
but undocumented).
- Cross-link retry.mdx <-> howto/mixins.mdx and add a reciprocal link
from the mixins design-pattern page back to component retry and
component overrides.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
* test: cover overrides.retry end-to-end via the mixin-overrides fixture
Extend TestDescribeComponentWithOverridesSection and the
atmos-overrides-section fixture with a retry block, proving the exact
scenario documented for sharing a retry policy via a mixin: a
`terraform.overrides.retry` block in an imported file applies to
components imported after it (test3), and correctly does not apply
when imported after the component (test2) — matching the existing
file-scoping behavior already proven for `overrides.vars`.
This closes the gap between the unit-level merge-precedence tests in
stack_processor_merge_test.go (which prove overrides wins in
isolation) and an end-to-end proof that overrides.retry flows through
real import resolution the same way overrides.vars does.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
* docs(fix): qualify retry batch-recovery claim in retry.mdx
"Any of the three lets the whole batch recover on its own" overstated
the guarantee. Each subprocess retry loop is independent and bounded
by its own max_attempts/max_elapsed_time (already documented in "How
it works"), so a component whose registry outage outlasts its own
budget still fails even with retry configured. Clarify that recovery
is per-component and budget-bound, and that a long enough outage can
still fail part or all of a batch.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
* fix: wire overrides.provision into component overrides merge
`provision` is a real per-component section (workdir/target delivery
settings for helmfile/kubernetes/helm/terraform/packer components) but
was never extracted by processComponentOverrides, so overrides.provision
silently no-op'd instead of erroring or applying. Wire it in the same
way retry was: extract it (gated by supportsSourceProvision, matching
the merge's existing gate), add a dedicated sentinel error for a
malformed value, and merge it in as the highest-precedence layer
(global -> base -> component -> overrides), consistent with every
other overrides.* field.
Document `provision` in the "What You Can Override" list.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
* fix(test): widen shrunk kubernetesReadyTimeout to stop CI flake
TestManager_WaitKubernetesReady_RetriesUntilReady failed on the
windows CI shard: "missing call(s) to *emulator.MockRuntime.Exec" for
the retry loop's second attempt. Root cause is test timing, not a
product bug — waitKubernetesReady correctly bounds by deadline, but
the test's 50ms shrunk kubernetesReadyTimeout has to survive two real
gomock-backed attempts, and the failing run took 0.31s total (300ms+
for a single mocked attempt is plausible under CI scheduler
contention), so the deadline expired before the loop's second
iteration ever ran.
Widen the shrunk timeout to 2s. Poll interval stays at 1ms, so a
passing run still finishes in low single-digit milliseconds — this
only adds headroom against CI jitter, not requirement laxity. Verified
with `go test -run TestManager_WaitKubernetesReady_RetriesUntilReady
-count=5`.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
* fix(test): retry copyRepoWithRetry on Windows file-lock errors too
TestDescribeAffectedWithDependentsStackFilterYamlFunctions failed on
the windows CI shard: "The process cannot access the file because
another process has locked a portion of the file" reading a shared
fixture's terraform.tfstate mid-copy.
copyRepoWithRetry already retries when a source file vanishes mid-copy
(git background housekeeping racing the walk), but only checked
os.IsNotExist. It copies the live, shared repo tree, so on Windows
another concurrently running test can legitimately hold one of those
files open at the exact moment this copy walks it -- Windows enforces
mandatory file locking far more strictly than Unix, so the read fails
outright instead of racing cleanly. Same class of issue already
handled for `git worktree remove` in pkg/git/worktree.go via string
matching on the OS error text; apply the same idiom here.
Added TestIsTransientRepoCopyError covering both this file's known
transient causes.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
* test: convert provision-overrides test to table-driven form
Addresses CodeRabbit review comment on PR #2987: the three
provision-override scenarios (valid, non-map error, unsupported
component type) had repeated setup boilerplate. Consolidate into a
single table-driven test, matching the existing convention already
used by the very next function in this file
(TestProcessComponentInheritance).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
* test: use errors.Is for missing-file detection in copy-retry helper
Addresses CodeRabbit review comment on PR #2987: os.IsNotExist does
not reliably unwrap wrapped errors (it predates errors.Is and only
special-cases raw *PathError/*LinkError/*SyscallError). Replace with
errors.Is(err, os.ErrNotExist) in isTransientRepoCopyError so a
wrapped missing-file error from a future otiai10/copy version (or any
other wrapping layer) is still classified as transient.
Converted TestIsTransientRepoCopyError to table-driven form per the
same review comment, and added a case covering a wrapped
os.ErrNotExist to guard against regressing back to os.IsNotExist.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
* fix(test): classify closed-pipe errors as clean shutdown in session helper
TestRunSessionDefaultsNilOptions failed on Windows CI ("RunSession
with nil opts: exit status 1") well before its context timeout (5.8s
of a 10s budget), so the earlier 3s->10s timeout bump for this test
was treating the wrong symptom -- the child helper process itself was
exiting 1, not timing out.
runAsciicastSessionHelper (the test-binary-as-fake-shell used by
session tests) exited 1 on any stdin read error other than a literal
io.EOF. finishSession's ordinary teardown sends EOT then closes the
input pipe; under Windows CI load that race can surface as
io.ErrClosedPipe (or an "input/output error") instead of a plain
io.EOF, which the helper had never seen before this change. The
codebase already classifies exactly this error set as an expected
clean shutdown for the parent's stdout-read loop via
isExpectedSessionReadError (session.go) -- reuse it here instead of
duplicating a narrower, incorrect check.
Verified with `go test ./pkg/asciicast/... -run TestRunSession
-count=5`.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
* feat: support stack-root global retry, like metadata/hooks/provision
`retry:` was the only major component section without a stack-level
global default. metadata, hooks, generate, source, and provision all
support a stack-manifest-root block that cascades into every component
of that type, via a Global*Section layer threaded through
ComponentProcessorOptions and merged first (lowest precedence) in
mergeComponentConfigurations. retry never got the same treatment, so
the only ways to share a retry policy across a stack were per-
component, an abstract base component, or the overrides.retry mixin
trick.
Add a `retry:` stack-manifest-root block, following the exact pattern
already established for global metadata:
- Read and validate `config[retry]` in ProcessStackConfig (must be a
map; unlike metadata, every RetryConfig field is meaningful at
global scope, so no field allowlist is needed).
- Thread GlobalComponentRetry through ComponentProcessorOptions and
wire it into all six built-in component-type constructions
(terraform, helmfile, packer, ansible, kubernetes, helm).
- Merge it as the new lowest-precedence layer in the retry merge:
global -> base component -> concrete component -> overrides.
- Also merge it into custom (non-built-in) component types in the
builtInTypes passthrough loop, mirroring how global metadata is
merged there.
- Add ErrInvalidGlobalRetrySection and register `retry` as a root
property in the atmos/manifest and stacks/stack-config JSON schemas
(reusing the existing #/definitions/retry).
Verified end-to-end with a live build: `atmos describe stacks` shows a
component with no local retry inheriting the global policy, and a
component with a local `max_attempts` override still inheriting
global's `conditions` list (deep-merge, not wholesale replacement).
Note: `atmos describe component`'s JSON/YAML output has its own fixed
key allowlist that has never included `retry` at all -- even a
component's own directly-set retry doesn't show there. Pre-existing,
unrelated to this change; the real execution path
(internal/exec/utils.go's ComponentRetrySection) reads the merged
config directly and is unaffected.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
* docs: document stack-root global retry defaults
Document the new stack-manifest-root retry: block added in the
previous commit:
- retry.mdx: new "Stack-Level Defaults" section with the precedence
order (stack-root -> base component -> concrete component ->
overrides) and an example. Updated the "share a retry policy across
a batch" list from three to four options, leading with the
stack-root block since it's the simplest for the whole-stack case.
- howto/mixins.mdx: added a tip pointing at the stack-root option for
readers who only need the retry policy on every component in a
stack -- the mixin/overrides.retry trick documented there remains
the right tool when the policy should apply to only part of a stack.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
* docs: add changelog post and roadmap entry for stack-level retry
Required by the pull-request skill for a minor-labeled feature PR.
- website/blog/2026-08-24-stack-level-retry-defaults.mdx: problem-first
changelog post per the changelog skill's template (Problem/Fix/How to
Use It/Get Involved), tagged enhancement, authored by osterman.
- website/src/data/roadmap.js: new shipped milestone under the CI/CD
Simplification initiative (same initiative as the original
component-level retry milestone), linked to the new changelog slug
and the retry docs' new #stack-level-defaults anchor. Progress stays
at 95% (20/21 shipped, same rounded value as before).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
* docs(fix): correct retry Inheritance example, document opt-out, broaden scope
Three fixes to the component retry docs found during a field-test pass
on the stack-level retry feature:
- The "## Inheritance" example used `metadata.component: base/network`
to demonstrate config inheritance, but that key only selects which
Terraform source a component uses -- it does not inherit config.
`metadata.inherits: [base/network]` is the correct mechanism; verified
live that the original example produced retry: null (no inheritance
at all) while metadata.inherits correctly inherits the base policy.
Also corrected the same example's claim that `conditions` "is
appended to" the base under default settings -- default
list_merge_strategy is replace, so conditions actually replaces
unless the user opts into list_merge_strategy: append.
- Documented that retry merges as a deep merge like every other
section, so `retry: {}` does NOT disable an inherited policy (verified
live), and that `retry: !unset` is rejected outright (tracked
separately in #2994, a general Atmos gap affecting every typed
section, not retry-specific). The supported opt-out is
`max_attempts: 1`.
- Broadened the intro/scope language ahead of extending retry execution
to Helmfile, Packer, and Ansible (previously terraform-only both in
implementation and in how the docs read).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
* feat: extend component retry to Helmfile, Packer, and Ansible
Component retry (retry.conditions matched against captured subprocess
output, with backoff) was wired up for terraform only, even though the
underlying mechanism was already fully generic -- a field-test pass
found retry.mdx documenting it as applying to "every component in the
stack" via the new stack-level defaults, while helmfile/kubernetes
components in that same stack silently got no protection at all.
Kubernetes and native Helm are out of scope here: they call Go SDKs
directly with no subprocess to capture/pattern-match, and would need a
different (err.Error()-based) retry mechanism. Tracked as a follow-up,
not implemented in this change.
- Export executeShellCommandWithRetry -> ExecuteShellCommandWithRetry
in internal/exec, so pkg/component/ansible (a different package,
already importing internal/exec for ExecuteShellCommand) can call it
directly -- no new abstraction, just visibility.
- Harden it: a caller-supplied stdout/stderr capture option (e.g.
helmfile's NodeHooks.After buffer) previously got silently replaced
by retry's own capture buffer when both were configured (last
ShellCommandOption wins). Now composed via io.MultiWriter so both
receive the full output. Extracted the composition logic into
composeRetryCaptureWriters, which also fixed a funlen lint finding.
- Wire Helmfile (internal/exec/helmfile.go), Packer
(internal/exec/packer.go), and Ansible
(pkg/component/ansible/executor.go) to the same wrapper terraform
uses. Extracted each call site into its own small
execute*CommandWithRetry function (matching the existing
executeMainTerraformCommand pattern) so retry wiring is directly
unit-testable without standing up each command's full
stack-processing preamble or requiring a real binary.
- Bundle the shared (allArgsAndFlags, componentPath, envVars) trio into
a new retryExecParams struct for the Helmfile/Packer wrappers,
resolving an argument-limit lint finding; switched all three
wrappers to a pointer atmosConfig param, resolving a gocritic
hugeParam finding.
- Extended internal/exec's TestMain (and added one to
pkg/component/ansible, which had none) so _ATMOS_TEST_EXIT_ONE can
combine with _ATMOS_TEST_STDOUT/_ATMOS_TEST_STDERR to simulate a
matching/non-matching transient failure -- lets retry-wiring tests
use the test binary itself as a fake terraform/helmfile/packer/
ansible-playbook command, no real binaries needed.
- Tests prove the wiring end-to-end through each real call chain (not
just the shared helper in isolation): matching errors retry to
max_attempts, non-matching errors fail fast on the first attempt
(asserted via an invocation-count file), and helmfile's NodeHooks
capture keeps receiving output when retry is also active.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
* docs: add changelog post and roadmap entry for retry's Helmfile/Packer/Ansible extension
Separate from the stack-level-retry-defaults post -- this is a
distinct capability (which component types retry works for at all,
not how it's scoped within a stack) and deserves its own changelog
entry per the roadmap skill's one-milestone-per-shipped-capability
convention.
Progress stays at 95% (21/22 shipped in the ci-cd initiative, same
rounded value as before).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
* fix: address CodeRabbit findings on retry PR
Honors settings.list_merge_strategy for retry.conditions merges (both
the built-in and custom component-type paths), asserts the configured
retry count in the Helmfile/Packer/Ansible matching-error tests instead
of only checking the final error, fails loudly instead of discarding
counter-file I/O errors in the shared test fixtures, adds trailing
periods to two comments, and corrects the retry-precedence wording in
both changelog posts.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
* docs: scope stack-root retry claims to supported component types
Corrects four remaining "every component" claims (retry.mdx x2, the
retry blog post, and the mixins how-to) flagged by CodeRabbit's follow-up
review — they contradicted the doc's own "Supported component types"
section, which excludes native Kubernetes and native Helm.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
* docs: rewrite retry blog posts in plain, consistent language
Rewrites both retry changelog posts in short, active-voice sentences
(ASD-STE100 style) and bumps their dates to today's publish date
(filenames renamed to match).
Also fixes two framing problems flagged as AI-cliche/imprecise:
- stack-level-retry-defaults: drops the "it's not X, it's Y" contrast
and the "hits all at once" framing in favor of the real point --
every component in a stack shares a registry, so they all benefit
from the same retry policy.
- retry-helmfile-packer-ansible: drops the "stack rarely runs one kind
of component" framing in favor of the actual motivation -- CI is
inherently flaky, retrying resolves it, and this pattern already
works well for Terraform, so it now extends to the other component
types for consistency.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
* docs: rewrite stack-level-retry-defaults intro in natural prose
Replaces the choppy, fragment-heavy intro with full sentences that
open on the real pain (CI is flaky, retries fix it, this already works
well for Terraform) instead of a single contrived registry-blip
example, then lead into this post's actual news: define the retry
policy once at the stack level instead of per component.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
* [autocommit] formatting fixes
* fix(ci): add missing shellescape override to stop flaky NOTICE diffs
al.essio.dev/pkg/shellescape is a vanity-import-path module that
go-licenses resolves non-deterministically -- some runs return its real
GitHub LICENSE URL, others return "Unknown". That flip-flop is exactly
what the existing REPO_OVERRIDES deterministic-URL mechanism in
generate-notice.sh was built to prevent, but this module was missing
from the list, so the "Review Dependency Licenses" CI check failed
whenever a run's committed NOTICE didn't match that run's resolution.
Adds the override and confirms two consecutive regenerations now
produce an identical NOTICE file.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
* docs: differentiate the two retry blog post intros
Both posts' intros had converged on the same "CI is flaky, Atmos
already handles this for Terraform, now X" template, making two
distinct features read as copy-paste of each other. Gives each post
its own real hook instead:
- stack-level-retry-defaults: leads with the repetition/DRY problem
(sharing one retry policy across a stack's components) -- what this
post's feature actually changes.
- retry-helmfile-packer-ansible: leads with the coverage-gap problem
(Terraform already recovered from transient errors, Helmfile/Packer/
Ansible in the same pipeline didn't) -- what this post's feature
actually changes.
Also trims each post's "The Problem" section where it had started
repeating the new intro's own examples verbatim.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
* fix(security): remediate Dependabot alert #278 (postcss-selector-parser DoS)
postcss-selector-parser < 6.1.3 and < 7.1.0 (< 7.1.3) allow uncontrolled
AST recursion in toString(), a low-severity DoS
(GHSA-w9m9-85wc-3x92 / CVE-2026-9358). Pins both major-version lines to
their patched releases (6.1.3, 7.1.3) via pnpm.overrides, since the
vulnerable package is only pulled in transitively.
39 other open CodeQL/Semgrep alerts on the repo were reviewed but none
match this repo's one established safe-fix pattern
(go/allocation-size-overflow), so per the security-remediate skill's
conservative rule they're left for manual review rather than guessed at.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
* fix(security): remediate Dependabot alerts #279, #281, #282
- google.golang.org/grpc: bump v1.82.1 -> v1.83.2, fixing GHSA-vp52-pcj8-j9qc
(heap memory exhaustion via HTTP/2 DATA frame fragmentation, <= 1.83.0).
- browserslist: pin transitive dependency to ^4.28.7 via pnpm.overrides,
fixing GHSA-c83g-rgw3-j3cx (unbounded memory growth) and
GHSA-73wf-gq98-2v4g (uncaught crash via untrusted stats file), both
affecting <= 4.28.6.
Alert #280 (postcss-selector-parser) was already fixed on this branch by
an earlier commit; it stays "open" on GitHub only because it's scoped to
the default branch's dependency graph and will auto-close once this
branch merges.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Co-authored-by: atmos-pro[bot] <173522224+atmos-pro[bot]@users.noreply.github.com>1 parent 5438c87 commit af511d8
40 files changed
Lines changed: 1309 additions & 193 deletions
File tree
- errors
- internal/exec
- pkg
- asciicast
- component/ansible
- datafetcher/schema
- atmos/manifest
- stacks/stack-config
- emulator
- tests/fixtures/scenarios/atmos-overrides-section/stacks/catalog
- tools/noticegen
- website
- blog
- docs
- cli/commands/terraform/cache
- design-patterns
- component-catalog
- configuration-composition
- howto
- stacks/components/terraform
- src/data
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
719 | 719 | | |
720 | 720 | | |
721 | 721 | | |
722 | | - | |
| 722 | + | |
723 | 723 | | |
724 | 724 | | |
725 | 725 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
524 | 524 | | |
525 | 525 | | |
526 | 526 | | |
| 527 | + | |
527 | 528 | | |
528 | 529 | | |
529 | 530 | | |
| |||
655 | 656 | | |
656 | 657 | | |
657 | 658 | | |
| 659 | + | |
658 | 660 | | |
659 | 661 | | |
660 | 662 | | |
| |||
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2 | 2 | | |
3 | 3 | | |
4 | 4 | | |
| 5 | + | |
| 6 | + | |
5 | 7 | | |
6 | 8 | | |
7 | 9 | | |
| |||
291 | 293 | | |
292 | 294 | | |
293 | 295 | | |
294 | | - | |
| 296 | + | |
295 | 297 | | |
296 | 298 | | |
297 | 299 | | |
| |||
319 | 321 | | |
320 | 322 | | |
321 | 323 | | |
322 | | - | |
323 | | - | |
324 | | - | |
325 | | - | |
| 324 | + | |
| 325 | + | |
| 326 | + | |
| 327 | + | |
326 | 328 | | |
327 | | - | |
| 329 | + | |
| 330 | + | |
| 331 | + | |
| 332 | + | |
| 333 | + | |
| 334 | + | |
328 | 335 | | |
329 | 336 | | |
330 | 337 | | |
| |||
340 | 347 | | |
341 | 348 | | |
342 | 349 | | |
| 350 | + | |
| 351 | + | |
| 352 | + | |
| 353 | + | |
| 354 | + | |
| 355 | + | |
| 356 | + | |
| 357 | + | |
| 358 | + | |
| 359 | + | |
| 360 | + | |
| 361 | + | |
| 362 | + | |
| 363 | + | |
| 364 | + | |
| 365 | + | |
| 366 | + | |
| 367 | + | |
| 368 | + | |
| 369 | + | |
| 370 | + | |
| 371 | + | |
| 372 | + | |
| 373 | + | |
| 374 | + | |
| 375 | + | |
| 376 | + | |
| 377 | + | |
| 378 | + | |
| 379 | + | |
| 380 | + | |
| 381 | + | |
| 382 | + | |
| 383 | + | |
| 384 | + | |
| 385 | + | |
| 386 | + | |
| 387 | + | |
| 388 | + | |
| 389 | + | |
| 390 | + | |
| 391 | + | |
| 392 | + | |
| 393 | + | |
| 394 | + | |
| 395 | + | |
| 396 | + | |
| 397 | + | |
| 398 | + | |
343 | 399 | | |
344 | 400 | | |
345 | 401 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
469 | 469 | | |
470 | 470 | | |
471 | 471 | | |
| 472 | + | |
| 473 | + | |
| 474 | + | |
472 | 475 | | |
473 | 476 | | |
474 | 477 | | |
| |||
487 | 490 | | |
488 | 491 | | |
489 | 492 | | |
| 493 | + | |
| 494 | + | |
| 495 | + | |
| 496 | + | |
| 497 | + | |
490 | 498 | | |
491 | 499 | | |
492 | 500 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
454 | 454 | | |
455 | 455 | | |
456 | 456 | | |
457 | | - | |
458 | | - | |
459 | | - | |
460 | | - | |
461 | | - | |
462 | | - | |
463 | | - | |
464 | | - | |
465 | | - | |
466 | | - | |
| 457 | + | |
| 458 | + | |
| 459 | + | |
| 460 | + | |
| 461 | + | |
467 | 462 | | |
468 | 463 | | |
469 | 464 | | |
| |||
482 | 477 | | |
483 | 478 | | |
484 | 479 | | |
| 480 | + | |
| 481 | + | |
| 482 | + | |
| 483 | + | |
| 484 | + | |
| 485 | + | |
| 486 | + | |
| 487 | + | |
| 488 | + | |
| 489 | + | |
| 490 | + | |
| 491 | + | |
| 492 | + | |
| 493 | + | |
| 494 | + | |
| 495 | + | |
| 496 | + | |
| 497 | + | |
| 498 | + | |
| 499 | + | |
| 500 | + | |
| 501 | + | |
| 502 | + | |
| 503 | + | |
| 504 | + | |
| 505 | + | |
| 506 | + | |
| 507 | + | |
| 508 | + | |
| 509 | + | |
| 510 | + | |
485 | 511 | | |
486 | 512 | | |
487 | 513 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | 3 | | |
| 4 | + | |
4 | 5 | | |
5 | 6 | | |
6 | 7 | | |
| |||
325 | 326 | | |
326 | 327 | | |
327 | 328 | | |
| 329 | + | |
| 330 | + | |
| 331 | + | |
| 332 | + | |
| 333 | + | |
| 334 | + | |
| 335 | + | |
| 336 | + | |
| 337 | + | |
| 338 | + | |
| 339 | + | |
| 340 | + | |
| 341 | + | |
| 342 | + | |
| 343 | + | |
| 344 | + | |
| 345 | + | |
| 346 | + | |
| 347 | + | |
| 348 | + | |
| 349 | + | |
| 350 | + | |
| 351 | + | |
| 352 | + | |
| 353 | + | |
| 354 | + | |
| 355 | + | |
| 356 | + | |
| 357 | + | |
| 358 | + | |
| 359 | + | |
| 360 | + | |
| 361 | + | |
| 362 | + | |
| 363 | + | |
| 364 | + | |
| 365 | + | |
| 366 | + | |
| 367 | + | |
| 368 | + | |
| 369 | + | |
| 370 | + | |
| 371 | + | |
| 372 | + | |
| 373 | + | |
| 374 | + | |
| 375 | + | |
| 376 | + | |
| 377 | + | |
| 378 | + | |
| 379 | + | |
| 380 | + | |
| 381 | + | |
| 382 | + | |
| 383 | + | |
| 384 | + | |
| 385 | + | |
| 386 | + | |
| 387 | + | |
| 388 | + | |
| 389 | + | |
| 390 | + | |
| 391 | + | |
| 392 | + | |
| 393 | + | |
| 394 | + | |
| 395 | + | |
| 396 | + | |
| 397 | + | |
| 398 | + | |
| 399 | + | |
| 400 | + | |
| 401 | + | |
| 402 | + | |
| 403 | + | |
| 404 | + | |
| 405 | + | |
| 406 | + | |
| 407 | + | |
| 408 | + | |
| 409 | + | |
| 410 | + | |
| 411 | + | |
| 412 | + | |
| 413 | + | |
| 414 | + | |
| 415 | + | |
| 416 | + | |
| 417 | + | |
| 418 | + | |
| 419 | + | |
| 420 | + | |
| 421 | + | |
| 422 | + | |
| 423 | + | |
| 424 | + | |
| 425 | + | |
| 426 | + | |
| 427 | + | |
| 428 | + | |
| 429 | + | |
| 430 | + | |
| 431 | + | |
| 432 | + | |
| 433 | + | |
| 434 | + | |
| 435 | + | |
| 436 | + | |
| 437 | + | |
| 438 | + | |
| 439 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
301 | 301 | | |
302 | 302 | | |
303 | 303 | | |
304 | | - | |
| 304 | + | |
| 305 | + | |
| 306 | + | |
| 307 | + | |
| 308 | + | |
| 309 | + | |
| 310 | + | |
| 311 | + | |
| 312 | + | |
| 313 | + | |
| 314 | + | |
| 315 | + | |
| 316 | + | |
| 317 | + | |
| 318 | + | |
| 319 | + | |
| 320 | + | |
| 321 | + | |
| 322 | + | |
| 323 | + | |
| 324 | + | |
305 | 325 | | |
306 | | - | |
307 | | - | |
308 | | - | |
309 | | - | |
310 | | - | |
311 | | - | |
| 326 | + | |
| 327 | + | |
| 328 | + | |
| 329 | + | |
| 330 | + | |
| 331 | + | |
| 332 | + | |
| 333 | + | |
| 334 | + | |
| 335 | + | |
| 336 | + | |
| 337 | + | |
| 338 | + | |
| 339 | + | |
312 | 340 | | |
313 | 341 | | |
314 | 342 | | |
0 commit comments