@futdevpro/fdp-agent-memory 1.1.133 → 1.1.135

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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@futdevpro/fdp-agent-memory",
3
- "version": "1.1.133",
3
+ "version": "1.1.135",
4
4
  "description": "Local-first, vector-backed multi-table agent memory exposed as an MCP server (read/write/capabilities). Public, FDP-Templates-free, no auth.",
5
5
  "private": false,
6
6
  "publishConfig": {
@@ -0,0 +1,138 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FAM_AgentGuidance_Util = exports.FAM_AgentMistake = void 0;
4
+ /**
5
+ * A felismert agent-hiba osztálya (a guidance + az incidens-rögzítés kulcsa).
6
+ */
7
+ var FAM_AgentMistake;
8
+ (function (FAM_AgentMistake) {
9
+ /** A body nem érvényes JSON (a leggyakoribb: aposztróf, lezáró vessző, nem-escape-elt sortörés). */
10
+ FAM_AgentMistake["malformedJson"] = "malformed-json";
11
+ /** Üres body egy olyan végponton, ami JSON-t vár. */
12
+ FAM_AgentMistake["emptyBody"] = "empty-body";
13
+ /** Nem létező útvonal (elgépelt/kitalált endpoint). */
14
+ FAM_AgentMistake["unknownEndpoint"] = "unknown-endpoint";
15
+ /** Rossz HTTP-metódus a létező útvonalon. */
16
+ FAM_AgentMistake["wrongMethod"] = "wrong-method";
17
+ })(FAM_AgentMistake || (exports.FAM_AgentMistake = FAM_AgentMistake = {}));
18
+ /**
19
+ * `FAM_AgentGuidance_Util` — **agent-támogató visszajelzések** (user-FR 2026-08-14).
20
+ *
21
+ * **A megfigyelt jelenség:** agentek, akiknek elsőre nem sikerült az MCP-t az elvárt módon használni, kerülőúton
22
+ * NYERS REST-hívásokkal próbálkoznak — és ezek gyakran rosszul összeállítottak (pl. aposztrófos „JSON"). Eddig egy
23
+ * néma parse-hiba volt a válasz: az agent nem tudta meg, MI a baj, sem azt, hogy MI lett volna a helyes út.
24
+ *
25
+ * **A cél (owner-direktíva):** „meg kell fogni a kis kezüket és irányba kell állítani őket — de NEM vehetjük el a
26
+ * kedvüket attól, hogy használják a FAM-ot; a FAM használata kritikusan fontos lépés MINDIG és MINDENKOR."
27
+ * Ezért minden üzenet: (1) tényszerűen megmondja mi a baj, (2) megadja a LEGVALÓSZÍNŰBB okot, (3) konkrét javítást,
28
+ * (4) másolható példát, (5) az ajánlott (MCP) utat, és (6) **megerősíti, hogy jó úton jár** — a hiba csak formai.
29
+ *
30
+ * PURE: nincs I/O, nincs állapot — így a szöveg-kontraktus unit-tesztelhető.
31
+ */
32
+ class FAM_AgentGuidance_Util {
33
+ /** A `read` tool minimál, helyes hívása (a leggyakoribb szándék). */
34
+ static READ_EXAMPLE = '{"queries":[{"tables":["knowledge"],"query":"amit keresel","topK":5}]}';
35
+ /** A `write` tool minimál, helyes hívása. */
36
+ static WRITE_EXAMPLE = '{"operation":"create","table":"memory","content":"a megjegyzendő tudás","scopePath":[{"layer":"project","name":"<projekt>"}]}';
37
+ /**
38
+ * A JSON-parse hiba KONKRÉT okának felismerése a nyers body-ból (PURE). A body-parser üzenete önmagában
39
+ * (`Expected property name or '}' at position 1`) egy agentnek keveset mond — a tényleges minta viszont
40
+ * elárulja a tipikus elrontást, és így célzott javítási tanácsot tudunk adni.
41
+ */
42
+ static diagnoseJson(rawBody) {
43
+ const body = (rawBody ?? '').trim();
44
+ if (!body) {
45
+ return {
46
+ mistake: FAM_AgentMistake.emptyBody,
47
+ likelyCause: 'A kérés törzse ÜRES, pedig ez a végpont JSON-objektumot vár.',
48
+ howToFix: 'Küldd el a JSON-body-t `Content-Type: application/json` fejléccel.',
49
+ };
50
+ }
51
+ // A leggyakoribb elrontás: aposztróf idézőjel helyett (shell-quoting / Python-szerű dict beillesztése).
52
+ if (/^\{\s*'/.test(body) || /:\s*'/.test(body)) {
53
+ return {
54
+ mistake: FAM_AgentMistake.malformedJson,
55
+ likelyCause: 'A body APOSZTRÓFOT (\') használ idézőjel (") helyett — ez Python/JS-objektum-szintaxis, '
56
+ + 'NEM JSON. Gyakran shell-idézőjel-ütközésből vagy egy nyelvi dict beillesztéséből ered.',
57
+ howToFix: 'Cseréld az összes aposztrófot kettős idézőjelre; a kulcsokat is idézőjelezd: {"kulcs":"érték"}.',
58
+ };
59
+ }
60
+ if (/,\s*[}\]]/.test(body)) {
61
+ return {
62
+ mistake: FAM_AgentMistake.malformedJson,
63
+ likelyCause: 'LEZÁRÓ VESSZŐ van az utolsó elem után (`…,}` vagy `…,]`) — a JSON ezt nem engedi.',
64
+ howToFix: 'Töröld a vesszőt az utolsó kulcs/elem után.',
65
+ };
66
+ }
67
+ if (!/^[[{]/.test(body)) {
68
+ return {
69
+ mistake: FAM_AgentMistake.malformedJson,
70
+ likelyCause: 'A body nem `{` vagy `[` karakterrel kezdődik — valószínűleg idézőjelek közé csomagolva '
71
+ + 'vagy escape-elve érkezett (dupla-stringify / shell-idézőjel).',
72
+ howToFix: 'Küldd a NYERS JSON-objektumot, ne stringbe csomagolva (ne `"{\\"a\\":1}"`, hanem `{"a":1}`).',
73
+ };
74
+ }
75
+ return {
76
+ mistake: FAM_AgentMistake.malformedJson,
77
+ likelyCause: 'A body szintaktikailag hibás JSON (hiányzó idézőjel/zárójel vagy nem-escape-elt sortörés).',
78
+ howToFix: 'Ellenőrizd a zárójel-párokat és az idézőjeleket; a többsoros szöveget `\\n`-nel escape-eld.',
79
+ };
80
+ }
81
+ /** Melyik FAM-tool tartozik az útvonalhoz (az „inkább ezt használd" tanácshoz). PURE. */
82
+ static toolForPath(path) {
83
+ const url = (path ?? '').toLowerCase();
84
+ if (url.includes('/read')) {
85
+ return 'read';
86
+ }
87
+ if (url.includes('/write') || url.includes('/scan')) {
88
+ return 'write';
89
+ }
90
+ if (url.includes('/capabilities')) {
91
+ return 'capabilities';
92
+ }
93
+ return null;
94
+ }
95
+ /**
96
+ * A teljes eligazítás összeállítása (PURE). A hangnem KÖTELEZŐEN támogató: a FAM-hoz fordulás MINDIG helyes
97
+ * döntés volt — csak a kérés formája hibás, és pontosan megmondjuk, hogyan javítsd.
98
+ */
99
+ static build(set) {
100
+ const tool = FAM_AgentGuidance_Util.toolForPath(set.path);
101
+ const example = tool === 'write' ? FAM_AgentGuidance_Util.WRITE_EXAMPLE : FAM_AgentGuidance_Util.READ_EXAMPLE;
102
+ const preferred = tool
103
+ ? `AJÁNLOTT: a nyers REST helyett használd az MCP-toolt — \`mcp__fdp-agent-memory__${tool}\`. Ugyanezt a `
104
+ + 'bemenetet várja, de a kliens szerializálja helyetted (nincs idézőjel-ütközés), és a hibákat is '
105
+ + 'olvashatóan adja vissza. Ha az MCP-eszköz nem elérhető, a REST teljes értékű tartalék — csak a '
106
+ + 'JSON-formára figyelj.'
107
+ : 'AJÁNLOTT: a FAM felülete a `read` / `write` / `capabilities` — a `capabilities` felsorolja a pontos '
108
+ + 'bemeneti sémákat. MCP-n át (`mcp__fdp-agent-memory__*`) a legkényelmesebb, de a REST is teljes értékű.';
109
+ return {
110
+ mistake: set.mistake,
111
+ errorCode: FAM_AgentGuidance_Util.errorCodeFor(set.mistake),
112
+ whatHappened: `A FAM megkapta a kérésedet (${set.method ?? '?'} ${set.path ?? '?'}), de a törzsét nem tudta `
113
+ + 'JSON-ként értelmezni, ezért NEM hajtotta végre. Semmi nem íródott és nem változott.',
114
+ likelyCause: set.likelyCause,
115
+ howToFix: set.howToFix,
116
+ example: example,
117
+ preferredApproach: preferred,
118
+ // A hangnem SZÁNDÉKOS: a következő lépés a ÚJRAPRÓBÁLKOZÁS legyen, nem a FAM elkerülése.
119
+ encouragement: 'Jó irányba indultál: a FAM-hoz fordulni MINDIG helyes lépés — a tudás ott van, csak a '
120
+ + 'kérés formája volt hibás. Javítsd a fentiek szerint és próbáld újra; ha elakadsz, a '
121
+ + '`capabilities` megadja a pontos sémát.',
122
+ };
123
+ }
124
+ /** A hiba-osztályhoz tartozó stabil hibakód (az incidens-rögzítés dedup-kulcsa is). PURE. */
125
+ static errorCodeFor(mistake) {
126
+ switch (mistake) {
127
+ case FAM_AgentMistake.emptyBody:
128
+ return 'FAM-AGENT-INPUT-002';
129
+ case FAM_AgentMistake.unknownEndpoint:
130
+ return 'FAM-AGENT-INPUT-003';
131
+ case FAM_AgentMistake.wrongMethod:
132
+ return 'FAM-AGENT-INPUT-004';
133
+ default:
134
+ return 'FAM-AGENT-INPUT-001';
135
+ }
136
+ }
137
+ }
138
+ exports.FAM_AgentGuidance_Util = FAM_AgentGuidance_Util;
@@ -38,6 +38,7 @@ class FAM_ErrorContext_Util {
38
38
  FAM_ErrorContext_Util.setString(snapshot, 'query', input.query);
39
39
  FAM_ErrorContext_Util.setString(snapshot, 'provider', input.provider);
40
40
  FAM_ErrorContext_Util.setString(snapshot, 'failedSample', input.failedSample);
41
+ FAM_ErrorContext_Util.setString(snapshot, 'requestContext', input.requestContext);
41
42
  // Ha minden mező hiányzott, NINCS snapshot (a rekordon nem jelenik meg üres objektum).
42
43
  return Object.keys(snapshot).length ? snapshot : undefined;
43
44
  }
@@ -7,6 +7,7 @@ const logs_1 = require("@futdevpro/nts-dynamo/logs");
7
7
  const package_json_1 = require("../package.json");
8
8
  const fam_db_models_const_1 = require("./_collections/fam-db-models.const");
9
9
  const fam_remote_config_util_1 = require("./_collections/fam-remote-config.util");
10
+ const fam_agent_guidance_util_1 = require("./_collections/fam-agent-guidance.util");
10
11
  const api_controller_1 = require("./_routes/server/api/api.controller");
11
12
  const client_app_controller_1 = require("./_routes/server/client-app/client-app.controller");
12
13
  const errors_controller_1 = require("./_routes/server/errors/errors.controller");
@@ -163,6 +164,127 @@ class App extends nts_dynamo_1.DyNTS_App {
163
164
  await embedding_1.FAM_EmbeddingBootstrap_ControlService.getInstance().boot();
164
165
  fsm_dynamo_1.DyFM_Log.S_info(`UI is available at: localhost:${environment_1.env.httpPort}/api/app`);
165
166
  }
167
+ /**
168
+ * AGENT-TÁMOGATÁS + ÖNDIAGNOSZTIKA (user-FR 2026-08-14). A bedrock `initOpenExpress` regisztrálja a
169
+ * body-parsert; KÖZVETLENÜL utána ékeljük be a saját JSON-hiba-kezelőnket, így:
170
+ * (1) a hibás kérés a **routing előtt** nálunk landol → van teljes kontextusunk (a bedrock-úton elveszne),
171
+ * (2) az agent **cselekvésre fordítható eligazítást** kap 400-zal (nem néma hibát), és
172
+ * (3) az esetet **incidensként rögzítjük** (öndiagnosztika: ki, mit, mikor, milyen mintával).
173
+ *
174
+ * A megfigyelt jelenség: akinek elsőre nem sikerült az MCP-használat, nyers REST-tel próbálkozik, és a body
175
+ * gyakran rosszul összeállított (pl. aposztrófos „JSON"). A válasz hangneme SZÁNDÉKOSAN támogató — a cél, hogy
176
+ * az agent JAVÍTVA ÚJRAPRÓBÁLJA, ne pedig elkerülje a FAM-ot.
177
+ */
178
+ async initOpenExpress() {
179
+ await super.initOpenExpress();
180
+ this.openExpress?.use(App.jsonErrorMiddleware());
181
+ }
182
+ /**
183
+ * A body-parser JSON-hibáját elkapó Express error-middleware (4 argumentumos — ez teszi error-handlerré).
184
+ * Csak a PARSE-hibát kezeli; minden más hibát változatlanul továbbad a bedrock láncnak.
185
+ */
186
+ static jsonErrorMiddleware() {
187
+ return (err, req, res, next) => {
188
+ const isParseError = err instanceof SyntaxError
189
+ && typeof err.status === 'number'
190
+ && 'body' in err;
191
+ if (!isParseError) {
192
+ next(err);
193
+ return;
194
+ }
195
+ const rawBody = typeof err.body === 'string'
196
+ ? err.body
197
+ : undefined;
198
+ const diagnosis = fam_agent_guidance_util_1.FAM_AgentGuidance_Util.diagnoseJson(rawBody);
199
+ const guidance = fam_agent_guidance_util_1.FAM_AgentGuidance_Util.build({
200
+ mistake: diagnosis.mistake, likelyCause: diagnosis.likelyCause, howToFix: diagnosis.howToFix,
201
+ path: req.originalUrl ?? req.url, method: req.method,
202
+ });
203
+ // (3) ÖNDIAGNOSZTIKA: incidens a FAM SAJÁT error-útján (dedup + occurrence-count + REST `/api/errors`),
204
+ // teljes kontextussal. Fire-and-forget: a diagnosztika SOHA nem késleltetheti/buktathatja a választ.
205
+ void App.recordAgentIncident(guidance, req, rawBody);
206
+ // (2) Cselekvésre fordítható válasz — 400 (a hibás kérés NEM 2xx; korábban a bedrock-út 200-at adott).
207
+ res.status(400).json({ ok: false, error: { errorCode: guidance.errorCode, message: guidance.whatHappened }, guidance: guidance });
208
+ };
209
+ }
210
+ /**
211
+ * Egy agent-input-incidens rögzítése a `fam_errors` tárba (REUSE: a meglévő emit-út adja a dedupot, az
212
+ * occurrence-countot és a `/api/errors` felületet — nincs új tár). A kontextus a hívó azonosítóit viszi
213
+ * (metódus, útvonal, aláírás-headerek) + a hibás body CSONKOLT, sensitive-szűrt mintáját, hogy a minta
214
+ * felismerhető legyen. Best-effort: sosem dob.
215
+ */
216
+ static async recordAgentIncident(guidance, req, rawBody) {
217
+ try {
218
+ const headers = (req.headers ?? {});
219
+ const text = (value) => typeof value === 'string' && value.trim() ? value.trim().slice(0, 120) : undefined;
220
+ const requestContext = [
221
+ `${req.method ?? '?'} ${req.originalUrl ?? req.url ?? '?'}`,
222
+ text(headers['user-agent']) ? `ua=${text(headers['user-agent'])}` : undefined,
223
+ text(headers['x-fam-agent']) ? `agent=${text(headers['x-fam-agent'])}` : undefined,
224
+ text(headers['x-fam-session']) ? `session=${text(headers['x-fam-session'])}` : undefined,
225
+ ].filter(Boolean).join(' · ');
226
+ await errors_control_service_1.FAM_Error_ControlService.getInstance().emit({
227
+ errorCode: guidance.errorCode,
228
+ message: `Agent-input hiba (${guidance.mistake}): ${guidance.likelyCause}`,
229
+ level: fsm_dynamo_1.DyFM_ErrorLevel.warning,
230
+ context: {
231
+ operation: 'agent-input',
232
+ requestContext: requestContext,
233
+ // A hibás minta CSONKOLVA — ebből ismerhető fel a visszatérő elrontás; a sensitive-szűrés a factory-ban.
234
+ failedSample: rawBody ? rawBody.slice(0, 200) : undefined,
235
+ },
236
+ });
237
+ }
238
+ catch {
239
+ // best-effort: az öndiagnosztika sosem buktathatja a kérés-kezelést
240
+ }
241
+ }
242
+ /**
243
+ * A hiba `additionalContent`-jének BIZTONSÁGOSSÁ tétele + a kérés azonosítóinak megőrzése (2026-08-13).
244
+ *
245
+ * **Miért kell:** a bedrock express-error-handlere a nyers `req`/`res`-t is beleteszi az `additionalContent`-be,
246
+ * ami KÖRKÖRÖS → a Dynamo `JSON.stringify`-ja elhasal, és a mezőt TELJESEN eldobja. Következmény: a `fam_errors`
247
+ * rekordon NINCS semmi kontextus (se út, se metódus, se hívó), így egy visszatérő hiba diagnosztizálhatatlan —
248
+ * ez sérti a „minden hiba debug-szintű részletet hordoz" hard rule-t.
249
+ *
250
+ * **Mit tesz:** ha az `additionalContent` már szerializálható, HOZZÁNYÚLNI SEM kell (nincs információ-veszteség).
251
+ * Ha nem, egy sensitive-szűrt, lapos snapshotra cseréli: metódus + útvonal + content-type/length + távoli cím +
252
+ * user-agent. A body-t NEM másoljuk (titkot hordozhat, és parse-hiba esetén amúgy sincs feldolgozva).
253
+ * PURE-közeli, best-effort: SOHA nem dob (egy hibakezelő nem bukhat el a hibakezelés közben).
254
+ */
255
+ static attachSafeRequestContext(err, req) {
256
+ try {
257
+ const target = err;
258
+ if (target.additionalContent !== undefined) {
259
+ try {
260
+ JSON.stringify(target.additionalContent);
261
+ return; // szerializálható → érintetlenül hagyjuk (a bedrock saját kontextusa megmarad)
262
+ }
263
+ catch {
264
+ // nem szerializálható → lecseréljük (különben a Dynamo némán eldobja)
265
+ }
266
+ }
267
+ if (!req) {
268
+ return;
269
+ }
270
+ const headers = (req.headers ?? {});
271
+ const asText = (value) => typeof value === 'string' && value.trim() ? value.trim().slice(0, 200) : undefined;
272
+ const requestContext = [
273
+ `${req.method ?? '?'} ${req.originalUrl ?? req.url ?? '?'}`,
274
+ asText(headers['content-type']) ? `type=${asText(headers['content-type'])}` : undefined,
275
+ asText(headers['content-length']) ? `bytes=${asText(headers['content-length'])}` : undefined,
276
+ asText(req.ip) ? `from=${asText(req.ip)}` : undefined,
277
+ asText(headers['user-agent']) ? `ua=${asText(headers['user-agent'])}` : undefined,
278
+ // A FAM event-signing headerei (ha a hívó aláírta magát) — ez azonosítja az agentet/sessiont.
279
+ asText(headers['x-fam-agent']) ? `agent=${asText(headers['x-fam-agent'])}` : undefined,
280
+ asText(headers['x-fam-session']) ? `session=${asText(headers['x-fam-session'])}` : undefined,
281
+ ].filter(Boolean).join(' · ');
282
+ target.additionalContent = { contextSnapshot: { operation: 'http-request', requestContext: requestContext } };
283
+ }
284
+ catch {
285
+ // best-effort: a hibakezelés SOHA nem bukhat el a kontextus-mentés miatt
286
+ }
287
+ }
166
288
  getGlobalErrorHandler() {
167
289
  return async (err, req, res, issuer) => {
168
290
  // No-silent-failure (dsgn-008): minden hibát persistálunk a `fam_errors` tárba a
@@ -173,6 +295,12 @@ class App extends nts_dynamo_1.DyNTS_App {
173
295
  }
174
296
  let setIssuer = issuer ?? (req?.body)?.issuer;
175
297
  setIssuer = setIssuer ?? err?.___issuerService ?? 'unknown-service';
298
+ // KÉRÉS-KONTEXTUS MENTÉSE (2026-08-13 lelet): a bedrock express-hibáin (`Express ERROR`) az
299
+ // `additionalContent` NEM JSON-szerializálható (körkörös `req`/`res`), ezért a Dynamo ELDOBJA
300
+ // („additionalContent is not JSON.stringifyable… it will be removed!") — és a hiba KONTEXTUS NÉLKÜL
301
+ // perzisztálódik. Így egy hibás-JSON POST-ról (body-parser SyntaxError, a routing ELŐTT) nem derül ki,
302
+ // KI küldte. Itt biztonságos, szerializálható snapshotra cseréljük — a hívó azonosíthatóvá válik.
303
+ App.attachSafeRequestContext(err, req);
176
304
  await errors_control_service_1.FAM_Error_ControlService.globalErrorHandler(err, setIssuer);
177
305
  };
178
306
  }
@@ -6,10 +6,10 @@
6
6
  <base href="/api/app/">
7
7
  <meta name="viewport" content="width=device-width, initial-scale=1">
8
8
  <link rel="icon" type="image/x-icon" href="favicon.ico">
9
- <style>@font-face{font-family:'Roboto';font-style:normal;font-weight:300;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3GUBGEe.woff2) format('woff2');unicode-range:U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}@font-face{font-family:'Roboto';font-style:normal;font-weight:300;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3iUBGEe.woff2) format('woff2');unicode-range:U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}@font-face{font-family:'Roboto';font-style:normal;font-weight:300;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3CUBGEe.woff2) format('woff2');unicode-range:U+1F00-1FFF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:300;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3-UBGEe.woff2) format('woff2');unicode-range:U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:300;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMawCUBGEe.woff2) format('woff2');unicode-range:U+0302-0303, U+0305, U+0307-0308, U+0310, U+0312, U+0315, U+031A, U+0326-0327, U+032C, U+032F-0330, U+0332-0333, U+0338, U+033A, U+0346, U+034D, U+0391-03A1, U+03A3-03A9, U+03B1-03C9, U+03D1, U+03D5-03D6, U+03F0-03F1, U+03F4-03F5, U+2016-2017, U+2034-2038, U+203C, U+2040, U+2043, U+2047, U+2050, U+2057, U+205F, U+2070-2071, U+2074-208E, U+2090-209C, U+20D0-20DC, U+20E1, U+20E5-20EF, U+2100-2112, U+2114-2115, U+2117-2121, U+2123-214F, U+2190, U+2192, U+2194-21AE, U+21B0-21E5, U+21F1-21F2, U+21F4-2211, U+2213-2214, U+2216-22FF, U+2308-230B, U+2310, U+2319, U+231C-2321, U+2336-237A, U+237C, U+2395, U+239B-23B7, U+23D0, U+23DC-23E1, U+2474-2475, U+25AF, U+25B3, U+25B7, U+25BD, U+25C1, U+25CA, U+25CC, U+25FB, U+266D-266F, U+27C0-27FF, U+2900-2AFF, U+2B0E-2B11, U+2B30-2B4C, U+2BFE, U+3030, U+FF5B, U+FF5D, U+1D400-1D7FF, U+1EE00-1EEFF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:300;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMaxKUBGEe.woff2) format('woff2');unicode-range:U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8BB, U+1F8C0-1F8C1, U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, U+1FA80-1FA89, U+1FA8F-1FAC6, U+1FACE-1FADC, U+1FADF-1FAE9, U+1FAF0-1FAF8, U+1FB00-1FBFF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:300;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3OUBGEe.woff2) format('woff2');unicode-range:U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;}@font-face{font-family:'Roboto';font-style:normal;font-weight:300;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3KUBGEe.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:300;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3yUBA.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3GUBGEe.woff2) format('woff2');unicode-range:U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3iUBGEe.woff2) format('woff2');unicode-range:U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3CUBGEe.woff2) format('woff2');unicode-range:U+1F00-1FFF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3-UBGEe.woff2) format('woff2');unicode-range:U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMawCUBGEe.woff2) format('woff2');unicode-range:U+0302-0303, U+0305, U+0307-0308, U+0310, U+0312, U+0315, U+031A, U+0326-0327, U+032C, U+032F-0330, U+0332-0333, U+0338, U+033A, U+0346, U+034D, U+0391-03A1, U+03A3-03A9, U+03B1-03C9, U+03D1, U+03D5-03D6, U+03F0-03F1, U+03F4-03F5, U+2016-2017, U+2034-2038, U+203C, U+2040, U+2043, U+2047, U+2050, U+2057, U+205F, U+2070-2071, U+2074-208E, U+2090-209C, U+20D0-20DC, U+20E1, U+20E5-20EF, U+2100-2112, U+2114-2115, U+2117-2121, U+2123-214F, U+2190, U+2192, U+2194-21AE, U+21B0-21E5, U+21F1-21F2, U+21F4-2211, U+2213-2214, U+2216-22FF, U+2308-230B, U+2310, U+2319, U+231C-2321, U+2336-237A, U+237C, U+2395, U+239B-23B7, U+23D0, U+23DC-23E1, U+2474-2475, U+25AF, U+25B3, U+25B7, U+25BD, U+25C1, U+25CA, U+25CC, U+25FB, U+266D-266F, U+27C0-27FF, U+2900-2AFF, U+2B0E-2B11, U+2B30-2B4C, U+2BFE, U+3030, U+FF5B, U+FF5D, U+1D400-1D7FF, U+1EE00-1EEFF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMaxKUBGEe.woff2) format('woff2');unicode-range:U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8BB, U+1F8C0-1F8C1, U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, U+1FA80-1FA89, U+1FA8F-1FAC6, U+1FACE-1FADC, U+1FADF-1FAE9, U+1FAF0-1FAF8, U+1FB00-1FBFF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3OUBGEe.woff2) format('woff2');unicode-range:U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3KUBGEe.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3yUBA.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3GUBGEe.woff2) format('woff2');unicode-range:U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3iUBGEe.woff2) format('woff2');unicode-range:U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3CUBGEe.woff2) format('woff2');unicode-range:U+1F00-1FFF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3-UBGEe.woff2) format('woff2');unicode-range:U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMawCUBGEe.woff2) format('woff2');unicode-range:U+0302-0303, U+0305, U+0307-0308, U+0310, U+0312, U+0315, U+031A, U+0326-0327, U+032C, U+032F-0330, U+0332-0333, U+0338, U+033A, U+0346, U+034D, U+0391-03A1, U+03A3-03A9, U+03B1-03C9, U+03D1, U+03D5-03D6, U+03F0-03F1, U+03F4-03F5, U+2016-2017, U+2034-2038, U+203C, U+2040, U+2043, U+2047, U+2050, U+2057, U+205F, U+2070-2071, U+2074-208E, U+2090-209C, U+20D0-20DC, U+20E1, U+20E5-20EF, U+2100-2112, U+2114-2115, U+2117-2121, U+2123-214F, U+2190, U+2192, U+2194-21AE, U+21B0-21E5, U+21F1-21F2, U+21F4-2211, U+2213-2214, U+2216-22FF, U+2308-230B, U+2310, U+2319, U+231C-2321, U+2336-237A, U+237C, U+2395, U+239B-23B7, U+23D0, U+23DC-23E1, U+2474-2475, U+25AF, U+25B3, U+25B7, U+25BD, U+25C1, U+25CA, U+25CC, U+25FB, U+266D-266F, U+27C0-27FF, U+2900-2AFF, U+2B0E-2B11, U+2B30-2B4C, U+2BFE, U+3030, U+FF5B, U+FF5D, U+1D400-1D7FF, U+1EE00-1EEFF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMaxKUBGEe.woff2) format('woff2');unicode-range:U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8BB, U+1F8C0-1F8C1, U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, U+1FA80-1FA89, U+1FA8F-1FAC6, U+1FACE-1FADC, U+1FADF-1FAE9, U+1FAF0-1FAF8, U+1FB00-1FBFF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3OUBGEe.woff2) format('woff2');unicode-range:U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3KUBGEe.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3yUBA.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}</style>
9
+ <style>@font-face{font-family:'Roboto';font-style:normal;font-weight:300;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFOBCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuaabQuYoPsOC-chym82KThn5-fFffE.woff2) format('woff2');unicode-range:U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}@font-face{font-family:'Roboto';font-style:normal;font-weight:300;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFOBCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuaabQuYoPsOC-chym82KThn7ufFffE.woff2) format('woff2');unicode-range:U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}@font-face{font-family:'Roboto';font-style:normal;font-weight:300;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFOBCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuaabQuYoPsOC-chym82KThn5ufFffE.woff2) format('woff2');unicode-range:U+1F00-1FFF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:300;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFOBCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuaabQuYoPsOC-chym82KThn6efFffE.woff2) format('woff2');unicode-range:U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:300;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFOBCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuaabQuYoPsOC-chym82KThnlufFffE.woff2) format('woff2');unicode-range:U+0302-0303, U+0305, U+0307-0308, U+0310, U+0312, U+0315, U+031A, U+0326-0327, U+032C, U+032F-0330, U+0332-0333, U+0338, U+033A, U+0346, U+034D, U+0391-03A1, U+03A3-03A9, U+03B1-03C9, U+03D1, U+03D5-03D6, U+03F0-03F1, U+03F4-03F5, U+2016-2017, U+2034-2038, U+203C, U+2040, U+2043, U+2047, U+2050, U+2057, U+205F, U+2070-2071, U+2074-208E, U+2090-209C, U+20D0-20DC, U+20E1, U+20E5-20EF, U+2100-2112, U+2114-2115, U+2117-2121, U+2123-214F, U+2190, U+2192, U+2194-21AE, U+21B0-21E5, U+21F1-21F2, U+21F4-2211, U+2213-2214, U+2216-22FF, U+2308-230B, U+2310, U+2319, U+231C-2321, U+2336-237A, U+237C, U+2395, U+239B-23B7, U+23D0, U+23DC-23E1, U+2474-2475, U+25AF, U+25B3, U+25B7, U+25BD, U+25C1, U+25CA, U+25CC, U+25FB, U+266D-266F, U+27C0-27FF, U+2900-2AFF, U+2B0E-2B11, U+2B30-2B4C, U+2BFE, U+3030, U+FF5B, U+FF5D, U+1D400-1D7FF, U+1EE00-1EEFF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:300;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFOBCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuaabQuYoPsOC-chym82KThnhOfFffE.woff2) format('woff2');unicode-range:U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8BB, U+1F8C0-1F8C1, U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, U+1FA80-1FA89, U+1FA8F-1FAC6, U+1FACE-1FADC, U+1FADF-1FAE9, U+1FAF0-1FAF8, U+1FB00-1FBFF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:300;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFOBCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuaabQuYoPsOC-chym82KThn5efFffE.woff2) format('woff2');unicode-range:U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;}@font-face{font-family:'Roboto';font-style:normal;font-weight:300;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFOBCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuaabQuYoPsOC-chym82KThn5OfFffE.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:300;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFOBCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuaabQuYoPsOC-chym82KThn6ufF.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFOBCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuaabQuYoPsOC-chym82KThn5-fFffE.woff2) format('woff2');unicode-range:U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFOBCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuaabQuYoPsOC-chym82KThn7ufFffE.woff2) format('woff2');unicode-range:U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFOBCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuaabQuYoPsOC-chym82KThn5ufFffE.woff2) format('woff2');unicode-range:U+1F00-1FFF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFOBCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuaabQuYoPsOC-chym82KThn6efFffE.woff2) format('woff2');unicode-range:U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFOBCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuaabQuYoPsOC-chym82KThnlufFffE.woff2) format('woff2');unicode-range:U+0302-0303, U+0305, U+0307-0308, U+0310, U+0312, U+0315, U+031A, U+0326-0327, U+032C, U+032F-0330, U+0332-0333, U+0338, U+033A, U+0346, U+034D, U+0391-03A1, U+03A3-03A9, U+03B1-03C9, U+03D1, U+03D5-03D6, U+03F0-03F1, U+03F4-03F5, U+2016-2017, U+2034-2038, U+203C, U+2040, U+2043, U+2047, U+2050, U+2057, U+205F, U+2070-2071, U+2074-208E, U+2090-209C, U+20D0-20DC, U+20E1, U+20E5-20EF, U+2100-2112, U+2114-2115, U+2117-2121, U+2123-214F, U+2190, U+2192, U+2194-21AE, U+21B0-21E5, U+21F1-21F2, U+21F4-2211, U+2213-2214, U+2216-22FF, U+2308-230B, U+2310, U+2319, U+231C-2321, U+2336-237A, U+237C, U+2395, U+239B-23B7, U+23D0, U+23DC-23E1, U+2474-2475, U+25AF, U+25B3, U+25B7, U+25BD, U+25C1, U+25CA, U+25CC, U+25FB, U+266D-266F, U+27C0-27FF, U+2900-2AFF, U+2B0E-2B11, U+2B30-2B4C, U+2BFE, U+3030, U+FF5B, U+FF5D, U+1D400-1D7FF, U+1EE00-1EEFF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFOBCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuaabQuYoPsOC-chym82KThnhOfFffE.woff2) format('woff2');unicode-range:U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8BB, U+1F8C0-1F8C1, U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, U+1FA80-1FA89, U+1FA8F-1FAC6, U+1FACE-1FADC, U+1FADF-1FAE9, U+1FAF0-1FAF8, U+1FB00-1FBFF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFOBCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuaabQuYoPsOC-chym82KThn5efFffE.woff2) format('woff2');unicode-range:U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFOBCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuaabQuYoPsOC-chym82KThn5OfFffE.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFOBCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuaabQuYoPsOC-chym82KThn6ufF.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFOBCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuaabQuYoPsOC-chym82KThn5-fFffE.woff2) format('woff2');unicode-range:U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFOBCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuaabQuYoPsOC-chym82KThn7ufFffE.woff2) format('woff2');unicode-range:U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFOBCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuaabQuYoPsOC-chym82KThn5ufFffE.woff2) format('woff2');unicode-range:U+1F00-1FFF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFOBCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuaabQuYoPsOC-chym82KThn6efFffE.woff2) format('woff2');unicode-range:U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFOBCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuaabQuYoPsOC-chym82KThnlufFffE.woff2) format('woff2');unicode-range:U+0302-0303, U+0305, U+0307-0308, U+0310, U+0312, U+0315, U+031A, U+0326-0327, U+032C, U+032F-0330, U+0332-0333, U+0338, U+033A, U+0346, U+034D, U+0391-03A1, U+03A3-03A9, U+03B1-03C9, U+03D1, U+03D5-03D6, U+03F0-03F1, U+03F4-03F5, U+2016-2017, U+2034-2038, U+203C, U+2040, U+2043, U+2047, U+2050, U+2057, U+205F, U+2070-2071, U+2074-208E, U+2090-209C, U+20D0-20DC, U+20E1, U+20E5-20EF, U+2100-2112, U+2114-2115, U+2117-2121, U+2123-214F, U+2190, U+2192, U+2194-21AE, U+21B0-21E5, U+21F1-21F2, U+21F4-2211, U+2213-2214, U+2216-22FF, U+2308-230B, U+2310, U+2319, U+231C-2321, U+2336-237A, U+237C, U+2395, U+239B-23B7, U+23D0, U+23DC-23E1, U+2474-2475, U+25AF, U+25B3, U+25B7, U+25BD, U+25C1, U+25CA, U+25CC, U+25FB, U+266D-266F, U+27C0-27FF, U+2900-2AFF, U+2B0E-2B11, U+2B30-2B4C, U+2BFE, U+3030, U+FF5B, U+FF5D, U+1D400-1D7FF, U+1EE00-1EEFF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFOBCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuaabQuYoPsOC-chym82KThnhOfFffE.woff2) format('woff2');unicode-range:U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8BB, U+1F8C0-1F8C1, U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, U+1FA80-1FA89, U+1FA8F-1FAC6, U+1FACE-1FADC, U+1FADF-1FAE9, U+1FAF0-1FAF8, U+1FB00-1FBFF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFOBCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuaabQuYoPsOC-chym82KThn5efFffE.woff2) format('woff2');unicode-range:U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFOBCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuaabQuYoPsOC-chym82KThn5OfFffE.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v51/KFOBCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuaabQuYoPsOC-chym82KThn6ufF.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}</style>
10
10
  <style>@font-face{font-family:'Material Icons';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/materialicons/v145/flUhRq6tzZclQEJ-Vdg-IuiaDsNc.woff2) format('woff2');}.material-icons{font-family:'Material Icons';font-weight:normal;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-feature-settings:'liga';-webkit-font-smoothing:antialiased;}</style>
11
- <style>@font-face{font-family:'Material Symbols Outlined';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/materialsymbolsoutlined/v364/kJF4BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzBwG-RpA6RzaxHMPdY40KH8nGzv3fzfVJU22ZZLsYEpzC_1hCs5Y0.woff2) format('woff2');}.material-symbols-outlined{font-family:'Material Symbols Outlined';font-weight:normal;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-feature-settings:'liga';-webkit-font-smoothing:antialiased;}</style>
12
- <style>@font-face{font-family:'Material Symbols Rounded';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/materialsymbolsrounded/v365/syl7-zNym6YjUruM-QrEh7-nyTnjDwKNJ_190FjpZIvLgyidOK7BDB_Qb9vUdV6_gjDK-P3JuF_Zs-obHph2-jOcZTKPqw.woff2) format('woff2');}.material-symbols-rounded{font-family:'Material Symbols Rounded';font-weight:normal;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-feature-settings:'liga';-webkit-font-smoothing:antialiased;}</style>
11
+ <style>@font-face{font-family:'Material Symbols Outlined';font-style:normal;font-weight:700;src:url(https://fonts.gstatic.com/s/materialsymbolsoutlined/v367/kJF4BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzBwG-RpA6RzaxHMPdY40KH8nGzv3fzfVJU22ZZLsYEpzC_1hCs5Y0.woff2) format('woff2');}.material-symbols-outlined{font-family:'Material Symbols Outlined';font-weight:normal;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-feature-settings:'liga';-webkit-font-smoothing:antialiased;}</style>
12
+ <style>@font-face{font-family:'Material Symbols Rounded';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/materialsymbolsrounded/v368/syl7-zNym6YjUruM-QrEh7-nyTnjDwKNJ_190FjpZIvLgyidOK7BDB_Qb9vUdV6_gjDK-P3JuF_Zs-obHph2-jOcZTKPqw.woff2) format('woff2');}.material-symbols-rounded{font-family:'Material Symbols Rounded';font-weight:normal;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-feature-settings:'liga';-webkit-font-smoothing:antialiased;}</style>
13
13
  <style>*,:before,:after{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgb(59 130 246 / .5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}html,body{height:100%;background-color:#0f0f0f}body{margin:0;font-family:Roboto,Helvetica Neue,sans-serif;color:#c8c8c8}</style><link rel="stylesheet" href="styles-3J7JD5YE.css" media="print" onload="this.media='all'"><noscript><link rel="stylesheet" href="styles-3J7JD5YE.css"></noscript></head>
14
14
  <body class="mat-typography">
15
15
  <a-root-root></a-root-root>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@futdevpro/fdp-agent-memory",
3
- "version": "1.1.133",
3
+ "version": "1.1.135",
4
4
  "description": "Local-first, vector-backed multi-table agent memory exposed as an MCP server (read/write/capabilities). Public, FDP-Templates-free, no auth.",
5
5
  "private": false,
6
6
  "publishConfig": {