Skip to content

Migrate Planner shared directives to v3 cmdlet configuration - #3890

Open
Ramses Sanchez-Hernandez (ramsessanchez) wants to merge 18 commits into
powershell-v3from
ramsessanchez-planner-v3-migration
Open

Ramses Sanchez-Hernandez (ramsessanchez) wants to merge 18 commits into
powershell-v3from
ramsessanchez-planner-v3-migration

Conversation

@ramsessanchez

@ramsessanchez Ramses Sanchez-Hernandez (ramsessanchez) commented Nov 2, 2026 •

Copy link
Copy Markdown
Contributor

No separate issue is linked.

Changes proposed in this pull request

  • Migrate only the eight active shared cmdlet directives in src/Planner/Planner.md to the v3 configurator, retaining exact reviewed operation evidence, source annotations and positive/neighbor regressions. Original AutoRest directives remain active. Required profiles are exactly v1.0 and beta, with no exclusions; preserve tracked wrapper/Beta casing.
  • Preserve normal Support compatible natural-ID operation variants #3849 and finite Align operation IDs for required shared directive paths #3847 required-path ID alignment. Both complete original surviving operation-ID selections use the ordinary literal inventory: 137 v1.0 and 206 beta. All 609 evidence rows remain current; there are no rejected Legacy integration fields, generic bridge, profile-scoped authored rules, new collision/naming policy or global helper/emitter fixes.
  • Current refresh integrates normally merged Authentication Sync current v2 Authentication into powershell-v3 #3891 / target 844672d7c2238f6b29a208f9ba73fe28e9e29cef. Rebuild both profiles sequentially against the canonical normally packaged adapted Authentication 2.41.2, preserving prior commits. Generated manifests require Authentication 2.41.2; bins and packages carry only the three wrapper-owned DLLs, with no dependency preloads or duplicate Auth/Kiota/RMS/UriTemplate/Multipart copies. The generator emits the explicit separate runtime profile. Validation is PowerShell 7/Core only.

Current acceptance is not an all-runtime pass: full builds, ordinary strict inventory, targeted/unit tests, normal-manifest compiled checks and package smoke gates pass. All four real offline authenticated profile/cloud HTTP gates retain an actual FAIL / exit 1 because a bound generic header is lost on the GET after a 204 PATCH. #3886 is not overlaid or waived. Exact captures and all other gate outcomes are retained below.

Ignored/deferred scope: all profile-local readmes and src/readme.graph.md are deliberately ignored and unchanged. Parameter/schema aliases and transforms remain deferred; none occur in the shared Planner source. PowerShell 5.1 compatibility is unsupported/out of scope. No live Graph/OAuth/credential-store calls, other-owner changes, dependency injection shims, new PRs, force-pushes or prerequisite overlays.

Reviewed dispositions

Directive Disposition
1: operation-ID suppression Complete unchanged original regex, including unanchored group/user matches; current literal sets equal all original surviving selected routes. No fabricated removals or zero-match absence inference.
2: User/GroupPlanner Remove Suppress singleton DELETE; preserve GET/PATCH.
3: User/GroupPlannerTask/Plan mutations Suppress navigation mutations; preserve parent collection GET.
4: PlannerPlan/TaskDetail Remove Suppress root details DELETE, not GroupPlannerPlanDetail.
5: UserPlannerTask/Plan Get variants Suppress item GET; preserve List.
6: UserPlannerPlanTask Get variants Item GET already covered by directive 1; directive 7 independently removes the descendant collection subject. No redundant override.
7: UserPlannerTask/Plan descendants Suppress descendant resources/calls, including count resources whose historical kind metadata is absent. Preserve parent Plan/Task calls including delta/archive/unarchive/moveToContainer/getUsageRights.
8: GroupPlannerPlanBucket/Task descendants Already covered by directive 1; preserve neighboring collection List routes.

Overlaps remain deduplicated into the unchanged 254-entry shared exact method/path configuration: 171 unique v1.0 / 254 unique beta suppressions. The one-time historical qualified-action/function route audit remains only in module tests.

Integration and commit boundaries

Boundary Commit
Original migration/audit, annotations and tests fde35d161f
Original combined v1.0 / beta generations c57eafb99c / 0dabcef99a
Count-subject correction and separate generation boundaries 997caca220, 87d5896d4c / cb858af684
Normal #3849 integration and own API correction 9cf25c267b, 0eed050fa9
Post-3849 combined profile generations 5eab3ca588 / cf4f6e988a
Normal #3847 integration and ordinary evidence correction 69bb91a03c, 46243172be
Historical full v1.0 / beta generations on 604bd968 af8229a5e8 / c9c39382d5
Current normal #3891 integration 3c857d71ddac2c5bce460e31d36fcadef88217e4
Tightly coupled own test assertion: explicit runtime profile, no bare/opposite-profile adapter call 198407936e
Current full combined v1.0 regeneration ab0680c6bd: client source byte-identical; cmdlets/projects regenerated for profile-aware transport and Authentication-owned dependencies
Current full combined beta regeneration ba1c90225e: same combined boundary, tracked Beta casing preserved

Current canonical head: ba1c90225e9e7b7b856d8033101d46a59746b9b6. No rebase, amend, cherry-pick or squash; required Copilot App co-author trailers retained. Git's full no-rename diff population is 738 paths; rename-collapsed REST counts are not used as the full path count.

Actual final source/build evidence

Profile Compatible spec Git blob Historical source Git blob
v1.0 6b17e5c670edb0cfa60f0e0c3f4f03f43ca9e950 dd3e46fdb6f30eb2c530119979654f2876dca775
beta ae762ea25793ba27bc4c013870176fd8e94ef8d3 ff945046e9fb2d11ae0207f1ea3e4d0cbc7ae32d

Current acceptance imports adapted Authentication 2.41.2 from the exact normal-production package root, not Gallery Authentication or old 2.38:

C:\Users\ramsess\.copilot\session-state\4aa86cf9-d43c-4d2b-a4a3-aeaed01b8f29\files\authentication-v2-sync\final-source\modules

All 64 files match auth-package-hashes.json; canonical Authentication nupkg SHA256 is 2FC09BFE6B70D313BC56DF8ADCCFB1976FB4E90A1898BF8A916B4B8B792898EB. This root is first in process-local PSModulePath, followed by the user modules, Program Files modules and PowerShell 7 modules. Kiota is isolated 1.36.1+fd3bf87790149b87f40f7eae1a5feb9016625943, with KIOTA_Generation__MaxDegreeOfParallelism=1. No global environment/package edits or manual DLL bundles.

Current profile Full queued Release pipeline Fresh compiled exports / unique routes Reviewed suppressions absent Required neighbors
v1.0 exit 0 / OK, 28.4s 54 / 50 171 / 171 10 / 10
beta exit 0 / OK, 57.9s 238 / 206 254 / 254 18 / 18

All 50/206 prior emitted nonmigrated routes retain their exact public names. Both regenerated manifests load normally with Authentication minimum 2.41.2, zero dependency preloads, and exactly Microsoft.Graph.Wrapper.Planner.dll, Microsoft.Graph.Wrapper.Planner.Client.dll, Microsoft.Graph.Wrapper.Runtime.dll in each bin/package. Native dotnet pack --no-build packages the actual validated bins using the normal builder's nuspec/module-bin layout; it does not substitute for the full queued generation pipelines.

Current wrapper package SHA256
v1.0 67ADD7A34D5EE84352ADA8E068F1EADFACF76C3717880FF96994A0B0B01AAA04
beta 4262B5ECD53D74EE379C006EA5F36B1C0379853E8FA86C9F0A98EDED90B0CCAA

Exact final validation commands and results

Current raw evidence root (all commands run in the existing isolated owner worktree):

$a = 'C:\Users\ramsess\.copilot\session-state\24d3e949-2987-4321-9dab-8f5b71e66ff6\files\Planner-auth-844672'

With the prescribed process-local environment in the same invocation, run sequentially:

& 'C:\Users\ramsess\.copilot\session-state\871a5292-dc5b-423e-8083-5165b0006603\files\Invoke-QueuedModuleBuild.ps1' -RepoRoot 'C:\Users\ramsess\Repos\copilot-worktrees\msgraph-sdk-powershell\ramsessanchez-solid-happiness' -Module Planner -ApiVersion v1.0 -Configuration Release
& 'C:\Users\ramsess\.copilot\session-state\871a5292-dc5b-423e-8083-5165b0006603\files\Invoke-QueuedModuleBuild.ps1' -RepoRoot 'C:\Users\ramsess\Repos\copilot-worktrees\msgraph-sdk-powershell\ramsessanchez-solid-happiness' -Module Planner -ApiVersion beta -Configuration Release

Both passed, exit 0 / OK, with the populations/times above. No SkipKiota, GenerateOnly, NoCollisionData, legacy fallback or NO-CMDLETS acceptance.

pwsh -NoProfile -NonInteractive -File .\tools\Get-WrapperDirectiveMigrationInventory.ps1 -Module Planner -FailOnUnresolved -AsJson
dotnet test .\tools\WrapperGenerator.Tests\WrapperGenerator.Tests.csproj --configuration Release --no-restore --filter 'FullyQualifiedName~PlannerDirectiveMigrationTests|FullyQualifiedName~CmdletConfiguratorTests|FullyQualifiedName~NamingTests' --logger 'trx;LogFileName=targeted-tests.trx' --results-directory $a --verbosity quiet
dotnet test .\src\GraphWrapperRuntime\Runtime.Tests\Microsoft.Graph.Wrapper.Runtime.Tests.csproj --configuration Release --no-restore --logger 'trx;LogFileName=runtime-tests.trx' --results-directory $a --verbosity quiet

Passed: ordinary strict inventory 8/8 Mapped, exit 0; actual targeted TRX 119 executed/passed, 0 failed; actual normal-target runtime TRX 28 executed/passed, 0 failed. No zero-population test run is counted.

pwsh -NoProfile -NonInteractive -File "$a\Test-PlannerCompiled.ps1" -RepoRoot 'C:\Users\ramsess\Repos\copilot-worktrees\msgraph-sdk-powershell\ramsessanchez-solid-happiness' -Profile v1.0 -OutputPath "$a\v1.0-compiled.json"
pwsh -NoProfile -NonInteractive -File "$a\Test-PlannerCompiled.ps1" -RepoRoot 'C:\Users\ramsess\Repos\copilot-worktrees\msgraph-sdk-powershell\ramsessanchez-solid-happiness' -Profile beta -OutputPath "$a\beta-compiled.json"

Both passed, exit 0: fresh normal-manifest imports, exact migrated suppressions/neighbors, ordinary defaults, mutation safety metadata, unchanged names and the explicitly frozen scalar-value omission. Normal packages also pass the existing gate:

& "$a\Pack-ValidatedProfiles.ps1" -RepoRoot 'C:\Users\ramsess\Repos\copilot-worktrees\msgraph-sdk-powershell\ramsessanchez-solid-happiness'
pwsh -NoProfile -NonInteractive -File .\tools\Test-WrapperModule.ps1 -PackagePath "$a\packages\v1.0\Microsoft.Graph.Wrapper.Planner.3.0.0-alpha202611030256.nupkg" -ApiVersion v1.0
pwsh -NoProfile -NonInteractive -File .\tools\Test-WrapperModule.ps1 -PackagePath "$a\packages\beta\Microsoft.Graph.Wrapper.Planner.3.0.0-alpha202611030257.nupkg" -ApiVersion beta

Passed: 54/238 package exports match manifests, zero orphan workers; compiled dispatcher reaches genuine NoGraphSession; complex/enum conversions, 1/2 scalar cases and 19/19 untyped cases per profile pass. Package DLL bytes match actual compiled bins; Auth/Kiota are not shipped twice.

The actual real authenticated HTTP matrix uses Connect-MgGraph, the existing in-memory MockDataStore, the real GraphHttpClientFactory authentication/retry/redirect pipeline, and a test-only terminal handler. Each row is a fresh normal-manifest process. No live Graph/OAuth or credential store:

pwsh -NoProfile -NonInteractive -File "$a\Test-PlannerHttp.ps1" -RepoRoot 'C:\Users\ramsess\Repos\copilot-worktrees\msgraph-sdk-powershell\ramsessanchez-solid-happiness' -Profile v1.0 -Cloud Global -OutputPath "$a\http-v1.0-Global.json"
pwsh -NoProfile -NonInteractive -File "$a\Test-PlannerHttp.ps1" -RepoRoot 'C:\Users\ramsess\Repos\copilot-worktrees\msgraph-sdk-powershell\ramsessanchez-solid-happiness' -Profile beta -Cloud Global -OutputPath "$a\http-beta-Global.json"
pwsh -NoProfile -NonInteractive -File "$a\Test-PlannerHttp.ps1" -RepoRoot 'C:\Users\ramsess\Repos\copilot-worktrees\msgraph-sdk-powershell\ramsessanchez-solid-happiness' -Profile v1.0 -Cloud USGov -OutputPath "$a\http-v1.0-USGov.json"
pwsh -NoProfile -NonInteractive -File "$a\Test-PlannerHttp.ps1" -RepoRoot 'C:\Users\ramsess\Repos\copilot-worktrees\msgraph-sdk-powershell\ramsessanchez-solid-happiness' -Profile beta -Cloud USGov -OutputPath "$a\http-beta-USGov.json"
Actual HTTP gate Passing checks Failed checks Genuine declined prompts Offline requests Exit
v1.0 / Global 13 1 3 14 1
beta / Global 18 1 5 17 1
v1.0 / USGov 13 1 3 14 1
beta / USGov 18 1 5 17 1

The one failure in each row is bound generic refetch headers lost (#3886): x-planner-proof=patch-and-refetch is on the actual PATCH but absent from the immediate GET. The logs/captures and exit 1 remain; no all-runtime PASS claim.

Passing real transport checks include typed POST JSON/results; selected typed PATCH JSON with scalars/date/enum/model, 204 then typed GET result; exact encoded IDs; bodyless DELETE with If-Match; beta typed archive/move actions and bodyless extendExpiry; bound GET select/expand and generic headers; default list routing; WhatIf and genuine declined Confirm each send zero HTTP, one prompt per declined mutation; invalid binder inputs send zero HTTP. Session/client/profile cache reuse, timeout/reconnect invalidation and NoGraphSession identity pass.

Real factory BaseAddress stays https://graph.microsoft.com/v1.0/, including USGov tests. Generated requests nevertheless use the correct Global/USGov host and explicit v1.0/beta root; alternating typed profile requests never mutate the authenticated shared client's BaseAddress. Exact assembly identity/context/hash captures show one Authentication-owned Kiota/RMS/UriTemplate/Multipart closure with no DLL injection or duplicate contexts. Normal packaging closes the old RMS gap.

DELETE query obligation #3882 is not applicable to Planner's current specs: 57/82 actual DELETE operations have zero inline query parameters, zero component-parameter references and zero inherited path query declarations. This is recorded in delete-query-applicability.json; no unsupported query API was added.

pwsh -NoProfile -NonInteractive -File .\tools\Compare-WrapperCmdletNames.ps1 -GeneratedPath .\src\Planner\wrapper\v1.0\Cmdlets -OutLedger "$a\v1.0-parity.csv"
pwsh -NoProfile -NonInteractive -File .\tools\Compare-WrapperCmdletNames.ps1 -GeneratedPath .\src\Planner\wrapper\beta\Cmdlets -OutLedger "$a\beta-parity.csv"

Current raw parity: v1.0 exit 0, 54/54 match; beta exit 1, 0/238 match, with 132 mismatches (117 Mg/MgBeta-prefix-only, 15 other names) and 106 no-oracle rows. Prefixes are not normalized into a claimed raw pass.

Frozen limits

The existing beta client-only omission remains: GET /planner/tasks_v2/{task-id}/customFieldValues/{customFieldValue-id}. Kiota supports it, but the unchanged shared emitter mistakes scalar CustomFieldValue.value for a collection property and omits the item GET. Current beta spec population remains 461: 254 shared suppressions, 206 emitted unique routes, one frozen nonmigrated omission. No unrelated schema/emitter change, suppression or full-surface claim.

Current HTTP header-loss failure is additional and explicit, not relabeled as this frozen omission. #3881/#3882/#3886 were not overlaid. Live tenant paging/delta behavior is not claimed. PowerShell 5.1 remains out of scope.

Historical evidence remains historical: prior normal 604bd968 / Authentication 2.38.1 validation was 54/238 exports, 20.0/41.3s, eight Mapped, 119 targeted plus 26 runtime tests and offline binder/WhatIf checks; it did not prove actual HTTP serialization or the new Authentication behavior. Its complete original body, raw commands/results/TRX/input/Auth hashes and artifacts remain unchanged under Planner-final-604bd968 and this refresh's pr-before-update.json. Earlier 08/candidate artifacts are untouched. They are not substituted for current 844672 proof.

Current canonical evidence root:
C:\Users\ramsess\.copilot\session-state\24d3e949-2987-4321-9dab-8f5b71e66ff6\files\Planner-auth-844672.

Retained: revalidation-report.json, full build logs/exits, actual targeted-tests.trx / runtime-tests.trx, ordinary strict JSON, authentication-64-hashes.json, input hashes, compiled manifest/DLL data, package inventory/hashes/smoke logs, all four raw HTTP logs/exits/captures/assembly contexts and raw parity ledgers. Initial test-fixture errors are preserved as .initial-fixture; the corrected real gates above do not hide the actual refetch failure.

Other links

Preserve all eight shared AutoRest directives and map complete same-profile legacy selectors to pinned compatible operations. Cover suppressions and retained resource/function neighbors in module-specific regression tests.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…ration

Run the complete queued Release pipeline against pinned Kiota-compatible v1.0 Planner with Kiota 1.36.1 and official Authentication 2.38.1. Client/project output is byte-identical except the regenerated client lock; generated cmdlets enforce the reviewed suppressions.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…ration

Run the complete queued Release pipeline with pinned compatible beta spec, Kiota 1.36.1 and official Authentication 2.38.1; retain tracked Beta casing. All 122 surviving baseline supported routes retain their names; the pinned spec lacks 18 stale generated goal routes, removed by normal regeneration. Preserve existing unrelated beta naming limitations without suppressing unique routes.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…tadata

Treat legacy operations without action/function metadata as resource operations when reviewing UserPlannerPlanCount and UserPlannerTaskCount. Add exact both-profile evidence and positive regression coverage; the existing v1 parity suppression is preserved and beta gains the shared directive's suppression.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…rection

The corrected complete queued Kiota plus cmdlet/project Release pipeline succeeded in 43 seconds with 54 compiled exports. All generated client, cmdlet, project and lockfile output is byte-identical because v1.0 derived configuration already suppressed these two count routes; retain the required separate profile-generation boundary without fabricated source changes.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
… migration

Repeat the complete queued Kiota plus cmdlet/project Release pipeline after the reviewed count correction. The generated client/projects/lockfiles are byte-identical; beta correctly drops only the two UserPlannerPlanCount/UserPlannerTaskCount cmdlets and exports 135 commands, retaining every other supported baseline route and name.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…iants

Refresh all eight reviewed groups against current actual legacy and compatible specs. v1.0 uses complete supported literal evidence; beta retains 206 original survivors including 24 actual-kind guarded final action/function bridges, which still require normal merge of the reviewed Legacy inventory helper. Keep exact shared route configuration and parent/count fidelity unchanged.

Update only Planner tests to three-setting GeneratorConfig with explicit separate runtime profiles for naming, suppression and full actual-spec generation; cover both oracle modes. Targeted Planner/configurator/naming regressions pass 117 tests. Strict current inventory honestly fails only beta directive 1 until #3847 merges.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Run the current-target full queued Kiota and cmdlet/client/project Release pipeline with Kiota1.36.1 cap1 and official Authentication2.38.1: exit0/OK54exports18.6seconds. All171reviewed suppressions absent, all50nonmigrated compatible routes present,10neighbors retained; raw current parity54/54. Client/cmdlet/project output is byte-identical except current spec client lock metadata.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Run the current-target full queued Kiota and cmdlet/client/project Release pipeline with Kiota1.36.1 cap1 and official Authentication2.38.1: exit0/OK238exports34.4seconds. Preserve tracked Beta casing and all120prior surviving route names; emit86additional current spec routes with no authored collision policy. All254shared suppressions remain absent and18neighbors remain present.

Do not claim full-surface coverage: the baseline shared emitter skips GET /planner/tasks_v2/{task-id}/customFieldValues/{customFieldValue-id} because its scalar value property is misclassified as a collection. Raw beta parity remains failing0/238 (132mismatches and106no-oracle), with no suppressions added to conceal those limitations. Final publication still requires normally merged reviewed Legacy helper and strict PASS.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Integrate the normally merged required-path ID alignment, refresh all609current method/path/ID rows, and remove rejected Legacy integration fields. Both unchanged original selections are complete with ordinary literal evidence:137v1.0 and206beta. Preserve unchanged shared exact suppressions, count fidelity, parent calls and a one-time historical route audit in tests.

Actual normal strict inventory maps all8directives, and119Planner/configurator/naming regressions pass. No helper overlay, global generator change, profile-scoped authored rule or unrelated scalar-value emitter fix. Final generation and validation target PowerShell7/Core only.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…alignment

Run full queued Kiota plus cmdlet/client/project Release pipeline on final source46243172be and normal target604bd968, using Kiota1.36.1 cap1 and original official Auth2.38.1 on PowerShell7/Core. Exit0/OK54exports20.0seconds;171suppressions absent,50unique routes,10neighbors, offline defaults/binder/WhatIf checks pass; raw parity54/54. Combined profile output is byte-identical; preserve the required generation commit boundary without fabricated deltas.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…ignment

Run full queued Kiota plus cmdlet/client/project Release pipeline after final source46243172be on normal604bd968, Kiota1.36.1 cap1 and original official Auth2.38.1 on PowerShell7/Core. Exit0/OK238exports41.3seconds;254shared suppressions absent,206unique compiled routes,18neighbors, offline defaults/binder/WhatIf checks pass. Combined client/cmdlet/project sources byte-identical except updated compatible spec lock hash; preserve tracked Beta casing.

Frozen nonmigrated scalarCustomFieldValue.value item-GET emitter omission and raw beta parity0of238 remain explicit baseline limits, not rewritten or suppressed. No actual network/mutation serialization or PowerShell5.1 validation claimed.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Assert actual whole-spec generation explicitly passes each separate runtime profile to GetRequestAdapter and never emits a bare/default or opposite-profile call, with derived naming data on and off. Keep existing literal directive evidence, shared authored rules, selected surfaces and frozen schema limits unchanged. Actual119module/configurator/namingtests pass; all8ordinary strict directives Mapped.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Complete full queued Kiota plus cmdlet/client/project Release generation after final source198407936e against target844672: exit0/OK54exports28.4seconds, canonical adaptedAuth2.41.2complete64filepackage andKiota1.36.1cap1. Emit explicit v1.0 runtime service root and regenerated project ownership: wrapper bin contains only its three owned DLLs; Authentication owns complete Kiota/RMS/UriTemplate/Multipart closure without preloads. Kiota client source byte-identical; preserve separate combined profile-generation boundary.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Complete sequential full queued Kiota plus cmdlet/client/project Release generation after final source198407936e against target844672: exit0/OK238exports57.9seconds, canonical adaptedAuth2.41.2complete64filepackage andKiota1.36.1cap1. Emit explicit beta runtime service root and regenerated project ownership: three wrapper-owned DLLs only, no dependency preloads or duplicate Auth/Kiota. Kiota client source byte-identical; preserve separate combined profile-generation boundary and tracked Beta casing.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant