openplanter 0.1.0
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/README.md +210 -0
- package/dist/builder.d.ts +11 -0
- package/dist/builder.d.ts.map +1 -0
- package/dist/builder.js +179 -0
- package/dist/builder.js.map +1 -0
- package/dist/cli.d.ts +9 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +548 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +51 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +114 -0
- package/dist/config.js.map +1 -0
- package/dist/credentials.d.ts +52 -0
- package/dist/credentials.d.ts.map +1 -0
- package/dist/credentials.js +371 -0
- package/dist/credentials.js.map +1 -0
- package/dist/demo.d.ts +26 -0
- package/dist/demo.d.ts.map +1 -0
- package/dist/demo.js +95 -0
- package/dist/demo.js.map +1 -0
- package/dist/engine.d.ts +91 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +1036 -0
- package/dist/engine.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -0
- package/dist/investigation-tools/aph-holdings.d.ts +61 -0
- package/dist/investigation-tools/aph-holdings.d.ts.map +1 -0
- package/dist/investigation-tools/aph-holdings.js +459 -0
- package/dist/investigation-tools/aph-holdings.js.map +1 -0
- package/dist/investigation-tools/asic-officer-lookup.d.ts +42 -0
- package/dist/investigation-tools/asic-officer-lookup.d.ts.map +1 -0
- package/dist/investigation-tools/asic-officer-lookup.js +197 -0
- package/dist/investigation-tools/asic-officer-lookup.js.map +1 -0
- package/dist/investigation-tools/asx-calendar-fetcher.d.ts +42 -0
- package/dist/investigation-tools/asx-calendar-fetcher.d.ts.map +1 -0
- package/dist/investigation-tools/asx-calendar-fetcher.js +271 -0
- package/dist/investigation-tools/asx-calendar-fetcher.js.map +1 -0
- package/dist/investigation-tools/asx-parser.d.ts +66 -0
- package/dist/investigation-tools/asx-parser.d.ts.map +1 -0
- package/dist/investigation-tools/asx-parser.js +314 -0
- package/dist/investigation-tools/asx-parser.js.map +1 -0
- package/dist/investigation-tools/bulk-asx-announcements.d.ts +53 -0
- package/dist/investigation-tools/bulk-asx-announcements.d.ts.map +1 -0
- package/dist/investigation-tools/bulk-asx-announcements.js +204 -0
- package/dist/investigation-tools/bulk-asx-announcements.js.map +1 -0
- package/dist/investigation-tools/entity-resolver.d.ts +77 -0
- package/dist/investigation-tools/entity-resolver.d.ts.map +1 -0
- package/dist/investigation-tools/entity-resolver.js +346 -0
- package/dist/investigation-tools/entity-resolver.js.map +1 -0
- package/dist/investigation-tools/hotcopper-scraper.d.ts +73 -0
- package/dist/investigation-tools/hotcopper-scraper.d.ts.map +1 -0
- package/dist/investigation-tools/hotcopper-scraper.js +318 -0
- package/dist/investigation-tools/hotcopper-scraper.js.map +1 -0
- package/dist/investigation-tools/index.d.ts +15 -0
- package/dist/investigation-tools/index.d.ts.map +1 -0
- package/dist/investigation-tools/index.js +15 -0
- package/dist/investigation-tools/index.js.map +1 -0
- package/dist/investigation-tools/insider-graph.d.ts +173 -0
- package/dist/investigation-tools/insider-graph.d.ts.map +1 -0
- package/dist/investigation-tools/insider-graph.js +732 -0
- package/dist/investigation-tools/insider-graph.js.map +1 -0
- package/dist/investigation-tools/insider-suspicion-scorer.d.ts +97 -0
- package/dist/investigation-tools/insider-suspicion-scorer.d.ts.map +1 -0
- package/dist/investigation-tools/insider-suspicion-scorer.js +327 -0
- package/dist/investigation-tools/insider-suspicion-scorer.js.map +1 -0
- package/dist/investigation-tools/multi-forum-scraper.d.ts +104 -0
- package/dist/investigation-tools/multi-forum-scraper.d.ts.map +1 -0
- package/dist/investigation-tools/multi-forum-scraper.js +415 -0
- package/dist/investigation-tools/multi-forum-scraper.js.map +1 -0
- package/dist/investigation-tools/price-fetcher.d.ts +81 -0
- package/dist/investigation-tools/price-fetcher.d.ts.map +1 -0
- package/dist/investigation-tools/price-fetcher.js +268 -0
- package/dist/investigation-tools/price-fetcher.js.map +1 -0
- package/dist/investigation-tools/shared.d.ts +39 -0
- package/dist/investigation-tools/shared.d.ts.map +1 -0
- package/dist/investigation-tools/shared.js +203 -0
- package/dist/investigation-tools/shared.js.map +1 -0
- package/dist/investigation-tools/timeline-linker.d.ts +90 -0
- package/dist/investigation-tools/timeline-linker.d.ts.map +1 -0
- package/dist/investigation-tools/timeline-linker.js +219 -0
- package/dist/investigation-tools/timeline-linker.js.map +1 -0
- package/dist/investigation-tools/volume-scanner.d.ts +70 -0
- package/dist/investigation-tools/volume-scanner.d.ts.map +1 -0
- package/dist/investigation-tools/volume-scanner.js +227 -0
- package/dist/investigation-tools/volume-scanner.js.map +1 -0
- package/dist/model.d.ts +136 -0
- package/dist/model.d.ts.map +1 -0
- package/dist/model.js +1071 -0
- package/dist/model.js.map +1 -0
- package/dist/patching.d.ts +45 -0
- package/dist/patching.d.ts.map +1 -0
- package/dist/patching.js +317 -0
- package/dist/patching.js.map +1 -0
- package/dist/prompts.d.ts +15 -0
- package/dist/prompts.d.ts.map +1 -0
- package/dist/prompts.js +351 -0
- package/dist/prompts.js.map +1 -0
- package/dist/replay-log.d.ts +54 -0
- package/dist/replay-log.d.ts.map +1 -0
- package/dist/replay-log.js +94 -0
- package/dist/replay-log.js.map +1 -0
- package/dist/runtime.d.ts +53 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +259 -0
- package/dist/runtime.js.map +1 -0
- package/dist/settings.d.ts +39 -0
- package/dist/settings.d.ts.map +1 -0
- package/dist/settings.js +146 -0
- package/dist/settings.js.map +1 -0
- package/dist/tool-defs.d.ts +58 -0
- package/dist/tool-defs.d.ts.map +1 -0
- package/dist/tool-defs.js +1029 -0
- package/dist/tool-defs.js.map +1 -0
- package/dist/tools.d.ts +72 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +1454 -0
- package/dist/tools.js.map +1 -0
- package/dist/tui.d.ts +49 -0
- package/dist/tui.d.ts.map +1 -0
- package/dist/tui.js +699 -0
- package/dist/tui.js.map +1 -0
- package/package.json +126 -0
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* price-fetcher.ts – ASX OHLCV price fetcher with anomaly detection.
|
|
3
|
+
*
|
|
4
|
+
* Fetches historical OHLCV data from Yahoo Finance for Australian (ASX)
|
|
5
|
+
* tickers, computes derived metrics, and flags trading anomalies.
|
|
6
|
+
*/
|
|
7
|
+
import { fetchJson, yahooTicker, normalizeTicker, } from "./shared.js";
|
|
8
|
+
// ── Constants ────────────────────────────────────────────────────
|
|
9
|
+
export const ANOMALY_THRESHOLDS = {
|
|
10
|
+
volume_spike: 2.0,
|
|
11
|
+
price_surge: 5.0,
|
|
12
|
+
price_drop: -5.0,
|
|
13
|
+
gap_up: 3.0,
|
|
14
|
+
gap_down: -3.0,
|
|
15
|
+
volatility_spike_factor: 2.0,
|
|
16
|
+
};
|
|
17
|
+
export const ROLLING_VOLUME_WINDOW = 20;
|
|
18
|
+
export const ROLLING_VOLATILITY_WINDOW = 20;
|
|
19
|
+
export const VOLATILITY_BASELINE_WINDOW = 60;
|
|
20
|
+
export const VALID_PERIODS = new Set([
|
|
21
|
+
"1d", "5d", "1mo", "3mo", "6mo", "1y", "2y", "5y", "10y", "ytd", "max",
|
|
22
|
+
]);
|
|
23
|
+
export const VALID_INTERVALS = new Set([
|
|
24
|
+
"1m", "2m", "5m", "15m", "30m", "60m", "90m", "1h",
|
|
25
|
+
"1d", "5d", "1wk", "1mo", "3mo",
|
|
26
|
+
]);
|
|
27
|
+
// ── Rolling window helpers ───────────────────────────────────────
|
|
28
|
+
/**
|
|
29
|
+
* Compute the rolling mean over the last `window` entries ending at `index`.
|
|
30
|
+
* Uses min_periods=1 (returns a value as long as at least one valid entry exists).
|
|
31
|
+
*/
|
|
32
|
+
function rollingMean(values, index, window) {
|
|
33
|
+
const start = Math.max(0, index - window + 1);
|
|
34
|
+
let sum = 0;
|
|
35
|
+
let count = 0;
|
|
36
|
+
for (let i = start; i <= index; i++) {
|
|
37
|
+
const v = values[i];
|
|
38
|
+
if (v !== null && isFinite(v)) {
|
|
39
|
+
sum += v;
|
|
40
|
+
count++;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return count > 0 ? sum / count : null;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Compute the rolling sample standard deviation over the last `window`
|
|
47
|
+
* entries ending at `index`. Requires at least 2 valid values (ddof=1).
|
|
48
|
+
*/
|
|
49
|
+
function rollingStd(values, index, window) {
|
|
50
|
+
const start = Math.max(0, index - window + 1);
|
|
51
|
+
const valid = [];
|
|
52
|
+
for (let i = start; i <= index; i++) {
|
|
53
|
+
const v = values[i];
|
|
54
|
+
if (v !== null && isFinite(v)) {
|
|
55
|
+
valid.push(v);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
if (valid.length < 2)
|
|
59
|
+
return null;
|
|
60
|
+
const mean = valid.reduce((a, b) => a + b, 0) / valid.length;
|
|
61
|
+
const sumSqDiff = valid.reduce((a, v) => a + (v - mean) ** 2, 0);
|
|
62
|
+
return Math.sqrt(sumSqDiff / (valid.length - 1));
|
|
63
|
+
}
|
|
64
|
+
function isFiniteNum(value) {
|
|
65
|
+
return typeof value === "number" && isFinite(value);
|
|
66
|
+
}
|
|
67
|
+
function round4(n) {
|
|
68
|
+
return Math.round(n * 10000) / 10000;
|
|
69
|
+
}
|
|
70
|
+
// ── Data fetching ────────────────────────────────────────────────
|
|
71
|
+
/**
|
|
72
|
+
* Parse a Yahoo Finance chart API JSON response into an array of OhlcvBar.
|
|
73
|
+
*/
|
|
74
|
+
function parseChartResponse(data) {
|
|
75
|
+
const result = data.chart.result;
|
|
76
|
+
if (!result || result.length === 0)
|
|
77
|
+
return [];
|
|
78
|
+
const { timestamp, indicators } = result[0];
|
|
79
|
+
const quote = indicators.quote[0];
|
|
80
|
+
const bars = [];
|
|
81
|
+
for (let i = 0; i < timestamp.length; i++) {
|
|
82
|
+
const o = quote.open[i];
|
|
83
|
+
const h = quote.high[i];
|
|
84
|
+
const l = quote.low[i];
|
|
85
|
+
const c = quote.close[i];
|
|
86
|
+
const v = quote.volume[i];
|
|
87
|
+
// Skip bars with any null OHLCV value
|
|
88
|
+
if (o == null || h == null || l == null || c == null || v == null)
|
|
89
|
+
continue;
|
|
90
|
+
const dt = new Date(timestamp[i] * 1000);
|
|
91
|
+
bars.push({
|
|
92
|
+
date: dt.toISOString().slice(0, 10),
|
|
93
|
+
open: o,
|
|
94
|
+
high: h,
|
|
95
|
+
low: l,
|
|
96
|
+
close: c,
|
|
97
|
+
volume: v,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
return bars;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Fetch OHLCV data from Yahoo Finance for the given ASX tickers.
|
|
104
|
+
*
|
|
105
|
+
* Each ticker is automatically suffixed with `.AX` if needed.
|
|
106
|
+
* Returns a mapping of clean ticker → OhlcvBar[].
|
|
107
|
+
*/
|
|
108
|
+
export async function fetchOhlcv(tickers, period = "3mo", interval = "1d") {
|
|
109
|
+
const results = new Map();
|
|
110
|
+
for (const raw of tickers) {
|
|
111
|
+
const symbol = yahooTicker(raw);
|
|
112
|
+
const clean = normalizeTicker(raw);
|
|
113
|
+
const url = `https://query1.finance.yahoo.com/v8/finance/chart/${encodeURIComponent(symbol)}` +
|
|
114
|
+
`?range=${period}&interval=${interval}`;
|
|
115
|
+
try {
|
|
116
|
+
const data = await fetchJson(url, { delay: 0.5 });
|
|
117
|
+
if (data.chart.error) {
|
|
118
|
+
console.warn(`[warn] Yahoo API error for ${symbol}: ${data.chart.error.description}`);
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
const bars = parseChartResponse(data);
|
|
122
|
+
if (bars.length === 0) {
|
|
123
|
+
console.warn(`[warn] No data returned for ${symbol}. Skipping.`);
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
results.set(clean, bars);
|
|
127
|
+
}
|
|
128
|
+
catch (err) {
|
|
129
|
+
console.warn(`[error] Failed to fetch ${symbol}: ${err}`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return results;
|
|
133
|
+
}
|
|
134
|
+
// ── Derived metrics & anomaly detection ──────────────────────────
|
|
135
|
+
/**
|
|
136
|
+
* Compute derived metrics and anomaly flags for an array of OHLCV bars.
|
|
137
|
+
*
|
|
138
|
+
* Metrics:
|
|
139
|
+
* - `dailyReturnPct`: percentage change in close vs previous close
|
|
140
|
+
* - `volumeRatio`: current volume / 20-day rolling mean volume
|
|
141
|
+
* - `volatility`: 20-day rolling sample std of daily returns
|
|
142
|
+
* - `gapPct`: percentage gap between open and previous close
|
|
143
|
+
* - `anomalyFlags`: list of triggered threshold names
|
|
144
|
+
*/
|
|
145
|
+
export function computeMetrics(ticker, bars) {
|
|
146
|
+
if (bars.length === 0)
|
|
147
|
+
return [];
|
|
148
|
+
// Pre-compute daily return percentages
|
|
149
|
+
const dailyReturns = bars.map((bar, i) => {
|
|
150
|
+
if (i === 0)
|
|
151
|
+
return null;
|
|
152
|
+
const prev = bars[i - 1].close;
|
|
153
|
+
return prev !== 0 ? ((bar.close - prev) / prev) * 100.0 : null;
|
|
154
|
+
});
|
|
155
|
+
// Pre-compute gap percentages
|
|
156
|
+
const gapPcts = bars.map((bar, i) => {
|
|
157
|
+
if (i === 0)
|
|
158
|
+
return null;
|
|
159
|
+
const prevClose = bars[i - 1].close;
|
|
160
|
+
return prevClose !== 0
|
|
161
|
+
? ((bar.open - prevClose) / prevClose) * 100.0
|
|
162
|
+
: null;
|
|
163
|
+
});
|
|
164
|
+
// Volume array for rolling calculations
|
|
165
|
+
const volumes = bars.map((b) => b.volume);
|
|
166
|
+
// Volatilities (rolling std of daily returns)
|
|
167
|
+
const volatilities = bars.map((_, i) => rollingStd(dailyReturns, i, ROLLING_VOLATILITY_WINDOW));
|
|
168
|
+
// Volatility baseline (60-day rolling mean of volatilities)
|
|
169
|
+
const volBaseline = bars.map((_, i) => rollingMean(volatilities, i, VOLATILITY_BASELINE_WINDOW));
|
|
170
|
+
return bars.map((bar, i) => {
|
|
171
|
+
const ret = dailyReturns[i];
|
|
172
|
+
const avgVol = rollingMean(volumes, i, ROLLING_VOLUME_WINDOW);
|
|
173
|
+
const volumeRatio = avgVol !== null && avgVol > 0 ? bar.volume / avgVol : null;
|
|
174
|
+
const vol = volatilities[i];
|
|
175
|
+
const gp = gapPcts[i];
|
|
176
|
+
const volBl = volBaseline[i];
|
|
177
|
+
// Anomaly flags
|
|
178
|
+
const flags = [];
|
|
179
|
+
if (isFiniteNum(volumeRatio) &&
|
|
180
|
+
volumeRatio > ANOMALY_THRESHOLDS.volume_spike) {
|
|
181
|
+
flags.push("volume_spike");
|
|
182
|
+
}
|
|
183
|
+
if (isFiniteNum(ret) && ret > ANOMALY_THRESHOLDS.price_surge) {
|
|
184
|
+
flags.push("price_surge");
|
|
185
|
+
}
|
|
186
|
+
if (isFiniteNum(ret) && ret < ANOMALY_THRESHOLDS.price_drop) {
|
|
187
|
+
flags.push("price_drop");
|
|
188
|
+
}
|
|
189
|
+
if (isFiniteNum(gp) && gp > ANOMALY_THRESHOLDS.gap_up) {
|
|
190
|
+
flags.push("gap_up");
|
|
191
|
+
}
|
|
192
|
+
if (isFiniteNum(gp) && gp < ANOMALY_THRESHOLDS.gap_down) {
|
|
193
|
+
flags.push("gap_down");
|
|
194
|
+
}
|
|
195
|
+
if (isFiniteNum(vol) &&
|
|
196
|
+
isFiniteNum(volBl) &&
|
|
197
|
+
volBl > 0 &&
|
|
198
|
+
vol > ANOMALY_THRESHOLDS.volatility_spike_factor * volBl) {
|
|
199
|
+
flags.push("volatility_spike");
|
|
200
|
+
}
|
|
201
|
+
return {
|
|
202
|
+
ticker,
|
|
203
|
+
date: bar.date,
|
|
204
|
+
open: round4(bar.open),
|
|
205
|
+
high: round4(bar.high),
|
|
206
|
+
low: round4(bar.low),
|
|
207
|
+
close: round4(bar.close),
|
|
208
|
+
volume: bar.volume,
|
|
209
|
+
dailyReturnPct: ret !== null ? round4(ret) : null,
|
|
210
|
+
volumeRatio: volumeRatio !== null ? round4(volumeRatio) : null,
|
|
211
|
+
volatility: vol !== null ? round4(vol) : null,
|
|
212
|
+
gapPct: gp !== null ? round4(gp) : null,
|
|
213
|
+
anomalyFlags: flags,
|
|
214
|
+
};
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
// ── Output builders ──────────────────────────────────────────────
|
|
218
|
+
/**
|
|
219
|
+
* Merge per-ticker data into a flat array of PriceMetrics.
|
|
220
|
+
* Optionally filter to only rows with at least one anomaly flag.
|
|
221
|
+
*/
|
|
222
|
+
export function buildOutput(allData, anomaliesOnly = false) {
|
|
223
|
+
const rows = [];
|
|
224
|
+
for (const [ticker, bars] of allData) {
|
|
225
|
+
rows.push(...computeMetrics(ticker, bars));
|
|
226
|
+
}
|
|
227
|
+
if (anomaliesOnly) {
|
|
228
|
+
return rows.filter((r) => r.anomalyFlags.length > 0);
|
|
229
|
+
}
|
|
230
|
+
return rows;
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Produce a per-ticker summary from OHLCV data.
|
|
234
|
+
*/
|
|
235
|
+
export function buildSummary(allData) {
|
|
236
|
+
const summaries = [];
|
|
237
|
+
for (const [ticker, bars] of allData) {
|
|
238
|
+
const metrics = computeMetrics(ticker, bars);
|
|
239
|
+
if (metrics.length === 0)
|
|
240
|
+
continue;
|
|
241
|
+
const returns = metrics
|
|
242
|
+
.map((m) => m.dailyReturnPct)
|
|
243
|
+
.filter((v) => v !== null);
|
|
244
|
+
const avgVolume = metrics.reduce((sum, m) => sum + m.volume, 0) / metrics.length;
|
|
245
|
+
const avgReturn = returns.length > 0
|
|
246
|
+
? returns.reduce((a, b) => a + b, 0) / returns.length
|
|
247
|
+
: 0;
|
|
248
|
+
const maxReturn = returns.length > 0 ? Math.max(...returns) : 0;
|
|
249
|
+
const minReturn = returns.length > 0 ? Math.min(...returns) : 0;
|
|
250
|
+
const anomalyCount = metrics.filter((m) => m.anomalyFlags.length > 0).length;
|
|
251
|
+
const firstClose = bars[0].close;
|
|
252
|
+
const lastClose = bars[bars.length - 1].close;
|
|
253
|
+
const periodReturn = firstClose !== 0
|
|
254
|
+
? ((lastClose - firstClose) / firstClose) * 100.0
|
|
255
|
+
: 0;
|
|
256
|
+
summaries.push({
|
|
257
|
+
ticker,
|
|
258
|
+
avgVolume: round4(avgVolume),
|
|
259
|
+
avgReturn: round4(avgReturn),
|
|
260
|
+
maxReturn: round4(maxReturn),
|
|
261
|
+
minReturn: round4(minReturn),
|
|
262
|
+
anomalyCount,
|
|
263
|
+
periodReturn: round4(periodReturn),
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
return summaries;
|
|
267
|
+
}
|
|
268
|
+
//# sourceMappingURL=price-fetcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"price-fetcher.js","sourceRoot":"","sources":["../../src/investigation-tools/price-fetcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { load as cheerioLoad } from "cheerio";
|
|
2
|
+
export type CheerioAPI = ReturnType<typeof cheerioLoad>;
|
|
3
|
+
export declare function parseDate(text: string): Date | null;
|
|
4
|
+
export declare function formatIsoDate(d: Date): string;
|
|
5
|
+
export declare function daysBetween(a: Date, b: Date): number;
|
|
6
|
+
export declare const BULLISH_KEYWORDS: string[];
|
|
7
|
+
export declare const BEARISH_KEYWORDS: string[];
|
|
8
|
+
export declare const RUMOR_KEYWORDS: string[];
|
|
9
|
+
export declare function sentimentScore(text: string): number;
|
|
10
|
+
export declare function sentimentLabel(score: number): string;
|
|
11
|
+
export declare function isRumor(text: string): boolean;
|
|
12
|
+
export declare function normalizeTicker(ticker: string): string;
|
|
13
|
+
export declare function yahooTicker(ticker: string): string;
|
|
14
|
+
export declare function normalizeCompany(name: string): string;
|
|
15
|
+
export declare function normalizePerson(name: string): string;
|
|
16
|
+
export declare function validateAbn(abn: string): boolean;
|
|
17
|
+
export declare function formatAbn(abn: string): string;
|
|
18
|
+
export declare function cleanAbn(value: string): string;
|
|
19
|
+
export declare function isAbn(value: string): boolean;
|
|
20
|
+
export declare function levenshtein(a: string, b: string): number;
|
|
21
|
+
export declare function fuzzyRatio(a: string, b: string): number;
|
|
22
|
+
export declare function tokenSortRatio(a: string, b: string): number;
|
|
23
|
+
export declare const DEFAULT_USER_AGENT = "Mozilla/5.0 (compatible; OpenPlanter/0.1; +https://github.com/openplanter)";
|
|
24
|
+
export declare function fetchWithDelay(url: string, opts?: {
|
|
25
|
+
delay?: number;
|
|
26
|
+
userAgent?: string;
|
|
27
|
+
headers?: Record<string, string>;
|
|
28
|
+
}): Promise<Response>;
|
|
29
|
+
export declare function fetchHtml(url: string, opts?: {
|
|
30
|
+
delay?: number;
|
|
31
|
+
userAgent?: string;
|
|
32
|
+
}): Promise<CheerioAPI>;
|
|
33
|
+
export declare function fetchJson<T = unknown>(url: string, opts?: {
|
|
34
|
+
delay?: number;
|
|
35
|
+
userAgent?: string;
|
|
36
|
+
}): Promise<T>;
|
|
37
|
+
export declare function sleep(ms: number): Promise<void>;
|
|
38
|
+
export declare function isoNow(): string;
|
|
39
|
+
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/investigation-tools/shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,IAAI,WAAW,EAAE,MAAM,SAAS,CAAC;AAE9C,MAAM,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAkCxD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAWnD;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,IAAI,GAAG,MAAM,CAE7C;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,MAAM,CAIpD;AAID,eAAO,MAAM,gBAAgB,UAG5B,CAAC;AAEF,eAAO,MAAM,gBAAgB,UAG5B,CAAC;AAEF,eAAO,MAAM,cAAc,UAI1B,CAAC;AAEF,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAUnD;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIpD;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAG7C;AAOD,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAKtD;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAGlD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAWpD;AAMD,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAOhD;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAG7C;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE5C;AAID,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAiBxD;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAKvD;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAI3D;AAID,eAAO,MAAM,kBAAkB,+EAC+C,CAAC;AAE/E,wBAAsB,cAAc,CAClC,GAAG,EAAE,MAAM,EACX,IAAI,GAAE;IACJ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7B,GACL,OAAO,CAAC,QAAQ,CAAC,CAgBnB;AAED,wBAAsB,SAAS,CAC7B,GAAG,EAAE,MAAM,EACX,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GAChD,OAAO,CAAC,UAAU,CAAC,CAKrB;AAED,wBAAsB,SAAS,CAAC,CAAC,GAAG,OAAO,EACzC,GAAG,EAAE,MAAM,EACX,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GAChD,OAAO,CAAC,CAAC,CAAC,CAIZ;AAID,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/C;AAED,wBAAgB,MAAM,IAAI,MAAM,CAE/B"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { load as cheerioLoad } from "cheerio";
|
|
2
|
+
// ── Date Parsing ────────────────────────────────────────────────
|
|
3
|
+
const AU_DATE_FORMATS = [
|
|
4
|
+
{
|
|
5
|
+
regex: /^(\d{4})-(\d{2})-(\d{2})$/,
|
|
6
|
+
parse: (m) => new Date(+m[1], +m[2] - 1, +m[3]),
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
regex: /^(\d{1,2})\/(\d{1,2})\/(\d{4})$/,
|
|
10
|
+
parse: (m) => new Date(+m[3], +m[2] - 1, +m[1]),
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
regex: /^(\d{1,2})-(\d{1,2})-(\d{4})$/,
|
|
14
|
+
parse: (m) => new Date(+m[3], +m[2] - 1, +m[1]),
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
regex: /^(\d{1,2})\.(\d{1,2})\.(\d{4})$/,
|
|
18
|
+
parse: (m) => new Date(+m[3], +m[2] - 1, +m[1]),
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
regex: /^(\d{1,2})\/(\d{1,2})\/(\d{2})$/,
|
|
22
|
+
parse: (m) => new Date(2000 + +m[3], +m[2] - 1, +m[1]),
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
regex: /^(\d{1,2})-(\d{1,2})-(\d{2})$/,
|
|
26
|
+
parse: (m) => new Date(2000 + +m[3], +m[2] - 1, +m[1]),
|
|
27
|
+
},
|
|
28
|
+
];
|
|
29
|
+
export function parseDate(text) {
|
|
30
|
+
const trimmed = text.trim();
|
|
31
|
+
for (const fmt of AU_DATE_FORMATS) {
|
|
32
|
+
const m = trimmed.match(fmt.regex);
|
|
33
|
+
if (m) {
|
|
34
|
+
const d = fmt.parse(m);
|
|
35
|
+
if (!isNaN(d.getTime()))
|
|
36
|
+
return d;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
const fallback = new Date(trimmed);
|
|
40
|
+
return isNaN(fallback.getTime()) ? null : fallback;
|
|
41
|
+
}
|
|
42
|
+
export function formatIsoDate(d) {
|
|
43
|
+
return d.toISOString().slice(0, 10);
|
|
44
|
+
}
|
|
45
|
+
export function daysBetween(a, b) {
|
|
46
|
+
return Math.round((b.getTime() - a.getTime()) / (1000 * 60 * 60 * 24));
|
|
47
|
+
}
|
|
48
|
+
// ── Sentiment & Rumor Detection ─────────────────────────────────
|
|
49
|
+
export const BULLISH_KEYWORDS = [
|
|
50
|
+
"buy", "bullish", "moon", "rocket", "undervalued",
|
|
51
|
+
"breakout", "accumulate", "long", "upside", "catalyst",
|
|
52
|
+
];
|
|
53
|
+
export const BEARISH_KEYWORDS = [
|
|
54
|
+
"sell", "bearish", "dump", "overvalued", "short",
|
|
55
|
+
"downside", "crash", "avoid", "exit",
|
|
56
|
+
];
|
|
57
|
+
export const RUMOR_KEYWORDS = [
|
|
58
|
+
"rumour", "rumor", "heard that", "insider",
|
|
59
|
+
"whisper", "leaked", "unconfirmed", "speculation",
|
|
60
|
+
"source says", "word is",
|
|
61
|
+
];
|
|
62
|
+
export function sentimentScore(text) {
|
|
63
|
+
const lower = text.toLowerCase();
|
|
64
|
+
let score = 0;
|
|
65
|
+
for (const kw of BULLISH_KEYWORDS) {
|
|
66
|
+
if (lower.includes(kw))
|
|
67
|
+
score += 1;
|
|
68
|
+
}
|
|
69
|
+
for (const kw of BEARISH_KEYWORDS) {
|
|
70
|
+
if (lower.includes(kw))
|
|
71
|
+
score -= 1;
|
|
72
|
+
}
|
|
73
|
+
return Math.max(-1, Math.min(1, score / 3));
|
|
74
|
+
}
|
|
75
|
+
export function sentimentLabel(score) {
|
|
76
|
+
if (score > 0.2)
|
|
77
|
+
return "bullish";
|
|
78
|
+
if (score < -0.2)
|
|
79
|
+
return "bearish";
|
|
80
|
+
return "neutral";
|
|
81
|
+
}
|
|
82
|
+
export function isRumor(text) {
|
|
83
|
+
const lower = text.toLowerCase();
|
|
84
|
+
return RUMOR_KEYWORDS.some((kw) => lower.includes(kw));
|
|
85
|
+
}
|
|
86
|
+
// ── Ticker & Company Name Normalization ─────────────────────────
|
|
87
|
+
const COMPANY_SUFFIXES_RE = /\b(ltd|limited|pty|proprietary|inc|incorporated|corp|corporation|group|holdings|plc|nv|se|ag|sa|llc|l\.l\.c|pty\s*ltd|pty\.\s*ltd\.?)\.?\s*$/i;
|
|
88
|
+
export function normalizeTicker(ticker) {
|
|
89
|
+
return ticker
|
|
90
|
+
.toUpperCase()
|
|
91
|
+
.trim()
|
|
92
|
+
.replace(/\.(AX|ASX)$/i, "");
|
|
93
|
+
}
|
|
94
|
+
export function yahooTicker(ticker) {
|
|
95
|
+
const clean = normalizeTicker(ticker);
|
|
96
|
+
return `${clean}.AX`;
|
|
97
|
+
}
|
|
98
|
+
export function normalizeCompany(name) {
|
|
99
|
+
return name.trim().replace(COMPANY_SUFFIXES_RE, "").trim();
|
|
100
|
+
}
|
|
101
|
+
export function normalizePerson(name) {
|
|
102
|
+
const trimmed = name.trim();
|
|
103
|
+
const parts = trimmed.split(/,\s*/);
|
|
104
|
+
if (parts.length === 2 && parts[0] === parts[0].toUpperCase()) {
|
|
105
|
+
return `${parts[1]} ${parts[0]}`.replace(/\s+/g, " ").trim();
|
|
106
|
+
}
|
|
107
|
+
return trimmed
|
|
108
|
+
.replace(/\b(mr|mrs|ms|dr|prof|hon|sir|dame|the)\b\.?\s*/gi, "")
|
|
109
|
+
.replace(/\b(ao|ac|qc|am|oam|obe|cbe|mp|mla|mlc)\b\.?\s*/gi, "")
|
|
110
|
+
.replace(/\s+/g, " ")
|
|
111
|
+
.trim();
|
|
112
|
+
}
|
|
113
|
+
// ── ABN Validation ──────────────────────────────────────────────
|
|
114
|
+
const ABN_WEIGHTS = [10, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19];
|
|
115
|
+
export function validateAbn(abn) {
|
|
116
|
+
const digits = abn.replace(/\s/g, "");
|
|
117
|
+
if (!/^\d{11}$/.test(digits))
|
|
118
|
+
return false;
|
|
119
|
+
const nums = digits.split("").map(Number);
|
|
120
|
+
nums[0] -= 1;
|
|
121
|
+
const sum = nums.reduce((acc, n, i) => acc + n * ABN_WEIGHTS[i], 0);
|
|
122
|
+
return sum % 89 === 0;
|
|
123
|
+
}
|
|
124
|
+
export function formatAbn(abn) {
|
|
125
|
+
const digits = abn.replace(/\s/g, "");
|
|
126
|
+
return `${digits.slice(0, 2)} ${digits.slice(2, 5)} ${digits.slice(5, 8)} ${digits.slice(8, 11)}`;
|
|
127
|
+
}
|
|
128
|
+
export function cleanAbn(value) {
|
|
129
|
+
return value.replace(/[\s-]/g, "");
|
|
130
|
+
}
|
|
131
|
+
export function isAbn(value) {
|
|
132
|
+
return /^\d[\d\s-]{9,14}\d$/.test(value.trim()) && /\d{11}/.test(value.replace(/[\s-]/g, ""));
|
|
133
|
+
}
|
|
134
|
+
// ── Fuzzy String Matching ───────────────────────────────────────
|
|
135
|
+
export function levenshtein(a, b) {
|
|
136
|
+
const m = a.length;
|
|
137
|
+
const n = b.length;
|
|
138
|
+
const dp = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0));
|
|
139
|
+
for (let i = 0; i <= m; i++)
|
|
140
|
+
dp[i][0] = i;
|
|
141
|
+
for (let j = 0; j <= n; j++)
|
|
142
|
+
dp[0][j] = j;
|
|
143
|
+
for (let i = 1; i <= m; i++) {
|
|
144
|
+
for (let j = 1; j <= n; j++) {
|
|
145
|
+
dp[i][j] =
|
|
146
|
+
a[i - 1] === b[j - 1]
|
|
147
|
+
? dp[i - 1][j - 1]
|
|
148
|
+
: 1 + Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
return dp[m][n];
|
|
152
|
+
}
|
|
153
|
+
export function fuzzyRatio(a, b) {
|
|
154
|
+
if (a === b)
|
|
155
|
+
return 100;
|
|
156
|
+
if (!a || !b)
|
|
157
|
+
return 0;
|
|
158
|
+
const maxLen = Math.max(a.length, b.length);
|
|
159
|
+
return Math.round(((maxLen - levenshtein(a, b)) / maxLen) * 100);
|
|
160
|
+
}
|
|
161
|
+
export function tokenSortRatio(a, b) {
|
|
162
|
+
const sortTokens = (s) => s.toLowerCase().split(/\s+/).sort().join(" ");
|
|
163
|
+
return fuzzyRatio(sortTokens(a), sortTokens(b));
|
|
164
|
+
}
|
|
165
|
+
// ── HTTP Helpers ────────────────────────────────────────────────
|
|
166
|
+
export const DEFAULT_USER_AGENT = "Mozilla/5.0 (compatible; OpenPlanter/0.1; +https://github.com/openplanter)";
|
|
167
|
+
export async function fetchWithDelay(url, opts = {}) {
|
|
168
|
+
const delay = opts.delay ?? 1.0;
|
|
169
|
+
if (delay > 0)
|
|
170
|
+
await sleep(delay * 1000);
|
|
171
|
+
const headers = {
|
|
172
|
+
"User-Agent": opts.userAgent ?? DEFAULT_USER_AGENT,
|
|
173
|
+
...opts.headers,
|
|
174
|
+
};
|
|
175
|
+
const resp = await fetch(url, { headers });
|
|
176
|
+
if (resp.status === 429) {
|
|
177
|
+
const retry = Number(resp.headers.get("Retry-After") ?? "5");
|
|
178
|
+
await sleep(retry * 1000);
|
|
179
|
+
return fetch(url, { headers });
|
|
180
|
+
}
|
|
181
|
+
return resp;
|
|
182
|
+
}
|
|
183
|
+
export async function fetchHtml(url, opts = {}) {
|
|
184
|
+
const resp = await fetchWithDelay(url, opts);
|
|
185
|
+
if (!resp.ok)
|
|
186
|
+
throw new Error(`HTTP ${resp.status} fetching ${url}`);
|
|
187
|
+
const html = await resp.text();
|
|
188
|
+
return cheerioLoad(html);
|
|
189
|
+
}
|
|
190
|
+
export async function fetchJson(url, opts = {}) {
|
|
191
|
+
const resp = await fetchWithDelay(url, opts);
|
|
192
|
+
if (!resp.ok)
|
|
193
|
+
throw new Error(`HTTP ${resp.status} fetching ${url}`);
|
|
194
|
+
return resp.json();
|
|
195
|
+
}
|
|
196
|
+
// ── Misc Utilities ──────────────────────────────────────────────
|
|
197
|
+
export function sleep(ms) {
|
|
198
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
199
|
+
}
|
|
200
|
+
export function isoNow() {
|
|
201
|
+
return new Date().toISOString();
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/investigation-tools/shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* timeline-linker.ts — Trade-vs-Event Timeline Correlation Tool
|
|
3
|
+
*
|
|
4
|
+
* Correlates politician / insider trade dates against ASX announcements,
|
|
5
|
+
* reports, and trading halts to build evidence chains for potential
|
|
6
|
+
* insider-trading investigations.
|
|
7
|
+
*
|
|
8
|
+
* Scoring algorithm (deterministic, 0–100):
|
|
9
|
+
* 1. timing_score = max(0, (window - gap) / window) × 40
|
|
10
|
+
* 2. alignment_score = 30 (buy→positive / sell→negative), else 10
|
|
11
|
+
* 3. size_score = min(value / $100k, 1) × 20
|
|
12
|
+
* 4. impact_score = 10 if event impact is non-neutral
|
|
13
|
+
* TOTAL = timing + alignment + size + impact (clamped 0–100)
|
|
14
|
+
*/
|
|
15
|
+
export declare const DEFAULT_WINDOW_DAYS = 14;
|
|
16
|
+
export declare const DEFAULT_MIN_SCORE = 0;
|
|
17
|
+
/** Trade value at which size_score maxes out. */
|
|
18
|
+
export declare const SIZE_NORMALISER = 100000;
|
|
19
|
+
/** Weight for timing component. */
|
|
20
|
+
export declare const W_TIMING = 40;
|
|
21
|
+
/** Weight for alignment component. */
|
|
22
|
+
export declare const W_ALIGNMENT = 30;
|
|
23
|
+
/** Weight for size component. */
|
|
24
|
+
export declare const W_SIZE = 20;
|
|
25
|
+
/** Weight for impact component. */
|
|
26
|
+
export declare const W_IMPACT = 10;
|
|
27
|
+
export interface Trade {
|
|
28
|
+
person?: string;
|
|
29
|
+
ticker?: string;
|
|
30
|
+
date: string;
|
|
31
|
+
action?: string;
|
|
32
|
+
quantity?: number;
|
|
33
|
+
value?: number;
|
|
34
|
+
source?: string;
|
|
35
|
+
}
|
|
36
|
+
export interface Event {
|
|
37
|
+
ticker?: string;
|
|
38
|
+
date: string;
|
|
39
|
+
type?: string;
|
|
40
|
+
description?: string;
|
|
41
|
+
impact?: string;
|
|
42
|
+
source?: string;
|
|
43
|
+
}
|
|
44
|
+
export interface CorrelatedEvent {
|
|
45
|
+
event: Event;
|
|
46
|
+
suspicionScore: number;
|
|
47
|
+
pattern: string;
|
|
48
|
+
daysBeforeEvent: number;
|
|
49
|
+
evidenceSummary: string;
|
|
50
|
+
}
|
|
51
|
+
export interface CorrelationResult {
|
|
52
|
+
trade: Trade;
|
|
53
|
+
correlatedEvents: Event[];
|
|
54
|
+
suspicionScore: number;
|
|
55
|
+
pattern: string;
|
|
56
|
+
daysBeforeEvent: number;
|
|
57
|
+
evidenceSummary: string;
|
|
58
|
+
allCorrelations: CorrelatedEvent[];
|
|
59
|
+
}
|
|
60
|
+
export interface CorrelationSummary {
|
|
61
|
+
totalTrades: number;
|
|
62
|
+
tradesWithCorrelations: number;
|
|
63
|
+
patternBreakdown: Record<string, number>;
|
|
64
|
+
topSuspicious: Array<{
|
|
65
|
+
score: number;
|
|
66
|
+
person: string;
|
|
67
|
+
action: string;
|
|
68
|
+
ticker: string;
|
|
69
|
+
daysBeforeEvent: number;
|
|
70
|
+
pattern: string;
|
|
71
|
+
}>;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Return [score 0–100, pattern_label] for a trade→event pair.
|
|
75
|
+
*
|
|
76
|
+
* *daysGap* is the number of days between the trade and the later event
|
|
77
|
+
* (0 = same day).
|
|
78
|
+
*/
|
|
79
|
+
export declare function computeSuspicionScore(trade: Trade, event: Event, daysGap: number, window: number): [number, string];
|
|
80
|
+
/** Return a plain-English sentence describing the correlation. */
|
|
81
|
+
export declare function buildEvidenceSummary(trade: Trade, event: Event, daysGap: number, pattern: string): string;
|
|
82
|
+
/**
|
|
83
|
+
* Return a list of evidence-chain objects linking trades to later events.
|
|
84
|
+
*/
|
|
85
|
+
export declare function correlate(trades: Trade[], events: Event[], window?: number, minScore?: number, dateFrom?: Date | null, dateTo?: Date | null): CorrelationResult[];
|
|
86
|
+
/**
|
|
87
|
+
* Generate a structured summary of correlation results.
|
|
88
|
+
*/
|
|
89
|
+
export declare function generateSummary(results: CorrelationResult[], totalTrades: number): CorrelationSummary;
|
|
90
|
+
//# sourceMappingURL=timeline-linker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeline-linker.d.ts","sourceRoot":"","sources":["../../src/investigation-tools/timeline-linker.ts"],"names":[],"mappings":"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"}
|