Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
6ea2794
docs(sample): describe negotiation in business terms, not internal state
codetalks-hw Oct 19, 2026
508e6e0
docs(sample): say answer, not accept, when describing templateUri dis…
codetalks-hw Oct 19, 2026
3e9b5eb
fix(sample): align the target and feasibility cases with the negotiat…
codetalks-hw Oct 19, 2026
105e679
docs(sample): rewrite the negotiation chapter in plain language
codetalks-hw Oct 19, 2026
4f2fe38
docs(sample): update the run_demo help text for the aligned cases
codetalks-hw Oct 19, 2026
2c50e5e
docs(sample): make the four-message loop cover all three cases
codetalks-hw Oct 19, 2026
f8e0c1d
docs(sample): drop the evidence claim and add a table of contents
codetalks-hw Oct 19, 2026
24d3fa1
docs(sample): explain that either side can open a negotiation
codetalks-hw Oct 19, 2026
268b9cb
docs(sample): name the responsible side instead of an unspecified "you"
codetalks-hw Oct 19, 2026
679a699
docs(sample): reflow the negotiation-decision paragraph
codetalks-hw Oct 19, 2026
e492732
docs(sample): fix the per-kind reference tables and the feasibility t…
codetalks-hw Oct 19, 2026
39c478d
docs(sample): keep the client sections client-only and drop protocol …
codetalks-hw Oct 19, 2026
4e4142f
docs(sample): remove the remaining wire/wired/wiring wording
codetalks-hw Oct 19, 2026
c1cfe00
refactor(sample): generate the server propose from a natural-language…
codetalks-hw Oct 19, 2026
303c34d
docs(sample): simplify the reject/abort section and describe the prop…
codetalks-hw Oct 19, 2026
2702c6d
docs(sample): say which SDK owns which part
codetalks-hw Oct 19, 2026
8263254
docs(sample): start the example comments with the step names
codetalks-hw Oct 19, 2026
b5a5702
refactor(sample): generate the accept from a natural-language message
codetalks-hw Oct 19, 2026
ee2cec5
docs(sample): document the from-text accept and drop the channel switch
codetalks-hw Oct 19, 2026
84e12ba
docs(sample): use formal section headings in the negotiation chapter
codetalks-hw Oct 20, 2026
40f3ca2
refactor(sample): rename the request text helper
codetalks-hw Oct 20, 2026
7a29d66
docs(sample): apply the external README review findings
codetalks-hw Oct 20, 2026
2e89035
docs(sample): restructure the overview around the two workflows
codetalks-hw Oct 20, 2026
5fd2535
docs(sample): use plain wording for the SDK role in section 4.2
codetalks-hw Oct 20, 2026
aee2729
docs(sample): restructure the custom client agent notes
codetalks-hw Oct 20, 2026
20ce5b2
docs(sample): merge the custom agent notes into the deployment checklist
codetalks-hw Oct 20, 2026
a848959
docs(sample): rename the deployment checklist to custom agent develop…
codetalks-hw Oct 20, 2026
23e47fc
docs(sample): describe the server rows like the client rows
codetalks-hw Oct 20, 2026
60111ac
fix(sample): make negotiation pre-task and keep the task long-running
codetalks-hw Oct 20, 2026
db3975e
docs(sample): describe pre-task negotiation and the long-running task
codetalks-hw Oct 20, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion a2a-t-sample/README-zh.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,4 @@
| 目录 | 说明 |
| --- | --- |
| [fault-management/](fault-management/) | 事件订阅样例——流式推送 Incident 通知 |
| [ran-energy-saving/](ran-energy-saving/) | 无线网络节能样例——运行 RAN 节能任务,并包含三类 Negotiation-T 协商(信息 / 目标 / 可行性),覆盖 fromData / fromText 两种生成通道,另支持可选的 webhook 传输(`--transport webhook`):全部任务事件以 A2A 推送通知回调送达客户端内嵌的接收器 |
| [ran-energy-saving/](ran-energy-saving/) | 无线网络节能样例——运行 RAN 节能任务,并包含三类 Negotiation-T 协商(信息 / 目标 / 可行性) |
2 changes: 1 addition & 1 deletion a2a-t-sample/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,4 @@ See the repository root [`README.md`](../README.md) for setup and how to run.
| Directory | Description |
| --- | --- |
| [fault-management/](fault-management/) | Event subscription sample — stream Incident notifications |
| [ran-energy-saving/](ran-energy-saving/) | RAN energy saving sample — run a RAN energy-saving task, including Negotiation-T negotiations in three kinds (information / target / feasibility) over both generation channels (fromData / fromText), plus an optional webhook transport (`--transport webhook`) that delivers every task event as an A2A push-notification callback to a client-embedded receiver |
| [ran-energy-saving/](ran-energy-saving/) | RAN energy saving sample — run a RAN energy-saving task, including Negotiation-T negotiations in three kinds (information / target / feasibility) |
6 changes: 0 additions & 6 deletions a2a-t-sample/env.example
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,6 @@ A2AT_SAMPLE_SCENARIO=default
# (run_demo.py --negotiation writes this key into the per-run .env)
A2AT_SAMPLE_NEGOTIATION_KIND=information

# ran-energy-saving generation channel of the negotiation propose/accept messages: "data"
# generates them from typed content (no extraction LLM call), "text" from a natural-language
# rendering plus one extraction LLM call
# (run_demo.py --channel writes this key into the per-run .env)
A2AT_SAMPLE_CHANNEL=data

# ran-energy-saving event transport: "sse" consumes the streamed response, "webhook" embeds the
# client-side webhook receiver and receives the task events as push-notification callbacks
# (run_demo.py --transport writes this key into the per-run .env)
Expand Down
451 changes: 281 additions & 170 deletions a2a-t-sample/ran-energy-saving/README-zh.md

Large diffs are not rendered by default.

534 changes: 331 additions & 203 deletions a2a-t-sample/ran-energy-saving/README.md

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,19 @@
"semantic_verdict": false,
"errors": [
{
"slot_name": "energySavingGoal",
"code": "content.semantic_conflict",
"slot_name": "guaranteedThroughputTarget",
"code": "content.rule_violation",
"facts": {
"section_label": "task_target"
"section_label": "task_context"
}
}
],
"params": {
"operationType": "create",
"region": "Songshanhu Administration Committee",
"energySavingGoal": null,
"guaranteedThroughputTarget": "{00:00~07:00,2Mbps}, {07:00~17:30,10Mbps}, {17:30~23:00,20Mbps}, {23:00~24:00,2Mbps}"
"energySavingGoal": "Maximize energy saving under the condition that the task context is met.",
"guaranteedThroughputTarget": null,
"siteList": "Station 1,Station 2",
"backgroundEvent": "power outage from 00:00 to 18:00"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"semantic_verdict": true,
"errors": [],
"params": {
"operationType": "create",
"region": "Songshanhu Administration Committee",
"energySavingGoal": "Maximize energy saving under the condition that the task context is met.",
"guaranteedThroughputTarget": "{00:00~06:00,2Mbps}, {06:00~18:00,2Mbps}",
"siteList": "Station 1,Station 2",
"backgroundEvent": "power outage from 00:00 to 18:00"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"semantic_verdict": true,
"errors": [],
"params": {
"operationType": "create",
"region": "Songshanhu Administration Committee",
"energySavingGoal": "Maximize energy saving under the condition that the task context is met.",
"guaranteedThroughputTarget": "{00:00~07:00,2Mbps}, {07:00~09:00,10Mbps}, {09:00~17:30,10Mbps}, {17:30~23:00,20Mbps}, {23:00~00:00,10Mbps}"
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
{
"conclusion": "Accept",
"feasibility_summary": "The energy saving target is achievable; the negotiation is confirmed."
"feasibility_summary": "Agreed to lower the guaranteed throughput target for 06:00~18:00 from 10Mbps to 2Mbps; the negotiation is confirmed as complete."
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
{
"feasibility_negotiation_description": "Feasibility negotiation for the RAN energy saving task: the 30% energy saving goal conflicts with the 50Mbps guaranteed throughput target, so the feasibility needs a joint evaluation.",
"action": "REQUEST_FEASIBILITY_EVALUATION",
"contents_to_evaluate": [
"feasibility_negotiation_description": "The feasibility assessment for the station-level energy saving task is complete: the current guaranteed throughput target cannot satisfy the power-outage duration requirement; see the infeasibility details and proposal.",
"action": "PROPOSE_ALTERNATIVE_ON_FAILURE",
"contents_to_evaluate": null,
"infeasibility_details_and_proposal": [
{
"name": "Target achievement",
"value": "The area runs energy saving from 00:00 to 06:00 while guaranteeing a throughput target of 50Mbps."
"name": "Conclusion",
"value": "Infeasible."
},
{
"name": "Resource status",
"value": "The cells in the area are NR with carrier shutdown available during the low-traffic period."
"name": "Proposal",
"value": "Lower the guaranteed throughput target for 06:00~18:00 from 10Mbps to 2Mbps, which extends the supportable outage duration to the required 18 hours. If lowering the rate is not acceptable, shorten the required outage duration instead. One of the two must be adjusted; no third option satisfies both original requirements."
}
],
"infeasibility_details_and_proposal": null,
"feasibility_confirm_request": null
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,7 @@
"items": [
{
"name": "region",
"value": "Please provide the coverage region of the energy saving task"
},
{
"name": "energySavingGoal",
"value": "Please provide the energy saving goal of the energy saving task"
"value": "Please provide region: Coverage region (task object) of the energy-saving task; a concrete physical area name.."
}
],
"relationship": null
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"conclusion": "Accept",
"confirmed_intent": "The clarified target is a guaranteed throughput of 20Mbps for the region.",
"confirmed_intent": "The energy saving target is corrected to {00:00~07:00,2Mbps}, {07:00~09:00,10Mbps}, {09:00~17:30,10Mbps}, {17:30~23:00,20Mbps}, {23:00~00:00,10Mbps}.",
"failure_reason": null
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,21 @@
{
"target_negotiation_description": "Target negotiation for the RAN energy saving task: the submitted guaranteed throughput target of 100Mbps exceeds the cell capability, so the clarified target needs confirmation.",
"intent_understanding": null,
"target_negotiation_description": "Target negotiation for the RAN energy saving task: the guaranteed throughput target has two overlapping time segments, {17:30~23:00,20Mbps} and {20:00~00:00,10Mbps}, so the guaranteed rate for the overlapping period cannot be determined uniquely.",
"intent_understanding": [
{
"name": "Region",
"value": "Songshanhu Administration Committee"
},
{
"name": "Time-segment-based guaranteed throughput target",
"value": "{00:00~07:00,2Mbps}, {07:00~09:00,10Mbps}, {09:00~17:30,10Mbps}, {17:30~23:00,20Mbps}, {20:00~00:00,10Mbps}"
}
],
"alignment_and_clarification": null,
"request_for_clarification": null,
"target_confirm_request": "The clarified target is a guaranteed throughput of 20Mbps for the region; please confirm."
"request_for_clarification": [
{
"name": "Time-segment-based guaranteed throughput target",
"value": "The two segments {17:30~23:00,20Mbps} and {20:00~00:00,10Mbps} overlap, so the guaranteed rate for the overlapping period is ambiguous; please adjust the time."
}
],
"target_confirm_request": null
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
"operation_type": "Create",
"task_description": "Based on <Task Object> and <Task Context>, output a wireless network energy saving plan that achieves the wireless network energy saving goal defined in <Task Target>, and return the wireless network energy saving result in the format defined in <Expected Output>.",
"task_object": "The area is the Songshanhu Administration Committee.",
"task_target": "Achieve a 30% energy saving under the condition that the task context is met.",
"task_context": "Time-segment-based guaranteed throughput target: {00:00~06:00,50Mbps}.",
"task_target": "Maximize energy saving under the condition that the task context is met.",
"task_context": "Station list 1: [\"Station 1\", \"Station 2\"], time-segment-based guaranteed throughput target: {00:00~06:00,2Mbps}, {06:00~18:00,10Mbps}, background event: power outage from 00:00 to 18:00.",
"expected_output": "Output the intent report for the network energy saving task."
},
"slot_errors": []
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"slots": {
"operation_type": "Create",
"task_description": "Based on <Task Object> and <Task Context>, output a wireless network energy saving plan that achieves the wireless network energy saving goal defined in <Task Target>, and return the wireless network energy saving result in the format defined in <Expected Output>.",
"task_object": "The area is the Songshanhu Administration Committee.",
"task_target": "Maximize energy saving under the condition that the task context is met.",
"task_context": "Station list 1: [\"Station 1\", \"Station 2\"], time-segment-based guaranteed throughput target: {00:00~06:00,2Mbps}, {06:00~18:00,2Mbps}, background event: power outage from 00:00 to 18:00.",
"expected_output": "Output the intent report for the network energy saving task."
},
"slot_errors": []
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
"task_description": "Based on <Task Object> and <Task Context>, output a wireless network energy saving plan that achieves the wireless network energy saving goal defined in <Task Target>, and return the wireless network energy saving result in the format defined in <Expected Output>.",
"task_object": "The area is the Songshanhu Administration Committee.",
"task_target": "Maximize energy saving under the condition that the task context is met.",
"task_context": "Time-segment-based guaranteed throughput target: {00:00~07:00,100Mbps}.",
"task_context": "Time-segment-based guaranteed throughput target: {00:00~07:00,2Mbps}, {07:00~09:00,10Mbps}, {09:00~17:30,10Mbps}, {17:30~23:00,20Mbps}, {20:00~00:00,10Mbps}.",
"expected_output": "Output the intent report for the network energy saving task."
},
"slot_errors": []
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"slots": {
"operation_type": "Create",
"task_description": "Based on <Task Object> and <Task Context>, output a wireless network energy saving plan that achieves the wireless network energy saving goal defined in <Task Target>, and return the wireless network energy saving result in the format defined in <Expected Output>.",
"task_object": "The area is the Songshanhu Administration Committee.",
"task_target": "Maximize energy saving under the condition that the task context is met.",
"task_context": "Time-segment-based guaranteed throughput target: {00:00~07:00,2Mbps}, {07:00~09:00,10Mbps}, {09:00~17:30,10Mbps}, {17:30~23:00,20Mbps}, {23:00~00:00,10Mbps}.",
"expected_output": "Output the intent report for the network energy saving task."
},
"slot_errors": []
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,19 @@
"semantic_verdict": false,
"errors": [
{
"slot_name": "energySavingGoal",
"code": "content.semantic_conflict",
"slot_name": "guaranteedThroughputTarget",
"code": "content.rule_violation",
"facts": {
"section_label": "任务目标"
"section_label": "任务上下文"
}
}
],
"params": {
"operationType": "create",
"region": "松山湖管委会",
"energySavingGoal": null,
"guaranteedThroughputTarget": "{00:00~07:00,2Mbps}、{07:00~17:30,10Mbps}、{17:30~23:00,20Mbps}、{23:00~24:00,2Mbps}"
"energySavingGoal": "在满足任务上下文的前提下最大化节能。",
"guaranteedThroughputTarget": null,
"siteList": "站点名称1,站点名称2",
"backgroundEvent": "00:00~18:00 停电"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"semantic_verdict": true,
"errors": [],
"params": {
"operationType": "create",
"region": "松山湖管委会",
"energySavingGoal": "在满足任务上下文的前提下最大化节能。",
"guaranteedThroughputTarget": "{00:00~06:00,2Mbps}、{06:00~18:00,2Mbps}",
"siteList": "站点名称1,站点名称2",
"backgroundEvent": "00:00~18:00 停电"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"semantic_verdict": true,
"errors": [],
"params": {
"operationType": "create",
"region": "松山湖管委会",
"energySavingGoal": "在满足任务上下文的前提下最大化节能。",
"guaranteedThroughputTarget": "{00:00~07:00,2Mbps}、{07:00~09:00,10Mbps}、{09:00~17:30,10Mbps}、{17:30~23:00,20Mbps}、{23:00~00:00,10Mbps}"
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
{
"conclusion": "Accept",
"feasibility_summary": "节能目标可达成,本次协商确认结束。"
"feasibility_summary": "同意将06:00~18:00时段的速率保障目标由10Mbps下调至2Mbps,本次协商确认结束。"
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
{
"feasibility_negotiation_description": "无线网络节能任务的可行性协商:节能目标30%与保障速率目标50Mbps存在冲突,需对可行性进行联合评估。",
"action": "REQUEST_FEASIBILITY_EVALUATION",
"contents_to_evaluate": [
"feasibility_negotiation_description": "站点级节能任务的目标达成可行性评估已完成,当前速率目标无法同时满足停电时长要求,详见评估不可行时的详情和提案,请确认。",
"action": "PROPOSE_ALTERNATIVE_ON_FAILURE",
"contents_to_evaluate": null,
"infeasibility_details_and_proposal": [
{
"name": "目标达成",
"value": "区域在00:00~06:00时段执行节能,同时保障速率目标为50Mbps。"
"name": "评估结论",
"value": "不可行。"
},
{
"name": "能源现状",
"value": "区域内小区为NR制式,低话务时段具备关断载频条件。"
"name": "提案",
"value": "建议将06:00~18:00时段的速率保障目标由10Mbps下调至2Mbps,以延长可支撑的停电时长至满足要求的18小时。若无法接受下调速率,则需相应缩短停电时长保障要求。两者需二选一调整,暂无第三种可同时满足原有两项要求的方案。"
}
],
"infeasibility_details_and_proposal": null,
"feasibility_confirm_request": null
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,8 @@
{
"items": [
{
"name": "区域",
"value": "请提供节能任务的覆盖区域"
},
{
"name": "节能目标",
"value": "请提供节能任务的节能目标"
"name": "region",
"value": "Please provide region: Coverage region (task object) of the energy-saving task; a concrete physical area name.."
}
],
"relationship": null
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"conclusion": "Accept",
"confirmed_intent": "澄清后的目标为该区域保障速率20Mbps。",
"confirmed_intent": "节能目标修正为{00:00~07:00,2Mbps}、{07:00~09:00,10Mbps}、{09:00~17:30,10Mbps}、{17:30~23:00,20Mbps}、{23:00~00:00,10Mbps}。",
"failure_reason": null
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,21 @@
{
"target_negotiation_description": "无线网络节能任务的目标协商:用户提交的保障速率目标100Mbps超出小区能力,需对澄清后的目标进行确认。",
"intent_understanding": null,
"target_negotiation_description": "无线网络节能任务的目标协商:分时段保障速率目标中 {17:30~23:00,20Mbps} 与 {20:00~00:00,10Mbps} 两个时段存在时间重叠,无法唯一确定重叠时段的速率保障目标。",
"intent_understanding": [
{
"name": "区域",
"value": "松山湖管委会"
},
{
"name": "分时段保障速率目标",
"value": "{00:00~07:00,2Mbps}、{07:00~09:00,10Mbps}、{09:00~17:30,10Mbps}、{17:30~23:00,20Mbps}、{20:00~00:00,10Mbps}"
}
],
"alignment_and_clarification": null,
"request_for_clarification": null,
"target_confirm_request": "澄清后的目标为该区域保障速率20Mbps,请确认。"
"request_for_clarification": [
{
"name": "分时段保障速率目标",
"value": "如下两个时段存在时间重叠,无法唯一确定重叠时段的速率保障目标,请调整时间:{17:30~23:00,20Mbps}、{20:00~00:00,10Mbps}"
}
],
"target_confirm_request": null
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
"操作类型": "创建",
"任务描述": "基于<任务对象>、<任务上下文>,输出无线网络节能方案,达成<任务目标>中定义的无线网络节能目标,并按照<预期输出>中定义的格式返回无线网络节能结果。",
"任务对象": "区域为松山湖管委会。",
"任务目标": "在满足任务上下文的前提下实现30%的节能。",
"任务上下文": "分时段保障速率目标:{00:00~06:00,50Mbps}。",
"任务目标": "在满足任务上下文的前提下最大化节能。",
"任务上下文": "站点列表1:[\"站点名称1\",\"站点名称2\"],分时段速率保障目标:{00:00~06:00,2Mbps}、{06:00~18:00,10Mbps},背景事件:在00:00~18:00停电。",
"预期输出": "输出网络节能任务的意图报告。"
},
"slot_errors": []
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"slots": {
"操作类型": "创建",
"任务描述": "基于<任务对象>、<任务上下文>,输出无线网络节能方案,达成<任务目标>中定义的无线网络节能目标,并按照<预期输出>中定义的格式返回无线网络节能结果。",
"任务对象": "区域为松山湖管委会。",
"任务目标": "在满足任务上下文的前提下最大化节能。",
"任务上下文": "站点列表1:[\"站点名称1\",\"站点名称2\"],分时段速率保障目标:{00:00~06:00,2Mbps}、{06:00~18:00,2Mbps},背景事件:在00:00~18:00停电。",
"预期输出": "输出网络节能任务的意图报告。"
},
"slot_errors": []
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
"任务描述": "基于<任务对象>、<任务上下文>,输出无线网络节能方案,达成<任务目标>中定义的无线网络节能目标,并按照<预期输出>中定义的格式返回无线网络节能结果。",
"任务对象": "区域为松山湖管委会。",
"任务目标": "在满足任务上下文的前提下最大化节能。",
"任务上下文": "分时段保障速率目标:{00:00~07:00,100Mbps}。",
"任务上下文": "分时段保障速率目标:{00:00~07:00,2Mbps}、{07:00~09:00,10Mbps}、{09:00~17:30,10Mbps}、{17:30~23:00,20Mbps}、{20:00~00:00,10Mbps}。",
"预期输出": "输出网络节能任务的意图报告。"
},
"slot_errors": []
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"slots": {
"操作类型": "创建",
"任务描述": "基于<任务对象>、<任务上下文>,输出无线网络节能方案,达成<任务目标>中定义的无线网络节能目标,并按照<预期输出>中定义的格式返回无线网络节能结果。",
"任务对象": "区域为松山湖管委会。",
"任务目标": "在满足任务上下文的前提下最大化节能。",
"任务上下文": "分时段保障速率目标:{00:00~07:00,2Mbps}、{07:00~09:00,10Mbps}、{09:00~17:30,10Mbps}、{17:30~23:00,20Mbps}、{23:00~00:00,10Mbps}。",
"预期输出": "输出网络节能任务的意图报告。"
},
"slot_errors": []
}
Loading
Loading