From 5e5da3f3e320edd5574d8bb73b9fc4412e419b76 Mon Sep 17 00:00:00 2001 From: Ramakrishna Prabhu Date: Fri, 26 Jun 2026 11:16:42 -0500 Subject: [PATCH 1/3] skills(cuopt-developer): update for mathematical_optimization namespace refactor Co-Authored-By: Claude Sonnet 4.6 --- skills/cuopt-developer/SKILL.md | 1 + upstream-patches/cvxpy-cuopt-status11.patch | 20 +++++++++ upstream-patches/pulp-cuopt-status11.patch | 48 +++++++++++++++++++++ upstream-patches/pyomo-cuopt-status11.patch | 46 ++++++++++++++++++++ 4 files changed, 115 insertions(+) create mode 100644 upstream-patches/cvxpy-cuopt-status11.patch create mode 100644 upstream-patches/pulp-cuopt-status11.patch create mode 100644 upstream-patches/pyomo-cuopt-status11.patch diff --git a/skills/cuopt-developer/SKILL.md b/skills/cuopt-developer/SKILL.md index d457b41cf4..ecc1187e29 100644 --- a/skills/cuopt-developer/SKILL.md +++ b/skills/cuopt-developer/SKILL.md @@ -13,6 +13,7 @@ metadata: - python-bindings --- + # cuOpt Developer Skill Contribute to the NVIDIA cuOpt codebase. This skill is for modifying cuOpt itself, not for using it. diff --git a/upstream-patches/cvxpy-cuopt-status11.patch b/upstream-patches/cvxpy-cuopt-status11.patch new file mode 100644 index 0000000000..5dadb54e74 --- /dev/null +++ b/upstream-patches/cvxpy-cuopt-status11.patch @@ -0,0 +1,20 @@ +diff --git a/cvxpy/reductions/solvers/conic_solvers/cuopt_conif.py b/cvxpy/reductions/solvers/conic_solvers/cuopt_conif.py +index 19e5162..af092a2 100644 +--- a/cvxpy/reductions/solvers/conic_solvers/cuopt_conif.py ++++ b/cvxpy/reductions/solvers/conic_solvers/cuopt_conif.py +@@ -71,6 +71,7 @@ class CUOPT(ConicSolver): + MILPTerminationStatus.Infeasible: s.INFEASIBLE, + MILPTerminationStatus.Unbounded: s.UNBOUNDED, + MILPTerminationStatus.TimeLimit: s.USER_LIMIT, ++ MILPTerminationStatus.UnboundedOrInfeasible: s.INFEASIBLE_OR_UNBOUNDED, + } + return STATUS_MAP_MIP[cuopt_status] + +@@ -84,6 +85,7 @@ class CUOPT(ConicSolver): + LPTerminationStatus.IterationLimit: s.USER_LIMIT, + LPTerminationStatus.TimeLimit: s.USER_LIMIT, + LPTerminationStatus.PrimalFeasible: s.USER_LIMIT, ++ LPTerminationStatus.UnboundedOrInfeasible: s.INFEASIBLE_OR_UNBOUNDED, + } + return STATUS_MAP_LP[cuopt_status] + diff --git a/upstream-patches/pulp-cuopt-status11.patch b/upstream-patches/pulp-cuopt-status11.patch new file mode 100644 index 0000000000..e5256f986e --- /dev/null +++ b/upstream-patches/pulp-cuopt-status11.patch @@ -0,0 +1,48 @@ +diff --git a/pulp/apis/cuopt_api.py b/pulp/apis/cuopt_api.py +index 10eb869..4867c95 100644 +--- a/pulp/apis/cuopt_api.py ++++ b/pulp/apis/cuopt_api.py +@@ -112,6 +112,12 @@ class CUOPT(LpSolver): + 7: LpStatusNotSolved, # Primal Feasible + 8: LpStatusNotSolved, # Feasible Found + 9: LpStatusNotSolved, # Concurrent Limit ++ 10: LpStatusNotSolved, # Work Limit ++ # cuOpt returns UnboundedOrInfeasible when the presolver ++ # detects one of the two but cannot disambiguate. PuLP has ++ # no combined status, so map to Undefined (matches how ++ # GLPK_CMD reports the same situation). ++ 11: LpStatusUndefined, # Unbounded or Infeasible + } + + status = CuoptStatus.get(solutionStatus, LpStatusUndefined) +diff --git a/pulp/tests/test_pulp.py b/pulp/tests/test_pulp.py +index af163fe..a5dff83 100644 +--- a/pulp/tests/test_pulp.py ++++ b/pulp/tests/test_pulp.py +@@ -656,6 +656,14 @@ class BaseSolverTest: + self.solver, + [const.LpStatusInfeasible, const.LpStatusUnbounded], + ) ++ elif self.solver.name == "CUOPT": ++ # cuOpt reports UnboundedOrInfeasible (mapped to Undefined) ++ # for problems where its presolver cannot disambiguate. ++ pulpTestCheck( ++ prob, ++ self.solver, ++ [const.LpStatusUnbounded, const.LpStatusUndefined], ++ ) + elif self.solver.name in ["COINMP_DLL", "MIPCL_CMD"]: + # COINMP_DLL is just plain wrong + # also MIPCL_CMD +@@ -1010,8 +1018,9 @@ class BaseSolverTest: + prob += c1 <= 0 + if self.solver.name in ["GUROBI_CMD", "SCIP_CMD", "FSCIP_CMD", "SCIP_PY"]: + pulpTestCheck(prob, self.solver, [const.LpStatusNotSolved]) +- elif self.solver.name in ["GLPK_CMD"]: +- # GLPK_CMD returns InfeasibleOrUnbounded ++ elif self.solver.name in ["GLPK_CMD", "CUOPT"]: ++ # These solvers may return InfeasibleOrUnbounded (reported as ++ # Undefined) rather than proving infeasibility. + pulpTestCheck( + prob, + self.solver, diff --git a/upstream-patches/pyomo-cuopt-status11.patch b/upstream-patches/pyomo-cuopt-status11.patch new file mode 100644 index 0000000000..fb25fb7c43 --- /dev/null +++ b/upstream-patches/pyomo-cuopt-status11.patch @@ -0,0 +1,46 @@ +diff --git a/pyomo/solvers/plugins/solvers/cuopt_direct.py b/pyomo/solvers/plugins/solvers/cuopt_direct.py +index 87f16b8..4ccdc9e 100644 +--- a/pyomo/solvers/plugins/solvers/cuopt_direct.py ++++ b/pyomo/solvers/plugins/solvers/cuopt_direct.py +@@ -249,16 +249,18 @@ class CUOPTDirect(DirectSolver): + is_mip = solution.get_problem_category() + + # Termination Status +- # 0 - CUOPT_TERIMINATION_STATUS_NO_TERMINATION +- # 1 - CUOPT_TERIMINATION_STATUS_OPTIMAL +- # 2 - CUOPT_TERIMINATION_STATUS_INFEASIBLE +- # 3 - CUOPT_TERIMINATION_STATUS_UNBOUNDED +- # 4 - CUOPT_TERIMINATION_STATUS_ITERATION_LIMIT +- # 5 - CUOPT_TERIMINATION_STATUS_TIME_LIMIT +- # 6 - CUOPT_TERIMINATION_STATUS_NUMERICAL_ERROR +- # 7 - CUOPT_TERIMINATION_STATUS_PRIMAL_FEASIBLE +- # 8 - CUOPT_TERIMINATION_STATUS_FEASIBLE_FOUND +- # 9 - CUOPT_TERIMINATION_STATUS_CONCURRENT_LIMIT ++ # 0 - CUOPT_TERIMINATION_STATUS_NO_TERMINATION ++ # 1 - CUOPT_TERIMINATION_STATUS_OPTIMAL ++ # 2 - CUOPT_TERIMINATION_STATUS_INFEASIBLE ++ # 3 - CUOPT_TERIMINATION_STATUS_UNBOUNDED ++ # 4 - CUOPT_TERIMINATION_STATUS_ITERATION_LIMIT ++ # 5 - CUOPT_TERIMINATION_STATUS_TIME_LIMIT ++ # 6 - CUOPT_TERIMINATION_STATUS_NUMERICAL_ERROR ++ # 7 - CUOPT_TERIMINATION_STATUS_PRIMAL_FEASIBLE ++ # 8 - CUOPT_TERIMINATION_STATUS_FEASIBLE_FOUND ++ # 9 - CUOPT_TERIMINATION_STATUS_CONCURRENT_LIMIT ++ # 10 - CUOPT_TERIMINATION_STATUS_WORK_LIMIT ++ # 11 - CUOPT_TERIMINATION_STATUS_UNBOUNDED_OR_INFEASIBLE + + if status == 1: + self.results.solver.status = SolverStatus.ok +@@ -292,6 +294,12 @@ class CUOPTDirect(DirectSolver): + self.results.solver.status = SolverStatus.ok + self.results.solver.termination_condition = TerminationCondition.other + soln.status = SolutionStatus.other ++ elif status == 11: ++ self.results.solver.status = SolverStatus.warning ++ self.results.solver.termination_condition = ( ++ TerminationCondition.infeasibleOrUnbounded ++ ) ++ soln.status = SolutionStatus.unsure + else: + self.results.solver.status = SolverStatus.error + self.results.solver.termination_condition = TerminationCondition.error From d725860436c49c3a76cf435d85b6056b893c8b6e Mon Sep 17 00:00:00 2001 From: Ramakrishna Prabhu Date: Fri, 26 Jun 2026 11:18:40 -0500 Subject: [PATCH 2/3] skills(cuopt-developer): remove accidentally committed upstream-patches files Co-Authored-By: Claude Sonnet 4.6 --- upstream-patches/cvxpy-cuopt-status11.patch | 20 --------- upstream-patches/pulp-cuopt-status11.patch | 48 --------------------- upstream-patches/pyomo-cuopt-status11.patch | 46 -------------------- 3 files changed, 114 deletions(-) delete mode 100644 upstream-patches/cvxpy-cuopt-status11.patch delete mode 100644 upstream-patches/pulp-cuopt-status11.patch delete mode 100644 upstream-patches/pyomo-cuopt-status11.patch diff --git a/upstream-patches/cvxpy-cuopt-status11.patch b/upstream-patches/cvxpy-cuopt-status11.patch deleted file mode 100644 index 5dadb54e74..0000000000 --- a/upstream-patches/cvxpy-cuopt-status11.patch +++ /dev/null @@ -1,20 +0,0 @@ -diff --git a/cvxpy/reductions/solvers/conic_solvers/cuopt_conif.py b/cvxpy/reductions/solvers/conic_solvers/cuopt_conif.py -index 19e5162..af092a2 100644 ---- a/cvxpy/reductions/solvers/conic_solvers/cuopt_conif.py -+++ b/cvxpy/reductions/solvers/conic_solvers/cuopt_conif.py -@@ -71,6 +71,7 @@ class CUOPT(ConicSolver): - MILPTerminationStatus.Infeasible: s.INFEASIBLE, - MILPTerminationStatus.Unbounded: s.UNBOUNDED, - MILPTerminationStatus.TimeLimit: s.USER_LIMIT, -+ MILPTerminationStatus.UnboundedOrInfeasible: s.INFEASIBLE_OR_UNBOUNDED, - } - return STATUS_MAP_MIP[cuopt_status] - -@@ -84,6 +85,7 @@ class CUOPT(ConicSolver): - LPTerminationStatus.IterationLimit: s.USER_LIMIT, - LPTerminationStatus.TimeLimit: s.USER_LIMIT, - LPTerminationStatus.PrimalFeasible: s.USER_LIMIT, -+ LPTerminationStatus.UnboundedOrInfeasible: s.INFEASIBLE_OR_UNBOUNDED, - } - return STATUS_MAP_LP[cuopt_status] - diff --git a/upstream-patches/pulp-cuopt-status11.patch b/upstream-patches/pulp-cuopt-status11.patch deleted file mode 100644 index e5256f986e..0000000000 --- a/upstream-patches/pulp-cuopt-status11.patch +++ /dev/null @@ -1,48 +0,0 @@ -diff --git a/pulp/apis/cuopt_api.py b/pulp/apis/cuopt_api.py -index 10eb869..4867c95 100644 ---- a/pulp/apis/cuopt_api.py -+++ b/pulp/apis/cuopt_api.py -@@ -112,6 +112,12 @@ class CUOPT(LpSolver): - 7: LpStatusNotSolved, # Primal Feasible - 8: LpStatusNotSolved, # Feasible Found - 9: LpStatusNotSolved, # Concurrent Limit -+ 10: LpStatusNotSolved, # Work Limit -+ # cuOpt returns UnboundedOrInfeasible when the presolver -+ # detects one of the two but cannot disambiguate. PuLP has -+ # no combined status, so map to Undefined (matches how -+ # GLPK_CMD reports the same situation). -+ 11: LpStatusUndefined, # Unbounded or Infeasible - } - - status = CuoptStatus.get(solutionStatus, LpStatusUndefined) -diff --git a/pulp/tests/test_pulp.py b/pulp/tests/test_pulp.py -index af163fe..a5dff83 100644 ---- a/pulp/tests/test_pulp.py -+++ b/pulp/tests/test_pulp.py -@@ -656,6 +656,14 @@ class BaseSolverTest: - self.solver, - [const.LpStatusInfeasible, const.LpStatusUnbounded], - ) -+ elif self.solver.name == "CUOPT": -+ # cuOpt reports UnboundedOrInfeasible (mapped to Undefined) -+ # for problems where its presolver cannot disambiguate. -+ pulpTestCheck( -+ prob, -+ self.solver, -+ [const.LpStatusUnbounded, const.LpStatusUndefined], -+ ) - elif self.solver.name in ["COINMP_DLL", "MIPCL_CMD"]: - # COINMP_DLL is just plain wrong - # also MIPCL_CMD -@@ -1010,8 +1018,9 @@ class BaseSolverTest: - prob += c1 <= 0 - if self.solver.name in ["GUROBI_CMD", "SCIP_CMD", "FSCIP_CMD", "SCIP_PY"]: - pulpTestCheck(prob, self.solver, [const.LpStatusNotSolved]) -- elif self.solver.name in ["GLPK_CMD"]: -- # GLPK_CMD returns InfeasibleOrUnbounded -+ elif self.solver.name in ["GLPK_CMD", "CUOPT"]: -+ # These solvers may return InfeasibleOrUnbounded (reported as -+ # Undefined) rather than proving infeasibility. - pulpTestCheck( - prob, - self.solver, diff --git a/upstream-patches/pyomo-cuopt-status11.patch b/upstream-patches/pyomo-cuopt-status11.patch deleted file mode 100644 index fb25fb7c43..0000000000 --- a/upstream-patches/pyomo-cuopt-status11.patch +++ /dev/null @@ -1,46 +0,0 @@ -diff --git a/pyomo/solvers/plugins/solvers/cuopt_direct.py b/pyomo/solvers/plugins/solvers/cuopt_direct.py -index 87f16b8..4ccdc9e 100644 ---- a/pyomo/solvers/plugins/solvers/cuopt_direct.py -+++ b/pyomo/solvers/plugins/solvers/cuopt_direct.py -@@ -249,16 +249,18 @@ class CUOPTDirect(DirectSolver): - is_mip = solution.get_problem_category() - - # Termination Status -- # 0 - CUOPT_TERIMINATION_STATUS_NO_TERMINATION -- # 1 - CUOPT_TERIMINATION_STATUS_OPTIMAL -- # 2 - CUOPT_TERIMINATION_STATUS_INFEASIBLE -- # 3 - CUOPT_TERIMINATION_STATUS_UNBOUNDED -- # 4 - CUOPT_TERIMINATION_STATUS_ITERATION_LIMIT -- # 5 - CUOPT_TERIMINATION_STATUS_TIME_LIMIT -- # 6 - CUOPT_TERIMINATION_STATUS_NUMERICAL_ERROR -- # 7 - CUOPT_TERIMINATION_STATUS_PRIMAL_FEASIBLE -- # 8 - CUOPT_TERIMINATION_STATUS_FEASIBLE_FOUND -- # 9 - CUOPT_TERIMINATION_STATUS_CONCURRENT_LIMIT -+ # 0 - CUOPT_TERIMINATION_STATUS_NO_TERMINATION -+ # 1 - CUOPT_TERIMINATION_STATUS_OPTIMAL -+ # 2 - CUOPT_TERIMINATION_STATUS_INFEASIBLE -+ # 3 - CUOPT_TERIMINATION_STATUS_UNBOUNDED -+ # 4 - CUOPT_TERIMINATION_STATUS_ITERATION_LIMIT -+ # 5 - CUOPT_TERIMINATION_STATUS_TIME_LIMIT -+ # 6 - CUOPT_TERIMINATION_STATUS_NUMERICAL_ERROR -+ # 7 - CUOPT_TERIMINATION_STATUS_PRIMAL_FEASIBLE -+ # 8 - CUOPT_TERIMINATION_STATUS_FEASIBLE_FOUND -+ # 9 - CUOPT_TERIMINATION_STATUS_CONCURRENT_LIMIT -+ # 10 - CUOPT_TERIMINATION_STATUS_WORK_LIMIT -+ # 11 - CUOPT_TERIMINATION_STATUS_UNBOUNDED_OR_INFEASIBLE - - if status == 1: - self.results.solver.status = SolverStatus.ok -@@ -292,6 +294,12 @@ class CUOPTDirect(DirectSolver): - self.results.solver.status = SolverStatus.ok - self.results.solver.termination_condition = TerminationCondition.other - soln.status = SolutionStatus.other -+ elif status == 11: -+ self.results.solver.status = SolverStatus.warning -+ self.results.solver.termination_condition = ( -+ TerminationCondition.infeasibleOrUnbounded -+ ) -+ soln.status = SolutionStatus.unsure - else: - self.results.solver.status = SolverStatus.error - self.results.solver.termination_condition = TerminationCondition.error From 3fd6775583ac5171c783edb33685e5eff215a1ef Mon Sep 17 00:00:00 2001 From: nvskills-svc-account Date: Fri, 26 Jun 2026 16:27:46 +0000 Subject: [PATCH 3/3] Attach NVSkills validation signatures Signed-off-by: nvskills-svc-account --- skills/cuopt-developer/BENCHMARK.md | 10 +++---- skills/cuopt-developer/skill-card.md | 44 ++++++++++++++++------------ skills/cuopt-developer/skill.oms.sig | 2 +- 3 files changed, 31 insertions(+), 25 deletions(-) diff --git a/skills/cuopt-developer/BENCHMARK.md b/skills/cuopt-developer/BENCHMARK.md index f2825348f1..516d3c2a68 100644 --- a/skills/cuopt-developer/BENCHMARK.md +++ b/skills/cuopt-developer/BENCHMARK.md @@ -7,7 +7,7 @@ This benchmark summarizes 3-Tier Evaluation from NVSkills-Eval results for the s ## Evaluation Summary - Skill: `cuopt-developer` -- Evaluation date: 2026-06-22 +- Evaluation date: 2026-06-26 - NVSkills-Eval profile: `external` - Environment: `astra-sandbox` - Dataset: 3 evaluation tasks @@ -55,10 +55,10 @@ Task composition is derived from the evaluation dataset when possible. Entries w | Dimension | Num | `claude-code` | `codex` | |---|---:|---:|---:| | Security | 3 | 100% (+0%) | 100% (+0%) | -| Correctness | 3 | 82% (+25%) | 93% (+34%) | -| Discoverability | 3 | 67% (+50%) | 88% (+52%) | -| Effectiveness | 3 | 91% (+27%) | 86% (+27%) | -| Efficiency | 3 | 71% (+46%) | 84% (+40%) | +| Correctness | 3 | 75% (+20%) | 89% (+26%) | +| Discoverability | 3 | 42% (+25%) | 72% (+41%) | +| Effectiveness | 3 | 95% (+40%) | 90% (+29%) | +| Efficiency | 3 | 48% (+22%) | 69% (+34%) | Score values show skill-assisted performance. Values in parentheses show uplift versus the no-skill baseline when baseline data is available. diff --git a/skills/cuopt-developer/skill-card.md b/skills/cuopt-developer/skill-card.md index 30d0bbccc9..875d7a00fe 100644 --- a/skills/cuopt-developer/skill-card.md +++ b/skills/cuopt-developer/skill-card.md @@ -7,44 +7,50 @@ This skill is ready for commercial/non-commercial use.
NVIDIA
### License/Terms of Use:
-Apache-2.0
+Apache 2.0
## Use Case:
-Developers and engineers who modify, build, test, debug, and contribute to the NVIDIA cuOpt solver codebase, including C++/CUDA engine internals, Python bindings, server endpoints, CI pipelines, and documentation.
+Developers and engineers who modify, build, test, debug, and contribute to the NVIDIA cuOpt optimization engine codebase, including C++/CUDA solver internals, Python bindings, server components, and CI workflows.
### Deployment Geography for Use:
Global
+## Requirements / Dependencies:
+**Requires API Key or External Credential:** [Not Specified]
+**Credential Type(s):** [None identified]
+ +Do not include secrets in prompts/logs/output; use least-privilege credentials; rotate keys as appropriate.
+ ## Known Risks and Mitigations:
Risk: Review before execution as proposals could introduce incorrect or misleading guidance into skills.
Mitigation: Review and scan skill before deployment.
## Reference(s):
-- [cuOpt User Guide](https://docs.nvidia.com/cuopt/user-guide/latest/introduction.html)
-- [cuOpt GitHub Repository](https://github.com/NVIDIA/cuopt)
-- [Build and Test Reference](references/build_and_test.md)
-- [Contributing Guide](references/contributing.md)
-- [Coding Conventions](references/conventions.md)
-- [First-Time Setup](references/first_time_setup.md)
-- [Python Bindings Architecture](references/python_bindings.md)
+- [Build and Test](references/build_and_test.md)
+- [Contributing](references/contributing.md)
+- [Conventions](references/conventions.md)
+- [First Time Setup](references/first_time_setup.md)
+- [Python Bindings](references/python_bindings.md)
- [Troubleshooting](references/troubleshooting.md)
-- [VRP Dimension Internals](references/vrp_skills.md)
-- [Numerical Debugging Methodology](resources/numerical_debugging.md)
+- [VRP Skills](references/vrp_skills.md)
+- [Numerical Debugging](resources/numerical_debugging.md)
+- [cuOpt User Guide](https://docs.nvidia.com/cuopt/user-guide/latest/introduction.html)
+- [cuOpt Examples](https://github.com/NVIDIA/cuopt-examples)
## Skill Output:
**Output Type(s):** [Code, Shell commands, Configuration instructions]
-**Output Format:** [Markdown with inline code blocks]
+**Output Format:** [Markdown with inline bash code blocks]
**Output Parameters:** [1D]
**Other Properties Related to Output:** [None]
## Evaluation Agents Used:
-- claude-code
-- codex
+- `claude-code`
+- `codex`
## Evaluation Tasks:
-Evaluated against 3 internal evaluation tasks in astra-sandbox environment using NVSkills-Eval external profile.
+Evaluated against 3 evaluation tasks in the astra-sandbox environment using the external NVSkills-Eval profile. All tasks were positive skill-activation cases with 1 attempt per task and a 50% pass threshold. Overall verdict: PASS.
## Evaluation Metrics Used:
Reported benchmark dimensions:
@@ -69,10 +75,10 @@ Underlying evaluation signals used in this run:
| Dimension | Num | `claude-code` | `codex` | |---|---:|---:|---:| | Security | 3 | 100% (+0%) | 100% (+0%) | -| Correctness | 3 | 82% (+25%) | 93% (+34%) | -| Discoverability | 3 | 67% (+50%) | 88% (+52%) | -| Effectiveness | 3 | 91% (+27%) | 86% (+27%) | -| Efficiency | 3 | 71% (+46%) | 84% (+40%) | +| Correctness | 3 | 75% (+20%) | 89% (+26%) | +| Discoverability | 3 | 42% (+25%) | 72% (+41%) | +| Effectiveness | 3 | 95% (+40%) | 90% (+29%) | +| Efficiency | 3 | 48% (+22%) | 69% (+34%) | ## Skill Version(s):
26.08.00 (source: frontmatter)
diff --git a/skills/cuopt-developer/skill.oms.sig b/skills/cuopt-developer/skill.oms.sig index d43b13c421..2159ec4201 100644 --- a/skills/cuopt-developer/skill.oms.sig +++ b/skills/cuopt-developer/skill.oms.sig @@ -1 +1 @@ -{"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json","verificationMaterial":{"x509CertificateChain":{"certificates":[{"rawBytes":"MIICgzCCAgmgAwIBAgIUKIyS7SxNteQIiWzK1dWj85E6520wCgYIKoZIzj0EAwMwVTELMAkGA1UEBhMCVVMxGzAZBgNVBAoMEk5WSURJQSBDb3Jwb3JhdGlvbjEpMCcGA1UEAwwgTlZJRElBIEFnZW50IENhcGFiaWxpdGllcyBJQ0EgMDEwHhcNMjYwNDAxMDAwMDAwWhcNMjgwNDIyMTUzMzA5WjBUMQswCQYDVQQGEwJVUzEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0aW9uMSgwJgYDVQQDDB9OVklESUEgQWdlbnQgU2tpbGxzIFNpZ25pbmcgMDAxMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEYoRM9bQl/dGlwSRNi6bTpIJUXH8Nv9GciP6LSflJYYMLCc296kpyuTSsk5ddbAWiDcFX3C/ydX3jwc+qCLYP6uHy9XphyLjOQ27Yb2J6rBLVtRBS1mgGco/Gr7fL6ODco4GaMIGXMB0GA1UdDgQWBBRQ/5ZW3nJ6lmo9SVk7I15o7UGmpTAfBgNVHSMEGDAWgBRPGpILxMBBleJSsBGjrMKsby1CgjAMBgNVHRMBAf8EAjAAMA4GA1UdDwEB/wQEAwIHgDA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAKBggqhkjOPQQDAwNoADBlAjAUygu/GiOCIXrgGr4SmLgeEVDcEitfFUv7ALbvLVGVyMysB3mxmO/uInZfXzWcJZsCMQDxuoxj4ZmO30jhkPIcCxGFCOvnUsnfU3TfGcouYm4M6iRpbKvtVnHPiy4bi6pcKf0="},{"rawBytes":"MIICiDCCAg6gAwIBAgIUZsIuSv9NkpJCNqtYEfCouVv5BzowCgYIKoZIzj0EAwMwUTELMAkGA1UEBhMCVVMxGzAZBgNVBAoMEk5WSURJQSBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcTlZJRElBIEFnZW50IENhcGFiaWxpdGllcyBDQTAgFw0yNjA0MDEwMDAwMDBaGA85OTk5MTIzMTIzNTk1OVowVTELMAkGA1UEBhMCVVMxGzAZBgNVBAoMEk5WSURJQSBDb3Jwb3JhdGlvbjEpMCcGA1UEAwwgTlZJRElBIEFnZW50IENhcGFiaWxpdGllcyBJQ0EgMDEwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASI72cR3ctKGg4VWnB3bNja6g1Z2PnOmFEopkPof+QeIcPk9rT+g9MjJnq51EQXL93a7C2GJ9J985G4o2V85VD7wJ1RaXhluHW2rf3y8bQGeAYaKMr5s/hUgn+M3/9WlWejgaAwgZ0wHQYDVR0OBBYEFE8akgvEwEGV4lKwEaOswqxvLUKCMB8GA1UdIwQYMBaAFItnoAjjfuCEUvzyvWyI2vOGvwPjMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgEGMDcGCCsGAQUFBwEBBCswKTAnBggrBgEFBQcwAYYbaHR0cDovL29jc3AubmRpcy5udmlkaWEuY29tMAoGCCqGSM49BAMDA2gAMGUCMQCeIMMfAbyzPDacw2MxG+Yt1cikrJX/DVxiGfXuHmkkXn6VgSzE79+lkqDErpVO2gYCMCNEColOyvUvkzZGUEI1hQ3PfMgi3FIo9tHoBKMw4/wGBLFpu/0ubtmbBXM6/UMOEw=="},{"rawBytes":"MIICRTCCAcygAwIBAgIUeJdY3rV86EdvFmG7L8LJBsyQFYkwCgYIKoZIzj0EAwMwUTELMAkGA1UEBhMCVVMxGzAZBgNVBAoMEk5WSURJQSBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcTlZJRElBIEFnZW50IENhcGFiaWxpdGllcyBDQTAgFw0yNjA0MDEwMDAwMDBaGA85OTk5MTIzMTIzNTk1OVowUTELMAkGA1UEBhMCVVMxGzAZBgNVBAoMEk5WSURJQSBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcTlZJRElBIEFnZW50IENhcGFiaWxpdGllcyBDQTB2MBAGByqGSM49AgEGBSuBBAAiA2IABAYpiXCDjJ9NT2eSDhyHJVSw1Tbze18cGG2F/578oWvHxg23eQAhNRYdq88i1iOshZSO6C29doKui5Xpmo/7Ctw9Sx4PP2RzOmIuOLCuTdNtKcTRwi4GEsd5BAFvWj42M6NjMGEwHQYDVR0OBBYEFItnoAjjfuCEUvzyvWyI2vOGvwPjMB8GA1UdIwQYMBaAFItnoAjjfuCEUvzyvWyI2vOGvwPjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMDA2cAMGQCMCwtAjWLaNwgGWNCgdyNoTyvNhqWRECRJV2r3+7w8g0PL6NHLOsbkgE09BH95h8XlgIwTaQmbbUh2ChAJ5TA1wRiVDnCcvbzHlZl2jM2FcwQQZlk19LOAbyGMRixbu2Ww/rj"}]},"tlogEntries":[]},"dsseEnvelope":{"payload":"ewogICJfdHlwZSI6ICJodHRwczovL2luLXRvdG8uaW8vU3RhdGVtZW50L3YxIiwKICAic3ViamVjdCI6IFsKICAgIHsKICAgICAgIm5hbWUiOiAiY3VvcHQtZGV2ZWxvcGVyIiwKICAgICAgImRpZ2VzdCI6IHsKICAgICAgICAic2hhMjU2IjogIjZmYzRkYjRhY2FjYWVmYTJlZWU2YmM2OWE4NGM2MjM1MjViYmQwNDEwZjI2YjAxOTM3NTg3MTJmNzk5MzY3MDEiCiAgICAgIH0KICAgIH0KICBdLAogICJwcmVkaWNhdGVUeXBlIjogImh0dHBzOi8vbW9kZWxfc2lnbmluZy9zaWduYXR1cmUvdjEuMCIsCiAgInByZWRpY2F0ZSI6IHsKICAgICJzZXJpYWxpemF0aW9uIjogewogICAgICAiYWxsb3dfc3ltbGlua3MiOiBmYWxzZSwKICAgICAgIm1ldGhvZCI6ICJmaWxlcyIsCiAgICAgICJpZ25vcmVfcGF0aHMiOiBbCiAgICAgICAgIi5naXRpZ25vcmUiLAogICAgICAgICIuZ2l0YXR0cmlidXRlcyIsCiAgICAgICAgIi5naXQiLAogICAgICAgICIuZ2l0aHViIgogICAgICBdLAogICAgICAiaGFzaF90eXBlIjogInNoYTI1NiIKICAgIH0sCiAgICAicmVzb3VyY2VzIjogWwogICAgICB7CiAgICAgICAgImRpZ2VzdCI6ICIzODY5OWIzYWZjYzllZDNhYjIwZTJhZjk2Y2UyMjdjMDAzMGNkYWQ3YWZjMTE1NjkyMWU2MzgyZDlkMDFkZTQwIiwKICAgICAgICAiYWxnb3JpdGhtIjogInNoYTI1NiIsCiAgICAgICAgIm5hbWUiOiAiQkVOQ0hNQVJLLm1kIgogICAgICB9LAogICAgICB7CiAgICAgICAgImRpZ2VzdCI6ICI4NzgxMjBmZWQyZjJhODg3NTIyMGY4NWUwMjVmMWJkMzZhNzkwM2M3YjhkMzMwN2I5NDUzMjE1YmJkOWJjMWNiIiwKICAgICAgICAiYWxnb3JpdGhtIjogInNoYTI1NiIsCiAgICAgICAgIm5hbWUiOiAiU0tJTEwubWQiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZGlnZXN0IjogIjIxZDQ1ZGNkMjMzYTBjMThjNzZiNTMyMjkwMzE2OGRkZmVjY2FlOTlmYzFhMTA5YmE5NjA1NzA4ZTEyYTQ3OTkiLAogICAgICAgICJhbGdvcml0aG0iOiAic2hhMjU2IiwKICAgICAgICAibmFtZSI6ICJiZW5jaG1hcmsvZXZhbHMuanNvbiIKICAgICAgfSwKICAgICAgewogICAgICAgICJkaWdlc3QiOiAiMGFhNzFhMzk1NzcxNTFiNTc0ZDYwODg1Mzk3NTliYjNlMjYzN2UzYzkxNmYxZmYzYjJhYjcxNTM3ZDBlODJmYiIsCiAgICAgICAgImFsZ29yaXRobSI6ICJzaGEyNTYiLAogICAgICAgICJuYW1lIjogImV2YWxzL2V2YWxzLmpzb24iCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZGlnZXN0IjogIjA2YjUxZTJiZTc4MjM3ZDMyMTc0ZmJhNzA4ZmRkZWY3MzIwYjVjNTM3NTAxODU1M2Y0Yzk5MzNlYTU1MzkzOGEiLAogICAgICAgICJhbGdvcml0aG0iOiAic2hhMjU2IiwKICAgICAgICAibmFtZSI6ICJyZWZlcmVuY2VzL2J1aWxkX2FuZF90ZXN0Lm1kIgogICAgICB9LAogICAgICB7CiAgICAgICAgImRpZ2VzdCI6ICI1OTE1Mjg1ZjEyYmQzMGMxZWJiYzE5ZjI4MDUyYjliYmZkNGU4MzhkNTJlZTA2MDM2MGU5YWQ2MDE2NGI0ODhkIiwKICAgICAgICAiYWxnb3JpdGhtIjogInNoYTI1NiIsCiAgICAgICAgIm5hbWUiOiAicmVmZXJlbmNlcy9jb250cmlidXRpbmcubWQiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZGlnZXN0IjogIjk5MTk1MDZkMmVmNzI4MTA5YmM4NTk5NTgyMGEwMzcxMWRhM2RkNjVmMmI2MWI1NTk2NDFhNjIzNmY5YThkM2EiLAogICAgICAgICJhbGdvcml0aG0iOiAic2hhMjU2IiwKICAgICAgICAibmFtZSI6ICJyZWZlcmVuY2VzL2NvbnZlbnRpb25zLm1kIgogICAgICB9LAogICAgICB7CiAgICAgICAgImRpZ2VzdCI6ICJlNWU1MDUxNzVmZTJmNjNlMTE0YmU3ZmUxOTkyN2I4NDIwZGM1ODdmM2Y2YTEyNjgxNmFmNWE2MDhmZDc2MzEzIiwKICAgICAgICAiYWxnb3JpdGhtIjogInNoYTI1NiIsCiAgICAgICAgIm5hbWUiOiAicmVmZXJlbmNlcy9maXJzdF90aW1lX3NldHVwLm1kIgogICAgICB9LAogICAgICB7CiAgICAgICAgImRpZ2VzdCI6ICIzNGQxMmI5ZjY0ZDEzNjg5YzUwZmVlNWNkOTRlYjFhYjhiZjhkZmI1ZGM2ZWQ2ZTlmMWY3ZGYxOGQxYjkyYWU3IiwKICAgICAgICAiYWxnb3JpdGhtIjogInNoYTI1NiIsCiAgICAgICAgIm5hbWUiOiAicmVmZXJlbmNlcy9weXRob25fYmluZGluZ3MubWQiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZGlnZXN0IjogIjkyYWQ2YmQxYTJjNjY4YzI4YmM2ZjUwY2NjNjQ5YTZhOTVhOGI3MDg2MTU4YmUwZDY4OTJiZTk1NzE3ZTNhNTciLAogICAgICAgICJhbGdvcml0aG0iOiAic2hhMjU2IiwKICAgICAgICAibmFtZSI6ICJyZWZlcmVuY2VzL3Ryb3VibGVzaG9vdGluZy5tZCIKICAgICAgfSwKICAgICAgewogICAgICAgICJkaWdlc3QiOiAiOTlhMGZkZmY2YjQ2NDhiZmIwYmUyNmQ2ZTM3OWQ1MzlmMmJkMThmN2YzYzBkYWM5OGIxODI2MDNiYTliYThhZCIsCiAgICAgICAgImFsZ29yaXRobSI6ICJzaGEyNTYiLAogICAgICAgICJuYW1lIjogInJlZmVyZW5jZXMvdnJwX3NraWxscy5tZCIKICAgICAgfSwKICAgICAgewogICAgICAgICJkaWdlc3QiOiAiZDU0OTYxZWZmNzI5ODUwYzNlMTc4MDYyZjdmNjRlNTMyYTljODk1MTIzY2UxZGExZjc2Mjc1NzRmNjIzMjY4MSIsCiAgICAgICAgImFsZ29yaXRobSI6ICJzaGEyNTYiLAogICAgICAgICJuYW1lIjogInJlc291cmNlcy9udW1lcmljYWxfZGVidWdnaW5nLm1kIgogICAgICB9LAogICAgICB7CiAgICAgICAgImRpZ2VzdCI6ICIxMDAyMzNjMGY3NWJhYmIzZTEwODBmOTEyOTdjY2QyMTk5NGRkNWQ5NTJhMDM2NjNlZjU3Mjg1OWZkYjkxZGI3IiwKICAgICAgICAiYWxnb3JpdGhtIjogInNoYTI1NiIsCiAgICAgICAgIm5hbWUiOiAic2tpbGwtY2FyZC5tZCIKICAgICAgfQogICAgXQogIH0KfQ==","payloadType":"application/vnd.in-toto+json","signatures":[{"sig":"MGUCMHv4Sj0mzb5ws4tUr1T8az0ePi8fxWIXnnYb4LIPnX8f6BvfTHc2dvIkDulL+QOA1wIxANaESdvDhHDJXtVNBkUddNJYflA2YyszXh6QjC2xYa1a5tEs5qsfrDk7D/WpQfbu6w==","keyid":""}]}} \ No newline at end of file +{"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json","verificationMaterial":{"x509CertificateChain":{"certificates":[{"rawBytes":"MIICgzCCAgmgAwIBAgIUKIyS7SxNteQIiWzK1dWj85E6520wCgYIKoZIzj0EAwMwVTELMAkGA1UEBhMCVVMxGzAZBgNVBAoMEk5WSURJQSBDb3Jwb3JhdGlvbjEpMCcGA1UEAwwgTlZJRElBIEFnZW50IENhcGFiaWxpdGllcyBJQ0EgMDEwHhcNMjYwNDAxMDAwMDAwWhcNMjgwNDIyMTUzMzA5WjBUMQswCQYDVQQGEwJVUzEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0aW9uMSgwJgYDVQQDDB9OVklESUEgQWdlbnQgU2tpbGxzIFNpZ25pbmcgMDAxMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEYoRM9bQl/dGlwSRNi6bTpIJUXH8Nv9GciP6LSflJYYMLCc296kpyuTSsk5ddbAWiDcFX3C/ydX3jwc+qCLYP6uHy9XphyLjOQ27Yb2J6rBLVtRBS1mgGco/Gr7fL6ODco4GaMIGXMB0GA1UdDgQWBBRQ/5ZW3nJ6lmo9SVk7I15o7UGmpTAfBgNVHSMEGDAWgBRPGpILxMBBleJSsBGjrMKsby1CgjAMBgNVHRMBAf8EAjAAMA4GA1UdDwEB/wQEAwIHgDA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAKBggqhkjOPQQDAwNoADBlAjAUygu/GiOCIXrgGr4SmLgeEVDcEitfFUv7ALbvLVGVyMysB3mxmO/uInZfXzWcJZsCMQDxuoxj4ZmO30jhkPIcCxGFCOvnUsnfU3TfGcouYm4M6iRpbKvtVnHPiy4bi6pcKf0="},{"rawBytes":"MIICiDCCAg6gAwIBAgIUZsIuSv9NkpJCNqtYEfCouVv5BzowCgYIKoZIzj0EAwMwUTELMAkGA1UEBhMCVVMxGzAZBgNVBAoMEk5WSURJQSBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcTlZJRElBIEFnZW50IENhcGFiaWxpdGllcyBDQTAgFw0yNjA0MDEwMDAwMDBaGA85OTk5MTIzMTIzNTk1OVowVTELMAkGA1UEBhMCVVMxGzAZBgNVBAoMEk5WSURJQSBDb3Jwb3JhdGlvbjEpMCcGA1UEAwwgTlZJRElBIEFnZW50IENhcGFiaWxpdGllcyBJQ0EgMDEwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASI72cR3ctKGg4VWnB3bNja6g1Z2PnOmFEopkPof+QeIcPk9rT+g9MjJnq51EQXL93a7C2GJ9J985G4o2V85VD7wJ1RaXhluHW2rf3y8bQGeAYaKMr5s/hUgn+M3/9WlWejgaAwgZ0wHQYDVR0OBBYEFE8akgvEwEGV4lKwEaOswqxvLUKCMB8GA1UdIwQYMBaAFItnoAjjfuCEUvzyvWyI2vOGvwPjMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgEGMDcGCCsGAQUFBwEBBCswKTAnBggrBgEFBQcwAYYbaHR0cDovL29jc3AubmRpcy5udmlkaWEuY29tMAoGCCqGSM49BAMDA2gAMGUCMQCeIMMfAbyzPDacw2MxG+Yt1cikrJX/DVxiGfXuHmkkXn6VgSzE79+lkqDErpVO2gYCMCNEColOyvUvkzZGUEI1hQ3PfMgi3FIo9tHoBKMw4/wGBLFpu/0ubtmbBXM6/UMOEw=="},{"rawBytes":"MIICRTCCAcygAwIBAgIUeJdY3rV86EdvFmG7L8LJBsyQFYkwCgYIKoZIzj0EAwMwUTELMAkGA1UEBhMCVVMxGzAZBgNVBAoMEk5WSURJQSBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcTlZJRElBIEFnZW50IENhcGFiaWxpdGllcyBDQTAgFw0yNjA0MDEwMDAwMDBaGA85OTk5MTIzMTIzNTk1OVowUTELMAkGA1UEBhMCVVMxGzAZBgNVBAoMEk5WSURJQSBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcTlZJRElBIEFnZW50IENhcGFiaWxpdGllcyBDQTB2MBAGByqGSM49AgEGBSuBBAAiA2IABAYpiXCDjJ9NT2eSDhyHJVSw1Tbze18cGG2F/578oWvHxg23eQAhNRYdq88i1iOshZSO6C29doKui5Xpmo/7Ctw9Sx4PP2RzOmIuOLCuTdNtKcTRwi4GEsd5BAFvWj42M6NjMGEwHQYDVR0OBBYEFItnoAjjfuCEUvzyvWyI2vOGvwPjMB8GA1UdIwQYMBaAFItnoAjjfuCEUvzyvWyI2vOGvwPjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMDA2cAMGQCMCwtAjWLaNwgGWNCgdyNoTyvNhqWRECRJV2r3+7w8g0PL6NHLOsbkgE09BH95h8XlgIwTaQmbbUh2ChAJ5TA1wRiVDnCcvbzHlZl2jM2FcwQQZlk19LOAbyGMRixbu2Ww/rj"}]},"tlogEntries":[]},"dsseEnvelope":{"payload":"ewogICJfdHlwZSI6ICJodHRwczovL2luLXRvdG8uaW8vU3RhdGVtZW50L3YxIiwKICAic3ViamVjdCI6IFsKICAgIHsKICAgICAgIm5hbWUiOiAiY3VvcHQtZGV2ZWxvcGVyIiwKICAgICAgImRpZ2VzdCI6IHsKICAgICAgICAic2hhMjU2IjogImEzOTZhNDlmMjE4NjgzZWEzN2JmMGY1MzMzZTNiZjdkYjBiMmYyMjY0ZGUxOWI0YzdjMTQxZjlkZWZiMzA5ZTYiCiAgICAgIH0KICAgIH0KICBdLAogICJwcmVkaWNhdGVUeXBlIjogImh0dHBzOi8vbW9kZWxfc2lnbmluZy9zaWduYXR1cmUvdjEuMCIsCiAgInByZWRpY2F0ZSI6IHsKICAgICJzZXJpYWxpemF0aW9uIjogewogICAgICAiYWxsb3dfc3ltbGlua3MiOiBmYWxzZSwKICAgICAgIm1ldGhvZCI6ICJmaWxlcyIsCiAgICAgICJoYXNoX3R5cGUiOiAic2hhMjU2IiwKICAgICAgImlnbm9yZV9wYXRocyI6IFsKICAgICAgICAiLmdpdGF0dHJpYnV0ZXMiLAogICAgICAgICIuZ2l0aWdub3JlIiwKICAgICAgICAiLmdpdCIsCiAgICAgICAgIi5naXRodWIiCiAgICAgIF0KICAgIH0sCiAgICAicmVzb3VyY2VzIjogWwogICAgICB7CiAgICAgICAgImFsZ29yaXRobSI6ICJzaGEyNTYiLAogICAgICAgICJuYW1lIjogIkJFTkNITUFSSy5tZCIsCiAgICAgICAgImRpZ2VzdCI6ICJkZDJlYmU0ZTNmNjhmNzkxYWFjZjVlNjQ4N2Q0OWVjNzU0MDY5NDVkODJjNjg2ZmU3ZGEyM2FhYTk2M2YwYzg0IgogICAgICB9LAogICAgICB7CiAgICAgICAgImFsZ29yaXRobSI6ICJzaGEyNTYiLAogICAgICAgICJuYW1lIjogIlNLSUxMLm1kIiwKICAgICAgICAiZGlnZXN0IjogIjkyYTNhZWY0Y2Y2MDc2NTZkNjY1MDg3YjY5ODI5NjYzZGNjYTJhNTE4YzE5YWRlYjVmNTIwMThmYmYyOTI5YTQiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiYWxnb3JpdGhtIjogInNoYTI1NiIsCiAgICAgICAgIm5hbWUiOiAiYmVuY2htYXJrL2V2YWxzLmpzb24iLAogICAgICAgICJkaWdlc3QiOiAiMjFkNDVkY2QyMzNhMGMxOGM3NmI1MzIyOTAzMTY4ZGRmZWNjYWU5OWZjMWExMDliYTk2MDU3MDhlMTJhNDc5OSIKICAgICAgfSwKICAgICAgewogICAgICAgICJhbGdvcml0aG0iOiAic2hhMjU2IiwKICAgICAgICAibmFtZSI6ICJldmFscy9ldmFscy5qc29uIiwKICAgICAgICAiZGlnZXN0IjogIjBhYTcxYTM5NTc3MTUxYjU3NGQ2MDg4NTM5NzU5YmIzZTI2MzdlM2M5MTZmMWZmM2IyYWI3MTUzN2QwZTgyZmIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiYWxnb3JpdGhtIjogInNoYTI1NiIsCiAgICAgICAgIm5hbWUiOiAicmVmZXJlbmNlcy9idWlsZF9hbmRfdGVzdC5tZCIsCiAgICAgICAgImRpZ2VzdCI6ICIwNmI1MWUyYmU3ODIzN2QzMjE3NGZiYTcwOGZkZGVmNzMyMGI1YzUzNzUwMTg1NTNmNGM5OTMzZWE1NTM5MzhhIgogICAgICB9LAogICAgICB7CiAgICAgICAgImFsZ29yaXRobSI6ICJzaGEyNTYiLAogICAgICAgICJuYW1lIjogInJlZmVyZW5jZXMvY29udHJpYnV0aW5nLm1kIiwKICAgICAgICAiZGlnZXN0IjogIjU5MTUyODVmMTJiZDMwYzFlYmJjMTlmMjgwNTJiOWJiZmQ0ZTgzOGQ1MmVlMDYwMzYwZTlhZDYwMTY0YjQ4OGQiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiYWxnb3JpdGhtIjogInNoYTI1NiIsCiAgICAgICAgIm5hbWUiOiAicmVmZXJlbmNlcy9jb252ZW50aW9ucy5tZCIsCiAgICAgICAgImRpZ2VzdCI6ICI5OTE5NTA2ZDJlZjcyODEwOWJjODU5OTU4MjBhMDM3MTFkYTNkZDY1ZjJiNjFiNTU5NjQxYTYyMzZmOWE4ZDNhIgogICAgICB9LAogICAgICB7CiAgICAgICAgImFsZ29yaXRobSI6ICJzaGEyNTYiLAogICAgICAgICJuYW1lIjogInJlZmVyZW5jZXMvZmlyc3RfdGltZV9zZXR1cC5tZCIsCiAgICAgICAgImRpZ2VzdCI6ICJlNWU1MDUxNzVmZTJmNjNlMTE0YmU3ZmUxOTkyN2I4NDIwZGM1ODdmM2Y2YTEyNjgxNmFmNWE2MDhmZDc2MzEzIgogICAgICB9LAogICAgICB7CiAgICAgICAgImFsZ29yaXRobSI6ICJzaGEyNTYiLAogICAgICAgICJuYW1lIjogInJlZmVyZW5jZXMvcHl0aG9uX2JpbmRpbmdzLm1kIiwKICAgICAgICAiZGlnZXN0IjogIjZhNDM2MzgwMTdkMzU5MmUyNWI3YzY0YTBiNmFiZDAyNDQ2Y2NkZDI0MmI4YTRmZGQ3MmJkMDJiNGRiZjIyOTQiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiYWxnb3JpdGhtIjogInNoYTI1NiIsCiAgICAgICAgIm5hbWUiOiAicmVmZXJlbmNlcy90cm91Ymxlc2hvb3RpbmcubWQiLAogICAgICAgICJkaWdlc3QiOiAiOTJhZDZiZDFhMmM2NjhjMjhiYzZmNTBjY2M2NDlhNmE5NWE4YjcwODYxNThiZTBkNjg5MmJlOTU3MTdlM2E1NyIKICAgICAgfSwKICAgICAgewogICAgICAgICJhbGdvcml0aG0iOiAic2hhMjU2IiwKICAgICAgICAibmFtZSI6ICJyZWZlcmVuY2VzL3ZycF9za2lsbHMubWQiLAogICAgICAgICJkaWdlc3QiOiAiOTlhMGZkZmY2YjQ2NDhiZmIwYmUyNmQ2ZTM3OWQ1MzlmMmJkMThmN2YzYzBkYWM5OGIxODI2MDNiYTliYThhZCIKICAgICAgfSwKICAgICAgewogICAgICAgICJhbGdvcml0aG0iOiAic2hhMjU2IiwKICAgICAgICAibmFtZSI6ICJyZXNvdXJjZXMvbnVtZXJpY2FsX2RlYnVnZ2luZy5tZCIsCiAgICAgICAgImRpZ2VzdCI6ICJkNTQ5NjFlZmY3Mjk4NTBjM2UxNzgwNjJmN2Y2NGU1MzJhOWM4OTUxMjNjZTFkYTFmNzYyNzU3NGY2MjMyNjgxIgogICAgICB9LAogICAgICB7CiAgICAgICAgImFsZ29yaXRobSI6ICJzaGEyNTYiLAogICAgICAgICJuYW1lIjogInNraWxsLWNhcmQubWQiLAogICAgICAgICJkaWdlc3QiOiAiNDQ5OTYwOGRjNjNhN2M5Y2IxZGE2Yzg4NGJhMmRkODFkNjRlNDllYWUyNTc5MGRjYzRmZDRlOTcwMmRhMmUwNyIKICAgICAgfQogICAgXQogIH0KfQ==","payloadType":"application/vnd.in-toto+json","signatures":[{"sig":"MGYCMQDrftsxlKbbDQcK61lJUyQOdawGJNuWYi447fcmyJAap0y5FVZ6R/eP2Cw1DRNN14ACMQDjHBwd5B8q7GO7B3ljuBX9UrxUfHpQ4oxS0/yyokyGQLTuC5OmqZ6IUKvVZL09T/Y=","keyid":""}]}} \ No newline at end of file