@proletariat/cli 0.3.71 → 0.3.72
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/action/create.d.ts +6 -2
- package/dist/commands/action/create.js +107 -40
- package/dist/commands/action/create.js.map +1 -1
- package/dist/commands/action/list.d.ts +1 -1
- package/dist/commands/action/list.js +12 -10
- package/dist/commands/action/list.js.map +1 -1
- package/dist/commands/action/run.js +2 -2
- package/dist/commands/action/run.js.map +1 -1
- package/dist/commands/action/show.js +24 -4
- package/dist/commands/action/show.js.map +1 -1
- package/dist/commands/action/update.d.ts +6 -2
- package/dist/commands/action/update.js +130 -52
- package/dist/commands/action/update.js.map +1 -1
- package/dist/commands/work/ready.js +4 -2
- package/dist/commands/work/ready.js.map +1 -1
- package/dist/commands/work/spawn.js +2 -2
- package/dist/commands/work/spawn.js.map +1 -1
- package/dist/commands/work/start.js +67 -23
- package/dist/commands/work/start.js.map +1 -1
- package/dist/commands/workflow/setup.d.ts +24 -0
- package/dist/commands/workflow/setup.js +346 -0
- package/dist/commands/workflow/setup.js.map +1 -0
- package/dist/commands/workflow-rule/create.d.ts +19 -0
- package/dist/commands/workflow-rule/create.js +140 -0
- package/dist/commands/workflow-rule/create.js.map +1 -0
- package/dist/commands/workflow-rule/delete.d.ts +18 -0
- package/dist/commands/workflow-rule/delete.js +72 -0
- package/dist/commands/workflow-rule/delete.js.map +1 -0
- package/dist/commands/workflow-rule/index.d.ts +16 -0
- package/dist/commands/workflow-rule/index.js +83 -0
- package/dist/commands/workflow-rule/index.js.map +1 -0
- package/dist/commands/workflow-rule/list.d.ts +17 -0
- package/dist/commands/workflow-rule/list.js +72 -0
- package/dist/commands/workflow-rule/list.js.map +1 -0
- package/dist/commands/workflow-rule/update.d.ts +22 -0
- package/dist/commands/workflow-rule/update.js +84 -0
- package/dist/commands/workflow-rule/update.js.map +1 -0
- package/dist/hooks/init.js +2 -4
- package/dist/hooks/init.js.map +1 -1
- package/dist/lib/database/drizzle-schema.d.ts +269 -4
- package/dist/lib/database/drizzle-schema.js +22 -2
- package/dist/lib/database/drizzle-schema.js.map +1 -1
- package/dist/lib/database/migrations/0003_actions_redesign.d.ts +15 -0
- package/dist/lib/database/migrations/0003_actions_redesign.js +105 -0
- package/dist/lib/database/migrations/0003_actions_redesign.js.map +1 -0
- package/dist/lib/database/migrations/0004_workflow_rules.d.ts +2 -0
- package/dist/lib/database/migrations/0004_workflow_rules.js +25 -0
- package/dist/lib/database/migrations/0004_workflow_rules.js.map +1 -0
- package/dist/lib/database/migrations/index.js +4 -0
- package/dist/lib/database/migrations/index.js.map +1 -1
- package/dist/lib/events/events.d.ts +13 -1
- package/dist/lib/execution/storage.d.ts +7 -1
- package/dist/lib/execution/storage.js +14 -6
- package/dist/lib/execution/storage.js.map +1 -1
- package/dist/lib/pmo/schema.d.ts +3 -1
- package/dist/lib/pmo/schema.js +25 -3
- package/dist/lib/pmo/schema.js.map +1 -1
- package/dist/lib/pmo/storage/actions.d.ts +5 -3
- package/dist/lib/pmo/storage/actions.js +89 -23
- package/dist/lib/pmo/storage/actions.js.map +1 -1
- package/dist/lib/pmo/storage/base.d.ts +5 -0
- package/dist/lib/pmo/storage/base.js +203 -20
- package/dist/lib/pmo/storage/base.js.map +1 -1
- package/dist/lib/pmo/storage/index.d.ts +9 -2
- package/dist/lib/pmo/storage/index.js +28 -3
- package/dist/lib/pmo/storage/index.js.map +1 -1
- package/dist/lib/pmo/storage/types.d.ts +19 -2
- package/dist/lib/pmo/storage/workflow-rules.d.ts +35 -0
- package/dist/lib/pmo/storage/workflow-rules.js +183 -0
- package/dist/lib/pmo/storage/workflow-rules.js.map +1 -0
- package/dist/lib/pmo/sync-manager.js +6 -0
- package/dist/lib/pmo/sync-manager.js.map +1 -1
- package/dist/lib/pmo/types.d.ts +59 -4
- package/dist/lib/pmo/types.js.map +1 -1
- package/dist/lib/telemetry/analytics.d.ts +25 -7
- package/dist/lib/telemetry/analytics.js +123 -58
- package/dist/lib/telemetry/analytics.js.map +1 -1
- package/dist/lib/work-lifecycle/action-chaining.d.ts +61 -0
- package/dist/lib/work-lifecycle/action-chaining.js +211 -0
- package/dist/lib/work-lifecycle/action-chaining.js.map +1 -0
- package/dist/lib/work-lifecycle/index.d.ts +3 -0
- package/dist/lib/work-lifecycle/index.js +3 -0
- package/dist/lib/work-lifecycle/index.js.map +1 -1
- package/dist/lib/work-lifecycle/post-execution.d.ts +54 -0
- package/dist/lib/work-lifecycle/post-execution.js +68 -0
- package/dist/lib/work-lifecycle/post-execution.js.map +1 -0
- package/dist/lib/work-lifecycle/rule-evaluator.d.ts +38 -0
- package/dist/lib/work-lifecycle/rule-evaluator.js +102 -0
- package/dist/lib/work-lifecycle/rule-evaluator.js.map +1 -0
- package/oclif.manifest.json +3198 -2707
- package/package.json +1 -1
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Post-Execution Transition Hook
|
|
3
|
+
*
|
|
4
|
+
* Handles automatic ticket state transitions after an action execution completes.
|
|
5
|
+
* Primary use case: when the implement action completes and a PR was created,
|
|
6
|
+
* automatically move the ticket from In Progress to Review.
|
|
7
|
+
*
|
|
8
|
+
* This hook replaces the need for a separate "create-pr" action. The implement
|
|
9
|
+
* action's endPrompt handles PR creation via `prlt work ready --pr`, and this
|
|
10
|
+
* hook ensures the state transition happens systematically.
|
|
11
|
+
*/
|
|
12
|
+
import { getWorkColumnSetting, findColumnByName } from '../pmo/utils.js';
|
|
13
|
+
/**
|
|
14
|
+
* Check if a completed execution should trigger an automatic state transition.
|
|
15
|
+
*
|
|
16
|
+
* When an execution completes and the ticket:
|
|
17
|
+
* 1. Is in a "started" category (e.g., In Progress)
|
|
18
|
+
* 2. Has a PR URL in its metadata
|
|
19
|
+
*
|
|
20
|
+
* Then automatically move the ticket to the Review column.
|
|
21
|
+
* If no PR was created, the ticket stays in its current state.
|
|
22
|
+
*
|
|
23
|
+
* @param context - Execution context with ticket and optional action info
|
|
24
|
+
* @param storage - PMO storage instance for ticket operations
|
|
25
|
+
* @param db - Database for work column settings
|
|
26
|
+
* @returns Result indicating whether a transition occurred
|
|
27
|
+
*/
|
|
28
|
+
export async function handlePostExecutionTransition(context, storage, db) {
|
|
29
|
+
// Get the ticket to check current state and PR status
|
|
30
|
+
const ticket = await storage.getTicket(context.ticketId);
|
|
31
|
+
if (!ticket || !ticket.projectId) {
|
|
32
|
+
return { transitioned: false };
|
|
33
|
+
}
|
|
34
|
+
// Only auto-transition tickets that are in the "started" category (In Progress)
|
|
35
|
+
if (ticket.statusCategory !== 'started') {
|
|
36
|
+
return { transitioned: false };
|
|
37
|
+
}
|
|
38
|
+
// Check if a PR was created (PR URL exists in ticket metadata)
|
|
39
|
+
const prUrl = ticket.metadata?.pr_url;
|
|
40
|
+
if (!prUrl) {
|
|
41
|
+
return { transitioned: false };
|
|
42
|
+
}
|
|
43
|
+
// Get the Review column name
|
|
44
|
+
const targetColumnName = getWorkColumnSetting(db, 'review');
|
|
45
|
+
// Get board columns to find the review column
|
|
46
|
+
const board = await storage.getProjectBoard(ticket.projectId);
|
|
47
|
+
if (!board) {
|
|
48
|
+
return { transitioned: false };
|
|
49
|
+
}
|
|
50
|
+
const columnNames = board.columns.map(col => col.name);
|
|
51
|
+
const reviewColumn = findColumnByName(columnNames, targetColumnName);
|
|
52
|
+
if (!reviewColumn) {
|
|
53
|
+
return { transitioned: false };
|
|
54
|
+
}
|
|
55
|
+
// Already in Review — skip
|
|
56
|
+
if (ticket.statusName === reviewColumn) {
|
|
57
|
+
return { transitioned: false };
|
|
58
|
+
}
|
|
59
|
+
// Move ticket to Review
|
|
60
|
+
const previousState = ticket.statusName;
|
|
61
|
+
await storage.moveTicket(ticket.projectId, context.ticketId, reviewColumn);
|
|
62
|
+
return {
|
|
63
|
+
transitioned: true,
|
|
64
|
+
fromState: previousState,
|
|
65
|
+
toState: reviewColumn,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=post-execution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"post-execution.js","sourceRoot":"","sources":["../../../src/lib/work-lifecycle/post-execution.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AA6BxE;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,OAA6B,EAC7B,OAA6B,EAC7B,EAAqB;IAErB,sDAAsD;IACtD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IACxD,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QACjC,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,CAAA;IAChC,CAAC;IAED,gFAAgF;IAChF,IAAI,MAAM,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;QACxC,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,CAAA;IAChC,CAAC;IAED,+DAA+D;IAC/D,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAA;IACrC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,CAAA;IAChC,CAAC;IAED,6BAA6B;IAC7B,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAA;IAE3D,8CAA8C;IAC9C,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;IAC7D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,CAAA;IAChC,CAAC;IAED,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACtD,MAAM,YAAY,GAAG,gBAAgB,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAA;IACpE,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,CAAA;IAChC,CAAC;IAED,2BAA2B;IAC3B,IAAI,MAAM,CAAC,UAAU,KAAK,YAAY,EAAE,CAAC;QACvC,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,CAAA;IAChC,CAAC;IAED,wBAAwB;IACxB,MAAM,aAAa,GAAG,MAAM,CAAC,UAAU,CAAA;IACvC,MAAM,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;IAE1E,OAAO;QACL,YAAY,EAAE,IAAI;QAClB,SAAS,EAAE,aAAa;QACxB,OAAO,EAAE,YAAY;KACtB,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow Rule Evaluator
|
|
3
|
+
*
|
|
4
|
+
* Subscribes to ticket:status_changed events on the global EventBus and
|
|
5
|
+
* evaluates workflow rules when a ticket enters a new state.
|
|
6
|
+
*
|
|
7
|
+
* For on_enter rules, emits a work:rule_matched event so that
|
|
8
|
+
* downstream systems (orchestrators, hooks) can fire the associated action.
|
|
9
|
+
* For manual rules, the match is logged but no action is auto-fired.
|
|
10
|
+
*/
|
|
11
|
+
import type Database from 'better-sqlite3';
|
|
12
|
+
export declare class WorkflowRuleEvaluator {
|
|
13
|
+
private unsubscribers;
|
|
14
|
+
private db;
|
|
15
|
+
constructor(db: Database.Database);
|
|
16
|
+
/**
|
|
17
|
+
* Start listening for ticket state changes.
|
|
18
|
+
*/
|
|
19
|
+
start(): void;
|
|
20
|
+
/**
|
|
21
|
+
* Stop listening for events.
|
|
22
|
+
*/
|
|
23
|
+
stop(): void;
|
|
24
|
+
/**
|
|
25
|
+
* Evaluate workflow rules for a status change event.
|
|
26
|
+
* Finds all enabled rules matching the new state and emits events for on_enter rules.
|
|
27
|
+
*/
|
|
28
|
+
private evaluate;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Initialize and start the workflow rule evaluator.
|
|
32
|
+
* Safe to call multiple times — subsequent calls are no-ops.
|
|
33
|
+
*/
|
|
34
|
+
export declare function initWorkflowRuleEvaluator(db: Database.Database): WorkflowRuleEvaluator;
|
|
35
|
+
/**
|
|
36
|
+
* Stop the workflow rule evaluator (primarily for testing).
|
|
37
|
+
*/
|
|
38
|
+
export declare function stopWorkflowRuleEvaluator(): void;
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow Rule Evaluator
|
|
3
|
+
*
|
|
4
|
+
* Subscribes to ticket:status_changed events on the global EventBus and
|
|
5
|
+
* evaluates workflow rules when a ticket enters a new state.
|
|
6
|
+
*
|
|
7
|
+
* For on_enter rules, emits a work:rule_matched event so that
|
|
8
|
+
* downstream systems (orchestrators, hooks) can fire the associated action.
|
|
9
|
+
* For manual rules, the match is logged but no action is auto-fired.
|
|
10
|
+
*/
|
|
11
|
+
import { getEventBus } from '../events/event-bus.js';
|
|
12
|
+
import { PMO_TABLES } from '../pmo/schema.js';
|
|
13
|
+
export class WorkflowRuleEvaluator {
|
|
14
|
+
unsubscribers = [];
|
|
15
|
+
db;
|
|
16
|
+
constructor(db) {
|
|
17
|
+
this.db = db;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Start listening for ticket state changes.
|
|
21
|
+
*/
|
|
22
|
+
start() {
|
|
23
|
+
const bus = getEventBus();
|
|
24
|
+
this.unsubscribers.push(bus.on('ticket:status_changed', (event) => {
|
|
25
|
+
this.evaluate(event);
|
|
26
|
+
}));
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Stop listening for events.
|
|
30
|
+
*/
|
|
31
|
+
stop() {
|
|
32
|
+
for (const unsub of this.unsubscribers) {
|
|
33
|
+
unsub();
|
|
34
|
+
}
|
|
35
|
+
this.unsubscribers = [];
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Evaluate workflow rules for a status change event.
|
|
39
|
+
* Finds all enabled rules matching the new state and emits events for on_enter rules.
|
|
40
|
+
*/
|
|
41
|
+
evaluate(event) {
|
|
42
|
+
if (!event.newStatusName)
|
|
43
|
+
return;
|
|
44
|
+
try {
|
|
45
|
+
// Find all enabled rules where to_state matches the new status
|
|
46
|
+
const rows = this.db.prepare(`
|
|
47
|
+
SELECT * FROM ${PMO_TABLES.workflow_rules}
|
|
48
|
+
WHERE to_state = ? AND enabled = 1
|
|
49
|
+
`).all(event.newStatusName);
|
|
50
|
+
if (rows.length === 0)
|
|
51
|
+
return;
|
|
52
|
+
const bus = getEventBus();
|
|
53
|
+
for (const row of rows) {
|
|
54
|
+
// If from_state is set, it must match the previous status
|
|
55
|
+
if (row.from_state && row.from_state !== event.previousStatusName) {
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
// Emit rule_matched event for on_enter triggers
|
|
59
|
+
if (row.trigger === 'on_enter') {
|
|
60
|
+
bus.emit('workflow_rule:matched', {
|
|
61
|
+
ruleId: row.id,
|
|
62
|
+
ticketId: event.ticketId,
|
|
63
|
+
projectId: event.projectId,
|
|
64
|
+
actionId: row.action_id,
|
|
65
|
+
trigger: row.trigger,
|
|
66
|
+
fromState: row.from_state,
|
|
67
|
+
toState: row.to_state,
|
|
68
|
+
timestamp: new Date(),
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
// Rule evaluation errors are non-fatal
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// =============================================================================
|
|
79
|
+
// Singleton
|
|
80
|
+
// =============================================================================
|
|
81
|
+
let _evaluator;
|
|
82
|
+
/**
|
|
83
|
+
* Initialize and start the workflow rule evaluator.
|
|
84
|
+
* Safe to call multiple times — subsequent calls are no-ops.
|
|
85
|
+
*/
|
|
86
|
+
export function initWorkflowRuleEvaluator(db) {
|
|
87
|
+
if (!_evaluator) {
|
|
88
|
+
_evaluator = new WorkflowRuleEvaluator(db);
|
|
89
|
+
_evaluator.start();
|
|
90
|
+
}
|
|
91
|
+
return _evaluator;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Stop the workflow rule evaluator (primarily for testing).
|
|
95
|
+
*/
|
|
96
|
+
export function stopWorkflowRuleEvaluator() {
|
|
97
|
+
if (_evaluator) {
|
|
98
|
+
_evaluator.stop();
|
|
99
|
+
_evaluator = undefined;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=rule-evaluator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-evaluator.js","sourceRoot":"","sources":["../../../src/lib/work-lifecycle/rule-evaluator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAEpD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAY7C,MAAM,OAAO,qBAAqB;IACxB,aAAa,GAAsB,EAAE,CAAA;IACrC,EAAE,CAAmB;IAE7B,YAAY,EAAqB;QAC/B,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;IACd,CAAC;IAED;;OAEG;IACH,KAAK;QACH,MAAM,GAAG,GAAG,WAAW,EAAE,CAAA;QAEzB,IAAI,CAAC,aAAa,CAAC,IAAI,CACrB,GAAG,CAAC,EAAE,CAAC,uBAAuB,EAAE,CAAC,KAA+B,EAAE,EAAE;YAClE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QACtB,CAAC,CAAC,CACH,CAAA;IACH,CAAC;IAED;;OAEG;IACH,IAAI;QACF,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvC,KAAK,EAAE,CAAA;QACT,CAAC;QACD,IAAI,CAAC,aAAa,GAAG,EAAE,CAAA;IACzB,CAAC;IAED;;;OAGG;IACK,QAAQ,CAAC,KAA+B;QAC9C,IAAI,CAAC,KAAK,CAAC,aAAa;YAAE,OAAM;QAEhC,IAAI,CAAC;YACH,+DAA+D;YAC/D,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;wBACX,UAAU,CAAC,cAAc;;OAE1C,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,CAAsB,CAAA;YAEhD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAM;YAE7B,MAAM,GAAG,GAAG,WAAW,EAAE,CAAA;YAEzB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,0DAA0D;gBAC1D,IAAI,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,UAAU,KAAK,KAAK,CAAC,kBAAkB,EAAE,CAAC;oBAClE,SAAQ;gBACV,CAAC;gBAED,gDAAgD;gBAChD,IAAI,GAAG,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;oBAC/B,GAAG,CAAC,IAAI,CAAC,uBAAuB,EAAE;wBAChC,MAAM,EAAE,GAAG,CAAC,EAAE;wBACd,QAAQ,EAAE,KAAK,CAAC,QAAQ;wBACxB,SAAS,EAAE,KAAK,CAAC,SAAS;wBAC1B,QAAQ,EAAE,GAAG,CAAC,SAAS;wBACvB,OAAO,EAAE,GAAG,CAAC,OAA8B;wBAC3C,SAAS,EAAE,GAAG,CAAC,UAAU;wBACzB,OAAO,EAAE,GAAG,CAAC,QAAQ;wBACrB,SAAS,EAAE,IAAI,IAAI,EAAE;qBACtB,CAAC,CAAA;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,uCAAuC;QACzC,CAAC;IACH,CAAC;CACF;AAED,gFAAgF;AAChF,YAAY;AACZ,gFAAgF;AAEhF,IAAI,UAA6C,CAAA;AAEjD;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,EAAqB;IAC7D,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,UAAU,GAAG,IAAI,qBAAqB,CAAC,EAAE,CAAC,CAAA;QAC1C,UAAU,CAAC,KAAK,EAAE,CAAA;IACpB,CAAC;IACD,OAAO,UAAU,CAAA;AACnB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB;IACvC,IAAI,UAAU,EAAE,CAAC;QACf,UAAU,CAAC,IAAI,EAAE,CAAA;QACjB,UAAU,GAAG,SAAS,CAAA;IACxB,CAAC;AACH,CAAC"}
|