@onlyworlds/sdk 4.70.0 → 4.72.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/AGENTS.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # For AI agents using @onlyworlds/sdk
2
2
 
3
- **Current as of**: SDK **4.x** · schema-dist **v0.33.0-dist.49** (canonical 00.33.00).
3
+ **Current as of**: SDK **4.x** · schema-dist **v0.33.0-dist.57** (canonical 00.33.00).
4
4
  This line is asserted by `codegen:check` in CI — if the pin moves and this file is not
5
5
  re-read against it, the check fails rather than letting this document rot quietly.
6
6
 
@@ -56,6 +56,11 @@ against live data). The v1 surface (`OnlyWorldsClient`, the `ElementType` enum)
56
56
  account's daily token rating (`tokens_remaining`, `token_rating`; `remaining` counts answers of
57
57
  this size still in it); used up → `err.isQuotaExceeded`. `isAskUnavailable`, `isAskFailed`
58
58
  count nothing. Custom fields (`x_*`) are in the lookup and the context; `atlas_*` is not.
59
+ Since 4.72.0 `buildAskContext` leaves proposed (`x_review_proposed` not absent or null), hidden
60
+ (`hidden` not absent, null or false) and room elements out unless asked
61
+ (`{ includeProposed, includeHidden, includeRoom }`), lists their ids in `leftOut.proposed`,
62
+ `.hidden`, `.room` (hidden and proposed: under `hidden` only), and labels a proposed element it
63
+ sends `[proposed, not yet reviewed]` on its first line; say how many were held back.
59
64
  - Sort (since 4.18.0, account token): `account.sort({ worldId, notes, slice })` turns unsorted
60
65
  notes (text, or a picture already uploaded into the world) into rows to review: `make`,
61
66
  `add_to`, `link`, `ask`, plus `not_proposed` with reasons. Ids come only from your `slice`
@@ -96,7 +101,9 @@ against live data). The v1 surface (`OnlyWorldsClient`, the `ElementType` enum)
96
101
  `writeWorldFile(files, topDir, { includePrivateRecords: true })` (since 4.63.0; OW-8).
97
102
  Element files marked `hidden: true` travel by default (a copy); a share passes
98
103
  `{ includeHidden: false, report: r => r.hiddenLeftOut }` to leave them out whole and count
99
- them (since 4.70.0; §4.8).
104
+ them (since 4.70.0; §4.8). Two names are one after OW-18's fold: NFC, then simple case
105
+ folding, both Unicode 15.1's from its own files (`nfc` since 4.71.0, `simpleCaseFold`), never
106
+ the runtime's `normalize`, whose Unicode is its ICU's (Node 22: 16.0).
100
107
  - World calendars (since 4.20.0): `worldCalendars(elements)` finds the elements carrying
101
108
  `atlas_calendar` (Atlas owns the field: read it, never write it); `resolveCalendarLens` picks
102
109
  one; `formatStep(config, step)` names a point on the world's integer time line, `parseDate`
package/CHANGELOG.md CHANGED
@@ -5,6 +5,34 @@ earlier history lives in git log only.
5
5
 
6
6
  ## [Unreleased]
7
7
 
8
+ ## [4.72.0] - 2026-10-24
9
+
10
+ ### Changed
11
+
12
+ - **`buildAskContext` now leaves proposed, hidden and room elements out of the context unless asked.** A caller that passes such elements gets fewer items in `context` and `kept` than before: an element whose `x_review_proposed` is anything but absent or null (the review profile, rules 1 and 4: a value that is not a proper mark is a doubt and counts as proposed), one whose `hidden` is anything but absent, null or false (folder format §4.8, the same test as `writeWorldFile`'s `includeHidden`), and a room element (`isRoomElement`, the room profile, rules 1 and 4) are not sent. Their ids come back in the new `leftOut: { proposed, hidden, room }`, in the order given, so a tool can say how many it held back. An element carrying more than one mark is listed once, in the first of hidden, proposed, room whose option is off: a hidden proposed element is under `hidden`, so `includeProposed` alone never sends it. A sent element's link to an element a mark leaves out, anywhere in the index, reads as "not present in the world data", never by its name. `dropped` keeps its meaning (the 8 items and the 12,000 characters), counted over what remains. Until now the SDK relied on the caller (Lantern) to filter first; the rules bind the exported function itself.
13
+
14
+ ### Added
15
+
16
+ - **`buildAskContext(items, index, { includeProposed, includeHidden, includeRoom })`**, each default false: true sends that kind again. A proposed element sent carries the review profile's label on its first line, `[proposed, not yet reviewed] Name (type)`, where the AI reading the text sees it. An option that is not a boolean is a TypeError, and an unknown key is refused by name (the options fence, `test/options.test.mjs`). Types `OwAskContextOptions` and `OwAskLeftOut`.
17
+ - **`REVIEW_PROPOSED_LABEL`** (`'proposed, not yet reviewed'`), generated into `types.generated.ts` from rule 1's own sentence in the vendored `profiles/review.md` ("labels each one it keeps **"…"**"); codegen exits 1 if the sentence is missing or occurs twice.
18
+ - **`minted_by: string | null` on `OwWorldLink` and `OwCreatedWorldLink`** (keel PR 215): the membership (its id in GET /api/v2/members) of the co-builder who minted the link over POST /api/v2/links; null for a link the owner made. Served by `createWorldLink` and `listWorldLinks`. No client for `/api/v2/links` itself yet.
19
+ - Tests: each mark left out by default and listed; `hidden` as §4.8 reads it (`"true"` and 1 out, false and null in); a doubt (`"yes"`, `{}`) treated as proposed and labelled when asked, a cleared `null` settled; each `include*` bringing back its own kind only; the label on the first line; a hidden proposed element counted once, under hidden; a kept element's links to a hidden element and from a room element read without their names; the limits over what remains; the fence and the boolean check. Ten mutants, each red on its own test: no proposed filter, no hidden filter, no room filter, no label, a doubt not proposed, proposed checked before hidden, left-out elements counted toward the total, no link view, no option fence, no boolean check.
20
+
21
+ ## [4.71.0] - 2026-10-24
22
+
23
+ ### Added
24
+
25
+ - **`nfc(text)`**: Normalization Form C as Unicode 15.1 defines it, built from Unicode's own `UnicodeData-15.1.0.txt` and `CompositionExclusions-15.1.0.txt` (schema-dist serial 57, OW Council #656), never the runtime's. It is the NFC half of OW-18's fold, beside `simpleCaseFold`, exported so a tool that compares names the way a world file does gets the same answer. This export is why the release is a minor, not 4.70.1.
26
+
27
+ ### Fixed
28
+
29
+ - **The world file's name check uses Unicode 15.1's NFC, not the runtime's** (folder spec §4.7, OW-18, ruled at serial 57). `readWorldFile` and `writeWorldFile` folded names with `String.prototype.normalize('NFC')`, which follows the runtime's ICU: Node 22's is Unicode 16.0, which composes 20 code points 15.1 leaves unassigned (Todhri, Tulu-Tigalari, Gurung Khema, Kirat Rai), so a name with U+11383 and one with U+11382 U+113C9 were refused as one name where the spec keeps two, and an older runtime could miss what 15.1 added. Both now fold with `nfc`. Where 15.1 and the runtime both assign a code point, nothing changes (Unicode's normalization stability): the set's 93 cases read the same either way. The tables are `src/nfc-tables.generated.ts`, made by `codegen/nfc_tables.mjs` from the vendored files.
30
+
31
+ ### Changed
32
+
33
+ - **Schema repinned to schema-dist `v0.33.0-dist.57`** (commit e21b867; same canonical 00.33.00; no schema file moved, `schema.json` and `presentation.json` unchanged, no generated type changed, `ONLYWORLDS_VERSION` still `'00.33.00'`; generated output moves only its source header and SCHEMA.md's line). Serials 50 to 57: the export fixture's world block is the World whole, with `origin` and `x_names` (50, 51); the review profile's reader rule, a reader that hands a world on leaves proposed elements out unless asked (52, 53); the folder lint takes `hidden` as a folder key (53); the checks profile's list case and reader rules 6 to 8 (54); the spine profile and its fixture (55, 56); the `.owworld` set at 93 zips, eight OW-18 NFC pairs with `UnicodeData-15.1.0.txt` and `CompositionExclusions-15.1.0.txt` beside `CaseFolding-15.1.0.txt` (57). None of the earlier 85 zips moved.
34
+ - Tests: the NFC against the two files for every code point (each composite composed back unless excluded, its mapping to the same NFC, each Hangul syllable from its jamo, each combining class by where ordering puts the mark), against the runtime wherever both assign a code point, and every code point 15.1 leaves unassigned left alone; U+11383 against U+11382 U+113C9 and U+16D68 against U+16D67 U+16D67 accepted as two names. The fixture count is the published 93. Four mutants (the runtime's `normalize` back in the fold, one exclusion dropped from the table, an unstable ordering, no Hangul LV+T), each red on its own line. Checked outside the repo against Unicode's `NormalizationTest-15.1.0.txt`: 19,074 lines, 0 disagreements.
35
+
8
36
  ## [4.70.0] - 2026-10-23
9
37
 
10
38
  ### Added
package/README.md CHANGED
@@ -247,11 +247,13 @@ To have an answer written from what you found, OnlyWorlds runs a small AI proxy
247
247
 
248
248
  ```typescript
249
249
  const shown = hits.slice(0, 8); // what your screen lists
250
- const { context, kept } = buildAskContext(shown, index); // within the proxy's limits; kept = what was sent
250
+ const { context, kept, leftOut } = buildAskContext(shown, index); // within the proxy's limits; kept = what was sent
251
251
  const reply = await account.ask({ worldId, question, context }); // account: a client with an ow_a_ token
252
252
  reply.answer; // from those elements only, or "The world doesn't say."
253
253
  ```
254
254
 
255
+ `buildAskContext` hands world elements to an AI, so it leaves three kinds out unless you ask (since 4.72.0): elements marked proposed (`x_review_proposed` anything but absent or null), elements marked hidden (`hidden` anything but absent, null or false) and room elements (`isRoomElement`). Their ids come back in `leftOut.proposed`, `leftOut.hidden` and `leftOut.room`, so you can say how many were held back; an element both hidden and proposed is listed under `hidden` only. Pass `{ includeProposed: true }`, `{ includeHidden: true }` or `{ includeRoom: true }` to send them; a proposed element sent carries `[proposed, not yet reviewed]` (`REVIEW_PROPOSED_LABEL`) on its first line. A sent element's link to one left out reads as not present, never by its name. `dropped` stays the proxy's limits: past the 8th, or past the 12,000 characters, counted over what remains.
256
+
255
257
  The same proxy sorts loose notes into changes for the user to review. Send the elements your own lookup found for them as the `slice`; every id in a row comes from it, and nothing is written until your app applies what the user accepts.
256
258
 
257
259
  ```typescript
@@ -293,6 +295,8 @@ The reader checks every entry before it inflates anything, and refuses the file
293
295
  | `marker` | a `mimetype` entry with other bytes than `WORLD_FILE_MEDIA_TYPE` (a marker is never required) |
294
296
  | `not_a_world`, `more_than_one` | no `world.json` with an `id`, two worlds, or a second `world.json` inside the world (one under `records/` is data) |
295
297
 
298
+ Two names are one when they match after NFC and then simple case folding, both as Unicode 15.1 defines them, from Unicode's own files built into the package (`nfc`, `simpleCaseFold`), never the runtime's Unicode: every reader, in any browser or Node version, joins the same names.
299
+
296
300
  Files beside the world's folder and archive junk (`__MACOSX`, `.DS_Store`) are ignored. The world's OnlyWorlds link and key (`world.json`'s `api`) never travel: both functions remove them. A tool's own folder (`.atlas/` and the like) comes back like any other file; pass `skip: path => …` to leave files out.
297
301
 
298
302
  The writer gives the same bytes for the same files: the `mimetype` marker first, then every entry in the UTF-8 order of its name, stamped 1980-01-01 00:00. It writes `world.json`, `elements/`, `spatial/`, `media/` and `records/`, and leaves any other file out. A tool's dot-folder you hand it travels too, which makes the file a private copy rather than a portable `.owworld`.
package/SCHEMA.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # OnlyWorlds Schema Reference
2
2
 
3
- **Source**: https://github.com/OnlyWorlds/schema-dist @ **v0.33.0-dist.49** — canonical schema **00.33.00**, published 2026-10-22.
3
+ **Source**: https://github.com/OnlyWorlds/schema-dist @ **v0.33.0-dist.57** — canonical schema **00.33.00**, published 2026-10-24.
4
4
 
5
5
  GENERATED from the canonical schema YAML — do not hand-edit (regenerate: `python codegen/generate_types.py`).
6
6
  Written for both humans and AI agents reading this package locally.
package/dist/index.d.ts CHANGED
@@ -102,6 +102,12 @@ declare const ROOM_PAIRS: ReadonlyArray<{
102
102
  readonly type: ElementType;
103
103
  readonly supertype: string;
104
104
  }>;
105
+ /** The review profile's label (schema-dist `profiles/review.md`, rule 1): the words a reader that
106
+ * hands a world on (a context for an AI, a pack, a share) puts on each proposed element it keeps,
107
+ * one whose `x_review_proposed` is anything but absent or null (a doubt, rule 4, included).
108
+ * buildAskContext writes it on the element's first line. Source: rule 1's own sentence, read at
109
+ * codegen. */
110
+ declare const REVIEW_PROPOSED_LABEL: "proposed, not yet reviewed";
105
111
  /** Field type definitions for OnlyWorlds elements. */
106
112
  type FieldType = 'text' | 'integer'
107
113
  /**
@@ -2635,6 +2641,8 @@ interface OwWorldLink {
2635
2641
  uses: number;
2636
2642
  /** A table is `pending` while `uses < max_uses` (and neither revoked nor expired), `used` once full. */
2637
2643
  status: 'pending' | 'used' | 'revoked' | 'expired';
2644
+ /** The membership (its id in GET /api/v2/members) of the co-builder who minted the link over POST /api/v2/links; null for a link the owner made (keel PR 215). */
2645
+ minted_by: string | null;
2638
2646
  /** Whether the link shows the world's name and picture when it is pasted into a chat (keel #422): then the link is `/join/<world_id>#<code>`, else `/join#<code>`. Never on an agent link. */
2639
2647
  preview?: boolean;
2640
2648
  /** A player link only: the Character the player reads as; null while a link for a fresh Character is unused, and always null on a table. `name` is null if that Character was deleted (the redeem then makes a fresh one). */
@@ -4285,7 +4293,7 @@ declare class OwV2Client {
4285
4293
  /**
4286
4294
  * POST /account/ask -- a question about a world the account owns or is in, answered by
4287
4295
  * keel's AI proxy from `context` only (build it with buildAskContext from the elements
4288
- * the user sees). The answer is "The world doesn't say." when the context does not hold
4296
+ * the user sees; it leaves proposed, hidden and room elements out unless asked). The answer is "The world doesn't say." when the context does not hold
4289
4297
  * it. Needs the client's `ow_a_` token (a world key is a TypeError before sending).
4290
4298
  * Refusals: 429 `quota_exceeded` (`err.isQuotaExceeded`, the account's token rating used up for the day;
4291
4299
  * Retry-After runs to midnight UTC), 503 `ask_unavailable` (`err.isAskUnavailable`:
@@ -4536,7 +4544,8 @@ declare function typeWord(world: object | null | undefined, type: string, opts?:
4536
4544
  * - `method` (OW-21): encrypted, or a method other than stored or deflate.
4537
4545
  * - `name` (OW-22): a Windows device name, a trailing dot or space, one of
4538
4546
  * `<>:"|?*` or a control character, a non-ASCII name without the UTF-8 flag.
4539
- * - `duplicate` (OW-17), `collision` (OW-18: NFC, then simple case folding).
4547
+ * - `duplicate` (OW-17), `collision` (OW-18: NFC, then simple case folding,
4548
+ * both Unicode 15.1's from its own files, never the runtime's).
4540
4549
  * - `too_many`, `too_big` (OW-14, OW-15): past the budget by count or declared
4541
4550
  * size, or an entry that inflates past the size it declares.
4542
4551
  * - `marker` (OW-6): a root `mimetype` entry with other bytes than the media
@@ -4663,6 +4672,15 @@ interface OwWriteWorldFileReport {
4663
4672
  */
4664
4673
  declare function writeWorldFile(files: OwWorldFileEntry[], topDir: string, opts?: OwWriteWorldFileOptions): Uint8Array;
4665
4674
 
4675
+ /**
4676
+ * Normalization Form C as Unicode 15.1's files define it (UAX #15:
4677
+ * canonical decomposition, canonical ordering, canonical composition), the
4678
+ * NFC OW-18 folds names with before simple case folding. A code point 15.1
4679
+ * leaves unassigned is left as it is, whatever the runtime's Unicode knows.
4680
+ * Lone surrogates pass through.
4681
+ */
4682
+ declare function nfc(text: string): string;
4683
+
4666
4684
  /**
4667
4685
  * World lookup: find the elements a plain-language question is about, in a
4668
4686
  * world held in memory, with no model and no network. Ported from Assembly's
@@ -4804,11 +4822,20 @@ declare function renderElement<T extends OwLookupElement>(element: T, index: OwW
4804
4822
  * the answer's sources are what the user saw, never a second lookup's.
4805
4823
  *
4806
4824
  * const hits = lookupWorld(index, question).slice(0, 8); // what the screen lists
4807
- * const { context, kept } = buildAskContext(hits, index);
4825
+ * const { context, kept, leftOut } = buildAskContext(hits, index);
4808
4826
  * const reply = await account.ask({ worldId, question, context });
4809
4827
  *
4828
+ * It is a reader that hands a world on, so three published rules hold here, not only in
4829
+ * the caller: an element marked proposed (the review profile, rules 1 and 4: any
4830
+ * `x_review_proposed` but absent or null, a doubt included), one marked hidden (folder
4831
+ * format §4.8: a `hidden` but absent, null or false) and a room element (the room
4832
+ * profile, rules 1 and 4: `isRoomElement`) are left out unless asked for, and listed in
4833
+ * `leftOut`. A kept proposed element carries REVIEW_PROPOSED_LABEL on its first line. A
4834
+ * kept element's link to one left out reads as not present, never by its name.
4835
+ *
4810
4836
  * The limits are keel's (accounts/ask.py), counted the way keel counts (characters,
4811
- * not UTF-16 units): at most 8 items, 2,000 characters each, 12,000 in all.
4837
+ * not UTF-16 units): at most 8 items, 2,000 characters each, 12,000 in all. They apply
4838
+ * to what remains after the three rules.
4812
4839
  */
4813
4840
 
4814
4841
  /** keel's limits on one ask. */
@@ -4818,23 +4845,56 @@ declare const ASK_LIMITS: {
4818
4845
  readonly itemMax: 2000;
4819
4846
  readonly totalMax: 12000;
4820
4847
  };
4848
+ interface OwAskContextOptions {
4849
+ /**
4850
+ * Send proposed elements: those whose `x_review_proposed` is anything but absent or null
4851
+ * (the review profile; a value that is not a proper mark is a doubt, rule 4, and counts as
4852
+ * proposed). Each one sent carries REVIEW_PROPOSED_LABEL on its first line. Default false:
4853
+ * left out and listed in `leftOut.proposed`.
4854
+ */
4855
+ includeProposed?: boolean;
4856
+ /**
4857
+ * Send elements marked hidden: a `hidden` that is anything but absent, null or false (folder
4858
+ * format §4.8, the same test as writeWorldFile's `includeHidden`). Default false: left out and
4859
+ * listed in `leftOut.hidden`.
4860
+ */
4861
+ includeHidden?: boolean;
4862
+ /** Send room elements (`isRoomElement`, the room profile). Default false: left out and listed in `leftOut.room`. */
4863
+ includeRoom?: boolean;
4864
+ }
4865
+ /** Ids left out by a mark, in the order given. An element carrying several marks is listed once, in the first of hidden, proposed, room whose `include*` is off. */
4866
+ interface OwAskLeftOut {
4867
+ proposed: string[];
4868
+ hidden: string[];
4869
+ room: string[];
4870
+ }
4821
4871
  interface OwAskContext {
4822
4872
  /** The texts to send as `context`, in the order given. */
4823
4873
  context: string[];
4824
4874
  /** Ids of the elements sent, in order (one per `context` item). */
4825
4875
  kept: string[];
4826
- /** Ids of the elements left out: past the 8th, or from the first one the 12,000 total could not hold. */
4876
+ /** Ids of the elements the limits left out: past the 8th, or from the first one the 12,000 total could not hold. Never an element `leftOut` holds. */
4827
4877
  dropped: string[];
4828
4878
  /** Ids among `kept` whose text was cut to 2,000 characters. */
4829
4879
  truncated: string[];
4880
+ /** Ids of the elements a mark left out (proposed, hidden, room), before the limits were counted. */
4881
+ leftOut: OwAskLeftOut;
4830
4882
  }
4831
4883
  /**
4832
4884
  * Turn the elements on screen into the proxy's `context`. Takes lookup hits or plain
4833
- * elements, keeps their order, renders each with `renderElement`, cuts a text over
4834
- * 2,000 characters, and stops at the 8th or at the first one the 12,000 total cannot
4835
- * hold, so what is sent is always the top of the list as shown.
4885
+ * elements and keeps their order. First the three marks: an element marked hidden
4886
+ * (§4.8), proposed (the review profile, a doubt included) or a room element (the room
4887
+ * profile) is left out unless its `include*` option is true, and its id goes to
4888
+ * `leftOut` (one bucket each, in the order hidden, proposed, room: a hidden proposed
4889
+ * element is listed under `hidden` only, since the owner's hide is the stronger
4890
+ * withholding and `includeProposed` alone never sends it). Then each remaining element
4891
+ * is rendered with `renderElement` (a proposed one with REVIEW_PROPOSED_LABEL on its
4892
+ * first line; a link to an element a mark leaves out, anywhere in the index, reads as
4893
+ * not present), a text over 2,000 characters is cut, and the list stops at the 8th or
4894
+ * at the first the 12,000 total cannot hold, so what is sent is always the top of the
4895
+ * list as shown. An unknown option, or one that is not a boolean, is a TypeError.
4836
4896
  */
4837
- declare function buildAskContext<T extends OwLookupElement>(items: Array<OwLookupHit<T> | T>, index: OwWorldIndex<T>): OwAskContext;
4897
+ declare function buildAskContext<T extends OwLookupElement>(items: Array<OwLookupHit<T> | T>, index: OwWorldIndex<T>, opts?: OwAskContextOptions): OwAskContext;
4838
4898
 
4839
4899
  /**
4840
4900
  * Photo preparation: make a picture from a phone's camera or files ready for
@@ -5473,4 +5533,4 @@ declare class TokenResource {
5473
5533
  getEncryptionInfo(): Promise<EncryptionInfo>;
5474
5534
  }
5475
5535
 
5476
- export { AGENT_DOORS, ASK_LIMITS, type AccessKeyResponse, CALENDAR_FIELD, CALENDAR_SUPERTYPE, type CalendarConfig, type CalendarEra, type CalendarIntercalary, type CalendarMonths, type CalendarWeek, ELEMENT_FAMILIES, ELEMENT_ICONS, ELEMENT_LABELS, ELEMENT_SECTIONS, ELEMENT_TYPES, type ElementFamily, type ElementType, type EncryptionInfo, type EraDomain, FAMILY_COLORS, FAMILY_ORDER, FIELD_ACRONYMS, FIELD_SCHEMA, FILE_EXTENSIONS, type FieldInfo, type FieldType, GameTier, type ListParams, ONLYWORLDS_VERSION, type OwAccountWorld, type OwAgentJoined, type OwAllowance, OwApiError, type OwAskAnswer, type OwAskContext, type OwAuthErrorCode, type OwBulkItem, type OwBulkItemResult, type OwBulkResponse, type OwCalendarElement, type OwChange, type OwChangeDelete, type OwChangeUpsert, type OwChangesPage, type OwClientConfig, type OwCreateAccountWorldInput, type OwCreatedAccountWorld, type OwCreatedWorldLink, type OwDeleteReason, type OwDraught, type OwDraughtCompact, type OwDraughtComponent, type OwDraughtItem, type OwDraughtPolicy, type OwElement, type OwElementBase, type OwErrorBody, type OwFileAddedBy, type OwFileDownload, type OwFileKind, type OwFileRow, type OwFileTicket, type OwFrontDoor, type OwHiddenRow, type OwJoinPreview, type OwJoined, type OwJoinedMembership, type OwKeyKind, type OwLinkEdit, type OwLookupElement, type OwLookupHit, type OwLookupLink, type OwLookupOptions, type OwLookupReason, type OwMe, type OwMediaTicket, type OwMember, type OwMemberRole, type OwMintedKey, type OwNamesMap, OwNetworkError, type OwPage, type OwPhotoOptions, type OwPhotoPlan, type OwPlayerJoined, OwPreconditionFailedError, type OwPreparedPhoto, type OwProposal, type OwProposalAccepted, type OwProposalConflict, type OwProposalList, type OwProposalQuery, type OwProposalState, type OwProposeInput, type OwProposed, OwProposedError, type OwProposedNewElement, type OwReadWorldFile, type OwReadWorldFileOptions, type OwRemovalTicket, type OwRemovedImage, type OwRenderOptions, type OwResyncReason, type OwReviewInput, type OwReviewed, type OwSeat, type OwSeatCreated, type OwSignInBegin, type OwSignInBegun, type OwSignInComplete, OwSignInError, type OwSignInReason, type OwSignInResult, type OwSignInStorage, type OwSignedIn, type OwSortAddToRow, type OwSortAnswer, type OwSortAskRow, type OwSortLinkRow, type OwSortMakeRow, type OwSortNote, type OwSortRef, type OwSortRow, OwStaleProposalError, type OwUploadedFile, type OwUploadedImage, OwV2Client, type OwWordPair, type OwWorldFileEntry, OwWorldFileError, type OwWorldFileReason, type OwWorldFileRow, type OwWorldFiles, type OwWorldIndex, type OwWorldLink, type OwWorldMeta, type OwWorldOrigin, type OwWorldProducer, type OwWorldProposalList, type OwWorldProposalQuery, type OwWorldProposalRow, type OwWorldPublicPage, type OwWorldSource, type OwWriteDoor, type OwWriteWorldFileOptions, type OwWriteWorldFileReport, PHOTO_MAX_BYTES, PHOTO_TYPES, PUBLIC_FIELDS, type ParseError, type ParseOptions, type ParseResult, ROOM_PAIRS, type RevokeAllSessionsResponse, type RevokeSessionResponse, SPATIAL_TYPES, type SectionInfo, type StepBreakdown, type TokenConsumeParams, type TokenConsumeResponse, TokenResource, type TokenStatus, type TokenTransport, WORLD_FILE_MAX_BYTES, WORLD_FILE_MAX_ENTRIES, WORLD_FILE_MEDIA_TYPE, type WorldCalendar, absYearForEraYear, absoluteYear, approxYearLength, base64url, breakdownStep, buildAskContext, buildWorldIndex, detectKeyKind, displayYear, elementColor, eraForStep, errorFromResponse, familyOf, fieldLabel, fileKindOf, floorDiv, floorMod, formatDuration, formatMidLabel, formatStep, formatYearLabel, getElementIcon, getElementLabel, isAgentDoor, isDemoKey, isKnownOf, isLeapYear, isParseError, isRoomElement, kindCanWrite, lookupWorld, monthStartSteps, parseDate, parseErrorEnvelope, pinExpectation, pkceChallenge, planPhoto, preparePhoto, readCalendarConfig, readCalendarValue, readWorldFile, renderElement, resolveCalendarLens, resolveEraDomains, simpleCaseFold, typeWord, validateCalendarConfig, weekdayForStep, worldCalendars, writeWorldFile, yearLength, yearStartStep };
5536
+ export { AGENT_DOORS, ASK_LIMITS, type AccessKeyResponse, CALENDAR_FIELD, CALENDAR_SUPERTYPE, type CalendarConfig, type CalendarEra, type CalendarIntercalary, type CalendarMonths, type CalendarWeek, ELEMENT_FAMILIES, ELEMENT_ICONS, ELEMENT_LABELS, ELEMENT_SECTIONS, ELEMENT_TYPES, type ElementFamily, type ElementType, type EncryptionInfo, type EraDomain, FAMILY_COLORS, FAMILY_ORDER, FIELD_ACRONYMS, FIELD_SCHEMA, FILE_EXTENSIONS, type FieldInfo, type FieldType, GameTier, type ListParams, ONLYWORLDS_VERSION, type OwAccountWorld, type OwAgentJoined, type OwAllowance, OwApiError, type OwAskAnswer, type OwAskContext, type OwAskContextOptions, type OwAskLeftOut, type OwAuthErrorCode, type OwBulkItem, type OwBulkItemResult, type OwBulkResponse, type OwCalendarElement, type OwChange, type OwChangeDelete, type OwChangeUpsert, type OwChangesPage, type OwClientConfig, type OwCreateAccountWorldInput, type OwCreatedAccountWorld, type OwCreatedWorldLink, type OwDeleteReason, type OwDraught, type OwDraughtCompact, type OwDraughtComponent, type OwDraughtItem, type OwDraughtPolicy, type OwElement, type OwElementBase, type OwErrorBody, type OwFileAddedBy, type OwFileDownload, type OwFileKind, type OwFileRow, type OwFileTicket, type OwFrontDoor, type OwHiddenRow, type OwJoinPreview, type OwJoined, type OwJoinedMembership, type OwKeyKind, type OwLinkEdit, type OwLookupElement, type OwLookupHit, type OwLookupLink, type OwLookupOptions, type OwLookupReason, type OwMe, type OwMediaTicket, type OwMember, type OwMemberRole, type OwMintedKey, type OwNamesMap, OwNetworkError, type OwPage, type OwPhotoOptions, type OwPhotoPlan, type OwPlayerJoined, OwPreconditionFailedError, type OwPreparedPhoto, type OwProposal, type OwProposalAccepted, type OwProposalConflict, type OwProposalList, type OwProposalQuery, type OwProposalState, type OwProposeInput, type OwProposed, OwProposedError, type OwProposedNewElement, type OwReadWorldFile, type OwReadWorldFileOptions, type OwRemovalTicket, type OwRemovedImage, type OwRenderOptions, type OwResyncReason, type OwReviewInput, type OwReviewed, type OwSeat, type OwSeatCreated, type OwSignInBegin, type OwSignInBegun, type OwSignInComplete, OwSignInError, type OwSignInReason, type OwSignInResult, type OwSignInStorage, type OwSignedIn, type OwSortAddToRow, type OwSortAnswer, type OwSortAskRow, type OwSortLinkRow, type OwSortMakeRow, type OwSortNote, type OwSortRef, type OwSortRow, OwStaleProposalError, type OwUploadedFile, type OwUploadedImage, OwV2Client, type OwWordPair, type OwWorldFileEntry, OwWorldFileError, type OwWorldFileReason, type OwWorldFileRow, type OwWorldFiles, type OwWorldIndex, type OwWorldLink, type OwWorldMeta, type OwWorldOrigin, type OwWorldProducer, type OwWorldProposalList, type OwWorldProposalQuery, type OwWorldProposalRow, type OwWorldPublicPage, type OwWorldSource, type OwWriteDoor, type OwWriteWorldFileOptions, type OwWriteWorldFileReport, PHOTO_MAX_BYTES, PHOTO_TYPES, PUBLIC_FIELDS, type ParseError, type ParseOptions, type ParseResult, REVIEW_PROPOSED_LABEL, ROOM_PAIRS, type RevokeAllSessionsResponse, type RevokeSessionResponse, SPATIAL_TYPES, type SectionInfo, type StepBreakdown, type TokenConsumeParams, type TokenConsumeResponse, TokenResource, type TokenStatus, type TokenTransport, WORLD_FILE_MAX_BYTES, WORLD_FILE_MAX_ENTRIES, WORLD_FILE_MEDIA_TYPE, type WorldCalendar, absYearForEraYear, absoluteYear, approxYearLength, base64url, breakdownStep, buildAskContext, buildWorldIndex, detectKeyKind, displayYear, elementColor, eraForStep, errorFromResponse, familyOf, fieldLabel, fileKindOf, floorDiv, floorMod, formatDuration, formatMidLabel, formatStep, formatYearLabel, getElementIcon, getElementLabel, isAgentDoor, isDemoKey, isKnownOf, isLeapYear, isParseError, isRoomElement, kindCanWrite, lookupWorld, monthStartSteps, nfc, parseDate, parseErrorEnvelope, pinExpectation, pkceChallenge, planPhoto, preparePhoto, readCalendarConfig, readCalendarValue, readWorldFile, renderElement, resolveCalendarLens, resolveEraDomains, simpleCaseFold, typeWord, validateCalendarConfig, weekdayForStep, worldCalendars, writeWorldFile, yearLength, yearStartStep };
package/dist/index.js CHANGED
@@ -1746,7 +1746,7 @@ var OwV2Client = class {
1746
1746
  /**
1747
1747
  * POST /account/ask -- a question about a world the account owns or is in, answered by
1748
1748
  * keel's AI proxy from `context` only (build it with buildAskContext from the elements
1749
- * the user sees). The answer is "The world doesn't say." when the context does not hold
1749
+ * the user sees; it leaves proposed, hidden and room elements out unless asked). The answer is "The world doesn't say." when the context does not hold
1750
1750
  * it. Needs the client's `ow_a_` token (a world key is a TypeError before sending).
1751
1751
  * Refusals: 429 `quota_exceeded` (`err.isQuotaExceeded`, the account's token rating used up for the day;
1752
1752
  * Retry-After runs to midnight UTC), 503 `ask_unavailable` (`err.isAskUnavailable`:
@@ -2244,6 +2244,7 @@ var ROOM_PAIRS = [
2244
2244
  { type: "character", supertype: "Member" }
2245
2245
  ];
2246
2246
  var ROOM_MARK = "x_room_of";
2247
+ var REVIEW_PROPOSED_LABEL = "proposed, not yet reviewed";
2247
2248
  var FIELD_SCHEMA = {
2248
2249
  ability: {
2249
2250
  // Base fields (shared by all elements)
@@ -2957,6 +2958,118 @@ function getElementLabel(elementType) {
2957
2958
 
2958
2959
  // src/world-file.ts
2959
2960
  import { Inflate, inflateSync, zipSync } from "fflate";
2961
+
2962
+ // src/nfc-tables.generated.ts
2963
+ var NFC_CLASS_RUNS = "lc.l.6e,lx..6g,ly.4.64,m2..6g,m3..60,m4.5.64,m9.2.5m,mb.4.64,mf.2.5m,mh.b.64,ms.5.1,mx.4.64,n1.8.6e,n9..6o,na..6e,nb.3.64,ne.3.6e,nh.2.64,nk.3.6e,nn.4.64,nr..6e,ns..6g,nt.2.64,nv..6e,nw..6h,nx.2.6i,nz..6h,o0.2.6i,o2..6h,o3.d.6e,w3.5.6e,13l..64,13m.4.6e,13q..64,13r.3.6e,13u..66,13v..64,13w.6.6e,142.6.64,148.2.6e,14a..64,14b.2.6e,14d..66,14e..6c,14f..6e,14g..a,14h..b,14i..c,14j..d,14k..e,14l..f,14m..g,14n..h,14o..i,14p.2.j,14r..k,14s..l,14t..m,14v..n,14x..o,14y..p,150..6e,151..64,153..i,174.8.6e,17c..u,17d..v,17e..w,18r..r,18s..s,18t..t,18u..u,18v..v,18w..w,18x..x,18y..y,18z.2.6e,191.2.64,193.5.6e,198..64,199.2.6e,19b..64,19s..z,1cm.7.6e,1cv.4.6e,1cz..64,1d0..6e,1d3.2.6e,1d6..64,1d7.2.6e,1d9..64,1e9..10,1f4..6e,1f5..64,1f6.2.6e,1f8..64,1f9.2.6e,1fb.3.64,1fe..6e,1ff.2.64,1fh..6e,1fi..64,1fj.3.6e,1fm..64,1fn..6e,1fo..64,1fp..6e,1fq..64,1fr..6e,1fs..64,1ft.2.6e,1kb.7.6e,1ki..64,1kj..6e,1kt..64,1li.4.6e,1ln.9.6e,1lx.3.6e,1m1.5.6e,1nd.3.64,1p4..6e,1p5.3.64,1p8.4.6e,1qi.5.6e,1qn.5.64,1qs.e.6e,1r7..64,1r8.2.6e,1ra..64,1rb.2.6e,1rd..64,1re.3.6e,1rh.3.64,1rk..r,1rl..s,1rm..t,1rn.3.6e,1rq..64,1rr.2.6e,1rt.2.64,1rv.5.6e,1to..7,1u5..9,1u9..6e,1ua..64,1ub.2.6e,1x8..7,1xp..9,1z2..6e,20s..7,219..9,24c..7,24t..9,27w..7,28d..9,2bx..9,2f0..7,2fh..9,2fp..2c,2fq..2j,2ik..7,2j1..9,2m3.2.9,2ml..9,2q2..9,2t4.2.2v,2t6..9,2tk.4.2z,2wo.2.3a,2wq..9,2x4.4.3e,2zc.2.64,305..64,307..64,309..60,31t..3l,31u..3m,31w..3o,322.4.3m,328..3m,32a.2.6e,32c..9,32e.2.6e,346..64,37b..7,37d.2.9,39p..64,3tp.3.6e,4k4.2.9,4l0..9,4pe..9,4pp..6e,4vd..6c,4zd..66,4ze..6e,4zf..64,55j..6e,55k..64,57k..9,585.8.6e,58f..64,59s.5.6e,59x.6.64,5a3.2.6e,5a5..64,5a7.2.64,5a9.2.6e,5ab.2.64,5ad.5.6e,5ai..64,5aj.4.6e,5dg..7,5dw..9,5ez..6e,5f0..64,5f1.7.6e,5gq.2.9,5ie..7,5iq.2.9,5kn..7,5ow.3.6e,5p0..1,5p1.5.64,5p6.2.6e,5p8.4.64,5pc..6e,5pe.7.1,5pp..64,5pw..6e,5q0.2.6e,5vk.2.6e,5vm..64,5vn.7.6e,5vu..64,5vv.2.6e,5vx..6i,5vy..5y,5vz..64,5w0..5m,5w1.11.6e,5x2..6g,5x3.2.6c,5x5..64,5x6..62,5x7..6e,5x8..6h,5x9..64,5xa..6e,5xb..64,6hc.2.6e,6he.2.1,6hg.4.6e,6hk.3.1,6hn.2.6e,6ht..6e,6hx.2.1,6hz..6e,6i0..64,6i1..6e,6i2.2.1,6i4.4.64,6i8..6e,8vj.3.6e,8zj..9,928.w.6e,9ii..62,9ij..6c,9ik..6g,9il..66,9im.2.68,9ll.2.8,wvj..6e,wvo.a.6e,wwu.2.6e,wz4.2.6e,x6u..9,x7w..9,xc4..9,xcw.i.6e,xez.3.64,xg3..9,xir..7,xj4..9,xps..6e,xpu.2.6e,xpw..64,xpz.2.6e,xq6.2.6e,xq9..6e,xrq..9,xyl..9,1dlq..q,1e74.7.6e,1e7b.7.64,1e7i.2.6e,1eyl..64,1f4w..64,1f92.5.6e,1gjx..64,1gjz..6e,1gl4..6e,1gl5..1,1gl6..64,1glb..9,1gpx..6e,1gpy..64,1h5w.4.6e,1hgr.2.6e,1hj1.3.64,1hl2.2.64,1hl4.3.6e,1hl7..64,1hl8..6e,1hl9.4.64,1hmq..6e,1hmr..64,1hms..6e,1hmt..64,1hs6..9,1htc..9,1htr..9,1hvd..9,1hve..7,1hxc.3.6e,1hyr.2.9,1i0j..7,1i2o..9,1i2y..7,1i5x..9,1i5y..7,1iax..7,1iay..9,1id7.2.7,1idp..9,1iee.7.6e,1ieo.5.6e,1iki..9,1ikm..7,1ila..6e,1io2..9,1io3..7,1iv3..9,1iv4..7,1iyn..9,1j1y..9,1j1z..7,1j57..9,1jcp..9,1jcq..7,1jjx.2.9,1jk3..7,1jog..9,1jqs..9,1jrb..9,1jtl..9,1k5b..9,1kci..7,1kck.2.9,1kev..9,1kqp.2.9,1zow.5.1,1zqo.7.6e,20og.2.6,2ftq..1,2jxh.2.60,2jxj.3.1,2jxp..6a,2jxq.5.60,2jy3.8.64,2jyd.5.6e,2jyi.2.64,2jze.4.6e,2k3m.3.6e,2mtc.7.6e,2mtk.h.6e,2mu3.7.6e,2mub.2.6e,2mue.5.6e,2mxb..6e,2n1s.7.6e,2nce..6e,2ne4.4.6e,2nsc.2.6g,2nse..64,2nsf..6e,2ok0.7.64,2on8.6.6e,2one..7";
2964
+ var NFC_DECOMP = "5c.1t.lc,1.1t.ld,1.1t.le,1.1t.lf,1.1t.lk,1.1t.lm,2.1v.mf,1.1x.lc,1.1x.ld,1.1x.le,1.1x.lk,1.21.lc,1.21.ld,1.21.le,1.21.lk,2.26.lf,1.27.lc,1.27.ld,1.27.le,1.27.lf,1.27.lk,3.2d.lc,1.2d.ld,1.2d.le,1.2d.lk,1.2h.ld,3.2p.lc,1.2p.ld,1.2p.le,1.2p.lf,1.2p.lk,1.2p.lm,2.2r.mf,1.2t.lc,1.2t.ld,1.2t.le,1.2t.lk,1.2x.lc,1.2x.ld,1.2x.le,1.2x.lk,2.32.lf,1.33.lc,1.33.ld,1.33.le,1.33.lf,1.33.lk,3.39.lc,1.39.ld,1.39.le,1.39.lk,1.3d.ld,2.3d.lk,1.1t.lg,1.2p.lg,1.1t.li,1.2p.li,1.1t.mg,1.2p.mg,1.1v.ld,1.2r.ld,1.1v.le,1.2r.le,1.1v.lj,1.2r.lj,1.1v.lo,1.2r.lo,1.1w.lo,1.2s.lo,3.1x.lg,1.2t.lg,1.1x.li,1.2t.li,1.1x.lj,1.2t.lj,1.1x.mg,1.2t.mg,1.1x.lo,1.2t.lo,1.1z.le,1.2v.le,1.1z.li,1.2v.li,1.1z.lj,1.2v.lj,1.1z.mf,1.2v.mf,1.20.le,1.2w.le,3.21.lf,1.2x.lf,1.21.lg,1.2x.lg,1.21.li,1.2x.li,1.21.mg,1.2x.mg,1.21.lj,4.22.le,1.2y.le,1.23.mf,1.2z.mf,2.24.ld,1.30.ld,1.24.mf,1.30.mf,1.24.lo,1.30.lo,5.26.ld,1.32.ld,1.26.mf,1.32.mf,1.26.lo,1.32.lo,4.27.lg,1.33.lg,1.27.li,1.33.li,1.27.ln,1.33.ln,3.2a.ld,1.36.ld,1.2a.mf,1.36.mf,1.2a.lo,1.36.lo,1.2b.ld,1.37.ld,1.2b.le,1.37.le,1.2b.mf,1.37.mf,1.2b.lo,1.37.lo,1.2c.mf,1.38.mf,1.2c.lo,1.38.lo,3.2d.lf,1.39.lf,1.2d.lg,1.39.lg,1.2d.li,1.39.li,1.2d.lm,1.39.lm,1.2d.ln,1.39.ln,1.2d.mg,1.39.mg,1.2f.le,1.3b.le,1.2h.le,1.3d.le,1.2h.lk,1.2i.ld,1.3e.ld,1.2i.lj,1.3e.lj,1.2i.lo,1.3e.lo,y.27.m3,1.33.m3,e.2d.m3,1.39.m3,t.1t.lo,1.2p.lo,1.21.lo,1.2x.lo,1.27.lo,1.33.lo,1.2d.lo,1.39.lo,1.64.lg,1.70.lg,1.64.ld,1.70.ld,1.64.lo,1.70.lo,1.64.lc,1.70.lc,2.5g.lg,1.6c.lg,1.fa.lg,1.fb.lg,1.5i.lg,1.6e.lg,3.1z.lo,1.2v.lo,1.23.lo,1.2z.lo,1.27.mg,1.33.mg,1.dm.lg,1.dn.lg,1.c7.lo,1.ia.lo,1.2y.lo,4.1z.ld,1.2v.ld,3.26.lc,1.32.lc,1.5h.ld,1.6d.ld,1.5i.ld,1.6e.ld,1.60.ld,1.6w.ld,1.1t.lr,1.2p.lr,1.1t.lt,1.2p.lt,1.1x.lr,1.2t.lr,1.1x.lt,1.2t.lt,1.21.lr,1.2x.lr,1.21.lt,1.2x.lt,1.27.lr,1.33.lr,1.27.lt,1.33.lt,1.2a.lr,1.36.lr,1.2a.lt,1.36.lt,1.2d.lr,1.39.lr,1.2d.lt,1.39.lt,1.2b.me,1.37.me,1.2c.me,1.38.me,3.20.lo,1.2w.lo,7.1t.lj,1.2p.lj,1.1x.mf,1.2t.mf,1.5y.lg,1.6u.lg,1.5x.lg,1.6t.lg,1.27.lj,1.33.lj,1.fi.lg,1.fj.lg,1.2h.lg,1.3d.lg,7h.lc,1.ld,2.lv,1.lk.ld,1c.jd,a.1n,7.4o.ld,1.pd.ld,1.53,1.ph.ld,1.pj.ld,1.pl.ld,2.pr.ld,2.px.ld,1.q1.ld,1.qy.ld,q.pl.lk,1.px.lk,1.q9.ld,1.qd.ld,1.qf.ld,1.qh.ld,1.qz.ld,q.qh.lk,1.qt.lk,1.qn.ld,1.qt.ld,1.qx.ld,5.r6.ld,1.r6.lk,18.t1.lc,1.t1.lk,2.sz.ld,4.sm.lk,5.t6.ld,1.t4.lc,1.tf.li,b.t4.li,w.u0.li,n.tx.lc,1.tx.lk,2.tv.ld,4.uu.lk,5.u2.ld,1.u0.lc,1.ub.li,o.vo.lr,1.vp.lr,22.t2.li,1.ty.li,e.sw.li,1.ts.li,1.sw.lk,1.ts.lk,3.t1.li,1.tx.li,3.yg.lk,1.yh.lk,1.t2.lk,1.ty.lk,1.t3.lk,1.tz.lk,3.t4.lg,1.u0.lg,1.t4.lk,1.u0.lk,1.ta.lk,1.u6.lk,3.yw.lk,1.yx.lk,1.tp.lk,1.ul.lk,1.tf.lg,1.ub.lg,1.tf.lk,1.ub.lk,1.tf.ln,1.ub.ln,1.tj.lk,1.uf.lk,3.tn.lk,1.uj.lk,89.17r.18z,1.17r.190,1.18o.190,1.17r.191,1.18q.190,4a.1cl.190,2.1c1.190,h.1ci.190,gm.1t4.1to,8.1tc.1to,3.1tf.1to,10.1sl.1to,1.1sm.1to,1.1sn.1to,1.1ss.1to,1.1sx.1to,1.1sy.1to,1.1t7.1to,1.1tb.1to,30.1xj.1xa,1.1xj.1xz,g.1wh.1x8,1.1wi.1x8,2.1wv.1x8,2c.20i.20s,3.20o.20s,z.1zq.20s,1.1zr.20s,1.1zw.20s,3.20b.20s,6i.287.28m,3.287.27y,1.287.28n,g.275.27w,1.276.27w,1j.2aa.2c7,1i.2bq.2bi,1.2br.2bi,1.2bq.2c7,3g.2fa.2fq,3c.2in.2j9,7.2iu.2j9,1.2iu.2ja,2.2iu.2iq,1.2iy.2j9,3j.2me.2m6,1.2mf.2m6,1.2me.2mv,3y.2qh.2q2,2.2qh.2q7,1.2qk.2q2,1.2qh.2qn,9x.30i.33r,a.30s.33r,5.30x.33r,5.312.33r,5.317.33r,d.30g.33p,a.31t.31u,2.31t.31w,1.33m.328,2.33n.328,9.31t.328,i.32q.33r,a.330.33r,5.335.33r,5.33a.33r,5.33f.33r,d.32o.33p,31.36t.372,25c.5c5.5dh,2.5c7.5dh,2.5c9.5dh,2.5cb.5dh,2.5cd.5dh,4.5ch.5dh,15.5dm.5dh,2.5do.5dh,3.5dq.5dh,1.5dr.5dh,2.5du.5dh,jh.1t.md,1.2p.md,1.1u.lj,1.2q.lj,1.1u.mb,1.2q.mb,1.1u.mp,1.2q.mp,1.5j.ld,1.6f.ld,1.1w.lj,1.2s.lj,1.1w.mb,1.2s.mb,1.1w.mp,1.2s.mp,1.1w.mf,1.2s.mf,1.1w.ml,1.2s.ml,1.7m.lc,1.7n.lc,1.7m.ld,1.7n.ld,1.1x.ml,1.2t.ml,1.1x.mo,1.2t.mo,1.fc.li,1.fd.li,1.1y.lj,1.2u.lj,1.1z.lg,1.2v.lg,1.20.lj,1.2w.lj,1.20.mb,1.2w.mb,1.20.lk,1.2w.lk,1.20.mf,1.2w.mf,1.20.mm,1.2w.mm,1.21.mo,1.2x.mo,1.5r.ld,1.6n.ld,1.23.ld,1.2z.ld,1.23.mb,1.2z.mb,1.23.mp,1.2z.mp,1.24.mb,1.30.mb,1.5yu.lg,1.5yv.lg,1.24.mp,1.30.mp,1.24.ml,1.30.ml,1.25.ld,1.31.ld,1.25.lj,1.31.lj,1.25.mb,1.31.mb,1.26.lj,1.32.lj,1.26.mb,1.32.mb,1.26.mp,1.32.mp,1.26.ml,1.32.ml,1.5x.ld,1.6t.ld,1.5x.lk,1.6t.lk,1.98.lc,1.99.lc,1.98.ld,1.99.ld,1.28.ld,1.34.ld,1.28.lj,1.34.lj,1.2a.lj,1.36.lj,1.2a.mb,1.36.mb,1.5zu.lg,1.5zv.lg,1.2a.mp,1.36.mp,1.2b.lj,1.37.lj,1.2b.mb,1.37.mb,1.9m.lj,1.9n.lj,1.9s.lj,1.9t.lj,1.602.lj,1.603.lj,1.2c.lj,1.38.lj,1.2c.mb,1.38.mb,1.2c.mp,1.38.mp,1.2c.ml,1.38.ml,1.2d.mc,1.39.mc,1.2d.mo,1.39.mo,1.2d.ml,1.39.ml,1.a0.ld,1.a1.ld,1.a2.lk,1.a3.lk,1.2e.lf,1.3a.lf,1.2e.mb,1.3a.mb,1.2f.lc,1.3b.lc,1.2f.ld,1.3b.ld,1.2f.lk,1.3b.lk,1.2f.lj,1.3b.lj,1.2f.mb,1.3b.mb,1.2g.lj,1.3c.lj,1.2g.lk,1.3c.lk,1.2h.lj,1.3d.lj,1.2i.le,1.3e.le,1.2i.mb,1.3e.mb,1.2i.mp,1.3e.mp,1.2w.mp,1.38.lk,1.3b.lm,1.3d.lm,2.an.lj,5.1t.mb,1.2p.mb,1.1t.ll,1.2p.ll,1.5e.ld,1.6a.ld,1.5e.lc,1.6a.lc,1.5e.ll,1.6a.ll,1.5e.lf,1.6a.lf,1.61s.le,1.61t.le,1.76.ld,1.77.ld,1.76.lc,1.77.lc,1.76.ll,1.77.ll,1.76.lf,1.77.lf,1.61s.li,1.61t.li,1.1x.mb,1.2t.mb,1.1x.ll,1.2t.ll,1.1x.lf,1.2t.lf,1.5m.ld,1.6i.ld,1.5m.lc,1.6i.lc,1.5m.ll,1.6i.ll,1.5m.lf,1.6i.lf,1.62g.le,1.62h.le,1.21.ll,1.2x.ll,1.21.mb,1.2x.mb,1.27.mb,1.33.mb,1.27.ll,1.33.ll,1.5w.ld,1.6s.ld,1.5w.lc,1.6s.lc,1.5w.ll,1.6s.ll,1.5w.lf,1.6s.lf,1.630.le,1.631.le,1.bk.ld,1.bl.ld,1.bk.lc,1.bl.lc,1.bk.ll,1.bl.ll,1.bk.lf,1.bl.lf,1.bk.mb,1.bl.mb,1.2d.mb,1.39.mb,1.2d.ll,1.39.ll,1.bz.ld,1.c0.ld,1.bz.lc,1.c0.lc,1.bz.ll,1.c0.ll,1.bz.lf,1.c0.lf,1.bz.mb,1.c0.mb,1.2h.lc,1.3d.lc,1.2h.mb,1.3d.mb,1.2h.ll,1.3d.ll,1.2h.lf,1.3d.lf,7.q9.lv,1.q9.lw,1.64g.lc,1.64h.lc,1.64g.ld,1.64h.ld,1.64g.n6,1.64h.n6,1.pd.lv,1.pd.lw,1.64o.lc,1.64p.lc,1.64o.ld,1.64p.ld,1.64o.n6,1.64p.n6,1.qd.lv,1.qd.lw,1.64w.lc,1.64x.lc,1.64w.ld,1.64x.ld,3.ph.lv,1.ph.lw,1.654.lc,1.655.lc,1.654.ld,1.655.ld,3.qf.lv,1.qf.lw,1.65c.lc,1.65d.lc,1.65c.ld,1.65d.ld,1.65c.n6,1.65d.n6,1.pj.lv,1.pj.lw,1.65k.lc,1.65l.lc,1.65k.ld,1.65l.ld,1.65k.n6,1.65l.n6,1.qh.lv,1.qh.lw,1.65s.lc,1.65t.lc,1.65s.ld,1.65t.ld,1.65s.n6,1.65t.n6,1.pl.lv,1.pl.lw,1.660.lc,1.661.lc,1.660.ld,1.661.ld,1.660.n6,1.661.n6,1.qn.lv,1.qn.lw,1.668.lc,1.669.lc,1.668.ld,1.669.ld,3.pr.lv,1.pr.lw,1.66g.lc,1.66h.lc,1.66g.ld,1.66h.ld,3.qt.lv,1.qt.lw,1.66o.lc,1.66p.lc,1.66o.ld,1.66p.ld,1.66o.n6,1.66p.n6,2.px.lw,2.66x.lc,2.66x.ld,2.66x.n6,1.qx.lv,1.qx.lw,1.674.lc,1.675.lc,1.674.ld,1.675.ld,1.674.n6,1.675.n6,1.q1.lv,1.q1.lw,1.67c.lc,1.67d.lc,1.67c.ld,1.67d.ld,1.67c.n6,1.67d.n6,1.q9.lc,1.q4,1.qd.lc,1.q5,1.qf.lc,1.q6,1.qh.lc,1.q7,1.qn.lc,1.r0,1.qt.lc,1.r1,1.qx.lc,1.r2,3.64g.n9,1.64h.n9,1.64i.n9,1.64j.n9,1.64k.n9,1.64l.n9,1.64m.n9,1.64n.n9,1.64o.n9,1.64p.n9,1.64q.n9,1.64r.n9,1.64s.n9,1.64t.n9,1.64u.n9,1.64v.n9,1.65c.n9,1.65d.n9,1.65e.n9,1.65f.n9,1.65g.n9,1.65h.n9,1.65i.n9,1.65j.n9,1.65k.n9,1.65l.n9,1.65m.n9,1.65n.n9,1.65o.n9,1.65p.n9,1.65q.n9,1.65r.n9,1.674.n9,1.675.n9,1.676.n9,1.677.n9,1.678.n9,1.679.n9,1.67a.n9,1.67b.n9,1.67c.n9,1.67d.n9,1.67e.n9,1.67f.n9,1.67g.n9,1.67h.n9,1.67i.n9,1.67j.n9,1.q9.li,1.q9.lg,1.67k.n9,1.q9.n9,1.q4.n9,2.q9.n6,1.69i.n9,1.pd.li,1.pd.lg,1.pd.lc,1.p2,1.pd.n9,2.qh,3.4o.n6,1.67o.n9,1.qf.n9,1.q6.n9,2.qf.n6,1.69y.n9,1.ph.lc,1.p4,1.pj.lc,1.p5,1.pj.n9,1.69r.lc,1.69r.ld,1.69r.n6,1.qh.li,1.qh.lg,1.qy.lc,1.pc,3.qh.n6,1.qy.n6,1.pl.li,1.pl.lg,1.pl.lc,1.p6,2.6bi.lc,1.6bi.ld,1.6bi.n6,1.qt.li,1.qt.lg,1.qz.lc,1.q8,1.qp.lv,1.qp.lw,1.qt.n6,1.qz.n6,1.px.li,1.px.lg,1.px.lc,1.pa,1.pt.lw,1.4o.lc,1.p1,1.2o,3.67w.n9,1.qx.n9,1.r2.n9,2.qx.n6,1.6ba.n9,1.pr.lc,1.p8,1.q1.lc,1.pb,1.q1.n9,1.50,3.6bm,1.6bn,85.q1,4.23,1.5h,33.6mo.mw,1.6mq.mw,j.6ms.mw,v.6og.mw,1.6ok.mw,1.6oi.mw,1h.6pv.mw,5.6q0.mw,3.6q3.mw,o.6qr.mw,2.6qt.mw,r.6rg.mw,3.6rn.mw,3.6rp.mw,2.6rs.mw,n.1p.mw,2.6sh.mw,b.6rx.mw,1.1o.mw,1.1q.mw,1.6sk.mw,1.6sl.mw,3.6sy.mw,1.6sz.mw,3.6t2.mw,1.6t3.mw,7.6t6.mw,1.6t7.mw,3.6te.mw,1.6tf.mw,3.6ti.mw,1.6tj.mw,z.6ua.mw,1.6ug.mw,1.6uh.mw,1.6uj.mw,1d.6t8.mw,1.6t9.mw,1.6tt.mw,1.6tu.mw,7.6uq.mw,1.6ur.mw,1.6us.mw,1.6ut.mw,1o.9hk,1.9hl,1iq.8gt.mw,12o.9jf.9ll,2.9jh.9ll,2.9jj.9ll,2.9jl.9ll,2.9jn.9ll,2.9jp.9ll,2.9jr.9ll,2.9jt.9ll,2.9jv.9ll,2.9jx.9ll,2.9jz.9ll,2.9k1.9ll,3.9k4.9ll,2.9k6.9ll,2.9k8.9ll,7.9kf.9ll,1.9kf.9lm,2.9ki.9ll,1.9ki.9lm,2.9kl.9ll,1.9kl.9lm,2.9ko.9ll,1.9ko.9lm,2.9kr.9ll,1.9kr.9lm,n.9ja.9ll,a.9lp.9ll,e.9m3.9ll,2.9m5.9ll,2.9m7.9ll,2.9m9.9ll,2.9mb.9ll,2.9md.9ll,2.9mf.9ll,2.9mh.9ll,2.9mj.9ll,2.9ml.9ll,2.9mn.9ll,2.9mp.9ll,3.9ms.9ll,2.9mu.9ll,2.9mw.9ll,7.9n3.9ll,1.9n3.9lm,2.9n6.9ll,1.9n6.9lm,2.9n9.9ll,1.9n9.9lm,2.9nc.9ll,1.9nc.9lm,2.9nf.9ll,1.9nf.9lm,n.9ly.9ll,3.9nz.9ll,1.9o0.9ll,1.9o1.9ll,1.9o2.9ll,4.9od.9ll,13ia.rpk,1.kc4,1.s7e,1.rt4,1.lw1,1.fg2,1.gkl,1.vj0,1.vj0,1.hn5,1.ssx,1.gw7,1.hmw,1.jcm,1.ne1,1.p6t,1.qin,1.qt6,1.r20,1.sjz,1.kxu,1.ljv,1.mah,1.mvy,1.q4d,1.sq2,1.uep,1.fia,1.ghh,1.l50,1.mjf,1.qi5,1.v8e,1.ifk,1.m3v,1.qfh,1.r50,1.jih,1.pnc,1.qvz,1.iq2,1.kd3,1.lm2,1.mpo,1.slq,1.fpi,1.g53,1.gda,1.jwk,1.l3n,1.mj4,1.nhj,1.pa9,1.qh2,1.qjg,1.s1b,1.tv6,1.upb,1.v7e,1.nt8,1.nzz,1.otc,1.q15,1.t1g,1.vb3,1.rfa,1.hjz,1.iro,1.okg,1.pdq,1.mle,1.nuy,1.rsy,1.ttj,1.hjs,1.i8y,1.kyb,1.lp6,1.lxr,1.oq7,1.oxj,1.tor,1.gcy,1.pe3,1.g64,1.g5o,1.o4c,1.ou6,1.q29,1.tpx,1.rk0,1.jin,1.kxu,1.rge,1.fg9,1.i5j,1.iz6,1.mtj,1.n74,1.gev,1.nwb,1.fr3,1.iw9,1.ff1,1.lho,1.k1k,1.opu,1.gjn,1.hge,1.ni9,1.q4p,1.re2,1.la2,1.sds,1.lfs,1.jjy,1.put,1.jog,1.n6t,1.fji,1.g2x,1.g5l,1.kn5,1.oo7,1.prj,1.rf6,1.ssv,1.gdx,1.gn6,1.ho3,1.ir0,1.k3p,1.m4e,1.nxm,1.tkd,1.ui2,1.vbr,1.vda,1.gbf,1.kau,1.l87,1.sbm,1.ino,1.j9s,1.jcw,1.jve,1.lyb,1.mdl,1.n0p,1.o22,1.ovo,1.pdb,1.s9y,1.q9a,1.sgz,1.t3e,1.g7r,1.gbn,1.gql,1.ma0,1.r0i,1.re2,1.iq1,1.iyd,1.jnf,1.l9q,1.oji,1.mt1,1.fl0,1.h6h,1.i5j,1.iii,1.izg,1.muq,1.mzt,1.p7e,1.pc6,1.svo,1.tti,1.tvs,1.u1k,1.fpn,1.o1a,1.ss4,1.trs,1.j4x,1.fie,1.fyy,1.i5q,1.i7z,1.k2h,1.kxu,1.mha,1.ncy,1.q9o,1.sjg,1.vil,1.k94,1.tny,1.gax,1.kfv,1.kj7,1.lkx,1.luk,1.mx5,1.n6h,1.nsb,1.opc,1.u3i,1.g31,1.je6,1.tq0,1.fu3,1.ie1,1.lpm,1.sa2,1.ivf,1.j7o,1.kk7,1.mtj,1.tqe,1.g89,1.glr,1.i91,1.k5v,1.kem,1.ko8,1.lid,1.mx2,1.naa,1.p6h,1.r0v,1.r1d,1.sss,1.tsy,1.gfz,1.lve,1.gm5,1.mhc,1.n14,1.qgq,1.tr7,1.uvr,1.vbz,1.kgn,1.lor,1.pns,1.o97,1.obk,1.olu,1.mo0,1.m8p,1.riw,1.fk0,1.px2,1.g8q,1.g7b,1.ip2,1.jir,1.onq,1.i2t,1.ljy,1.kac,1.saj,1.qx8,1.tot,1.r63,1.iqb,1.g1s,1.gxs,3.hga,2.k8k,3.g66,1.mqy,1.ngq,1.ny4,1.nz2,1.nz9,1.o0f,1.tw6,1.on2,1.p8d,2.qhe,2.rg8,3.shk,1.sn1,4.u7j,1.u7w,1.u94,1.v5g,1.sm6,1.trr,1.fqm,1.fzb,1.g25,1.gcp,1.gdg,1.ggh,1.gwt,1.gzq,1.h2g,1.hfk,1.hig,1.i90,1.i9a,1.j2s,1.j8o,1.j9q,1.jci,1.k0f,1.k4i,1.k9d,1.kn9,1.lmf,1.lqy,1.lya,1.mem,1.mjv,1.mxu,1.ntd,1.ny6,1.nyh,1.nyg,1.nyo,1.nyu,1.nz1,1.o0d,1.o0e,1.o5c,1.o75,1.og0,1.ovo,1.ow9,1.oxt,1.p6a,1.pad,1.pnx,1.prt,1.prt,1.q53,1.r2o,1.r6e,1.rgh,1.ri1,1.rtf,1.ruw,1.sdy,1.shk,1.tsz,1.u0v,1.u2j,1.j1x,1.36cu,1.pp4,3.ffq,1.g51,1.g2w,1.fpc,1.g1x,1.g3k,1.gcn,1.ge2,1.gwt,1.gut,1.gwp,1.gyq,1.hga,1.hir,1.hms,1.hn8,1.huq,1.i08,1.iqa,1.iqh,1.iuh,1.iwd,1.j4o,1.j7y,1.j60,1.j9q,1.j8g,1.jci,1.jec,1.jpg,1.jrw,1.jte,1.k0m,1.k8k,1.kd3,1.kd7,1.keu,1.l89,1.la2,1.lkx,1.lwb,1.lvv,1.lya,1.m5a,1.mem,1.nmv,1.mk5,1.mnj,1.mqy,1.n01,1.n46,1.n5n,1.nbx,1.nbz,1.ngq,1.nh7,1.nhw,1.nka,1.nk0,1.nv0,1.o8h,1.og0,1.ol7,1.orf,1.ovo,1.p4u,1.pad,1.pxu,1.q27,1.qrd,1.r41,1.r5y,1.r6e,1.ren,1.rg8,1.rez,1.rgh,1.rge,1.rfx,1.ri1,1.rka,1.ruw,1.sag,1.sj6,1.srd,1.sxi,1.tq4,1.tsz,1.tw6,1.tzv,1.u0v,1.u17,1.u2j,1.umq,1.vj0,1.313e,1.3138,1.33dh,1.brx,1.cns,1.cop,1.39e1,1.3bgw,1.3i6r,1.vgj,1.vim,1w.15l.14k,2.16a.14n,b.161.14x,1.161.14y,1.1dmx.14x,1.1dmx.14y,1.15c.14n,1.15c.14o,1.15c.14s,1.15d.14s,1.15e.14s,1.15f.14s,1.15g.14s,1.15h.14s,1.15i.14s,2.15k.14s,1.15l.14s,1.15m.14s,1.15n.14s,1.15o.14s,2.15q.14s,2.15s.14s,1.15t.14s,2.15v.14s,1.15w.14s,2.15y.14s,1.15z.14s,1.160.14s,1.161.14s,1.162.14s,1.15h.14p,1.15d.14v,1.15n.14v,1.15w.14v,47g.1huh.1hve,2.1huj.1hve,f.1hut.1hve,3n.1hyp.1hyf,1.1hyq.1hyf,f0.1idj.1ida,1.1idj.1idz,a7.1int.1inu,1.1int.1ink,2.1int.1inx,70.1iuw.1iun,1.1iux.1iun,ot.1jjp.1jjk,10di.2jx3.2jxh,1.2jx4.2jxh,1.2jxb.2jxq,1.2jxb.2jxr,1.2jxb.2jxs,1.2jxb.2jxt,1.2jxb.2jxu,2f.2jzt.2jxh,1.2jzu.2jxh,1.2jzv.2jxq,1.2jzw.2jxq,1.2jzv.2jxr,1.2jzw.2jxr,1m4g.fgd,1.fg8,1.fgh,1.2tcy,1.fog,1.fqm,1.fqz,1.fsy,1.fwa,1.fx5,1.fzb,1.fyn,1.ae6,1.2ud6,1.g25,1.g2c,1.g2s,1.g3b,1.2u58,1.aex,1.g2v,1.g3x,1.2u6j,1.g47,1.g4k,1.fkc,1.g4s,1.g51,1.3ly7,1.g6t,1.g77,1.afz,1.g8r,1.g92,1.gaa,1.gaf,1.ahh,1.gcn,1.gcp,1.gdg,1.ge2,1.ged,1.gee,1.gev,1.gg9,1.ggh,1.ggq,1.ghf,1.ghp,1.ghr,1.ghr,1.ghr,1.2v58,1.m7k,1.gju,1.gkf,1.2vdv,1.gkr,1.gkx,1.gli,1.gpq,1.gmw,1.gnc,1.go8,1.gpu,1.gs6,1.gsw,1.gur,1.gv7,1.gw4,1.gw4,1.gwp,1.gx7,1.gxf,1.gxu,1.h7a,1.gzq,1.h7b,1.h1t,1.h2s,1.g7b,1.hke,1.hce,1.hdg,1.he5,1.haj,1.hf6,1.hf5,1.hik,1.2x9g,1.hki,1.hkn,1.hl2,1.hlm,1.hlu,1.hnm,1.2xm0,1.2xnu,1.hrg,1.hsr,1.ht3,1.hqw,1.huu,1.aum,1.av0,1.hzc,1.i0u,1.i0u,1.2y88,1.i4j,1.i54,1.i5j,1.i5v,1.2yhk,1.i67,1.i6e,1.itv,1.i76,1.ayp,1.i8w,1.i9a,1.ibk,1.ia5,1.2z1g,1.if7,1.2z1i,1.ige,1.igb,1.igs,1.ijl,1.ijm,1.b3j,1.ikd,1.ilk,1.im5,1.ind,1.b4y,1.2zr7,1.b5o,1.ipc,1.ipf,1.ipi,1.iq2,1.3pg2,1.iri,1.3035,1.3035,1.poh,1.isi,1.isi,1.b7r,1.335k,1.3cgq,1.iua,1.iuj,1.b8j,1.ivu,1.ix9,1.ixj,1.iyh,1.j29,1.bay,1.ba4,1.j2s,1.30t0,1.j47,1.j7s,1.j7w,1.j7y,1.j7w,1.j96,1.j9q,1.jaq,1.jac,1.jan,1.jby,1.jci,1.jcm,1.jdc,1.jdn,1.jfh,1.jht,1.jis,1.jm8,1.31n0,1.jlp,1.jjw,1.jmw,1.jnn,1.jqc,1.31td,1.js2,1.jph,1.jop,1.bhq,1.ju1,1.jum,1.jvh,1.juf,1.bjg,1.k0f,1.k18,1.32mi,1.k4j,1.kc8,1.k7d,1.bo9,1.k9d,1.bns,1.bms,1.g42,1.g45,1.kcg,1.k9o,1.pf1,1.deh,1.kd3,1.kd7,1.kdd,1.kf2,1.ker,1.33cz,1.bpl,1.kje,1.kg5,1.klu,1.kn9,1.33hp,1.kni,1.kkf,1.kr8,1.brx,1.ksi,1.kv7,1.kx6,1.l2g,1.33xf,1.l3v,1.bvc,1.l5t,1.34br,1.l78,1.bwu,1.l82,1.l9b,1.la2,1.la3,1.34p9,1.2yvf,1.34sa,1.le6,1.354s,1.lhb,1.lhp,1.lev,1.ljq,1.lku,1.lmf,1.lkx,1.lm1,1.lmg,1.lmt,1.357i,1.lkk,1.lrj,1.lta,1.c37,1.lvv,1.lvr,1.35jl,1.lq1,1.m0e,1.35ni,1.35ou,1.m2u,1.m61,1.m5a,1.m57,1.c5y,1.m6i,1.m7x,1.m7r,1.m99,1.2u5h,1.mdh,1.368z,1.mfw,1.36i3,1.mjs,1.mk5,1.mkw,1.36yw,1.mm8,1.mmt,1.3779,1.37dg,1.mt6,1.mtn,1.cdo,1.mud,1.ce0,1.ce0,1.myv,1.mzg,1.n01,1.n0l,1.n2i,1.cgr,1.n50,1.386u,1.n5q,1.389e,1.n74,1.2zrz,1.nbk,1.38v5,1.38vs,1.38zo,1.cn0,1.cnc,1.nhw,1.394j,1.394i,1.395l,1.396b,1.nj2,1.nj3,1.nj3,1.nka,1.cop,1.nm3,1.cp2,1.cra,1.39r1,1.nri,1.nt8,1.nv0,1.ctf,1.3a5i,1.nyu,1.3a8q,1.3a9x,1.o0f,1.o2z,1.cvj,1.o5c,1.o5m,1.o5r,1.3at8,1.3b1j,1.3b1j,1.oa6,1.d1e,1.3b8r,1.og6,1.og9,1.d2f,1.3beo,1.onm,1.d5s,1.oo8,1.oo3,1.oow,1.3c06,1.orn,1.d8h,1.ouf,1.ow2,1.oxx,1.d9w,1.3ciw,1.3cjr,1.dax,1.3cnt,1.p6i,1.3cqm,1.p79,1.pa2,1.pad,1.3d22,1.3d43,1.pcw,1.3d7s,1.pdc,1.33a7,1.ded,1.pf6,1.phf,1.dfv,1.pj2,1.hx1,1.3dlz,1.3dmd,1.33bn,1.33bw,1.poh,1.pok,1.sda,1.dij,1.psh,1.psb,1.pst,1.gc3,1.ptd,1.ptf,1.ptp,1.puu,1.3ebg,1.put,1.pwd,1.pyb,1.q0d,1.pwj,1.q0t,1.q1z,1.q53,1.pxv,1.q16,1.q18,1.q1o,1.3eie,1.3eqz,1.3emt,1.dnv,1.q9d,1.q9f,1.qae,1.3g0a,1.qck,1.3f3g,1.dp9,1.dpd,1.3f75,1.3ff6,1.dpn,1.qj4,1.qjg,1.qjr,1.qjt,1.qll,1.qko,1.qoe,1.qn6,1.qrd,1.qp4,1.qqz,1.qrq,1.dsn,1.qu9,1.qv5,1.dtl,1.qxs,1.qxv,1.3giv,1.r13,1.r1a,1.dv9,1.r22,1.aez,1.3gz2,1.3h46,1.dz2,1.dzb,1.rds,1.rfx,1.rka,1.rpx,1.3hrc,1.rsb,1.rsx,1.rvf,1.rxz,1.3i9b,1.2upw,1.s0b,1.rzw,1.s1c,1.2uvy,1.s7o,1.sag,1.3jki,1.3jl9,1.sk4,1.smp,1.snl,1.3ju6,1.snv,1.svs,1.t07,1.t08,1.sxo,1.t89,1.t91,1.3ksa,1.tjf,1.ej9,1.tkn,1.3l2v,1.eli,1.ts3,1.iia,1.tur,1.3ltx,1.3lzu,1.epa,1.epi,1.u00,1.3mdm,1.er6,1.3mhi,1.u17,1.u17,1.u21,1.3mpi,1.u76,1.eur,1.u95,1.ucn,1.ude,1.uf2,1.ez2,1.3nsg,1.umq,1.uv4,1.v0d,1.f66,1.f71,1.v3b,1.3owe,1.f7c,1.3oxx,1.3p5a,1.3p8x,1.vcr,1.f9y,1.veh,1.vem,1.vet,1.vf3,1.vfa,1.vgb,1.3pxc";
2965
+ var NFC_EXCLUDED = "1ug,1uh,1ui,1uj,1uk,1ul,1um,1un,1y4,1y5,1y7,20j,20m,21l,21m,21n,21q,28s,28t,30j,30t,30y,313,318,31l,31y,320,32r,331,336,33b,33g,33t,1dlp,1dlr,1dm2,1dm3,1dm4,1dm5,1dm6,1dm7,1dm8,1dm9,1dma,1dmb,1dmc,1dmd,1dme,1dmg,1dmh,1dmi,1dmj,1dmk,1dmm,1dmo,1dmp,1dmr,1dms,1dmu,1dmv,1dmw,1dmx,1dmy,1dmz,1dn0,1dn1,1dn2,8gs,2jxa,2jxb,2jxc,2jxd,2jxe,2jxf,2jxg,2jzv,2jzw,2jzx,2jzy,2jzz,2k00";
2966
+
2967
+ // src/nfc.ts
2968
+ var S_BASE = 44032;
2969
+ var L_BASE = 4352;
2970
+ var V_BASE = 4449;
2971
+ var T_BASE = 4519;
2972
+ var L_COUNT = 19;
2973
+ var V_COUNT = 21;
2974
+ var T_COUNT = 28;
2975
+ var N_COUNT = V_COUNT * T_COUNT;
2976
+ var S_COUNT = L_COUNT * N_COUNT;
2977
+ var tables = null;
2978
+ function load() {
2979
+ const ccc = /* @__PURE__ */ new Map();
2980
+ for (const run of NFC_CLASS_RUNS.split(",")) {
2981
+ const [start, count, cls] = run.split(".");
2982
+ const s = parseInt(start, 36);
2983
+ const n = count ? parseInt(count, 36) : 1;
2984
+ const c = parseInt(cls, 36);
2985
+ for (let k = 0; k < n; k++) ccc.set(s + k, c);
2986
+ }
2987
+ const raw = /* @__PURE__ */ new Map();
2988
+ let cp = 0;
2989
+ for (const entry of NFC_DECOMP.split(",")) {
2990
+ const [gap, ...to] = entry.split(".");
2991
+ cp += parseInt(gap, 36);
2992
+ raw.set(cp, to.map((t) => parseInt(t, 36)));
2993
+ }
2994
+ const excluded = new Set(NFC_EXCLUDED.split(",").map((t) => parseInt(t, 36)));
2995
+ const compose = /* @__PURE__ */ new Map();
2996
+ for (const [c, to] of raw) {
2997
+ if (to.length !== 2 || excluded.has(c) || ccc.has(c) || ccc.has(to[0])) continue;
2998
+ compose.set(to[0] * 1114112 + to[1], c);
2999
+ }
3000
+ const decomp = /* @__PURE__ */ new Map();
3001
+ const full = (c) => {
3002
+ const done = decomp.get(c);
3003
+ if (done) return done;
3004
+ const to = raw.get(c);
3005
+ if (!to) return [c];
3006
+ const out = to.flatMap(full);
3007
+ decomp.set(c, out);
3008
+ return out;
3009
+ };
3010
+ for (const c of raw.keys()) full(c);
3011
+ return { ccc, decomp, compose };
3012
+ }
3013
+ function nfc(text) {
3014
+ let plain = true;
3015
+ for (let i = 0; i < text.length; i++) if (text.charCodeAt(i) >= 192) {
3016
+ plain = false;
3017
+ break;
3018
+ }
3019
+ if (plain) return text;
3020
+ const t = tables ?? (tables = load());
3021
+ const cls = (c) => t.ccc.get(c) ?? 0;
3022
+ const cps = [];
3023
+ for (const ch of text) {
3024
+ const c = ch.codePointAt(0);
3025
+ const s = c - S_BASE;
3026
+ if (s >= 0 && s < S_COUNT) {
3027
+ cps.push(L_BASE + Math.floor(s / N_COUNT), V_BASE + Math.floor(s % N_COUNT / T_COUNT));
3028
+ if (s % T_COUNT) cps.push(T_BASE + s % T_COUNT);
3029
+ } else {
3030
+ const d = t.decomp.get(c);
3031
+ if (d) cps.push(...d);
3032
+ else cps.push(c);
3033
+ }
3034
+ }
3035
+ for (let i = 1; i < cps.length; i++) {
3036
+ const c = cps[i];
3037
+ const k = cls(c);
3038
+ if (!k) continue;
3039
+ let j = i;
3040
+ while (j > 0 && cls(cps[j - 1]) > k) {
3041
+ cps[j] = cps[j - 1];
3042
+ j--;
3043
+ }
3044
+ cps[j] = c;
3045
+ }
3046
+ const out = [];
3047
+ let starter = -1;
3048
+ let last = 0;
3049
+ for (const c of cps) {
3050
+ const k = cls(c);
3051
+ if (starter >= 0 && (out.length - 1 === starter || last !== 0 && last < k)) {
3052
+ const a = out[starter];
3053
+ let composed;
3054
+ const l = a - L_BASE, v = c - V_BASE, s = a - S_BASE, tt = c - T_BASE;
3055
+ if (l >= 0 && l < L_COUNT && v >= 0 && v < V_COUNT) composed = S_BASE + (l * V_COUNT + v) * T_COUNT;
3056
+ else if (s >= 0 && s < S_COUNT && s % T_COUNT === 0 && tt > 0 && tt < T_COUNT) composed = a + tt;
3057
+ else composed = t.compose.get(a * 1114112 + c);
3058
+ if (composed !== void 0) {
3059
+ out[starter] = composed;
3060
+ continue;
3061
+ }
3062
+ }
3063
+ if (k === 0) starter = out.length;
3064
+ last = k;
3065
+ out.push(c);
3066
+ }
3067
+ let r = "";
3068
+ for (const c of out) r += String.fromCodePoint(c);
3069
+ return r;
3070
+ }
3071
+
3072
+ // src/world-file.ts
2960
3073
  var WORLD_FILE = "world.json";
2961
3074
  var MARKER_NAME = "mimetype";
2962
3075
  var WORLD_FILE_MEDIA_TYPE = "application/vnd.onlyworlds.world+zip";
@@ -3035,7 +3148,7 @@ function simpleCaseFold(text) {
3035
3148
  return out;
3036
3149
  }
3037
3150
  function foldName(name) {
3038
- return simpleCaseFold(name.normalize("NFC"));
3151
+ return simpleCaseFold(nfc(name));
3039
3152
  }
3040
3153
  function byCodePoint(a, b) {
3041
3154
  const n = Math.min(a.length, b.length);
@@ -4006,19 +4119,60 @@ function renderElement(element, index, opts = {}) {
4006
4119
 
4007
4120
  // src/ask.ts
4008
4121
  var ASK_LIMITS = { questionMax: 500, itemsMax: 8, itemMax: 2e3, totalMax: 12e3 };
4122
+ var ASK_OPTION_KEYS = ["includeProposed", "includeHidden", "includeRoom"];
4009
4123
  var chars = (s) => [...s].length;
4010
4124
  var cut = (s, n) => [...s].slice(0, n).join("");
4011
- function buildAskContext(items, index) {
4012
- const out = { context: [], kept: [], dropped: [], truncated: [] };
4125
+ var isHidden = (el) => el.hidden !== void 0 && el.hidden !== null && el.hidden !== false;
4126
+ var isProposed = (el) => el.x_review_proposed !== void 0 && el.x_review_proposed !== null;
4127
+ function readOptions(opts) {
4128
+ refuseUnknownOptions("buildAskContext", opts, ASK_OPTION_KEYS);
4129
+ const o = opts ?? {};
4130
+ for (const k of ASK_OPTION_KEYS) {
4131
+ if (o[k] !== void 0 && typeof o[k] !== "boolean") {
4132
+ throw new TypeError(`buildAskContext: ${k} must be a boolean; got ${JSON.stringify(o[k]) ?? String(o[k])}.`);
4133
+ }
4134
+ }
4135
+ return { includeProposed: o.includeProposed === true, includeHidden: o.includeHidden === true, includeRoom: o.includeRoom === true };
4136
+ }
4137
+ function buildAskContext(items, index, opts = {}) {
4138
+ const o = readOptions(opts);
4139
+ const markOf = (el) => {
4140
+ if (!o.includeHidden && isHidden(el)) return "hidden";
4141
+ if (!o.includeProposed && isProposed(el)) return "proposed";
4142
+ if (!o.includeRoom && isRoomElement(el)) return "room";
4143
+ return null;
4144
+ };
4145
+ const withheld = (id) => {
4146
+ const el = index.byId.get(id);
4147
+ return el !== void 0 && markOf(el) !== null;
4148
+ };
4149
+ const viewFor = (el) => {
4150
+ const out2 = index.out.get(el.id) ?? [];
4151
+ const gone = out2.filter((l) => withheld(l.id));
4152
+ if (!gone.length && !(index.inn.get(el.id) ?? []).some((l) => withheld(l.id))) return index;
4153
+ return {
4154
+ ...index,
4155
+ out: /* @__PURE__ */ new Map([[el.id, out2.filter((l) => !withheld(l.id))]]),
4156
+ inn: /* @__PURE__ */ new Map([[el.id, (index.inn.get(el.id) ?? []).filter((l) => !withheld(l.id))]]),
4157
+ unresolved: /* @__PURE__ */ new Map([[el.id, [...index.unresolved.get(el.id) ?? [], ...gone]]])
4158
+ };
4159
+ };
4160
+ const out = { context: [], kept: [], dropped: [], truncated: [], leftOut: { proposed: [], hidden: [], room: [] } };
4013
4161
  let total = 0;
4014
4162
  let full = false;
4015
4163
  for (const item of items) {
4016
4164
  const el = item && typeof item === "object" && "element" in item ? item.element : item;
4165
+ const mark = markOf(el);
4166
+ if (mark) {
4167
+ out.leftOut[mark].push(el.id);
4168
+ continue;
4169
+ }
4017
4170
  if (full || out.context.length >= ASK_LIMITS.itemsMax) {
4018
4171
  out.dropped.push(el.id);
4019
4172
  continue;
4020
4173
  }
4021
- let text = renderElement(el, index);
4174
+ let text = renderElement(el, viewFor(el));
4175
+ if (isProposed(el)) text = `[${REVIEW_PROPOSED_LABEL}] ${text}`;
4022
4176
  if (chars(text) > ASK_LIMITS.itemMax) {
4023
4177
  text = cut(text, ASK_LIMITS.itemMax);
4024
4178
  out.truncated.push(el.id);
@@ -4777,6 +4931,7 @@ export {
4777
4931
  PHOTO_MAX_BYTES,
4778
4932
  PHOTO_TYPES,
4779
4933
  PUBLIC_FIELDS,
4934
+ REVIEW_PROPOSED_LABEL,
4780
4935
  ROOM_PAIRS,
4781
4936
  SPATIAL_TYPES,
4782
4937
  TokenResource,
@@ -4815,6 +4970,7 @@ export {
4815
4970
  kindCanWrite,
4816
4971
  lookupWorld,
4817
4972
  monthStartSteps,
4973
+ nfc,
4818
4974
  parseDate,
4819
4975
  parseErrorEnvelope,
4820
4976
  pinExpectation,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@onlyworlds/sdk",
3
- "version": "4.70.0",
3
+ "version": "4.72.0",
4
4
  "description": "TypeScript SDK for the OnlyWorlds API - build world-building applications with type safety",
5
5
  "type": "module",
6
6
  "exports": {