coh-content-db 2.0.0-rc.20 → 2.0.0-rc.21
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/CHANGELOG.md +1 -1
- package/README.md +16 -7
- package/dist/coh-content-db.d.ts +5 -3
- package/dist/coh-content-db.js +11 -9
- package/dist/coh-content-db.js.map +1 -1
- package/dist/coh-content-db.mjs +11 -9
- package/dist/coh-content-db.mjs.map +1 -1
- package/package.json +1 -1
- package/src/main/db/badge-index.ts +11 -9
- package/src/main/db/paged.ts +7 -3
- package/src/test/db/badge-index.test.ts +40 -6
- package/src/test/db/coh-content-database.test.ts +2 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
-
## [2.0.0-rc.
|
|
8
|
+
## [2.0.0-rc.21] - 2026-01-04
|
|
9
9
|
|
|
10
10
|
### Added
|
|
11
11
|
|
package/README.md
CHANGED
|
@@ -8,7 +8,9 @@
|
|
|
8
8
|
|
|
9
9
|
City of Heroes Content Database
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
----
|
|
12
|
+
|
|
13
|
+
# Changelog
|
|
12
14
|
|
|
13
15
|
[CHANGELOG.md](CHANGELOG.md)
|
|
14
16
|
|
|
@@ -18,6 +20,8 @@ City of Heroes Content Database
|
|
|
18
20
|
npm install coh-content-db
|
|
19
21
|
```
|
|
20
22
|
|
|
23
|
+
----
|
|
24
|
+
|
|
21
25
|
# Usage
|
|
22
26
|
|
|
23
27
|
There are two ways to use this package; As a data provider, or a db consumer.
|
|
@@ -111,7 +115,17 @@ for (const badge of db.badges) {
|
|
|
111
115
|
}
|
|
112
116
|
```
|
|
113
117
|
|
|
114
|
-
|
|
118
|
+
----
|
|
119
|
+
|
|
120
|
+
# Development
|
|
121
|
+
|
|
122
|
+
* `npm run lint`
|
|
123
|
+
* `npm run test`
|
|
124
|
+
* `npm run build`
|
|
125
|
+
|
|
126
|
+
----
|
|
127
|
+
|
|
128
|
+
# Release
|
|
115
129
|
|
|
116
130
|
1. Determine the next [Semantic Release](https://semver.org) version, i.e. `2.0.0-rc.16`
|
|
117
131
|
2. Update the version and release notes in the [CHANGELOG.md](CHANGELOG.md).
|
|
@@ -122,8 +136,3 @@ for (const badge of db.badges) {
|
|
|
122
136
|
|
|
123
137
|
Tags matching the pattern `v<X>.<Y>.<Z>` will attempt to publish to npm (this can only be achieved by the package manager (n15g).
|
|
124
138
|
The `npm version` command automatically prepends the `v` prefix to the version number.
|
|
125
|
-
|
|
126
|
-
```shell
|
|
127
|
-
npm version 1.4.x
|
|
128
|
-
npm run push
|
|
129
|
-
```
|
package/dist/coh-content-db.d.ts
CHANGED
|
@@ -705,10 +705,12 @@ interface BadgeSearchOptions {
|
|
|
705
705
|
|
|
706
706
|
interface Paged<T> {
|
|
707
707
|
items: T[];
|
|
708
|
-
|
|
708
|
+
matchedItemCount: number;
|
|
709
|
+
totalItemCount: number;
|
|
709
710
|
pageSize?: number;
|
|
710
|
-
|
|
711
|
-
|
|
711
|
+
pageIndex: number;
|
|
712
|
+
pageNumber: number;
|
|
713
|
+
totalPageCount: number;
|
|
712
714
|
}
|
|
713
715
|
|
|
714
716
|
type KeysOfType<T, V> = {
|
package/dist/coh-content-db.js
CHANGED
|
@@ -751,17 +751,19 @@ class BadgeIndex extends AbstractIndex {
|
|
|
751
751
|
__privateAdd$1(this, _BadgeIndex_instances);
|
|
752
752
|
}
|
|
753
753
|
search(options) {
|
|
754
|
-
const
|
|
755
|
-
const sorted = __privateMethod(this, _BadgeIndex_instances, sort_fn).call(this,
|
|
756
|
-
const totalPages = options?.pageSize ? Math.ceil(
|
|
757
|
-
const
|
|
758
|
-
const
|
|
754
|
+
const matched = options?.query || options?.filter ? this._values.filter((badge) => __privateMethod(this, _BadgeIndex_instances, satisfiesQueryPredicate_fn).call(this, badge, options?.query) && __privateMethod(this, _BadgeIndex_instances, satisfiesFilterPredicate_fn).call(this, badge, options?.filter)) : this._values;
|
|
755
|
+
const sorted = __privateMethod(this, _BadgeIndex_instances, sort_fn).call(this, matched, options);
|
|
756
|
+
const totalPages = options?.pageSize ? Math.ceil(matched.length / options?.pageSize) : 1;
|
|
757
|
+
const pageNumber = Math.max(1, Math.min(totalPages, options?.page ?? 1));
|
|
758
|
+
const items = options?.pageSize ? sorted.slice((pageNumber - 1) * options.pageSize, pageNumber * options?.pageSize) : sorted;
|
|
759
759
|
return {
|
|
760
|
-
items
|
|
761
|
-
|
|
760
|
+
items,
|
|
761
|
+
pageIndex: pageNumber - 1,
|
|
762
|
+
pageNumber,
|
|
762
763
|
pageSize: options?.pageSize,
|
|
763
|
-
|
|
764
|
-
|
|
764
|
+
matchedItemCount: matched.length,
|
|
765
|
+
totalItemCount: this._values.length,
|
|
766
|
+
totalPageCount: totalPages
|
|
765
767
|
};
|
|
766
768
|
}
|
|
767
769
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coh-content-db.js","sources":["../src/main/api/alignment.ts","../src/main/api/badge-requirement-type.ts","../src/main/api/badge-type.ts","../src/main/api/enhancement-category.ts","../src/main/api/mission-type.ts","../src/main/api/morality.ts","../src/main/api/sex.ts","../src/main/api/zone-type.ts","../src/main/db/alignment-list.ts","../src/main/db/key.ts","../src/main/db/archetype.ts","../src/main/util/coalesce-to-array.ts","../src/main/db/badge-requirement.ts","../src/main/db/variants.ts","../src/main/db/morality-list.ts","../src/main/db/abstract-index.ts","../src/main/util/to-date.ts","../src/main/db/set-title-ids.ts","../src/main/db/badge.ts","../src/main/db/badge-index.ts","../src/main/db/bundle-header.ts","../src/main/db/level-range.ts","../src/main/db/zone.ts","../src/main/db/contact.ts","../src/main/db/mission.ts","../src/main/db/coh-content-database.ts","../src/main/db/location.ts","../src/main/util/links.ts"],"sourcesContent":["export const ALIGNMENT = ['hero', 'villain', 'praetorian'] as const\nexport type Alignment = typeof ALIGNMENT[number]\nexport type AlignmentExtended = Alignment\n /**\n * The alignments available for Primal Earth characters - Hero and Villain.\n */\n | 'primal'\n /**\n * All the alignments.\n */\n | 'all'\n\nconst ALIGNMENT_ORDER = Object.fromEntries(ALIGNMENT.map((x, index) => [x, index]))\n\nexport function compareAlignment(a?: Alignment, b?: Alignment): number {\n const orderA = a ? ALIGNMENT_ORDER[a] : -1\n const orderB = b ? ALIGNMENT_ORDER[b] : -1\n return orderA - orderB\n}\n","export const BADGE_REQUIREMENT_TYPE = [\n /**\n * Collect a badge.\n */\n 'badge',\n /**\n * Craft an invention.\n */\n 'invention',\n /**\n * Some invention badges require you to build x of two different invention levels, 'plus one of either level'.\n */\n 'invention-plus-one',\n /**\n * Visit a location.\n */\n 'location',\n /**\n * Click on a monument.\n */\n 'monument',\n /**\n * Complete a mission.\n */\n 'mission',\n /**\n * Complete an arbitrary task.\n */\n 'task',\n] as const\n\nexport type BadgeRequirementType = typeof BADGE_REQUIREMENT_TYPE[number]\n","export const BADGE_TYPE = [\n 'exploration',\n 'history',\n 'accomplishment',\n 'achievement',\n 'accolade',\n 'gladiator',\n 'veteran',\n 'pvp',\n 'invention',\n 'defeat',\n 'event',\n 'ouroboros',\n 'consignment',\n 'day-job',\n 'architect-entertainment',\n] as const\n\nexport type BadgeType = typeof BADGE_TYPE[number]\n","export const ENHANCEMENT_CATEGORY = [\n 'defense-debuff',\n 'to-hit-debuff',\n 'taunt',\n 'confuse',\n 'healing',\n 'defense-buff',\n 'resist-damage',\n 'intangibility',\n 'sleep',\n 'slow',\n 'hold',\n 'stun',\n 'immobilize',\n 'fear',\n 'endurance-modification',\n 'endurance-reduction',\n 'recharge-reduction',\n 'interrupt-duration',\n 'accuracy',\n 'to-hit-buff',\n 'damage',\n 'knockback',\n 'run-speed',\n 'jump',\n 'fly-speed',\n 'range',\n] as const\n\nexport type EnhancementCategory = typeof ENHANCEMENT_CATEGORY[number]\n","export const MISSION_TYPE = ['story-arc', 'mission', 'task-force', 'strike-force', 'trial', 'personal-story'] as const\nexport type MissionType = typeof MISSION_TYPE[number]\n","import { Alignment } from './alignment'\n\nexport const MORALITY = ['hero', 'vigilante', 'villain', 'rogue', 'resistance', 'loyalist'] as const\nexport const MORALITY_EXTENDED = [\n ...MORALITY,\n /**\n * Any of the Primal Earth moralities - Hero, Vigilante, Villain, Rogue.\n */\n 'primal',\n /**\n * Either of the Praetorian Earth moralities - Resistance or Loyalist.\n */\n 'praetorian',\n /**\n * The moralities that roll up to the Hero {@link Alignment} - Hero and Vigilante.\n */\n 'heroic',\n /**\n * The moralities that roll up to the Villain {@link Alignment} - Villain and Rogue.\n */\n 'villainous',\n /**\n * Moralities with access to Paragon City - Hero, Vigilante and Rogue.\n */\n 'paragon-city-access',\n /**\n * Moralities with access to the Rogue Isles - Villain, Rogue and Vigilante.\n */\n 'rogue-isles-access',\n /**\n * All the moralities.\n */\n 'all',\n] as const\nexport type Morality = typeof MORALITY[number]\nexport type MoralityExtended = typeof MORALITY_EXTENDED[number]\n\n/**\n * Maps a morality to the underlying alignment\n */\nexport const MoralityMap: Record<Morality | Alignment, Alignment> = {\n hero: 'hero',\n vigilante: 'hero',\n villain: 'villain',\n rogue: 'villain',\n loyalist: 'praetorian',\n resistance: 'praetorian',\n praetorian: 'praetorian',\n}\n","export const SEX = ['M', 'F'] as const\nexport type Sex = typeof SEX[number]\n\nconst SEX_ORDER = Object.fromEntries(SEX.map((x, index) => [x, index]))\n\nexport function compareSex(a?: Sex, b?: Sex): number {\n const orderA = a ? SEX_ORDER[a] : -1\n const orderB = b ? SEX_ORDER[b] : -1\n return orderA - orderB\n}\n","export const ZONE_TYPE = [\n /**\n * The standard zone type, even if not technically occurring in the 'City' proper.\n */\n 'city',\n /**\n * An Ouroboros flashback to a zone as it was in a previous era.\n */\n 'echo',\n /**\n * Tutorial zon, usually inaccessible after leaving.\n */\n 'tutorial',\n /**\n * Trial zones, like the Abandoned Sewers trial.\n */\n 'trial',\n /**\n * Hazard zones like the Hollows.\n */\n 'hazard',\n /**\n * Mayhem mission zones.\n */\n 'mayhem',\n /**\n * Safeguard mission zones.\n */\n 'safeguard',\n /**\n * Exists inside a mission not covered by the other types.\n */\n 'mission',\n /**\n * Incarnate trial zones.\n */\n 'incarnate',\n /**\n * Cooprative zones where Heroes and Villains can team up for PvE content.\n */\n 'co-op',\n /**\n * PvP zones like Bloody Bay.\n */\n 'pvp',\n /**\n * Located in an arena PvP map.\n */\n 'arena',\n /**\n * A building, usually contained within another zone, like the AE buildings.\n */\n 'building',\n /**\n * Stuff like the (Phone only) zone.\n */\n 'other',\n] as const\nexport type ZoneType = typeof ZONE_TYPE[number]\n","import { ALIGNMENT, Alignment, AlignmentExtended } from '../api/alignment'\n\nexport class AlignmentList {\n readonly #items: Set<Alignment>\n\n readonly hero: boolean\n readonly villain: boolean\n readonly praetorian: boolean\n\n readonly primal: boolean\n readonly all: boolean\n\n constructor(items?: AlignmentExtended[]) {\n const set = new Set(items ?? [...ALIGNMENT])\n this.hero = set.has('hero') || set.has('primal') || set.has('all')\n this.villain = set.has('villain') || set.has('primal') || set.has('all')\n this.praetorian = set.has('praetorian') || set.has('all')\n\n this.primal = this.hero && this.villain\n this.all = this.hero && this.villain && this.praetorian\n\n this.#items = new Set()\n if (this.hero) this.#items.add('hero')\n if (this.villain) this.#items.add('villain')\n if (this.praetorian) this.#items.add('praetorian')\n }\n\n get items(): Alignment[] {\n return [...this.#items]\n }\n\n has(alignment?: AlignmentExtended): boolean {\n switch (alignment) {\n case 'hero': {\n return this.hero\n }\n case 'villain': {\n return this.villain\n }\n case 'praetorian': {\n return this.praetorian\n }\n case 'primal' : {\n return this.primal\n }\n case 'all': {\n return this.all\n }\n default: {\n return false\n }\n }\n }\n}\n","const INVALID_KEY_PATTERN = /[^a-z0-9-]/\n\nexport class Key {\n readonly #value: string\n\n constructor(value: string) {\n this.#validateKey(value)\n this.#value = value\n }\n\n get value(): string {\n return this.#value\n }\n\n #validateKey(key: string): void {\n if (INVALID_KEY_PATTERN.test(key)) throw new Error(`Invalid key: [${key}]; Keys can only contain lowercase characters, numbers and dashes.`)\n }\n}\n","import { Key } from './key'\nimport { ArchetypeData } from '../api/archetype-data'\n\nexport class Archetype {\n readonly key: string\n readonly name: string\n readonly description?: string\n\n constructor(data: ArchetypeData) {\n this.key = new Key(data.key).value\n this.name = data.name\n this.description = data.description\n }\n}\n","/**\n * For fields that accept either an array of values or a single value, coalesces the value to an array.\n *\n * Arrays are returned as-is.\n * Single values are returned as a single-value array.\n * Undefined values are returned as undefined.\n *\n * @param value The value to coalesce.\n */\nexport function coalesceToArray<T>(value?: T | T[]): T[] | undefined {\n if (!value) return undefined\n return Array.isArray(value) ? value as T[] : [value]\n}\n","import { BadgeRequirementData } from '../api/badge-requirement-data'\nimport { BadgeRequirementType } from '../api/badge-requirement-type'\nimport { EnhancementCategory } from '../api/enhancement-category'\nimport { Key } from './key'\nimport { MarkdownString } from '../api/markdown-string'\nimport { Link } from '../api/link'\nimport { Location } from './location'\nimport { coalesceToArray } from '../util/coalesce-to-array'\n\nexport class BadgeRequirement {\n /**\n * Unique key used to reference this badge requirement.\n *\n * Keys must be unique and can only contain lowercase letters, numbers and hyphens (`-`).\n */\n readonly key: string\n\n /**\n * The requirement type.\n */\n readonly type: BadgeRequirementType\n\n /**\n * If the requirement involves a location, where it is.\n */\n readonly location?: Location[]\n\n /**\n * If the requirement involves a badge, the badge key.\n */\n readonly badgeKey?: string\n\n /**\n * If the requirement involves a mission, the mission key.\n */\n readonly missionKey?: string\n\n /**\n * If the requirement involves a monument, the text that is displayed thereon.\n */\n readonly monumentText?: string\n\n /**\n * If the requirement involves crafting an invention, the Level of the invention required.\n */\n readonly inventionLevel?: number\n\n /**\n * If the requirement involves crafting an invention, the types of enhancements that will qualify.\n */\n readonly inventionTypes?: EnhancementCategory[]\n\n /**\n * Number of times the task needs to be repeated.\n */\n readonly count?: number\n\n /**\n * Additional information about the requirement.\n */\n readonly notes?: MarkdownString\n\n /**\n * List of external links. Wiki, forums, etc.\n */\n readonly links: Link[]\n\n constructor(data: BadgeRequirementData) {\n this.key = new Key(data.key).value\n this.type = data.type\n this.location = coalesceToArray(data.location)\n this.badgeKey = data.badgeKey\n this.missionKey = data.missionKey\n this.monumentText = data.monumentText\n this.inventionLevel = data.inventionLevel\n this.inventionTypes = data.inventionTypes\n this.count = data.count\n this.notes = data.notes\n this.links = data.links ?? []\n }\n}\n","import { VariantData } from '../api/variant-data'\nimport { compareSex } from '../api/sex'\nimport { compareAlignment } from '../api/alignment'\nimport { VariantContext } from '../api/variant-context'\nimport { MoralityMap } from '../api/morality'\n\nexport class Variants<T> {\n readonly #sortedValues: VariantData<T>[] = []\n\n /**\n * Create a variant set from either a list of categorized values, or a single value when there are no variants.\n * @param value List of variants, or a single value.\n */\n constructor(value: VariantData<T>[] | T) {\n if (Array.isArray(value)) {\n this.#sortedValues = value.toSorted()\n this.#sortedValues.sort((a, b) => this.#compareVariants(a, b))\n } else {\n this.#sortedValues = [{ value }]\n }\n }\n\n /**\n * Get a variant by context\n * @param context The context\n */\n getVariant(context?: VariantContext): VariantData<T> | undefined {\n const alignment = context?.morality ? MoralityMap[context.morality] : undefined\n const sex = context?.sex\n\n for (let index = this.#sortedValues.length; index--;) {\n const entry = this.#sortedValues[index]\n if ((entry.alignment === undefined || entry.alignment === alignment)\n && (entry.sex === undefined || entry.sex === sex)\n ) return entry\n }\n\n return this.default\n }\n\n /**\n * Get a value by variant context\n * @param context The context\n */\n getValue(context?: VariantContext): T | undefined {\n return this.getVariant(context)?.value\n }\n\n /**\n * Get the default value for this list of variants, the value with the highest priority and lowest specificity.\n */\n get default(): VariantData<T> | undefined {\n return this.#sortedValues[0]\n }\n\n /**\n * Get the list of variants sorted in canonical order (alignment then sex, low to high specificity).\n */\n get canonical(): VariantData<T>[] {\n return this.#sortedValues\n }\n\n /**\n * Create a joined string from the variant values in canonical order.\n * @param separator Separator to use. Default is ' / '\n */\n toString(separator: string): string {\n return this.canonical.map(x => x.value).join(separator)\n }\n\n #compareVariants(a: VariantData<T>, b: VariantData<T>): number {\n const aSpecificity = (a.alignment ? 2 : 0) + (a.sex ? 1 : 0)\n const bSpecificity = (b.alignment ? 2 : 0) + (b.sex ? 1 : 0)\n if (aSpecificity !== bSpecificity) return aSpecificity - bSpecificity // Order first by least-specific\n\n const alignmentComparison = compareAlignment(a.alignment, b.alignment) // Next by alignment\n if (alignmentComparison !== 0) return alignmentComparison\n\n const sexComparison = compareSex(a.sex, b.sex) // Last by sex\n if (sexComparison !== 0) return sexComparison\n\n return String(a.value).localeCompare(String(b.value))\n }\n}\n","import { MORALITY, Morality, MoralityExtended } from '../api/morality'\n\nexport class MoralityList {\n readonly #items: Set<Morality>\n\n readonly hero: boolean\n readonly vigilante: boolean\n readonly villain: boolean\n readonly rogue: boolean\n readonly resistance: boolean\n readonly loyalist: boolean\n\n readonly primal: boolean\n readonly praetorian: boolean\n readonly heroic: boolean\n readonly villainous: boolean\n readonly paragonCityAccess: boolean\n readonly rogueIslesAccess: boolean\n\n readonly all: boolean\n\n constructor(items?: MoralityExtended[]) {\n const set = new Set(items ?? [...MORALITY])\n this.hero = set.has('hero') || set.has('primal') || set.has('heroic') || set.has('paragon-city-access') || set.has('all')\n this.vigilante = set.has('vigilante') || set.has('primal') || set.has('heroic') || set.has('paragon-city-access') || set.has('rogue-isles-access') || set.has('all')\n this.villain = set.has('villain') || set.has('primal') || set.has('villainous') || set.has('rogue-isles-access') || set.has('all')\n this.rogue = set.has('rogue') || set.has('primal') || set.has('villainous') || set.has('paragon-city-access') || set.has('rogue-isles-access') || set.has('all')\n this.resistance = set.has('resistance') || set.has('praetorian') || set.has('all')\n this.loyalist = set.has('loyalist') || set.has('praetorian') || set.has('all')\n\n this.primal = this.hero && this.vigilante && this.villain && this.rogue\n this.praetorian = this.loyalist && this.resistance\n this.heroic = this.hero && this.vigilante\n this.villainous = this.villain && this.rogue\n this.paragonCityAccess = this.heroic && this.rogue\n this.rogueIslesAccess = this.villainous && this.vigilante\n\n this.all = this.primal && this.praetorian\n\n this.#items = new Set()\n if (this.hero) this.#items.add('hero')\n if (this.vigilante) this.#items.add('vigilante')\n if (this.villain) this.#items.add('villain')\n if (this.rogue) this.#items.add('rogue')\n if (this.resistance) this.#items.add('resistance')\n if (this.loyalist) this.#items.add('loyalist')\n }\n\n get items(): Morality[] {\n return [...this.#items]\n }\n\n has(morality?: MoralityExtended): boolean {\n switch (morality) {\n case 'hero': {\n return this.hero\n }\n case 'vigilante': {\n return this.vigilante\n }\n case 'villain': {\n return this.villain\n }\n case 'rogue': {\n return this.rogue\n }\n case 'resistance': {\n return this.resistance\n }\n case 'loyalist': {\n return this.loyalist\n }\n case 'primal' : {\n return this.primal\n }\n case 'praetorian': {\n return this.praetorian\n }\n case 'heroic': {\n return this.hero\n }\n case 'paragon-city-access': {\n return this.paragonCityAccess\n }\n case 'rogue-isles-access': {\n return this.rogueIslesAccess\n }\n case 'villainous': {\n return this.villainous\n }\n case 'all': {\n return this.all\n }\n default: {\n return false\n }\n }\n }\n}\n","type KeysOfType<T, V> = { [P in keyof T]: T[P] extends V ? P : never }[keyof T]\n\nexport class AbstractIndex<T> {\n protected _values: T[] = []\n protected _hashTable: Record<string, T> = {}\n\n /**\n * Create a new index.\n * @param keyField The field of the values that will act as the key.\n * @param values Values to index.\n */\n constructor(keyField: KeysOfType<T, string>, values: T[] | undefined) {\n this._values = values ?? []\n this._hashTable = {}\n for (const value of this.values) {\n const key = value[keyField] as string\n if (this._hashTable[key] !== undefined) throw new Error(`Duplicate key [${key}]`)\n this._hashTable[key] = value\n }\n }\n\n /**\n * Return all indexed values\n */\n get values(): T[] {\n return this._values\n }\n\n /**\n * Get a value from the index\n * @param key Key string\n */\n get(key: string | undefined): T | undefined {\n if (!key) return undefined\n return this._hashTable[key]\n }\n}\n","/**\n * Converts an iso string to a Date object, throwing an error if the iso string is invalid.\n * @param iso ISO-8601 Date string\n */\nexport function toDate(iso: string): Date {\n const date = new Date(iso)\n if (!date || Number.isNaN(date.getTime())) throw new Error(`Invalid date format: [${iso}]`)\n return date\n}\n","import { SetTitleData } from '../api/set-title-data'\n\nexport class SetTitleIds {\n readonly primal: number\n readonly praetorian?: number\n\n constructor(value: SetTitleData) {\n [this.primal, this.praetorian] = value\n }\n}\n","import { BadgeType } from '../api/badge-type'\nimport { Link } from '../api/link'\nimport { BadgeData } from '../api/badge-data'\nimport { BadgeRequirement } from './badge-requirement'\nimport { Key } from './key'\nimport { Variants } from './variants'\nimport { MarkdownString } from '../api/markdown-string'\nimport { MoralityList } from './morality-list'\nimport { AbstractIndex } from './abstract-index'\nimport { toDate } from '../util/to-date'\nimport { coalesceToArray } from '../util/coalesce-to-array'\nimport { SetTitleIds } from './set-title-ids'\nimport { VariantContext } from '../api/variant-context'\n\nexport class Badge {\n readonly #requirementsIndex: AbstractIndex<BadgeRequirement>\n readonly #zoneKeys = new Set<string>()\n\n /**\n * The database key for this badge.\n */\n readonly key: string\n\n /**\n * The type of badge.\n */\n readonly type: BadgeType\n\n /**\n * The name of this badge.\n *\n * May vary by character sex or alignment.\n */\n readonly name: Variants<string>\n\n /**\n * The date that the badge was added to the game.\n */\n readonly releaseDate: Date\n\n /**\n * The character moralities that this badge is available to.\n */\n readonly morality: MoralityList\n\n /**\n * The badge text as it appears in-game. May vary by character sex or alignment.\n */\n readonly badgeText: Variants<MarkdownString>\n\n /**\n * Short description of how to acquire the badge. Detailed instructions will be in the notes field.\n */\n readonly acquisition?: MarkdownString\n\n /**\n * Absolute URL to this badge's icon.\n *\n * May vary by character sex or alignment.\n */\n readonly icon: Variants<string>\n\n /**\n * Freeform notes or tips about the badge.\n */\n readonly notes?: MarkdownString\n\n /**\n * List of external links. Wiki, forums, etc.\n */\n readonly links: Link[]\n\n /**\n * The id used with the in-game `/settitle` command to apply the badge.\n * The first value is the id for primal characters and the (optional) second number is the id for praetorian characters.\n */\n readonly setTitleId?: SetTitleIds\n\n /**\n * A description of the effect the badge will have, such as a buff or granting a temporary power.\n */\n readonly effect?: MarkdownString\n\n /**\n * Some badges are not included in the badge total count... such as Flames of Prometheus, which can be removed by redeeming it for a Notice of the Well.\n */\n readonly ignoreInTotals: boolean\n\n constructor(badgeData: BadgeData) {\n this.key = new Key(badgeData.key).value\n this.type = badgeData.type\n this.name = new Variants(badgeData.name)\n this.releaseDate = toDate(badgeData.releaseDate)\n this.morality = new MoralityList(coalesceToArray(badgeData.morality))\n this.badgeText = new Variants(badgeData.badgeText ?? [])\n this.acquisition = badgeData.acquisition\n this.icon = new Variants(badgeData.icon ?? [])\n this.notes = badgeData.notes\n this.links = badgeData.links ?? []\n this.effect = badgeData.effect\n this.setTitleId = badgeData.setTitleId ? new SetTitleIds(badgeData.setTitleId) : undefined\n this.ignoreInTotals = badgeData.ignoreInTotals ?? false\n\n this.#requirementsIndex = new AbstractIndex<BadgeRequirement>('key', badgeData.requirements?.map(x => new BadgeRequirement(x)))\n\n for (const requirement of this.#requirementsIndex.values) {\n if (requirement.location) for (const location of requirement.location) {\n if (location.zoneKey) this.#zoneKeys.add(location.zoneKey)\n }\n }\n }\n\n /**\n * Represents the requirements for badges with multiple fulfillment steps, such as visiting monuments for history badges, completing missions, or collecting other badges.\n */\n get requirements(): BadgeRequirement[] {\n return this.#requirementsIndex.values\n }\n\n getRequirement(key: string): BadgeRequirement | undefined {\n return this.#requirementsIndex.get(key)\n }\n\n /**\n * Return a list of all the zone keys referenced by this badge.\n */\n get zoneKeys(): string[] {\n return [...this.#zoneKeys]\n }\n\n /**\n * The zone key if this badge relates to a single zone.\n */\n get zoneKey(): string | undefined {\n return this.#zoneKeys.size === 1 ? this.#zoneKeys.values().next().value : undefined\n }\n}\n\nexport function compareByName(a?: Badge, b?: Badge, context?: VariantContext): number {\n const aName = a?.name?.getValue(context)\n const bName = b?.name?.getValue(context)\n if (!aName && !bName) return 0\n if (!aName) return 1\n if (!bName) return -1\n return aName.localeCompare(bName)\n}\n\nexport function compareByZoneKey(a?: Badge, b?: Badge): number {\n const aZone = a?.zoneKey\n const bZone = b?.zoneKey\n if (!aZone && !bZone) return 0\n if (!aZone) return 1\n if (!bZone) return -1\n return aZone.localeCompare(bZone)\n}\n\nexport function compareByReleaseDate(a?: Badge, b?: Badge): number {\n const aReleaseDate = a?.releaseDate?.getTime()\n const bReleaseDate = b?.releaseDate?.getTime()\n if (aReleaseDate === bReleaseDate) return 0\n if (!aReleaseDate) return 1\n if (!bReleaseDate) return -1\n return aReleaseDate < bReleaseDate ? -1 : 1\n}\n","import { Badge, compareByName, compareByReleaseDate, compareByZoneKey } from './badge'\nimport { BadgeSearchOptions } from './badge-search-options'\nimport { Paged } from './paged'\nimport { AbstractIndex } from './abstract-index'\n\nexport class BadgeIndex extends AbstractIndex<Badge> {\n constructor(values: Badge[] | undefined) {\n super('key', values)\n }\n\n search(options?: BadgeSearchOptions): Paged<Badge> {\n const filtered = (options?.query || options?.filter)\n ? this._values.filter(badge => this.#satisfiesQueryPredicate(badge, options?.query) && this.#satisfiesFilterPredicate(badge, options?.filter))\n : this._values\n\n const sorted = this.#sort(filtered, options)\n\n const totalPages = options?.pageSize ? Math.ceil(filtered.length / (options?.pageSize)) : 1\n const page = Math.max(1, Math.min(totalPages, options?.page ?? 1))\n const paged = options?.pageSize ? sorted.slice((page - 1) * options.pageSize, page * options?.pageSize) : sorted\n\n return {\n items: paged,\n page: page,\n pageSize: options?.pageSize,\n totalItems: filtered.length,\n totalPages: totalPages,\n }\n }\n\n #satisfiesQueryPredicate(badge: Badge, query?: BadgeSearchOptions['query']): boolean {\n const queryString = query?.str?.toLowerCase() ?? ''\n const fields = query?.fields ? new Set(query?.fields) : new Set(['name']) // Default to name if not provided\n if (fields.size === 0) return true\n\n return !!((fields.has('name') && badge.name.canonical.some(x => x.value.toLowerCase().includes(queryString)))\n || (fields.has('badge-text') && badge.badgeText.canonical.some(x => x.value.toLowerCase().includes(queryString)))\n || (fields.has('acquisition') && badge.acquisition?.toLowerCase().includes(queryString))\n || (fields.has('effect') && badge.effect?.toLowerCase().includes(queryString))\n || (fields.has('notes') && badge.notes?.toLowerCase().includes(queryString))\n || (fields.has('set-title-id') && (badge.setTitleId?.primal.toString() === queryString))\n || (fields.has('set-title-id') && (badge.setTitleId?.praetorian?.toString() === queryString))\n )\n }\n\n #satisfiesFilterPredicate(badge: Badge, filter?: BadgeSearchOptions['filter']): boolean {\n return (!filter?.type || badge.type === filter.type)\n && (!filter?.zoneKey || badge.zoneKey === filter.zoneKey)\n && (!filter?.morality || badge.morality.has(filter.morality))\n && (!filter?.predicate || filter.predicate(badge))\n }\n\n #sort(badges: Badge[], options?: BadgeSearchOptions): Badge[] {\n switch (options?.sort) {\n case 'name.asc': {\n return badges.toSorted((a, b) => compareByName(a, b, options.variantContext))\n }\n case 'name.desc': {\n return badges.toSorted((a, b) => compareByName(b, a, options.variantContext))\n }\n case 'zone-key.asc': {\n return badges.toSorted(compareByZoneKey)\n }\n case 'zone-key.desc': {\n return badges.toSorted((a, b) => compareByZoneKey(b, a))\n }\n case 'release-date.asc': {\n return badges.toSorted(compareByReleaseDate)\n }\n case 'release-date.desc': {\n return badges.toSorted((a, b) => compareByReleaseDate(b, a))\n }\n case 'canonical.desc': {\n return badges.toReversed()\n }\n default: {\n return [...badges]\n }\n }\n }\n}\n","import { Link } from '../api/link'\nimport { MarkdownString } from '../api/markdown-string'\nimport { BundleHeaderData } from '../api/bundle-header-data'\nimport { toDate } from '../util/to-date'\n\nexport class BundleHeader {\n /**\n * Name of the fork this bundle contains data for.\n */\n readonly name: string\n\n /**\n * Version number for this data package.\n */\n readonly version: string\n\n /**\n * The time this bundle was last updated.\n */\n readonly lastUpdateTime: Date\n\n /**\n * Description of the fork.\n */\n readonly description?: MarkdownString\n\n /**\n * Url for the repository where the bundle is maintained.\n */\n readonly repositoryUrl?: string\n\n /**\n * Url for the location of the changelog.\n */\n readonly changelogUrl?: string\n\n /**\n * List of external links. Wiki, forums, etc.\n */\n readonly links?: Link[]\n\n constructor(data: BundleHeaderData) {\n if (!data) throw new Error('Missing header data')\n this.name = data.name\n this.version = data.version\n this.lastUpdateTime = toDate(data.lastUpdateTime)\n this.description = data?.description\n this.repositoryUrl = data?.repositoryUrl\n this.changelogUrl = data?.changelogUrl\n this.links = data?.links ?? []\n }\n}\n","import { LevelRangeData } from '../api/level-range-data'\n\nexport class LevelRange {\n readonly min: number\n readonly max?: number\n\n constructor(value: LevelRangeData) {\n if (Array.isArray(value)) {\n this.min = value[0]\n this.max = value[1] === undefined ? undefined : value[1]\n } else {\n this.min = value\n }\n }\n}\n","import { Link } from '../api/link'\nimport { ZoneData } from '../api/zone-data'\nimport { Key } from './key'\nimport { MoralityList } from './morality-list'\nimport { coalesceToArray } from '../util/coalesce-to-array'\nimport { ZoneType } from '../api/zone-type'\nimport { MarkdownString } from '../api/markdown-string'\nimport { LevelRange } from './level-range'\n\nexport class Zone {\n /**\n * Unique key used to reference this zone.\n *\n * Keys must be unique and can only contain lowercase letters, numbers and hyphens (`-`).\n */\n readonly key: string\n\n /**\n * The name of the zone as it appears in-game.\n */\n readonly name: string\n\n /**\n * The type of zone.\n */\n readonly type: ZoneType\n\n /**\n * The character moralities that this zone is accessible by.\n */\n readonly morality: MoralityList\n\n /**\n * The level range this zone is recommended for.\n */\n readonly levelRange?: LevelRange\n\n /**\n * Freeform notes or tips about the zone.\n */\n readonly notes?: MarkdownString\n\n /**\n * List of external links. Wiki, forums, etc.\n */\n readonly links: Link[]\n\n constructor(data: ZoneData) {\n this.key = new Key(data.key).value\n this.name = data.name\n this.type = data.type\n this.morality = new MoralityList(coalesceToArray(data.morality))\n this.levelRange = data.levelRange ? new LevelRange(data.levelRange) : undefined\n this.notes = data.notes\n this.links = data.links ?? []\n }\n}\n","import { Link } from '../api/link'\nimport { Key } from './key'\nimport { MarkdownString } from '../api/markdown-string'\nimport { ContactData } from '../api/contact-data'\nimport { Location } from './location'\nimport { MoralityList } from './morality-list'\nimport { coalesceToArray } from '../util/coalesce-to-array'\nimport { LevelRange } from './level-range'\n\nexport class Contact {\n /**\n * Unique key used to reference this contact.\n *\n * Keys must be unique and can only contain lowercase letters, numbers and hyphens (`-`).\n */\n readonly key: string\n\n /**\n * The name of this contact.\n */\n readonly name: string\n\n /**\n * The contact's title.\n */\n readonly title?: string\n\n /**\n * The character moralities that this contact will interact with.\n */\n readonly morality: MoralityList\n\n /**\n * The location of this contact.\n */\n readonly location?: Location\n\n /**\n * The level range this contact will offer missions for.\n */\n readonly levelRange?: LevelRange\n\n /**\n * Freeform notes or tips about the contact.\n */\n readonly notes?: MarkdownString\n\n /**\n * List of external links. Wiki, forums, etc.\n */\n readonly links: Link[]\n\n constructor(data: ContactData) {\n this.key = new Key(data.key).value\n this.name = data.name\n this.title = data.title\n this.morality = new MoralityList(coalesceToArray(data.morality))\n this.location = data.location\n this.levelRange = data.levelRange ? new LevelRange(data.levelRange) : undefined\n this.notes = data.notes\n this.links = data.links ?? []\n }\n}\n","import { MissionType } from '../api/mission-type'\nimport { MarkdownString } from '../api/markdown-string'\nimport { Link } from '../api/link'\nimport { MissionData } from '../api/mission-data'\nimport { Key } from './key'\nimport { MoralityList } from './morality-list'\nimport { coalesceToArray } from '../util/coalesce-to-array'\nimport { LevelRange } from './level-range'\n\nexport class Mission {\n /**\n * Unique key used to reference this mission.\n *\n * Keys must be unique and can only contain lowercase letters, numbers and hyphens (`-`).\n */\n readonly key: string\n\n /**\n * The name of the mission as it appears from the contact.\n *\n * The name may be different when viewed in Ouroboros as a Flashback.\n */\n readonly name: string\n\n /**\n * The type of mission... Story arc, task force, trial, etc.\n */\n readonly type: MissionType\n\n /**\n * The character moralities that may accept the mission.\n */\n readonly morality: MoralityList\n\n /**\n * The keys of any contacts that provide this mission.\n */\n readonly contactKeys?: string[]\n\n /**\n * The level range this mission is available for.\n */\n readonly levelRange?: LevelRange\n\n /**\n * Freeform notes or tips about the mission.\n */\n readonly notes?: MarkdownString\n\n /**\n * List of external links. Wiki, forums, etc.\n */\n readonly links: Link[]\n\n /**\n * If the mission is available in Ouroboros as a Flashback.\n */\n readonly flashback?: {\n\n /**\n * The id of the mission as seen in the Flashback menu, i.e. '14.01'.\n */\n readonly id: string\n\n /**\n * The level range this mission appears under as a Flashback.\n */\n readonly levelRange?: LevelRange\n\n /**\n * The name as it appears in the Flashback list.\n */\n readonly name: string\n\n /**\n * The character moralities that the mission will appear for in the Flashback list.\n */\n readonly morality: MoralityList\n\n /**\n * Freeform notes or tips about the Flashback version of the mission.\n */\n readonly notes?: MarkdownString\n }\n\n constructor(data: MissionData) {\n this.key = new Key(data.key).value\n this.name = data.name\n this.type = data.type\n this.morality = new MoralityList(coalesceToArray(data.morality))\n this.contactKeys = coalesceToArray(data.contactKeys)\n this.levelRange = data.levelRange ? new LevelRange(data.levelRange) : undefined\n this.notes = data.notes\n this.links = data.links ?? []\n this.flashback = createFlashback(data)\n }\n}\n\nfunction createFlashback(data: MissionData): Mission['flashback'] {\n if (!data.flashback) return undefined\n return {\n id: data.flashback.id,\n levelRange: data.flashback.levelRange ? new LevelRange(data.flashback.levelRange) : undefined,\n name: data.flashback.name ?? data.name,\n morality: new MoralityList(coalesceToArray(data.flashback.morality ?? data.morality)),\n notes: data.flashback.notes,\n }\n}\n","import { BundleData } from '../api/bundle-data'\nimport { Archetype } from './archetype'\nimport { Zone } from './zone'\nimport { Badge } from './badge'\nimport { BundleHeader } from './bundle-header'\nimport { BadgeSearchOptions } from './badge-search-options'\nimport { Paged } from './paged'\nimport { Contact } from './contact'\nimport { Mission } from './mission'\nimport { AbstractIndex } from './abstract-index'\nimport { BadgeIndex } from './badge-index'\n\nexport class CohContentDatabase {\n readonly #archetypeIndex\n readonly #zoneIndex\n readonly #contactIndex\n readonly #missionIndex\n readonly #badgeIndex\n\n readonly #header: BundleHeader\n readonly #servers: string[]\n\n /**\n * Create a db instance from the given content bundle.\n * @param bundle The bundle to load.\n */\n constructor(bundle: BundleData) {\n this.#header = new BundleHeader(bundle.header)\n this.#servers = bundle.servers ?? []\n\n this.#archetypeIndex = new AbstractIndex<Archetype>('key', bundle.archetypes?.map(x => new Archetype(x)))\n this.#zoneIndex = new AbstractIndex<Zone>('key', bundle.zones?.map(x => new Zone(x)))\n this.#contactIndex = new AbstractIndex<Contact>('key', bundle.contacts?.map(x => new Contact(x)))\n this.#missionIndex = new AbstractIndex<Mission>('key', bundle.missions?.map(x => new Mission(x)))\n this.#badgeIndex = new BadgeIndex(bundle.badges?.map(x => new Badge(x)))\n }\n\n /**\n * Header information about the content bundle.\n */\n get header(): BundleHeader {\n return this.#header\n }\n\n /**\n * List of the game server names.\n *\n * Torchbearer, Excelsior, etc.\n */\n get servers(): string[] {\n return this.#servers\n }\n\n /**\n * List of archetypes.\n */\n get archetypes(): Archetype[] {\n return this.#archetypeIndex.values\n }\n\n /**\n * Get archetype by key.\n * @param key The key.\n */\n getArchetype(key: string | undefined): Archetype | undefined {\n return this.#archetypeIndex.get(key)\n }\n\n /**\n * List of game zones.\n */\n get zones(): Zone[] {\n return this.#zoneIndex.values\n }\n\n /**\n * Get zone by key.\n * @param key The key.\n */\n getZone(key: string | undefined): Zone | undefined {\n return this.#zoneIndex.get(key)\n }\n\n /**\n * List of contacts.\n */\n get contacts(): Contact[] {\n return this.#contactIndex.values\n }\n\n /**\n * Get contact by key.\n * @param key The key.\n */\n getContact(key: string | undefined): Contact | undefined {\n return this.#contactIndex.get(key)\n }\n\n /**\n * List of missions.\n */\n get missions(): Mission[] {\n return this.#missionIndex.values\n }\n\n /**\n * Get mission by key.\n * @param key The key.\n */\n getMission(key: string | undefined): Mission | undefined {\n return this.#missionIndex.get(key)\n }\n\n /**\n * List of badges.\n */\n get badges(): Badge[] {\n return this.#badgeIndex.values\n }\n\n /**\n * Get badge by key.\n * @param key The key.\n */\n getBadge(key: string | undefined): Badge | undefined {\n return this.#badgeIndex.get(key)\n }\n\n /**\n * Search, sort and filter the badge list.\n * This is a fairly brute-forced approach and will not be as performant as loading the badge data into a traditional\n * database engine, but is sufficient for most operations.\n * @param options {@link BadgeSearchOptions}\n */\n searchBadges(options?: BadgeSearchOptions): Paged<Badge> {\n return this.#badgeIndex.search(options)\n }\n}\n","import { Coords, LocationData, LocationIcon } from '../api/location-data'\n\nexport class Location {\n /**\n * Key of the {@link Zone} that the location references.\n */\n readonly zoneKey?: string\n\n /**\n * In-game `/loc` coordinates of the location.\n */\n readonly coords?: Coords\n\n /**\n * The type of icon to use if the location appears on a map. (Typically the Vidiot map icon).\n */\n readonly icon?: LocationIcon\n\n /**\n * The text that should appear in the location icon. (Typically a number or symbol from the Vidiot map).\n */\n readonly iconText?: string\n\n constructor(data: LocationData) {\n this.zoneKey = data.zoneKey\n this.coords = data.coords\n this.icon = data.icon\n this.iconText = data.iconText\n }\n}\n","import { BadgeData } from '../api/badge-data'\nimport { Badge } from '../db/badge'\nimport { ZoneData } from '../api/zone-data'\nimport { Zone } from '../db/zone'\nimport { Contact } from '../db/contact'\nimport { ContactData } from '../api/contact-data'\nimport { Mission } from '../db/mission'\nimport { MissionData } from '../api/mission-data'\n\n/**\n * Returns the URI of the given badge that can be used in {@link MarkdownString} fields.\n *\n * URI format: `badge://<key>`\n *\n * @param target The badge or badge key to target.\n */\nexport function badgeUri(target: string | Badge | BadgeData): string {\n const key = typeof target === 'string' ? target : target.key\n return `badge://${key}`\n}\n\n/**\n * Returns a {@link MarkdownString} link to the given badge.\n *\n * Link format: `[<key>](badge://<key>)`\n *\n * @param target The {@link Badge} or badge key to target.\n */\nexport function badgeLink(target: string | Badge | BadgeData): string {\n const key = typeof target === 'string' ? target : target.key\n return `[${key}](${badgeUri(target)})`\n}\n\n/**\n * Returns the URI of the given contact that can be used in {@link MarkdownString} fields.\n *\n * URI format: `contact://<key>`\n *\n * @param target The {@link Contact} or contact key to target.\n */\nexport function contactUri(target: string | Contact | ContactData): string {\n const key = typeof target === 'string' ? target : target.key\n return `contact://${key}`\n}\n\n/**\n * Returns a {@link MarkdownString} link to the given contact.\n *\n * Link format: `[<key>](contact://<key>)`\n *\n * @param target The {@link Contact} or contact key to target.\n */\nexport function contactLink(target: string | Contact | ContactData): string {\n const key = typeof target === 'string' ? target : target.key\n return `[${key}](${contactUri(target)})`\n}\n\n/**\n * Returns the URI of the given mission that can be used in {@link MarkdownString} fields.\n *\n * URI format: `mission://<key>`\n *\n * @param target The {@link Mission} or mission key to target.\n */\nexport function missionUri(target: string | Mission | MissionData): string {\n const key = typeof target === 'string' ? target : target.key\n return `mission://${key}`\n}\n\n/**\n * Returns a {@link MarkdownString} link to the given mission.\n *\n * Link format: `[<key>](mission://<key>)`\n *\n * @param target The {@link Mission} or mission key to target.\n */\nexport function missionLink(target: string | Mission | MissionData): string {\n const key = typeof target === 'string' ? target : target.key\n return `[${key}](${missionUri(target)})`\n}\n\n/**\n * Returns the URI of the given zone that can be used in {@link MarkdownString} fields.\n *\n * URI format: `zone://<key>`\n *\n * @param target The {@link Zone} or zone key to target.\n */\nexport function zoneUri(target: string | Zone | ZoneData): string {\n const key = typeof target === 'string' ? target : target.key\n return `zone://${key}`\n}\n\n/**\n * Returns a {@link MarkdownString} link to the given zone.\n *\n * Link format: `[<key>](zone://<key>)`\n *\n * @param target The {@link Zone} or zone key to target.\n */\nexport function zoneLink(target: string | Zone | ZoneData): string {\n const key = typeof target === 'string' ? target : target.key\n return `[${key}](${zoneUri(target)})`\n}\n"],"names":["_items","__privateAdd","__publicField","__privateSet","__privateGet","__privateMethod"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"coh-content-db.js","sources":["../src/main/api/alignment.ts","../src/main/api/badge-requirement-type.ts","../src/main/api/badge-type.ts","../src/main/api/enhancement-category.ts","../src/main/api/mission-type.ts","../src/main/api/morality.ts","../src/main/api/sex.ts","../src/main/api/zone-type.ts","../src/main/db/alignment-list.ts","../src/main/db/key.ts","../src/main/db/archetype.ts","../src/main/util/coalesce-to-array.ts","../src/main/db/badge-requirement.ts","../src/main/db/variants.ts","../src/main/db/morality-list.ts","../src/main/db/abstract-index.ts","../src/main/util/to-date.ts","../src/main/db/set-title-ids.ts","../src/main/db/badge.ts","../src/main/db/badge-index.ts","../src/main/db/bundle-header.ts","../src/main/db/level-range.ts","../src/main/db/zone.ts","../src/main/db/contact.ts","../src/main/db/mission.ts","../src/main/db/coh-content-database.ts","../src/main/db/location.ts","../src/main/util/links.ts"],"sourcesContent":["export const ALIGNMENT = ['hero', 'villain', 'praetorian'] as const\nexport type Alignment = typeof ALIGNMENT[number]\nexport type AlignmentExtended = Alignment\n /**\n * The alignments available for Primal Earth characters - Hero and Villain.\n */\n | 'primal'\n /**\n * All the alignments.\n */\n | 'all'\n\nconst ALIGNMENT_ORDER = Object.fromEntries(ALIGNMENT.map((x, index) => [x, index]))\n\nexport function compareAlignment(a?: Alignment, b?: Alignment): number {\n const orderA = a ? ALIGNMENT_ORDER[a] : -1\n const orderB = b ? ALIGNMENT_ORDER[b] : -1\n return orderA - orderB\n}\n","export const BADGE_REQUIREMENT_TYPE = [\n /**\n * Collect a badge.\n */\n 'badge',\n /**\n * Craft an invention.\n */\n 'invention',\n /**\n * Some invention badges require you to build x of two different invention levels, 'plus one of either level'.\n */\n 'invention-plus-one',\n /**\n * Visit a location.\n */\n 'location',\n /**\n * Click on a monument.\n */\n 'monument',\n /**\n * Complete a mission.\n */\n 'mission',\n /**\n * Complete an arbitrary task.\n */\n 'task',\n] as const\n\nexport type BadgeRequirementType = typeof BADGE_REQUIREMENT_TYPE[number]\n","export const BADGE_TYPE = [\n 'exploration',\n 'history',\n 'accomplishment',\n 'achievement',\n 'accolade',\n 'gladiator',\n 'veteran',\n 'pvp',\n 'invention',\n 'defeat',\n 'event',\n 'ouroboros',\n 'consignment',\n 'day-job',\n 'architect-entertainment',\n] as const\n\nexport type BadgeType = typeof BADGE_TYPE[number]\n","export const ENHANCEMENT_CATEGORY = [\n 'defense-debuff',\n 'to-hit-debuff',\n 'taunt',\n 'confuse',\n 'healing',\n 'defense-buff',\n 'resist-damage',\n 'intangibility',\n 'sleep',\n 'slow',\n 'hold',\n 'stun',\n 'immobilize',\n 'fear',\n 'endurance-modification',\n 'endurance-reduction',\n 'recharge-reduction',\n 'interrupt-duration',\n 'accuracy',\n 'to-hit-buff',\n 'damage',\n 'knockback',\n 'run-speed',\n 'jump',\n 'fly-speed',\n 'range',\n] as const\n\nexport type EnhancementCategory = typeof ENHANCEMENT_CATEGORY[number]\n","export const MISSION_TYPE = ['story-arc', 'mission', 'task-force', 'strike-force', 'trial', 'personal-story'] as const\nexport type MissionType = typeof MISSION_TYPE[number]\n","import { Alignment } from './alignment'\n\nexport const MORALITY = ['hero', 'vigilante', 'villain', 'rogue', 'resistance', 'loyalist'] as const\nexport const MORALITY_EXTENDED = [\n ...MORALITY,\n /**\n * Any of the Primal Earth moralities - Hero, Vigilante, Villain, Rogue.\n */\n 'primal',\n /**\n * Either of the Praetorian Earth moralities - Resistance or Loyalist.\n */\n 'praetorian',\n /**\n * The moralities that roll up to the Hero {@link Alignment} - Hero and Vigilante.\n */\n 'heroic',\n /**\n * The moralities that roll up to the Villain {@link Alignment} - Villain and Rogue.\n */\n 'villainous',\n /**\n * Moralities with access to Paragon City - Hero, Vigilante and Rogue.\n */\n 'paragon-city-access',\n /**\n * Moralities with access to the Rogue Isles - Villain, Rogue and Vigilante.\n */\n 'rogue-isles-access',\n /**\n * All the moralities.\n */\n 'all',\n] as const\nexport type Morality = typeof MORALITY[number]\nexport type MoralityExtended = typeof MORALITY_EXTENDED[number]\n\n/**\n * Maps a morality to the underlying alignment\n */\nexport const MoralityMap: Record<Morality | Alignment, Alignment> = {\n hero: 'hero',\n vigilante: 'hero',\n villain: 'villain',\n rogue: 'villain',\n loyalist: 'praetorian',\n resistance: 'praetorian',\n praetorian: 'praetorian',\n}\n","export const SEX = ['M', 'F'] as const\nexport type Sex = typeof SEX[number]\n\nconst SEX_ORDER = Object.fromEntries(SEX.map((x, index) => [x, index]))\n\nexport function compareSex(a?: Sex, b?: Sex): number {\n const orderA = a ? SEX_ORDER[a] : -1\n const orderB = b ? SEX_ORDER[b] : -1\n return orderA - orderB\n}\n","export const ZONE_TYPE = [\n /**\n * The standard zone type, even if not technically occurring in the 'City' proper.\n */\n 'city',\n /**\n * An Ouroboros flashback to a zone as it was in a previous era.\n */\n 'echo',\n /**\n * Tutorial zon, usually inaccessible after leaving.\n */\n 'tutorial',\n /**\n * Trial zones, like the Abandoned Sewers trial.\n */\n 'trial',\n /**\n * Hazard zones like the Hollows.\n */\n 'hazard',\n /**\n * Mayhem mission zones.\n */\n 'mayhem',\n /**\n * Safeguard mission zones.\n */\n 'safeguard',\n /**\n * Exists inside a mission not covered by the other types.\n */\n 'mission',\n /**\n * Incarnate trial zones.\n */\n 'incarnate',\n /**\n * Cooprative zones where Heroes and Villains can team up for PvE content.\n */\n 'co-op',\n /**\n * PvP zones like Bloody Bay.\n */\n 'pvp',\n /**\n * Located in an arena PvP map.\n */\n 'arena',\n /**\n * A building, usually contained within another zone, like the AE buildings.\n */\n 'building',\n /**\n * Stuff like the (Phone only) zone.\n */\n 'other',\n] as const\nexport type ZoneType = typeof ZONE_TYPE[number]\n","import { ALIGNMENT, Alignment, AlignmentExtended } from '../api/alignment'\n\nexport class AlignmentList {\n readonly #items: Set<Alignment>\n\n readonly hero: boolean\n readonly villain: boolean\n readonly praetorian: boolean\n\n readonly primal: boolean\n readonly all: boolean\n\n constructor(items?: AlignmentExtended[]) {\n const set = new Set(items ?? [...ALIGNMENT])\n this.hero = set.has('hero') || set.has('primal') || set.has('all')\n this.villain = set.has('villain') || set.has('primal') || set.has('all')\n this.praetorian = set.has('praetorian') || set.has('all')\n\n this.primal = this.hero && this.villain\n this.all = this.hero && this.villain && this.praetorian\n\n this.#items = new Set()\n if (this.hero) this.#items.add('hero')\n if (this.villain) this.#items.add('villain')\n if (this.praetorian) this.#items.add('praetorian')\n }\n\n get items(): Alignment[] {\n return [...this.#items]\n }\n\n has(alignment?: AlignmentExtended): boolean {\n switch (alignment) {\n case 'hero': {\n return this.hero\n }\n case 'villain': {\n return this.villain\n }\n case 'praetorian': {\n return this.praetorian\n }\n case 'primal' : {\n return this.primal\n }\n case 'all': {\n return this.all\n }\n default: {\n return false\n }\n }\n }\n}\n","const INVALID_KEY_PATTERN = /[^a-z0-9-]/\n\nexport class Key {\n readonly #value: string\n\n constructor(value: string) {\n this.#validateKey(value)\n this.#value = value\n }\n\n get value(): string {\n return this.#value\n }\n\n #validateKey(key: string): void {\n if (INVALID_KEY_PATTERN.test(key)) throw new Error(`Invalid key: [${key}]; Keys can only contain lowercase characters, numbers and dashes.`)\n }\n}\n","import { Key } from './key'\nimport { ArchetypeData } from '../api/archetype-data'\n\nexport class Archetype {\n readonly key: string\n readonly name: string\n readonly description?: string\n\n constructor(data: ArchetypeData) {\n this.key = new Key(data.key).value\n this.name = data.name\n this.description = data.description\n }\n}\n","/**\n * For fields that accept either an array of values or a single value, coalesces the value to an array.\n *\n * Arrays are returned as-is.\n * Single values are returned as a single-value array.\n * Undefined values are returned as undefined.\n *\n * @param value The value to coalesce.\n */\nexport function coalesceToArray<T>(value?: T | T[]): T[] | undefined {\n if (!value) return undefined\n return Array.isArray(value) ? value as T[] : [value]\n}\n","import { BadgeRequirementData } from '../api/badge-requirement-data'\nimport { BadgeRequirementType } from '../api/badge-requirement-type'\nimport { EnhancementCategory } from '../api/enhancement-category'\nimport { Key } from './key'\nimport { MarkdownString } from '../api/markdown-string'\nimport { Link } from '../api/link'\nimport { Location } from './location'\nimport { coalesceToArray } from '../util/coalesce-to-array'\n\nexport class BadgeRequirement {\n /**\n * Unique key used to reference this badge requirement.\n *\n * Keys must be unique and can only contain lowercase letters, numbers and hyphens (`-`).\n */\n readonly key: string\n\n /**\n * The requirement type.\n */\n readonly type: BadgeRequirementType\n\n /**\n * If the requirement involves a location, where it is.\n */\n readonly location?: Location[]\n\n /**\n * If the requirement involves a badge, the badge key.\n */\n readonly badgeKey?: string\n\n /**\n * If the requirement involves a mission, the mission key.\n */\n readonly missionKey?: string\n\n /**\n * If the requirement involves a monument, the text that is displayed thereon.\n */\n readonly monumentText?: string\n\n /**\n * If the requirement involves crafting an invention, the Level of the invention required.\n */\n readonly inventionLevel?: number\n\n /**\n * If the requirement involves crafting an invention, the types of enhancements that will qualify.\n */\n readonly inventionTypes?: EnhancementCategory[]\n\n /**\n * Number of times the task needs to be repeated.\n */\n readonly count?: number\n\n /**\n * Additional information about the requirement.\n */\n readonly notes?: MarkdownString\n\n /**\n * List of external links. Wiki, forums, etc.\n */\n readonly links: Link[]\n\n constructor(data: BadgeRequirementData) {\n this.key = new Key(data.key).value\n this.type = data.type\n this.location = coalesceToArray(data.location)\n this.badgeKey = data.badgeKey\n this.missionKey = data.missionKey\n this.monumentText = data.monumentText\n this.inventionLevel = data.inventionLevel\n this.inventionTypes = data.inventionTypes\n this.count = data.count\n this.notes = data.notes\n this.links = data.links ?? []\n }\n}\n","import { VariantData } from '../api/variant-data'\nimport { compareSex } from '../api/sex'\nimport { compareAlignment } from '../api/alignment'\nimport { VariantContext } from '../api/variant-context'\nimport { MoralityMap } from '../api/morality'\n\nexport class Variants<T> {\n readonly #sortedValues: VariantData<T>[] = []\n\n /**\n * Create a variant set from either a list of categorized values, or a single value when there are no variants.\n * @param value List of variants, or a single value.\n */\n constructor(value: VariantData<T>[] | T) {\n if (Array.isArray(value)) {\n this.#sortedValues = value.toSorted()\n this.#sortedValues.sort((a, b) => this.#compareVariants(a, b))\n } else {\n this.#sortedValues = [{ value }]\n }\n }\n\n /**\n * Get a variant by context\n * @param context The context\n */\n getVariant(context?: VariantContext): VariantData<T> | undefined {\n const alignment = context?.morality ? MoralityMap[context.morality] : undefined\n const sex = context?.sex\n\n for (let index = this.#sortedValues.length; index--;) {\n const entry = this.#sortedValues[index]\n if ((entry.alignment === undefined || entry.alignment === alignment)\n && (entry.sex === undefined || entry.sex === sex)\n ) return entry\n }\n\n return this.default\n }\n\n /**\n * Get a value by variant context\n * @param context The context\n */\n getValue(context?: VariantContext): T | undefined {\n return this.getVariant(context)?.value\n }\n\n /**\n * Get the default value for this list of variants, the value with the highest priority and lowest specificity.\n */\n get default(): VariantData<T> | undefined {\n return this.#sortedValues[0]\n }\n\n /**\n * Get the list of variants sorted in canonical order (alignment then sex, low to high specificity).\n */\n get canonical(): VariantData<T>[] {\n return this.#sortedValues\n }\n\n /**\n * Create a joined string from the variant values in canonical order.\n * @param separator Separator to use. Default is ' / '\n */\n toString(separator: string): string {\n return this.canonical.map(x => x.value).join(separator)\n }\n\n #compareVariants(a: VariantData<T>, b: VariantData<T>): number {\n const aSpecificity = (a.alignment ? 2 : 0) + (a.sex ? 1 : 0)\n const bSpecificity = (b.alignment ? 2 : 0) + (b.sex ? 1 : 0)\n if (aSpecificity !== bSpecificity) return aSpecificity - bSpecificity // Order first by least-specific\n\n const alignmentComparison = compareAlignment(a.alignment, b.alignment) // Next by alignment\n if (alignmentComparison !== 0) return alignmentComparison\n\n const sexComparison = compareSex(a.sex, b.sex) // Last by sex\n if (sexComparison !== 0) return sexComparison\n\n return String(a.value).localeCompare(String(b.value))\n }\n}\n","import { MORALITY, Morality, MoralityExtended } from '../api/morality'\n\nexport class MoralityList {\n readonly #items: Set<Morality>\n\n readonly hero: boolean\n readonly vigilante: boolean\n readonly villain: boolean\n readonly rogue: boolean\n readonly resistance: boolean\n readonly loyalist: boolean\n\n readonly primal: boolean\n readonly praetorian: boolean\n readonly heroic: boolean\n readonly villainous: boolean\n readonly paragonCityAccess: boolean\n readonly rogueIslesAccess: boolean\n\n readonly all: boolean\n\n constructor(items?: MoralityExtended[]) {\n const set = new Set(items ?? [...MORALITY])\n this.hero = set.has('hero') || set.has('primal') || set.has('heroic') || set.has('paragon-city-access') || set.has('all')\n this.vigilante = set.has('vigilante') || set.has('primal') || set.has('heroic') || set.has('paragon-city-access') || set.has('rogue-isles-access') || set.has('all')\n this.villain = set.has('villain') || set.has('primal') || set.has('villainous') || set.has('rogue-isles-access') || set.has('all')\n this.rogue = set.has('rogue') || set.has('primal') || set.has('villainous') || set.has('paragon-city-access') || set.has('rogue-isles-access') || set.has('all')\n this.resistance = set.has('resistance') || set.has('praetorian') || set.has('all')\n this.loyalist = set.has('loyalist') || set.has('praetorian') || set.has('all')\n\n this.primal = this.hero && this.vigilante && this.villain && this.rogue\n this.praetorian = this.loyalist && this.resistance\n this.heroic = this.hero && this.vigilante\n this.villainous = this.villain && this.rogue\n this.paragonCityAccess = this.heroic && this.rogue\n this.rogueIslesAccess = this.villainous && this.vigilante\n\n this.all = this.primal && this.praetorian\n\n this.#items = new Set()\n if (this.hero) this.#items.add('hero')\n if (this.vigilante) this.#items.add('vigilante')\n if (this.villain) this.#items.add('villain')\n if (this.rogue) this.#items.add('rogue')\n if (this.resistance) this.#items.add('resistance')\n if (this.loyalist) this.#items.add('loyalist')\n }\n\n get items(): Morality[] {\n return [...this.#items]\n }\n\n has(morality?: MoralityExtended): boolean {\n switch (morality) {\n case 'hero': {\n return this.hero\n }\n case 'vigilante': {\n return this.vigilante\n }\n case 'villain': {\n return this.villain\n }\n case 'rogue': {\n return this.rogue\n }\n case 'resistance': {\n return this.resistance\n }\n case 'loyalist': {\n return this.loyalist\n }\n case 'primal' : {\n return this.primal\n }\n case 'praetorian': {\n return this.praetorian\n }\n case 'heroic': {\n return this.hero\n }\n case 'paragon-city-access': {\n return this.paragonCityAccess\n }\n case 'rogue-isles-access': {\n return this.rogueIslesAccess\n }\n case 'villainous': {\n return this.villainous\n }\n case 'all': {\n return this.all\n }\n default: {\n return false\n }\n }\n }\n}\n","type KeysOfType<T, V> = { [P in keyof T]: T[P] extends V ? P : never }[keyof T]\n\nexport class AbstractIndex<T> {\n protected _values: T[] = []\n protected _hashTable: Record<string, T> = {}\n\n /**\n * Create a new index.\n * @param keyField The field of the values that will act as the key.\n * @param values Values to index.\n */\n constructor(keyField: KeysOfType<T, string>, values: T[] | undefined) {\n this._values = values ?? []\n this._hashTable = {}\n for (const value of this.values) {\n const key = value[keyField] as string\n if (this._hashTable[key] !== undefined) throw new Error(`Duplicate key [${key}]`)\n this._hashTable[key] = value\n }\n }\n\n /**\n * Return all indexed values\n */\n get values(): T[] {\n return this._values\n }\n\n /**\n * Get a value from the index\n * @param key Key string\n */\n get(key: string | undefined): T | undefined {\n if (!key) return undefined\n return this._hashTable[key]\n }\n}\n","/**\n * Converts an iso string to a Date object, throwing an error if the iso string is invalid.\n * @param iso ISO-8601 Date string\n */\nexport function toDate(iso: string): Date {\n const date = new Date(iso)\n if (!date || Number.isNaN(date.getTime())) throw new Error(`Invalid date format: [${iso}]`)\n return date\n}\n","import { SetTitleData } from '../api/set-title-data'\n\nexport class SetTitleIds {\n readonly primal: number\n readonly praetorian?: number\n\n constructor(value: SetTitleData) {\n [this.primal, this.praetorian] = value\n }\n}\n","import { BadgeType } from '../api/badge-type'\nimport { Link } from '../api/link'\nimport { BadgeData } from '../api/badge-data'\nimport { BadgeRequirement } from './badge-requirement'\nimport { Key } from './key'\nimport { Variants } from './variants'\nimport { MarkdownString } from '../api/markdown-string'\nimport { MoralityList } from './morality-list'\nimport { AbstractIndex } from './abstract-index'\nimport { toDate } from '../util/to-date'\nimport { coalesceToArray } from '../util/coalesce-to-array'\nimport { SetTitleIds } from './set-title-ids'\nimport { VariantContext } from '../api/variant-context'\n\nexport class Badge {\n readonly #requirementsIndex: AbstractIndex<BadgeRequirement>\n readonly #zoneKeys = new Set<string>()\n\n /**\n * The database key for this badge.\n */\n readonly key: string\n\n /**\n * The type of badge.\n */\n readonly type: BadgeType\n\n /**\n * The name of this badge.\n *\n * May vary by character sex or alignment.\n */\n readonly name: Variants<string>\n\n /**\n * The date that the badge was added to the game.\n */\n readonly releaseDate: Date\n\n /**\n * The character moralities that this badge is available to.\n */\n readonly morality: MoralityList\n\n /**\n * The badge text as it appears in-game. May vary by character sex or alignment.\n */\n readonly badgeText: Variants<MarkdownString>\n\n /**\n * Short description of how to acquire the badge. Detailed instructions will be in the notes field.\n */\n readonly acquisition?: MarkdownString\n\n /**\n * Absolute URL to this badge's icon.\n *\n * May vary by character sex or alignment.\n */\n readonly icon: Variants<string>\n\n /**\n * Freeform notes or tips about the badge.\n */\n readonly notes?: MarkdownString\n\n /**\n * List of external links. Wiki, forums, etc.\n */\n readonly links: Link[]\n\n /**\n * The id used with the in-game `/settitle` command to apply the badge.\n * The first value is the id for primal characters and the (optional) second number is the id for praetorian characters.\n */\n readonly setTitleId?: SetTitleIds\n\n /**\n * A description of the effect the badge will have, such as a buff or granting a temporary power.\n */\n readonly effect?: MarkdownString\n\n /**\n * Some badges are not included in the badge total count... such as Flames of Prometheus, which can be removed by redeeming it for a Notice of the Well.\n */\n readonly ignoreInTotals: boolean\n\n constructor(badgeData: BadgeData) {\n this.key = new Key(badgeData.key).value\n this.type = badgeData.type\n this.name = new Variants(badgeData.name)\n this.releaseDate = toDate(badgeData.releaseDate)\n this.morality = new MoralityList(coalesceToArray(badgeData.morality))\n this.badgeText = new Variants(badgeData.badgeText ?? [])\n this.acquisition = badgeData.acquisition\n this.icon = new Variants(badgeData.icon ?? [])\n this.notes = badgeData.notes\n this.links = badgeData.links ?? []\n this.effect = badgeData.effect\n this.setTitleId = badgeData.setTitleId ? new SetTitleIds(badgeData.setTitleId) : undefined\n this.ignoreInTotals = badgeData.ignoreInTotals ?? false\n\n this.#requirementsIndex = new AbstractIndex<BadgeRequirement>('key', badgeData.requirements?.map(x => new BadgeRequirement(x)))\n\n for (const requirement of this.#requirementsIndex.values) {\n if (requirement.location) for (const location of requirement.location) {\n if (location.zoneKey) this.#zoneKeys.add(location.zoneKey)\n }\n }\n }\n\n /**\n * Represents the requirements for badges with multiple fulfillment steps, such as visiting monuments for history badges, completing missions, or collecting other badges.\n */\n get requirements(): BadgeRequirement[] {\n return this.#requirementsIndex.values\n }\n\n getRequirement(key: string): BadgeRequirement | undefined {\n return this.#requirementsIndex.get(key)\n }\n\n /**\n * Return a list of all the zone keys referenced by this badge.\n */\n get zoneKeys(): string[] {\n return [...this.#zoneKeys]\n }\n\n /**\n * The zone key if this badge relates to a single zone.\n */\n get zoneKey(): string | undefined {\n return this.#zoneKeys.size === 1 ? this.#zoneKeys.values().next().value : undefined\n }\n}\n\nexport function compareByName(a?: Badge, b?: Badge, context?: VariantContext): number {\n const aName = a?.name?.getValue(context)\n const bName = b?.name?.getValue(context)\n if (!aName && !bName) return 0\n if (!aName) return 1\n if (!bName) return -1\n return aName.localeCompare(bName)\n}\n\nexport function compareByZoneKey(a?: Badge, b?: Badge): number {\n const aZone = a?.zoneKey\n const bZone = b?.zoneKey\n if (!aZone && !bZone) return 0\n if (!aZone) return 1\n if (!bZone) return -1\n return aZone.localeCompare(bZone)\n}\n\nexport function compareByReleaseDate(a?: Badge, b?: Badge): number {\n const aReleaseDate = a?.releaseDate?.getTime()\n const bReleaseDate = b?.releaseDate?.getTime()\n if (aReleaseDate === bReleaseDate) return 0\n if (!aReleaseDate) return 1\n if (!bReleaseDate) return -1\n return aReleaseDate < bReleaseDate ? -1 : 1\n}\n","import { Badge, compareByName, compareByReleaseDate, compareByZoneKey } from './badge'\nimport { BadgeSearchOptions } from './badge-search-options'\nimport { Paged } from './paged'\nimport { AbstractIndex } from './abstract-index'\n\nexport class BadgeIndex extends AbstractIndex<Badge> {\n constructor(values: Badge[] | undefined) {\n super('key', values)\n }\n\n search(options?: BadgeSearchOptions): Paged<Badge> {\n const matched = (options?.query || options?.filter)\n ? this._values.filter(badge => this.#satisfiesQueryPredicate(badge, options?.query) && this.#satisfiesFilterPredicate(badge, options?.filter))\n : this._values\n\n const sorted = this.#sort(matched, options)\n\n const totalPages = options?.pageSize ? Math.ceil(matched.length / (options?.pageSize)) : 1\n const pageNumber = Math.max(1, Math.min(totalPages, options?.page ?? 1))\n const items = options?.pageSize ? sorted.slice((pageNumber - 1) * options.pageSize, pageNumber * options?.pageSize) : sorted\n\n return {\n items: items,\n pageIndex: pageNumber - 1,\n pageNumber: pageNumber,\n pageSize: options?.pageSize,\n matchedItemCount: matched.length,\n totalItemCount: this._values.length,\n totalPageCount: totalPages,\n }\n }\n\n #satisfiesQueryPredicate(badge: Badge, query?: BadgeSearchOptions['query']): boolean {\n const queryString = query?.str?.toLowerCase() ?? ''\n const fields = query?.fields ? new Set(query?.fields) : new Set(['name']) // Default to name if not provided\n if (fields.size === 0) return true\n\n return !!((fields.has('name') && badge.name.canonical.some(x => x.value.toLowerCase().includes(queryString)))\n || (fields.has('badge-text') && badge.badgeText.canonical.some(x => x.value.toLowerCase().includes(queryString)))\n || (fields.has('acquisition') && badge.acquisition?.toLowerCase().includes(queryString))\n || (fields.has('effect') && badge.effect?.toLowerCase().includes(queryString))\n || (fields.has('notes') && badge.notes?.toLowerCase().includes(queryString))\n || (fields.has('set-title-id') && (badge.setTitleId?.primal.toString() === queryString))\n || (fields.has('set-title-id') && (badge.setTitleId?.praetorian?.toString() === queryString))\n )\n }\n\n #satisfiesFilterPredicate(badge: Badge, filter?: BadgeSearchOptions['filter']): boolean {\n return (!filter?.type || badge.type === filter.type)\n && (!filter?.zoneKey || badge.zoneKey === filter.zoneKey)\n && (!filter?.morality || badge.morality.has(filter.morality))\n && (!filter?.predicate || filter.predicate(badge))\n }\n\n #sort(badges: Badge[], options?: BadgeSearchOptions): Badge[] {\n switch (options?.sort) {\n case 'name.asc': {\n return badges.toSorted((a, b) => compareByName(a, b, options.variantContext))\n }\n case 'name.desc': {\n return badges.toSorted((a, b) => compareByName(b, a, options.variantContext))\n }\n case 'zone-key.asc': {\n return badges.toSorted(compareByZoneKey)\n }\n case 'zone-key.desc': {\n return badges.toSorted((a, b) => compareByZoneKey(b, a))\n }\n case 'release-date.asc': {\n return badges.toSorted(compareByReleaseDate)\n }\n case 'release-date.desc': {\n return badges.toSorted((a, b) => compareByReleaseDate(b, a))\n }\n case 'canonical.desc': {\n return badges.toReversed()\n }\n default: {\n return [...badges]\n }\n }\n }\n}\n","import { Link } from '../api/link'\nimport { MarkdownString } from '../api/markdown-string'\nimport { BundleHeaderData } from '../api/bundle-header-data'\nimport { toDate } from '../util/to-date'\n\nexport class BundleHeader {\n /**\n * Name of the fork this bundle contains data for.\n */\n readonly name: string\n\n /**\n * Version number for this data package.\n */\n readonly version: string\n\n /**\n * The time this bundle was last updated.\n */\n readonly lastUpdateTime: Date\n\n /**\n * Description of the fork.\n */\n readonly description?: MarkdownString\n\n /**\n * Url for the repository where the bundle is maintained.\n */\n readonly repositoryUrl?: string\n\n /**\n * Url for the location of the changelog.\n */\n readonly changelogUrl?: string\n\n /**\n * List of external links. Wiki, forums, etc.\n */\n readonly links?: Link[]\n\n constructor(data: BundleHeaderData) {\n if (!data) throw new Error('Missing header data')\n this.name = data.name\n this.version = data.version\n this.lastUpdateTime = toDate(data.lastUpdateTime)\n this.description = data?.description\n this.repositoryUrl = data?.repositoryUrl\n this.changelogUrl = data?.changelogUrl\n this.links = data?.links ?? []\n }\n}\n","import { LevelRangeData } from '../api/level-range-data'\n\nexport class LevelRange {\n readonly min: number\n readonly max?: number\n\n constructor(value: LevelRangeData) {\n if (Array.isArray(value)) {\n this.min = value[0]\n this.max = value[1] === undefined ? undefined : value[1]\n } else {\n this.min = value\n }\n }\n}\n","import { Link } from '../api/link'\nimport { ZoneData } from '../api/zone-data'\nimport { Key } from './key'\nimport { MoralityList } from './morality-list'\nimport { coalesceToArray } from '../util/coalesce-to-array'\nimport { ZoneType } from '../api/zone-type'\nimport { MarkdownString } from '../api/markdown-string'\nimport { LevelRange } from './level-range'\n\nexport class Zone {\n /**\n * Unique key used to reference this zone.\n *\n * Keys must be unique and can only contain lowercase letters, numbers and hyphens (`-`).\n */\n readonly key: string\n\n /**\n * The name of the zone as it appears in-game.\n */\n readonly name: string\n\n /**\n * The type of zone.\n */\n readonly type: ZoneType\n\n /**\n * The character moralities that this zone is accessible by.\n */\n readonly morality: MoralityList\n\n /**\n * The level range this zone is recommended for.\n */\n readonly levelRange?: LevelRange\n\n /**\n * Freeform notes or tips about the zone.\n */\n readonly notes?: MarkdownString\n\n /**\n * List of external links. Wiki, forums, etc.\n */\n readonly links: Link[]\n\n constructor(data: ZoneData) {\n this.key = new Key(data.key).value\n this.name = data.name\n this.type = data.type\n this.morality = new MoralityList(coalesceToArray(data.morality))\n this.levelRange = data.levelRange ? new LevelRange(data.levelRange) : undefined\n this.notes = data.notes\n this.links = data.links ?? []\n }\n}\n","import { Link } from '../api/link'\nimport { Key } from './key'\nimport { MarkdownString } from '../api/markdown-string'\nimport { ContactData } from '../api/contact-data'\nimport { Location } from './location'\nimport { MoralityList } from './morality-list'\nimport { coalesceToArray } from '../util/coalesce-to-array'\nimport { LevelRange } from './level-range'\n\nexport class Contact {\n /**\n * Unique key used to reference this contact.\n *\n * Keys must be unique and can only contain lowercase letters, numbers and hyphens (`-`).\n */\n readonly key: string\n\n /**\n * The name of this contact.\n */\n readonly name: string\n\n /**\n * The contact's title.\n */\n readonly title?: string\n\n /**\n * The character moralities that this contact will interact with.\n */\n readonly morality: MoralityList\n\n /**\n * The location of this contact.\n */\n readonly location?: Location\n\n /**\n * The level range this contact will offer missions for.\n */\n readonly levelRange?: LevelRange\n\n /**\n * Freeform notes or tips about the contact.\n */\n readonly notes?: MarkdownString\n\n /**\n * List of external links. Wiki, forums, etc.\n */\n readonly links: Link[]\n\n constructor(data: ContactData) {\n this.key = new Key(data.key).value\n this.name = data.name\n this.title = data.title\n this.morality = new MoralityList(coalesceToArray(data.morality))\n this.location = data.location\n this.levelRange = data.levelRange ? new LevelRange(data.levelRange) : undefined\n this.notes = data.notes\n this.links = data.links ?? []\n }\n}\n","import { MissionType } from '../api/mission-type'\nimport { MarkdownString } from '../api/markdown-string'\nimport { Link } from '../api/link'\nimport { MissionData } from '../api/mission-data'\nimport { Key } from './key'\nimport { MoralityList } from './morality-list'\nimport { coalesceToArray } from '../util/coalesce-to-array'\nimport { LevelRange } from './level-range'\n\nexport class Mission {\n /**\n * Unique key used to reference this mission.\n *\n * Keys must be unique and can only contain lowercase letters, numbers and hyphens (`-`).\n */\n readonly key: string\n\n /**\n * The name of the mission as it appears from the contact.\n *\n * The name may be different when viewed in Ouroboros as a Flashback.\n */\n readonly name: string\n\n /**\n * The type of mission... Story arc, task force, trial, etc.\n */\n readonly type: MissionType\n\n /**\n * The character moralities that may accept the mission.\n */\n readonly morality: MoralityList\n\n /**\n * The keys of any contacts that provide this mission.\n */\n readonly contactKeys?: string[]\n\n /**\n * The level range this mission is available for.\n */\n readonly levelRange?: LevelRange\n\n /**\n * Freeform notes or tips about the mission.\n */\n readonly notes?: MarkdownString\n\n /**\n * List of external links. Wiki, forums, etc.\n */\n readonly links: Link[]\n\n /**\n * If the mission is available in Ouroboros as a Flashback.\n */\n readonly flashback?: {\n\n /**\n * The id of the mission as seen in the Flashback menu, i.e. '14.01'.\n */\n readonly id: string\n\n /**\n * The level range this mission appears under as a Flashback.\n */\n readonly levelRange?: LevelRange\n\n /**\n * The name as it appears in the Flashback list.\n */\n readonly name: string\n\n /**\n * The character moralities that the mission will appear for in the Flashback list.\n */\n readonly morality: MoralityList\n\n /**\n * Freeform notes or tips about the Flashback version of the mission.\n */\n readonly notes?: MarkdownString\n }\n\n constructor(data: MissionData) {\n this.key = new Key(data.key).value\n this.name = data.name\n this.type = data.type\n this.morality = new MoralityList(coalesceToArray(data.morality))\n this.contactKeys = coalesceToArray(data.contactKeys)\n this.levelRange = data.levelRange ? new LevelRange(data.levelRange) : undefined\n this.notes = data.notes\n this.links = data.links ?? []\n this.flashback = createFlashback(data)\n }\n}\n\nfunction createFlashback(data: MissionData): Mission['flashback'] {\n if (!data.flashback) return undefined\n return {\n id: data.flashback.id,\n levelRange: data.flashback.levelRange ? new LevelRange(data.flashback.levelRange) : undefined,\n name: data.flashback.name ?? data.name,\n morality: new MoralityList(coalesceToArray(data.flashback.morality ?? data.morality)),\n notes: data.flashback.notes,\n }\n}\n","import { BundleData } from '../api/bundle-data'\nimport { Archetype } from './archetype'\nimport { Zone } from './zone'\nimport { Badge } from './badge'\nimport { BundleHeader } from './bundle-header'\nimport { BadgeSearchOptions } from './badge-search-options'\nimport { Paged } from './paged'\nimport { Contact } from './contact'\nimport { Mission } from './mission'\nimport { AbstractIndex } from './abstract-index'\nimport { BadgeIndex } from './badge-index'\n\nexport class CohContentDatabase {\n readonly #archetypeIndex\n readonly #zoneIndex\n readonly #contactIndex\n readonly #missionIndex\n readonly #badgeIndex\n\n readonly #header: BundleHeader\n readonly #servers: string[]\n\n /**\n * Create a db instance from the given content bundle.\n * @param bundle The bundle to load.\n */\n constructor(bundle: BundleData) {\n this.#header = new BundleHeader(bundle.header)\n this.#servers = bundle.servers ?? []\n\n this.#archetypeIndex = new AbstractIndex<Archetype>('key', bundle.archetypes?.map(x => new Archetype(x)))\n this.#zoneIndex = new AbstractIndex<Zone>('key', bundle.zones?.map(x => new Zone(x)))\n this.#contactIndex = new AbstractIndex<Contact>('key', bundle.contacts?.map(x => new Contact(x)))\n this.#missionIndex = new AbstractIndex<Mission>('key', bundle.missions?.map(x => new Mission(x)))\n this.#badgeIndex = new BadgeIndex(bundle.badges?.map(x => new Badge(x)))\n }\n\n /**\n * Header information about the content bundle.\n */\n get header(): BundleHeader {\n return this.#header\n }\n\n /**\n * List of the game server names.\n *\n * Torchbearer, Excelsior, etc.\n */\n get servers(): string[] {\n return this.#servers\n }\n\n /**\n * List of archetypes.\n */\n get archetypes(): Archetype[] {\n return this.#archetypeIndex.values\n }\n\n /**\n * Get archetype by key.\n * @param key The key.\n */\n getArchetype(key: string | undefined): Archetype | undefined {\n return this.#archetypeIndex.get(key)\n }\n\n /**\n * List of game zones.\n */\n get zones(): Zone[] {\n return this.#zoneIndex.values\n }\n\n /**\n * Get zone by key.\n * @param key The key.\n */\n getZone(key: string | undefined): Zone | undefined {\n return this.#zoneIndex.get(key)\n }\n\n /**\n * List of contacts.\n */\n get contacts(): Contact[] {\n return this.#contactIndex.values\n }\n\n /**\n * Get contact by key.\n * @param key The key.\n */\n getContact(key: string | undefined): Contact | undefined {\n return this.#contactIndex.get(key)\n }\n\n /**\n * List of missions.\n */\n get missions(): Mission[] {\n return this.#missionIndex.values\n }\n\n /**\n * Get mission by key.\n * @param key The key.\n */\n getMission(key: string | undefined): Mission | undefined {\n return this.#missionIndex.get(key)\n }\n\n /**\n * List of badges.\n */\n get badges(): Badge[] {\n return this.#badgeIndex.values\n }\n\n /**\n * Get badge by key.\n * @param key The key.\n */\n getBadge(key: string | undefined): Badge | undefined {\n return this.#badgeIndex.get(key)\n }\n\n /**\n * Search, sort and filter the badge list.\n * This is a fairly brute-forced approach and will not be as performant as loading the badge data into a traditional\n * database engine, but is sufficient for most operations.\n * @param options {@link BadgeSearchOptions}\n */\n searchBadges(options?: BadgeSearchOptions): Paged<Badge> {\n return this.#badgeIndex.search(options)\n }\n}\n","import { Coords, LocationData, LocationIcon } from '../api/location-data'\n\nexport class Location {\n /**\n * Key of the {@link Zone} that the location references.\n */\n readonly zoneKey?: string\n\n /**\n * In-game `/loc` coordinates of the location.\n */\n readonly coords?: Coords\n\n /**\n * The type of icon to use if the location appears on a map. (Typically the Vidiot map icon).\n */\n readonly icon?: LocationIcon\n\n /**\n * The text that should appear in the location icon. (Typically a number or symbol from the Vidiot map).\n */\n readonly iconText?: string\n\n constructor(data: LocationData) {\n this.zoneKey = data.zoneKey\n this.coords = data.coords\n this.icon = data.icon\n this.iconText = data.iconText\n }\n}\n","import { BadgeData } from '../api/badge-data'\nimport { Badge } from '../db/badge'\nimport { ZoneData } from '../api/zone-data'\nimport { Zone } from '../db/zone'\nimport { Contact } from '../db/contact'\nimport { ContactData } from '../api/contact-data'\nimport { Mission } from '../db/mission'\nimport { MissionData } from '../api/mission-data'\n\n/**\n * Returns the URI of the given badge that can be used in {@link MarkdownString} fields.\n *\n * URI format: `badge://<key>`\n *\n * @param target The badge or badge key to target.\n */\nexport function badgeUri(target: string | Badge | BadgeData): string {\n const key = typeof target === 'string' ? target : target.key\n return `badge://${key}`\n}\n\n/**\n * Returns a {@link MarkdownString} link to the given badge.\n *\n * Link format: `[<key>](badge://<key>)`\n *\n * @param target The {@link Badge} or badge key to target.\n */\nexport function badgeLink(target: string | Badge | BadgeData): string {\n const key = typeof target === 'string' ? target : target.key\n return `[${key}](${badgeUri(target)})`\n}\n\n/**\n * Returns the URI of the given contact that can be used in {@link MarkdownString} fields.\n *\n * URI format: `contact://<key>`\n *\n * @param target The {@link Contact} or contact key to target.\n */\nexport function contactUri(target: string | Contact | ContactData): string {\n const key = typeof target === 'string' ? target : target.key\n return `contact://${key}`\n}\n\n/**\n * Returns a {@link MarkdownString} link to the given contact.\n *\n * Link format: `[<key>](contact://<key>)`\n *\n * @param target The {@link Contact} or contact key to target.\n */\nexport function contactLink(target: string | Contact | ContactData): string {\n const key = typeof target === 'string' ? target : target.key\n return `[${key}](${contactUri(target)})`\n}\n\n/**\n * Returns the URI of the given mission that can be used in {@link MarkdownString} fields.\n *\n * URI format: `mission://<key>`\n *\n * @param target The {@link Mission} or mission key to target.\n */\nexport function missionUri(target: string | Mission | MissionData): string {\n const key = typeof target === 'string' ? target : target.key\n return `mission://${key}`\n}\n\n/**\n * Returns a {@link MarkdownString} link to the given mission.\n *\n * Link format: `[<key>](mission://<key>)`\n *\n * @param target The {@link Mission} or mission key to target.\n */\nexport function missionLink(target: string | Mission | MissionData): string {\n const key = typeof target === 'string' ? target : target.key\n return `[${key}](${missionUri(target)})`\n}\n\n/**\n * Returns the URI of the given zone that can be used in {@link MarkdownString} fields.\n *\n * URI format: `zone://<key>`\n *\n * @param target The {@link Zone} or zone key to target.\n */\nexport function zoneUri(target: string | Zone | ZoneData): string {\n const key = typeof target === 'string' ? target : target.key\n return `zone://${key}`\n}\n\n/**\n * Returns a {@link MarkdownString} link to the given zone.\n *\n * Link format: `[<key>](zone://<key>)`\n *\n * @param target The {@link Zone} or zone key to target.\n */\nexport function zoneLink(target: string | Zone | ZoneData): string {\n const key = typeof target === 'string' ? target : target.key\n return `[${key}](${zoneUri(target)})`\n}\n"],"names":["_items","__privateAdd","__publicField","__privateSet","__privateGet","__privateMethod"],"mappings":";;AAAO,MAAM,SAAA,GAAY,CAAC,MAAA,EAAQ,SAAA,EAAW,YAAY;AAYzD,MAAM,eAAA,GAAkB,MAAA,CAAO,WAAA,CAAY,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,EAAG,KAAA,KAAU,CAAC,CAAA,EAAG,KAAK,CAAC,CAAC,CAAA;AAE3E,SAAS,gBAAA,CAAiB,GAAe,CAAA,EAAuB;AACrE,EAAA,MAAM,MAAA,GAAS,CAAA,GAAI,eAAA,CAAgB,CAAC,CAAA,GAAI,EAAA;AACxC,EAAA,MAAM,MAAA,GAAS,CAAA,GAAI,eAAA,CAAgB,CAAC,CAAA,GAAI,EAAA;AACxC,EAAA,OAAO,MAAA,GAAS,MAAA;AAClB;;AClBO,MAAM,sBAAA,GAAyB;AAAA;AAAA;AAAA;AAAA,EAIpC,OAAA;AAAA;AAAA;AAAA;AAAA,EAIA,WAAA;AAAA;AAAA;AAAA;AAAA,EAIA,oBAAA;AAAA;AAAA;AAAA;AAAA,EAIA,UAAA;AAAA;AAAA;AAAA;AAAA,EAIA,UAAA;AAAA;AAAA;AAAA;AAAA,EAIA,SAAA;AAAA;AAAA;AAAA;AAAA,EAIA;AACF;;AC7BO,MAAM,UAAA,GAAa;AAAA,EACxB,aAAA;AAAA,EACA,SAAA;AAAA,EACA,gBAAA;AAAA,EACA,aAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF;;AChBO,MAAM,oBAAA,GAAuB;AAAA,EAClC,gBAAA;AAAA,EACA,eAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,cAAA;AAAA,EACA,eAAA;AAAA,EACA,eAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,MAAA;AAAA,EACA,wBAAA;AAAA,EACA,qBAAA;AAAA,EACA,oBAAA;AAAA,EACA,oBAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF;;AC3BO,MAAM,eAAe,CAAC,WAAA,EAAa,WAAW,YAAA,EAAc,cAAA,EAAgB,SAAS,gBAAgB;;ACErG,MAAM,WAAW,CAAC,MAAA,EAAQ,aAAa,SAAA,EAAW,OAAA,EAAS,cAAc,UAAU;AACnF,MAAM,iBAAA,GAAoB;AAAA,EAC/B,GAAG,QAAA;AAAA;AAAA;AAAA;AAAA,EAIH,QAAA;AAAA;AAAA;AAAA;AAAA,EAIA,YAAA;AAAA;AAAA;AAAA;AAAA,EAIA,QAAA;AAAA;AAAA;AAAA;AAAA,EAIA,YAAA;AAAA;AAAA;AAAA;AAAA,EAIA,qBAAA;AAAA;AAAA;AAAA;AAAA,EAIA,oBAAA;AAAA;AAAA;AAAA;AAAA,EAIA;AACF;AAOO,MAAM,WAAA,GAAuD;AAAA,EAClE,IAAA,EAAM,MAAA;AAAA,EACN,SAAA,EAAW,MAAA;AAAA,EACX,OAAA,EAAS,SAAA;AAAA,EACT,KAAA,EAAO,SAAA;AAAA,EACP,QAAA,EAAU,YAAA;AAAA,EACV,UAAA,EAAY,YAAA;AAAA,EACZ,UAAA,EAAY;AACd;;AChDO,MAAM,GAAA,GAAM,CAAC,GAAA,EAAK,GAAG;AAG5B,MAAM,SAAA,GAAY,MAAA,CAAO,WAAA,CAAY,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,EAAG,KAAA,KAAU,CAAC,CAAA,EAAG,KAAK,CAAC,CAAC,CAAA;AAE/D,SAAS,UAAA,CAAW,GAAS,CAAA,EAAiB;AACnD,EAAA,MAAM,MAAA,GAAS,CAAA,GAAI,SAAA,CAAU,CAAC,CAAA,GAAI,EAAA;AAClC,EAAA,MAAM,MAAA,GAAS,CAAA,GAAI,SAAA,CAAU,CAAC,CAAA,GAAI,EAAA;AAClC,EAAA,OAAO,MAAA,GAAS,MAAA;AAClB;;ACTO,MAAM,SAAA,GAAY;AAAA;AAAA;AAAA;AAAA,EAIvB,MAAA;AAAA;AAAA;AAAA;AAAA,EAIA,MAAA;AAAA;AAAA;AAAA;AAAA,EAIA,UAAA;AAAA;AAAA;AAAA;AAAA,EAIA,OAAA;AAAA;AAAA;AAAA;AAAA,EAIA,QAAA;AAAA;AAAA;AAAA;AAAA,EAIA,QAAA;AAAA;AAAA;AAAA;AAAA,EAIA,WAAA;AAAA;AAAA;AAAA;AAAA,EAIA,SAAA;AAAA;AAAA;AAAA;AAAA,EAIA,WAAA;AAAA;AAAA;AAAA;AAAA,EAIA,OAAA;AAAA;AAAA;AAAA;AAAA,EAIA,KAAA;AAAA;AAAA;AAAA;AAAA,EAIA,OAAA;AAAA;AAAA;AAAA;AAAA,EAIA,UAAA;AAAA;AAAA;AAAA;AAAA,EAIA;AACF;;;;;;;;;;;;ACzDA,IAAAA,QAAA;AAEO,MAAM,aAAA,CAAc;AAAA,EAUzB,YAAY,KAAA,EAA6B;AATzC,IAAAC,cAAA,CAAA,IAAA,EAASD,QAAA,CAAA;AAET,IAAAE,eAAA,CAAA,IAAA,EAAS,MAAA,CAAA;AACT,IAAAA,eAAA,CAAA,IAAA,EAAS,SAAA,CAAA;AACT,IAAAA,eAAA,CAAA,IAAA,EAAS,YAAA,CAAA;AAET,IAAAA,eAAA,CAAA,IAAA,EAAS,QAAA,CAAA;AACT,IAAAA,eAAA,CAAA,IAAA,EAAS,KAAA,CAAA;AAGP,IAAA,MAAM,MAAM,IAAI,GAAA,CAAI,SAAS,CAAC,GAAG,SAAS,CAAC,CAAA;AAC3C,IAAA,IAAA,CAAK,IAAA,GAAO,GAAA,CAAI,GAAA,CAAI,MAAM,CAAA,IAAK,GAAA,CAAI,GAAA,CAAI,QAAQ,CAAA,IAAK,GAAA,CAAI,GAAA,CAAI,KAAK,CAAA;AACjE,IAAA,IAAA,CAAK,OAAA,GAAU,GAAA,CAAI,GAAA,CAAI,SAAS,CAAA,IAAK,GAAA,CAAI,GAAA,CAAI,QAAQ,CAAA,IAAK,GAAA,CAAI,GAAA,CAAI,KAAK,CAAA;AACvE,IAAA,IAAA,CAAK,aAAa,GAAA,CAAI,GAAA,CAAI,YAAY,CAAA,IAAK,GAAA,CAAI,IAAI,KAAK,CAAA;AAExD,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,OAAA;AAChC,IAAA,IAAA,CAAK,GAAA,GAAM,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,WAAW,IAAA,CAAK,UAAA;AAE7C,IAAAC,cAAA,CAAA,IAAA,EAAKH,QAAA,sBAAa,GAAA,EAAI,CAAA;AACtB,IAAA,IAAI,IAAA,CAAK,IAAA,EAAMI,cAAA,CAAA,IAAA,EAAKJ,QAAA,CAAA,CAAO,IAAI,MAAM,CAAA;AACrC,IAAA,IAAI,IAAA,CAAK,OAAA,EAASI,cAAA,CAAA,IAAA,EAAKJ,QAAA,CAAA,CAAO,IAAI,SAAS,CAAA;AAC3C,IAAA,IAAI,IAAA,CAAK,UAAA,EAAYI,cAAA,CAAA,IAAA,EAAKJ,QAAA,CAAA,CAAO,IAAI,YAAY,CAAA;AAAA,EACnD;AAAA,EAEA,IAAI,KAAA,GAAqB;AACvB,IAAA,OAAO,CAAC,GAAGI,cAAA,CAAA,IAAA,EAAKJ,QAAA,CAAM,CAAA;AAAA,EACxB;AAAA,EAEA,IAAI,SAAA,EAAwC;AAC1C,IAAA,QAAQ,SAAA;AAAW,MACjB,KAAK,MAAA,EAAQ;AACX,QAAA,OAAO,IAAA,CAAK,IAAA;AAAA,MACd;AAAA,MACA,KAAK,SAAA,EAAW;AACd,QAAA,OAAO,IAAA,CAAK,OAAA;AAAA,MACd;AAAA,MACA,KAAK,YAAA,EAAc;AACjB,QAAA,OAAO,IAAA,CAAK,UAAA;AAAA,MACd;AAAA,MACA,KAAK,QAAA,EAAW;AACd,QAAA,OAAO,IAAA,CAAK,MAAA;AAAA,MACd;AAAA,MACA,KAAK,KAAA,EAAO;AACV,QAAA,OAAO,IAAA,CAAK,GAAA;AAAA,MACd;AAAA,MACA,SAAS;AACP,QAAA,OAAO,KAAA;AAAA,MACT;AAAA;AACF,EACF;AACF;AAlDWA,QAAA,GAAA,IAAA,OAAA,EAAA;;;;;;;;;;ACHX,IAAA,MAAA,EAAA,cAAA,EAAA,cAAA;AAAA,MAAM,mBAAA,GAAsB,YAAA;AAErB,MAAM,GAAA,CAAI;AAAA,EAGf,YAAY,KAAA,EAAe;AAHtB,IAAAC,cAAA,CAAA,IAAA,EAAA,cAAA,CAAA;AACL,IAAAA,cAAA,CAAA,IAAA,EAAS,MAAA,CAAA;AAGP,IAAAI,iBAAA,CAAA,IAAA,EAAK,gCAAL,IAAA,CAAA,IAAA,EAAkB,KAAA,CAAA;AAClB,IAAAF,cAAA,CAAA,IAAA,EAAK,MAAA,EAAS,KAAA,CAAA;AAAA,EAChB;AAAA,EAEA,IAAI,KAAA,GAAgB;AAClB,IAAA,OAAOC,cAAA,CAAA,IAAA,EAAK,MAAA,CAAA;AAAA,EACd;AAKF;AAdW,MAAA,GAAA,IAAA,OAAA,EAAA;AADJ,cAAA,GAAA,IAAA,OAAA,EAAA;AAYL,cAAA,GAAY,SAAC,GAAA,EAAmB;AAC9B,EAAA,IAAI,mBAAA,CAAoB,KAAK,GAAG,CAAA,QAAS,IAAI,KAAA,CAAM,CAAA,cAAA,EAAiB,GAAG,CAAA,kEAAA,CAAoE,CAAA;AAC7I,CAAA;;;;;ACbK,MAAM,SAAA,CAAU;AAAA,EAKrB,YAAY,IAAA,EAAqB;AAJjC,IAAAF,eAAA,CAAA,IAAA,EAAS,KAAA,CAAA;AACT,IAAAA,eAAA,CAAA,IAAA,EAAS,MAAA,CAAA;AACT,IAAAA,eAAA,CAAA,IAAA,EAAS,aAAA,CAAA;AAGP,IAAA,IAAA,CAAK,GAAA,GAAM,IAAI,GAAA,CAAI,IAAA,CAAK,GAAG,CAAA,CAAE,KAAA;AAC7B,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AACjB,IAAA,IAAA,CAAK,cAAc,IAAA,CAAK,WAAA;AAAA,EAC1B;AACF;;ACJO,SAAS,gBAAmB,KAAA,EAAkC;AACnE,EAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AACnB,EAAA,OAAO,MAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,GAAe,CAAC,KAAK,CAAA;AACrD;;;;;ACHO,MAAM,gBAAA,CAAiB;AAAA,EA0D5B,YAAY,IAAA,EAA4B;AApDxC;AAAA;AAAA;AAAA;AAAA;AAAA,IAAAA,eAAA,CAAA,IAAA,EAAS,KAAA,CAAA;AAKT;AAAA;AAAA;AAAA,IAAAA,eAAA,CAAA,IAAA,EAAS,MAAA,CAAA;AAKT;AAAA;AAAA;AAAA,IAAAA,eAAA,CAAA,IAAA,EAAS,UAAA,CAAA;AAKT;AAAA;AAAA;AAAA,IAAAA,eAAA,CAAA,IAAA,EAAS,UAAA,CAAA;AAKT;AAAA;AAAA;AAAA,IAAAA,eAAA,CAAA,IAAA,EAAS,YAAA,CAAA;AAKT;AAAA;AAAA;AAAA,IAAAA,eAAA,CAAA,IAAA,EAAS,cAAA,CAAA;AAKT;AAAA;AAAA;AAAA,IAAAA,eAAA,CAAA,IAAA,EAAS,gBAAA,CAAA;AAKT;AAAA;AAAA;AAAA,IAAAA,eAAA,CAAA,IAAA,EAAS,gBAAA,CAAA;AAKT;AAAA;AAAA;AAAA,IAAAA,eAAA,CAAA,IAAA,EAAS,OAAA,CAAA;AAKT;AAAA;AAAA;AAAA,IAAAA,eAAA,CAAA,IAAA,EAAS,OAAA,CAAA;AAKT;AAAA;AAAA;AAAA,IAAAA,eAAA,CAAA,IAAA,EAAS,OAAA,CAAA;AAGP,IAAA,IAAA,CAAK,GAAA,GAAM,IAAI,GAAA,CAAI,IAAA,CAAK,GAAG,CAAA,CAAE,KAAA;AAC7B,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AACjB,IAAA,IAAA,CAAK,QAAA,GAAW,eAAA,CAAgB,IAAA,CAAK,QAAQ,CAAA;AAC7C,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK,QAAA;AACrB,IAAA,IAAA,CAAK,aAAa,IAAA,CAAK,UAAA;AACvB,IAAA,IAAA,CAAK,eAAe,IAAA,CAAK,YAAA;AACzB,IAAA,IAAA,CAAK,iBAAiB,IAAA,CAAK,cAAA;AAC3B,IAAA,IAAA,CAAK,iBAAiB,IAAA,CAAK,cAAA;AAC3B,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA;AAClB,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA;AAClB,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,KAAA,IAAS,EAAC;AAAA,EAC9B;AACF;;;;;;;;;;AChFA,IAAA,aAAA,EAAA,mBAAA,EAAA,kBAAA;AAMO,MAAM,QAAA,CAAY;AAAA;AAAA;AAAA;AAAA;AAAA,EAOvB,YAAY,KAAA,EAA6B;AAPpC,IAAAD,cAAA,CAAA,IAAA,EAAA,mBAAA,CAAA;AACL,IAAAA,cAAA,CAAA,IAAA,EAAS,eAAkC,EAAC,CAAA;AAO1C,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,MAAAE,cAAA,CAAA,IAAA,EAAK,aAAA,EAAgB,MAAM,QAAA,EAAS,CAAA;AACpC,MAAAC,cAAA,CAAA,IAAA,EAAK,aAAA,CAAA,CAAc,KAAK,CAAC,CAAA,EAAG,MAAMC,iBAAA,CAAA,IAAA,EAAK,mBAAA,EAAA,kBAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAsB,CAAA,EAAG,CAAA,CAAE,CAAA;AAAA,IAC/D,CAAA,MAAO;AACL,MAAAF,cAAA,CAAA,IAAA,EAAK,aAAA,EAAgB,CAAC,EAAE,KAAA,EAAO,CAAA,CAAA;AAAA,IACjC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW,OAAA,EAAsD;AAC/D,IAAA,MAAM,YAAY,OAAA,EAAS,QAAA,GAAW,WAAA,CAAY,OAAA,CAAQ,QAAQ,CAAA,GAAI,MAAA;AACtE,IAAA,MAAM,MAAM,OAAA,EAAS,GAAA;AAErB,IAAA,KAAA,IAAS,KAAA,GAAQC,cAAA,CAAA,IAAA,EAAK,aAAA,CAAA,CAAc,MAAA,EAAQ,KAAA,EAAA,IAAU;AACpD,MAAA,MAAM,KAAA,GAAQA,cAAA,CAAA,IAAA,EAAK,aAAA,CAAA,CAAc,KAAK,CAAA;AACtC,MAAA,IAAA,CAAK,KAAA,CAAM,SAAA,KAAc,MAAA,IAAa,KAAA,CAAM,SAAA,KAAc,SAAA,MACpD,KAAA,CAAM,GAAA,KAAQ,MAAA,IAAa,KAAA,CAAM,GAAA,KAAQ,GAAA,CAAA,EAC7C,OAAO,KAAA;AAAA,IACX;AAEA,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS,OAAA,EAAyC;AAChD,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,OAAO,CAAA,EAAG,KAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAAA,GAAsC;AACxC,IAAA,OAAOA,cAAA,CAAA,IAAA,EAAK,eAAc,CAAC,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,SAAA,GAA8B;AAChC,IAAA,OAAOA,cAAA,CAAA,IAAA,EAAK,aAAA,CAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS,SAAA,EAA2B;AAClC,IAAA,OAAO,IAAA,CAAK,UAAU,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,KAAK,CAAA,CAAE,KAAK,SAAS,CAAA;AAAA,EACxD;AAeF;AA5EW,aAAA,GAAA,IAAA,OAAA,EAAA;AADJ,mBAAA,GAAA,IAAA,OAAA,EAAA;AAgEL,kBAAA,GAAgB,SAAC,GAAmB,CAAA,EAA2B;AAC7D,EAAA,MAAM,gBAAgB,CAAA,CAAE,SAAA,GAAY,IAAI,CAAA,KAAM,CAAA,CAAE,MAAM,CAAA,GAAI,CAAA,CAAA;AAC1D,EAAA,MAAM,gBAAgB,CAAA,CAAE,SAAA,GAAY,IAAI,CAAA,KAAM,CAAA,CAAE,MAAM,CAAA,GAAI,CAAA,CAAA;AAC1D,EAAA,IAAI,YAAA,KAAiB,YAAA,EAAc,OAAO,YAAA,GAAe,YAAA;AAEzD,EAAA,MAAM,mBAAA,GAAsB,gBAAA,CAAiB,CAAA,CAAE,SAAA,EAAW,EAAE,SAAS,CAAA;AACrE,EAAA,IAAI,mBAAA,KAAwB,GAAG,OAAO,mBAAA;AAEtC,EAAA,MAAM,aAAA,GAAgB,UAAA,CAAW,CAAA,CAAE,GAAA,EAAK,EAAE,GAAG,CAAA;AAC7C,EAAA,IAAI,aAAA,KAAkB,GAAG,OAAO,aAAA;AAEhC,EAAA,OAAO,MAAA,CAAO,EAAE,KAAK,CAAA,CAAE,cAAc,MAAA,CAAO,CAAA,CAAE,KAAK,CAAC,CAAA;AACtD,CAAA;;;;;;;;;;;;AClFF,IAAA,MAAA;AAEO,MAAM,YAAA,CAAa;AAAA,EAmBxB,YAAY,KAAA,EAA4B;AAlBxC,IAAAH,cAAA,CAAA,IAAA,EAAS,MAAA,CAAA;AAET,IAAAC,eAAA,CAAA,IAAA,EAAS,MAAA,CAAA;AACT,IAAAA,eAAA,CAAA,IAAA,EAAS,WAAA,CAAA;AACT,IAAAA,eAAA,CAAA,IAAA,EAAS,SAAA,CAAA;AACT,IAAAA,eAAA,CAAA,IAAA,EAAS,OAAA,CAAA;AACT,IAAAA,eAAA,CAAA,IAAA,EAAS,YAAA,CAAA;AACT,IAAAA,eAAA,CAAA,IAAA,EAAS,UAAA,CAAA;AAET,IAAAA,eAAA,CAAA,IAAA,EAAS,QAAA,CAAA;AACT,IAAAA,eAAA,CAAA,IAAA,EAAS,YAAA,CAAA;AACT,IAAAA,eAAA,CAAA,IAAA,EAAS,QAAA,CAAA;AACT,IAAAA,eAAA,CAAA,IAAA,EAAS,YAAA,CAAA;AACT,IAAAA,eAAA,CAAA,IAAA,EAAS,mBAAA,CAAA;AACT,IAAAA,eAAA,CAAA,IAAA,EAAS,kBAAA,CAAA;AAET,IAAAA,eAAA,CAAA,IAAA,EAAS,KAAA,CAAA;AAGP,IAAA,MAAM,MAAM,IAAI,GAAA,CAAI,SAAS,CAAC,GAAG,QAAQ,CAAC,CAAA;AAC1C,IAAA,IAAA,CAAK,OAAO,GAAA,CAAI,GAAA,CAAI,MAAM,CAAA,IAAK,GAAA,CAAI,IAAI,QAAQ,CAAA,IAAK,IAAI,GAAA,CAAI,QAAQ,KAAK,GAAA,CAAI,GAAA,CAAI,qBAAqB,CAAA,IAAK,GAAA,CAAI,IAAI,KAAK,CAAA;AACxH,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,GAAA,CAAI,WAAW,KAAK,GAAA,CAAI,GAAA,CAAI,QAAQ,CAAA,IAAK,GAAA,CAAI,GAAA,CAAI,QAAQ,CAAA,IAAK,GAAA,CAAI,GAAA,CAAI,qBAAqB,CAAA,IAAK,GAAA,CAAI,IAAI,oBAAoB,CAAA,IAAK,GAAA,CAAI,GAAA,CAAI,KAAK,CAAA;AACnK,IAAA,IAAA,CAAK,UAAU,GAAA,CAAI,GAAA,CAAI,SAAS,CAAA,IAAK,GAAA,CAAI,IAAI,QAAQ,CAAA,IAAK,IAAI,GAAA,CAAI,YAAY,KAAK,GAAA,CAAI,GAAA,CAAI,oBAAoB,CAAA,IAAK,GAAA,CAAI,IAAI,KAAK,CAAA;AACjI,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,GAAA,CAAI,OAAO,KAAK,GAAA,CAAI,GAAA,CAAI,QAAQ,CAAA,IAAK,GAAA,CAAI,GAAA,CAAI,YAAY,CAAA,IAAK,GAAA,CAAI,GAAA,CAAI,qBAAqB,CAAA,IAAK,GAAA,CAAI,IAAI,oBAAoB,CAAA,IAAK,GAAA,CAAI,GAAA,CAAI,KAAK,CAAA;AAC/J,IAAA,IAAA,CAAK,UAAA,GAAa,GAAA,CAAI,GAAA,CAAI,YAAY,CAAA,IAAK,GAAA,CAAI,GAAA,CAAI,YAAY,CAAA,IAAK,GAAA,CAAI,GAAA,CAAI,KAAK,CAAA;AACjF,IAAA,IAAA,CAAK,QAAA,GAAW,GAAA,CAAI,GAAA,CAAI,UAAU,CAAA,IAAK,GAAA,CAAI,GAAA,CAAI,YAAY,CAAA,IAAK,GAAA,CAAI,GAAA,CAAI,KAAK,CAAA;AAE7E,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,IAAA,IAAQ,KAAK,SAAA,IAAa,IAAA,CAAK,WAAW,IAAA,CAAK,KAAA;AAClE,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,UAAA;AACxC,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,SAAA;AAChC,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,KAAA;AACvC,IAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,KAAA;AAC7C,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,SAAA;AAEhD,IAAA,IAAA,CAAK,GAAA,GAAM,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,UAAA;AAE/B,IAAAC,cAAA,CAAA,IAAA,EAAK,MAAA,sBAAa,GAAA,EAAI,CAAA;AACtB,IAAA,IAAI,IAAA,CAAK,IAAA,EAAMC,cAAA,CAAA,IAAA,EAAK,MAAA,CAAA,CAAO,IAAI,MAAM,CAAA;AACrC,IAAA,IAAI,IAAA,CAAK,SAAA,EAAWA,cAAA,CAAA,IAAA,EAAK,MAAA,CAAA,CAAO,IAAI,WAAW,CAAA;AAC/C,IAAA,IAAI,IAAA,CAAK,OAAA,EAASA,cAAA,CAAA,IAAA,EAAK,MAAA,CAAA,CAAO,IAAI,SAAS,CAAA;AAC3C,IAAA,IAAI,IAAA,CAAK,KAAA,EAAOA,cAAA,CAAA,IAAA,EAAK,MAAA,CAAA,CAAO,IAAI,OAAO,CAAA;AACvC,IAAA,IAAI,IAAA,CAAK,UAAA,EAAYA,cAAA,CAAA,IAAA,EAAK,MAAA,CAAA,CAAO,IAAI,YAAY,CAAA;AACjD,IAAA,IAAI,IAAA,CAAK,QAAA,EAAUA,cAAA,CAAA,IAAA,EAAK,MAAA,CAAA,CAAO,IAAI,UAAU,CAAA;AAAA,EAC/C;AAAA,EAEA,IAAI,KAAA,GAAoB;AACtB,IAAA,OAAO,CAAC,GAAGA,cAAA,CAAA,IAAA,EAAK,MAAA,CAAM,CAAA;AAAA,EACxB;AAAA,EAEA,IAAI,QAAA,EAAsC;AACxC,IAAA,QAAQ,QAAA;AAAU,MAChB,KAAK,MAAA,EAAQ;AACX,QAAA,OAAO,IAAA,CAAK,IAAA;AAAA,MACd;AAAA,MACA,KAAK,WAAA,EAAa;AAChB,QAAA,OAAO,IAAA,CAAK,SAAA;AAAA,MACd;AAAA,MACA,KAAK,SAAA,EAAW;AACd,QAAA,OAAO,IAAA,CAAK,OAAA;AAAA,MACd;AAAA,MACA,KAAK,OAAA,EAAS;AACZ,QAAA,OAAO,IAAA,CAAK,KAAA;AAAA,MACd;AAAA,MACA,KAAK,YAAA,EAAc;AACjB,QAAA,OAAO,IAAA,CAAK,UAAA;AAAA,MACd;AAAA,MACA,KAAK,UAAA,EAAY;AACf,QAAA,OAAO,IAAA,CAAK,QAAA;AAAA,MACd;AAAA,MACA,KAAK,QAAA,EAAW;AACd,QAAA,OAAO,IAAA,CAAK,MAAA;AAAA,MACd;AAAA,MACA,KAAK,YAAA,EAAc;AACjB,QAAA,OAAO,IAAA,CAAK,UAAA;AAAA,MACd;AAAA,MACA,KAAK,QAAA,EAAU;AACb,QAAA,OAAO,IAAA,CAAK,IAAA;AAAA,MACd;AAAA,MACA,KAAK,qBAAA,EAAuB;AAC1B,QAAA,OAAO,IAAA,CAAK,iBAAA;AAAA,MACd;AAAA,MACA,KAAK,oBAAA,EAAsB;AACzB,QAAA,OAAO,IAAA,CAAK,gBAAA;AAAA,MACd;AAAA,MACA,KAAK,YAAA,EAAc;AACjB,QAAA,OAAO,IAAA,CAAK,UAAA;AAAA,MACd;AAAA,MACA,KAAK,KAAA,EAAO;AACV,QAAA,OAAO,IAAA,CAAK,GAAA;AAAA,MACd;AAAA,MACA,SAAS;AACP,QAAA,OAAO,KAAA;AAAA,MACT;AAAA;AACF,EACF;AACF;AA/FW,MAAA,GAAA,IAAA,OAAA,EAAA;;;;;ACDJ,MAAM,aAAA,CAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS5B,WAAA,CAAY,UAAiC,MAAA,EAAyB;AARtE,IAAAF,eAAA,CAAA,IAAA,EAAU,WAAe,EAAC,CAAA;AAC1B,IAAAA,eAAA,CAAA,IAAA,EAAU,cAAgC,EAAC,CAAA;AAQzC,IAAA,IAAA,CAAK,OAAA,GAAU,UAAU,EAAC;AAC1B,IAAA,IAAA,CAAK,aAAa,EAAC;AACnB,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,MAAA,EAAQ;AAC/B,MAAA,MAAM,GAAA,GAAM,MAAM,QAAQ,CAAA;AAC1B,MAAA,IAAI,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,KAAM,MAAA,QAAiB,IAAI,KAAA,CAAM,CAAA,eAAA,EAAkB,GAAG,CAAA,CAAA,CAAG,CAAA;AAChF,MAAA,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,GAAI,KAAA;AAAA,IACzB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,MAAA,GAAc;AAChB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,GAAA,EAAwC;AAC1C,IAAA,IAAI,CAAC,KAAK,OAAO,MAAA;AACjB,IAAA,OAAO,IAAA,CAAK,WAAW,GAAG,CAAA;AAAA,EAC5B;AACF;;AChCO,SAAS,OAAO,GAAA,EAAmB;AACxC,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,GAAG,CAAA;AACzB,EAAA,IAAI,CAAC,IAAA,IAAQ,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,OAAA,EAAS,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,GAAG,CAAA,CAAA,CAAG,CAAA;AAC1F,EAAA,OAAO,IAAA;AACT;;;;;ACNO,MAAM,WAAA,CAAY;AAAA,EAIvB,YAAY,KAAA,EAAqB;AAHjC,IAAAA,eAAA,CAAA,IAAA,EAAS,QAAA,CAAA;AACT,IAAAA,eAAA,CAAA,IAAA,EAAS,YAAA,CAAA;AAGP,IAAA,CAAC,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,UAAU,CAAA,GAAI,KAAA;AAAA,EACnC;AACF;;;;;;;;;;;;ACTA,IAAA,kBAAA,EAAA,SAAA;AAcO,MAAM,KAAA,CAAM;AAAA,EA0EjB,YAAY,SAAA,EAAsB;AAzElC,IAAAD,cAAA,CAAA,IAAA,EAAS,kBAAA,CAAA;AACT,IAAAA,cAAA,CAAA,IAAA,EAAS,SAAA,sBAAgB,GAAA,EAAY,CAAA;AAKrC;AAAA;AAAA;AAAA,IAAAC,eAAA,CAAA,IAAA,EAAS,KAAA,CAAA;AAKT;AAAA;AAAA;AAAA,IAAAA,eAAA,CAAA,IAAA,EAAS,MAAA,CAAA;AAOT;AAAA;AAAA;AAAA;AAAA;AAAA,IAAAA,eAAA,CAAA,IAAA,EAAS,MAAA,CAAA;AAKT;AAAA;AAAA;AAAA,IAAAA,eAAA,CAAA,IAAA,EAAS,aAAA,CAAA;AAKT;AAAA;AAAA;AAAA,IAAAA,eAAA,CAAA,IAAA,EAAS,UAAA,CAAA;AAKT;AAAA;AAAA;AAAA,IAAAA,eAAA,CAAA,IAAA,EAAS,WAAA,CAAA;AAKT;AAAA;AAAA;AAAA,IAAAA,eAAA,CAAA,IAAA,EAAS,aAAA,CAAA;AAOT;AAAA;AAAA;AAAA;AAAA;AAAA,IAAAA,eAAA,CAAA,IAAA,EAAS,MAAA,CAAA;AAKT;AAAA;AAAA;AAAA,IAAAA,eAAA,CAAA,IAAA,EAAS,OAAA,CAAA;AAKT;AAAA;AAAA;AAAA,IAAAA,eAAA,CAAA,IAAA,EAAS,OAAA,CAAA;AAMT;AAAA;AAAA;AAAA;AAAA,IAAAA,eAAA,CAAA,IAAA,EAAS,YAAA,CAAA;AAKT;AAAA;AAAA;AAAA,IAAAA,eAAA,CAAA,IAAA,EAAS,QAAA,CAAA;AAKT;AAAA;AAAA;AAAA,IAAAA,eAAA,CAAA,IAAA,EAAS,gBAAA,CAAA;AAGP,IAAA,IAAA,CAAK,GAAA,GAAM,IAAI,GAAA,CAAI,SAAA,CAAU,GAAG,CAAA,CAAE,KAAA;AAClC,IAAA,IAAA,CAAK,OAAO,SAAA,CAAU,IAAA;AACtB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAI,QAAA,CAAS,SAAA,CAAU,IAAI,CAAA;AACvC,IAAA,IAAA,CAAK,WAAA,GAAc,MAAA,CAAO,SAAA,CAAU,WAAW,CAAA;AAC/C,IAAA,IAAA,CAAK,WAAW,IAAI,YAAA,CAAa,eAAA,CAAgB,SAAA,CAAU,QAAQ,CAAC,CAAA;AACpE,IAAA,IAAA,CAAK,YAAY,IAAI,QAAA,CAAS,SAAA,CAAU,SAAA,IAAa,EAAE,CAAA;AACvD,IAAA,IAAA,CAAK,cAAc,SAAA,CAAU,WAAA;AAC7B,IAAA,IAAA,CAAK,OAAO,IAAI,QAAA,CAAS,SAAA,CAAU,IAAA,IAAQ,EAAE,CAAA;AAC7C,IAAA,IAAA,CAAK,QAAQ,SAAA,CAAU,KAAA;AACvB,IAAA,IAAA,CAAK,KAAA,GAAQ,SAAA,CAAU,KAAA,IAAS,EAAC;AACjC,IAAA,IAAA,CAAK,SAAS,SAAA,CAAU,MAAA;AACxB,IAAA,IAAA,CAAK,aAAa,SAAA,CAAU,UAAA,GAAa,IAAI,WAAA,CAAY,SAAA,CAAU,UAAU,CAAA,GAAI,MAAA;AACjF,IAAA,IAAA,CAAK,cAAA,GAAiB,UAAU,cAAA,IAAkB,KAAA;AAElD,IAAAC,cAAA,CAAA,IAAA,EAAK,kBAAA,EAAqB,IAAI,aAAA,CAAgC,KAAA,EAAO,SAAA,CAAU,YAAA,EAAc,GAAA,CAAI,CAAA,CAAA,KAAK,IAAI,gBAAA,CAAiB,CAAC,CAAC,CAAC,CAAA,CAAA;AAE9H,IAAA,KAAA,MAAW,WAAA,IAAeC,cAAA,CAAA,IAAA,EAAK,kBAAA,CAAA,CAAmB,MAAA,EAAQ;AACxD,MAAA,IAAI,WAAA,CAAY,QAAA,EAAU,KAAA,MAAW,QAAA,IAAY,YAAY,QAAA,EAAU;AACrE,QAAA,IAAI,SAAS,OAAA,EAASA,cAAA,CAAA,IAAA,EAAK,SAAA,CAAA,CAAU,GAAA,CAAI,SAAS,OAAO,CAAA;AAAA,MAC3D;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,YAAA,GAAmC;AACrC,IAAA,OAAOA,qBAAK,kBAAA,CAAA,CAAmB,MAAA;AAAA,EACjC;AAAA,EAEA,eAAe,GAAA,EAA2C;AACxD,IAAA,OAAOA,cAAA,CAAA,IAAA,EAAK,kBAAA,CAAA,CAAmB,GAAA,CAAI,GAAG,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,QAAA,GAAqB;AACvB,IAAA,OAAO,CAAC,GAAGA,cAAA,CAAA,IAAA,EAAK,SAAA,CAAS,CAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAAA,GAA8B;AAChC,IAAA,OAAOA,cAAA,CAAA,IAAA,EAAK,SAAA,CAAA,CAAU,IAAA,KAAS,CAAA,GAAIA,cAAA,CAAA,IAAA,EAAK,WAAU,MAAA,EAAO,CAAE,IAAA,EAAK,CAAE,KAAA,GAAQ,MAAA;AAAA,EAC5E;AACF;AAzHW,kBAAA,GAAA,IAAA,OAAA,EAAA;AACA,SAAA,GAAA,IAAA,OAAA,EAAA;AA0HJ,SAAS,aAAA,CAAc,CAAA,EAAW,CAAA,EAAW,OAAA,EAAkC;AACpF,EAAA,MAAM,KAAA,GAAQ,CAAA,EAAG,IAAA,EAAM,QAAA,CAAS,OAAO,CAAA;AACvC,EAAA,MAAM,KAAA,GAAQ,CAAA,EAAG,IAAA,EAAM,QAAA,CAAS,OAAO,CAAA;AACvC,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,KAAA,EAAO,OAAO,CAAA;AAC7B,EAAA,IAAI,CAAC,OAAO,OAAO,CAAA;AACnB,EAAA,IAAI,CAAC,OAAO,OAAO,EAAA;AACnB,EAAA,OAAO,KAAA,CAAM,cAAc,KAAK,CAAA;AAClC;AAEO,SAAS,gBAAA,CAAiB,GAAW,CAAA,EAAmB;AAC7D,EAAA,MAAM,QAAQ,CAAA,EAAG,OAAA;AACjB,EAAA,MAAM,QAAQ,CAAA,EAAG,OAAA;AACjB,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,KAAA,EAAO,OAAO,CAAA;AAC7B,EAAA,IAAI,CAAC,OAAO,OAAO,CAAA;AACnB,EAAA,IAAI,CAAC,OAAO,OAAO,EAAA;AACnB,EAAA,OAAO,KAAA,CAAM,cAAc,KAAK,CAAA;AAClC;AAEO,SAAS,oBAAA,CAAqB,GAAW,CAAA,EAAmB;AACjE,EAAA,MAAM,YAAA,GAAe,CAAA,EAAG,WAAA,EAAa,OAAA,EAAQ;AAC7C,EAAA,MAAM,YAAA,GAAe,CAAA,EAAG,WAAA,EAAa,OAAA,EAAQ;AAC7C,EAAA,IAAI,YAAA,KAAiB,cAAc,OAAO,CAAA;AAC1C,EAAA,IAAI,CAAC,cAAc,OAAO,CAAA;AAC1B,EAAA,IAAI,CAAC,cAAc,OAAO,EAAA;AAC1B,EAAA,OAAO,YAAA,GAAe,eAAe,EAAA,GAAK,CAAA;AAC5C;;;;;;;;ACnKA,IAAA,qBAAA,EAAA,0BAAA,EAAA,2BAAA,EAAA,OAAA;AAKO,MAAM,mBAAmB,aAAA,CAAqB;AAAA,EACnD,YAAY,MAAA,EAA6B;AACvC,IAAA,KAAA,CAAM,OAAO,MAAM,CAAA;AAFhB,IAAAH,cAAA,CAAA,IAAA,EAAA,qBAAA,CAAA;AAAA,EAGL;AAAA,EAEA,OAAO,OAAA,EAA4C;AACjD,IAAA,MAAM,OAAA,GAAW,SAAS,KAAA,IAAS,OAAA,EAAS,SACxC,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,CAAA,KAAA,KAAS,eAAA,CAAA,IAAA,EAAK,qBAAA,EAAA,0BAAA,CAAA,CAAL,WAA8B,KAAA,EAAO,OAAA,EAAS,UAAU,eAAA,CAAA,IAAA,EAAK,qBAAA,EAAA,2BAAA,CAAA,CAAL,WAA+B,KAAA,EAAO,OAAA,EAAS,MAAA,CAAO,CAAA,GAC3I,IAAA,CAAK,OAAA;AAET,IAAA,MAAM,MAAA,GAAS,eAAA,CAAA,IAAA,EAAK,qBAAA,EAAA,OAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAW,OAAA,EAAS,OAAA,CAAA;AAEnC,IAAA,MAAM,UAAA,GAAa,SAAS,QAAA,GAAW,IAAA,CAAK,KAAK,OAAA,CAAQ,MAAA,GAAU,OAAA,EAAS,QAAS,CAAA,GAAI,CAAA;AACzF,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI,UAAA,EAAY,OAAA,EAAS,IAAA,IAAQ,CAAC,CAAC,CAAA;AACvE,IAAA,MAAM,KAAA,GAAQ,OAAA,EAAS,QAAA,GAAW,MAAA,CAAO,KAAA,CAAA,CAAO,UAAA,GAAa,CAAA,IAAK,OAAA,CAAQ,QAAA,EAAU,UAAA,GAAa,OAAA,EAAS,QAAQ,CAAA,GAAI,MAAA;AAEtH,IAAA,OAAO;AAAA,MACL,KAAA;AAAA,MACA,WAAW,UAAA,GAAa,CAAA;AAAA,MACxB,UAAA;AAAA,MACA,UAAU,OAAA,EAAS,QAAA;AAAA,MACnB,kBAAkB,OAAA,CAAQ,MAAA;AAAA,MAC1B,cAAA,EAAgB,KAAK,OAAA,CAAQ,MAAA;AAAA,MAC7B,cAAA,EAAgB;AAAA,KAClB;AAAA,EACF;AAoDF;AA7EO,qBAAA,GAAA,IAAA,OAAA,EAAA;AA2BL,0BAAA,GAAwB,SAAC,OAAc,KAAA,EAA8C;AACnF,EAAA,MAAM,WAAA,GAAc,KAAA,EAAO,GAAA,EAAK,WAAA,EAAY,IAAK,EAAA;AACjD,EAAA,MAAM,MAAA,GAAS,KAAA,EAAO,MAAA,GAAS,IAAI,GAAA,CAAI,KAAA,EAAO,MAAM,CAAA,mBAAI,IAAI,GAAA,CAAI,CAAC,MAAM,CAAC,CAAA;AACxE,EAAA,IAAI,MAAA,CAAO,IAAA,KAAS,CAAA,EAAG,OAAO,IAAA;AAE9B,EAAA,OAAO,CAAC,EAAG,MAAA,CAAO,IAAI,MAAM,CAAA,IAAK,MAAM,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,KAAA,CAAM,WAAA,GAAc,QAAA,CAAS,WAAW,CAAC,CAAA,IACrG,MAAA,CAAO,GAAA,CAAI,YAAY,KAAK,KAAA,CAAM,SAAA,CAAU,UAAU,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,KAAA,CAAM,WAAA,GAAc,QAAA,CAAS,WAAW,CAAC,CAAA,IAC3G,MAAA,CAAO,IAAI,aAAa,CAAA,IAAK,MAAM,WAAA,EAAa,WAAA,EAAY,CAAE,QAAA,CAAS,WAAW,CAAA,IAClF,MAAA,CAAO,IAAI,QAAQ,CAAA,IAAK,MAAM,MAAA,EAAQ,WAAA,GAAc,QAAA,CAAS,WAAW,KACxE,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA,IAAK,KAAA,CAAM,OAAO,WAAA,EAAY,CAAE,QAAA,CAAS,WAAW,KACtE,MAAA,CAAO,GAAA,CAAI,cAAc,CAAA,IAAM,KAAA,CAAM,YAAY,MAAA,CAAO,QAAA,OAAe,WAAA,IACvE,MAAA,CAAO,IAAI,cAAc,CAAA,IAAM,MAAM,UAAA,EAAY,UAAA,EAAY,UAAS,KAAM,WAAA,CAAA;AAEpF,CAAA;AAEA,2BAAA,GAAyB,SAAC,OAAc,MAAA,EAAgD;AACtF,EAAA,OAAA,CAAQ,CAAC,MAAA,EAAQ,IAAA,IAAQ,KAAA,CAAM,IAAA,KAAS,MAAA,CAAO,IAAA,MACzC,CAAC,MAAA,EAAQ,OAAA,IAAW,KAAA,CAAM,OAAA,KAAY,MAAA,CAAO,OAAA,CAAA,KAC7C,CAAC,MAAA,EAAQ,QAAA,IAAY,KAAA,CAAM,QAAA,CAAS,GAAA,CAAI,MAAA,CAAO,QAAQ,CAAA,CAAA,KACvD,CAAC,MAAA,EAAQ,SAAA,IAAa,MAAA,CAAO,SAAA,CAAU,KAAK,CAAA,CAAA;AACpD,CAAA;AAEA,OAAA,GAAK,SAAC,QAAiB,OAAA,EAAuC;AAC5D,EAAA,QAAQ,SAAS,IAAA;AAAM,IACrB,KAAK,UAAA,EAAY;AACf,MAAA,OAAO,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,EAAG,CAAA,KAAM,cAAc,CAAA,EAAG,CAAA,EAAG,OAAA,CAAQ,cAAc,CAAC,CAAA;AAAA,IAC9E;AAAA,IACA,KAAK,WAAA,EAAa;AAChB,MAAA,OAAO,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,EAAG,CAAA,KAAM,cAAc,CAAA,EAAG,CAAA,EAAG,OAAA,CAAQ,cAAc,CAAC,CAAA;AAAA,IAC9E;AAAA,IACA,KAAK,cAAA,EAAgB;AACnB,MAAA,OAAO,MAAA,CAAO,SAAS,gBAAgB,CAAA;AAAA,IACzC;AAAA,IACA,KAAK,eAAA,EAAiB;AACpB,MAAA,OAAO,MAAA,CAAO,SAAS,CAAC,CAAA,EAAG,MAAM,gBAAA,CAAiB,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,IACzD;AAAA,IACA,KAAK,kBAAA,EAAoB;AACvB,MAAA,OAAO,MAAA,CAAO,SAAS,oBAAoB,CAAA;AAAA,IAC7C;AAAA,IACA,KAAK,mBAAA,EAAqB;AACxB,MAAA,OAAO,MAAA,CAAO,SAAS,CAAC,CAAA,EAAG,MAAM,oBAAA,CAAqB,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,IAC7D;AAAA,IACA,KAAK,gBAAA,EAAkB;AACrB,MAAA,OAAO,OAAO,UAAA,EAAW;AAAA,IAC3B;AAAA,IACA,SAAS;AACP,MAAA,OAAO,CAAC,GAAG,MAAM,CAAA;AAAA,IACnB;AAAA;AAEJ,CAAA;;;;;AC5EK,MAAM,YAAA,CAAa;AAAA,EAoCxB,YAAY,IAAA,EAAwB;AAhCpC;AAAA;AAAA;AAAA,IAAAC,eAAA,CAAA,IAAA,EAAS,MAAA,CAAA;AAKT;AAAA;AAAA;AAAA,IAAAA,eAAA,CAAA,IAAA,EAAS,SAAA,CAAA;AAKT;AAAA;AAAA;AAAA,IAAAA,eAAA,CAAA,IAAA,EAAS,gBAAA,CAAA;AAKT;AAAA;AAAA;AAAA,IAAAA,eAAA,CAAA,IAAA,EAAS,aAAA,CAAA;AAKT;AAAA;AAAA;AAAA,IAAAA,eAAA,CAAA,IAAA,EAAS,eAAA,CAAA;AAKT;AAAA;AAAA;AAAA,IAAAA,eAAA,CAAA,IAAA,EAAS,cAAA,CAAA;AAKT;AAAA;AAAA;AAAA,IAAAA,eAAA,CAAA,IAAA,EAAS,OAAA,CAAA;AAGP,IAAA,IAAI,CAAC,IAAA,EAAM,MAAM,IAAI,MAAM,qBAAqB,CAAA;AAChD,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AACjB,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK,OAAA;AACpB,IAAA,IAAA,CAAK,cAAA,GAAiB,MAAA,CAAO,IAAA,CAAK,cAAc,CAAA;AAChD,IAAA,IAAA,CAAK,cAAc,IAAA,EAAM,WAAA;AACzB,IAAA,IAAA,CAAK,gBAAgB,IAAA,EAAM,aAAA;AAC3B,IAAA,IAAA,CAAK,eAAe,IAAA,EAAM,YAAA;AAC1B,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA,EAAM,KAAA,IAAS,EAAC;AAAA,EAC/B;AACF;;;;;ACjDO,MAAM,UAAA,CAAW;AAAA,EAItB,YAAY,KAAA,EAAuB;AAHnC,IAAAA,eAAA,CAAA,IAAA,EAAS,KAAA,CAAA;AACT,IAAAA,eAAA,CAAA,IAAA,EAAS,KAAA,CAAA;AAGP,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,MAAA,IAAA,CAAK,GAAA,GAAM,MAAM,CAAC,CAAA;AAClB,MAAA,IAAA,CAAK,MAAM,KAAA,CAAM,CAAC,MAAM,MAAA,GAAY,MAAA,GAAY,MAAM,CAAC,CAAA;AAAA,IACzD,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,GAAA,GAAM,KAAA;AAAA,IACb;AAAA,EACF;AACF;;;;;ACLO,MAAM,IAAA,CAAK;AAAA,EAsChB,YAAY,IAAA,EAAgB;AAhC5B;AAAA;AAAA;AAAA;AAAA;AAAA,IAAAA,eAAA,CAAA,IAAA,EAAS,KAAA,CAAA;AAKT;AAAA;AAAA;AAAA,IAAAA,eAAA,CAAA,IAAA,EAAS,MAAA,CAAA;AAKT;AAAA;AAAA;AAAA,IAAAA,eAAA,CAAA,IAAA,EAAS,MAAA,CAAA;AAKT;AAAA;AAAA;AAAA,IAAAA,eAAA,CAAA,IAAA,EAAS,UAAA,CAAA;AAKT;AAAA;AAAA;AAAA,IAAAA,eAAA,CAAA,IAAA,EAAS,YAAA,CAAA;AAKT;AAAA;AAAA;AAAA,IAAAA,eAAA,CAAA,IAAA,EAAS,OAAA,CAAA;AAKT;AAAA;AAAA;AAAA,IAAAA,eAAA,CAAA,IAAA,EAAS,OAAA,CAAA;AAGP,IAAA,IAAA,CAAK,GAAA,GAAM,IAAI,GAAA,CAAI,IAAA,CAAK,GAAG,CAAA,CAAE,KAAA;AAC7B,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AACjB,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AACjB,IAAA,IAAA,CAAK,WAAW,IAAI,YAAA,CAAa,eAAA,CAAgB,IAAA,CAAK,QAAQ,CAAC,CAAA;AAC/D,IAAA,IAAA,CAAK,aAAa,IAAA,CAAK,UAAA,GAAa,IAAI,UAAA,CAAW,IAAA,CAAK,UAAU,CAAA,GAAI,MAAA;AACtE,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA;AAClB,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,KAAA,IAAS,EAAC;AAAA,EAC9B;AACF;;;;;AC/CO,MAAM,OAAA,CAAQ;AAAA,EA2CnB,YAAY,IAAA,EAAmB;AArC/B;AAAA;AAAA;AAAA;AAAA;AAAA,IAAAA,eAAA,CAAA,IAAA,EAAS,KAAA,CAAA;AAKT;AAAA;AAAA;AAAA,IAAAA,eAAA,CAAA,IAAA,EAAS,MAAA,CAAA;AAKT;AAAA;AAAA;AAAA,IAAAA,eAAA,CAAA,IAAA,EAAS,OAAA,CAAA;AAKT;AAAA;AAAA;AAAA,IAAAA,eAAA,CAAA,IAAA,EAAS,UAAA,CAAA;AAKT;AAAA;AAAA;AAAA,IAAAA,eAAA,CAAA,IAAA,EAAS,UAAA,CAAA;AAKT;AAAA;AAAA;AAAA,IAAAA,eAAA,CAAA,IAAA,EAAS,YAAA,CAAA;AAKT;AAAA;AAAA;AAAA,IAAAA,eAAA,CAAA,IAAA,EAAS,OAAA,CAAA;AAKT;AAAA;AAAA;AAAA,IAAAA,eAAA,CAAA,IAAA,EAAS,OAAA,CAAA;AAGP,IAAA,IAAA,CAAK,GAAA,GAAM,IAAI,GAAA,CAAI,IAAA,CAAK,GAAG,CAAA,CAAE,KAAA;AAC7B,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AACjB,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA;AAClB,IAAA,IAAA,CAAK,WAAW,IAAI,YAAA,CAAa,eAAA,CAAgB,IAAA,CAAK,QAAQ,CAAC,CAAA;AAC/D,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK,QAAA;AACrB,IAAA,IAAA,CAAK,aAAa,IAAA,CAAK,UAAA,GAAa,IAAI,UAAA,CAAW,IAAA,CAAK,UAAU,CAAA,GAAI,MAAA;AACtE,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA;AAClB,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,KAAA,IAAS,EAAC;AAAA,EAC9B;AACF;;;;;ACrDO,MAAM,OAAA,CAAQ;AAAA,EA4EnB,YAAY,IAAA,EAAmB;AAtE/B;AAAA;AAAA;AAAA;AAAA;AAAA,IAAAA,eAAA,CAAA,IAAA,EAAS,KAAA,CAAA;AAOT;AAAA;AAAA;AAAA;AAAA;AAAA,IAAAA,eAAA,CAAA,IAAA,EAAS,MAAA,CAAA;AAKT;AAAA;AAAA;AAAA,IAAAA,eAAA,CAAA,IAAA,EAAS,MAAA,CAAA;AAKT;AAAA;AAAA;AAAA,IAAAA,eAAA,CAAA,IAAA,EAAS,UAAA,CAAA;AAKT;AAAA;AAAA;AAAA,IAAAA,eAAA,CAAA,IAAA,EAAS,aAAA,CAAA;AAKT;AAAA;AAAA;AAAA,IAAAA,eAAA,CAAA,IAAA,EAAS,YAAA,CAAA;AAKT;AAAA;AAAA;AAAA,IAAAA,eAAA,CAAA,IAAA,EAAS,OAAA,CAAA;AAKT;AAAA;AAAA;AAAA,IAAAA,eAAA,CAAA,IAAA,EAAS,OAAA,CAAA;AAKT;AAAA;AAAA;AAAA,IAAAA,eAAA,CAAA,IAAA,EAAS,WAAA,CAAA;AA6BP,IAAA,IAAA,CAAK,GAAA,GAAM,IAAI,GAAA,CAAI,IAAA,CAAK,GAAG,CAAA,CAAE,KAAA;AAC7B,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AACjB,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AACjB,IAAA,IAAA,CAAK,WAAW,IAAI,YAAA,CAAa,eAAA,CAAgB,IAAA,CAAK,QAAQ,CAAC,CAAA;AAC/D,IAAA,IAAA,CAAK,WAAA,GAAc,eAAA,CAAgB,IAAA,CAAK,WAAW,CAAA;AACnD,IAAA,IAAA,CAAK,aAAa,IAAA,CAAK,UAAA,GAAa,IAAI,UAAA,CAAW,IAAA,CAAK,UAAU,CAAA,GAAI,MAAA;AACtE,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA;AAClB,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,KAAA,IAAS,EAAC;AAC5B,IAAA,IAAA,CAAK,SAAA,GAAY,gBAAgB,IAAI,CAAA;AAAA,EACvC;AACF;AAEA,SAAS,gBAAgB,IAAA,EAAyC;AAChE,EAAA,IAAI,CAAC,IAAA,CAAK,SAAA,EAAW,OAAO,MAAA;AAC5B,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,KAAK,SAAA,CAAU,EAAA;AAAA,IACnB,UAAA,EAAY,KAAK,SAAA,CAAU,UAAA,GAAa,IAAI,UAAA,CAAW,IAAA,CAAK,SAAA,CAAU,UAAU,CAAA,GAAI,MAAA;AAAA,IACpF,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAA,IAAQ,IAAA,CAAK,IAAA;AAAA,IAClC,QAAA,EAAU,IAAI,YAAA,CAAa,eAAA,CAAgB,KAAK,SAAA,CAAU,QAAA,IAAY,IAAA,CAAK,QAAQ,CAAC,CAAA;AAAA,IACpF,KAAA,EAAO,KAAK,SAAA,CAAU;AAAA,GACxB;AACF;;;;;;;;;AC3GA,IAAA,eAAA,EAAA,UAAA,EAAA,aAAA,EAAA,aAAA,EAAA,WAAA,EAAA,OAAA,EAAA,QAAA;AAYO,MAAM,kBAAA,CAAmB;AAAA;AAAA;AAAA;AAAA;AAAA,EAc9B,YAAY,MAAA,EAAoB;AAbhC,IAAA,YAAA,CAAA,IAAA,EAAS,eAAA,CAAA;AACT,IAAA,YAAA,CAAA,IAAA,EAAS,UAAA,CAAA;AACT,IAAA,YAAA,CAAA,IAAA,EAAS,aAAA,CAAA;AACT,IAAA,YAAA,CAAA,IAAA,EAAS,aAAA,CAAA;AACT,IAAA,YAAA,CAAA,IAAA,EAAS,WAAA,CAAA;AAET,IAAA,YAAA,CAAA,IAAA,EAAS,OAAA,CAAA;AACT,IAAA,YAAA,CAAA,IAAA,EAAS,QAAA,CAAA;AAOP,IAAA,YAAA,CAAA,IAAA,EAAK,OAAA,EAAU,IAAI,YAAA,CAAa,MAAA,CAAO,MAAM,CAAA,CAAA;AAC7C,IAAA,YAAA,CAAA,IAAA,EAAK,QAAA,EAAW,MAAA,CAAO,OAAA,IAAW,EAAC,CAAA;AAEnC,IAAA,YAAA,CAAA,IAAA,EAAK,eAAA,EAAkB,IAAI,aAAA,CAAyB,KAAA,EAAO,MAAA,CAAO,UAAA,EAAY,GAAA,CAAI,CAAA,CAAA,KAAK,IAAI,SAAA,CAAU,CAAC,CAAC,CAAC,CAAA,CAAA;AACxG,IAAA,YAAA,CAAA,IAAA,EAAK,UAAA,EAAa,IAAI,aAAA,CAAoB,KAAA,EAAO,MAAA,CAAO,KAAA,EAAO,GAAA,CAAI,CAAA,CAAA,KAAK,IAAI,IAAA,CAAK,CAAC,CAAC,CAAC,CAAA,CAAA;AACpF,IAAA,YAAA,CAAA,IAAA,EAAK,aAAA,EAAgB,IAAI,aAAA,CAAuB,KAAA,EAAO,MAAA,CAAO,QAAA,EAAU,GAAA,CAAI,CAAA,CAAA,KAAK,IAAI,OAAA,CAAQ,CAAC,CAAC,CAAC,CAAA,CAAA;AAChG,IAAA,YAAA,CAAA,IAAA,EAAK,aAAA,EAAgB,IAAI,aAAA,CAAuB,KAAA,EAAO,MAAA,CAAO,QAAA,EAAU,GAAA,CAAI,CAAA,CAAA,KAAK,IAAI,OAAA,CAAQ,CAAC,CAAC,CAAC,CAAA,CAAA;AAChG,IAAA,YAAA,CAAA,IAAA,EAAK,WAAA,EAAc,IAAI,UAAA,CAAW,MAAA,CAAO,MAAA,EAAQ,GAAA,CAAI,CAAA,CAAA,KAAK,IAAI,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA,CAAA;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,MAAA,GAAuB;AACzB,IAAA,OAAO,YAAA,CAAA,IAAA,EAAK,OAAA,CAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,OAAA,GAAoB;AACtB,IAAA,OAAO,YAAA,CAAA,IAAA,EAAK,QAAA,CAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,UAAA,GAA0B;AAC5B,IAAA,OAAO,mBAAK,eAAA,CAAA,CAAgB,MAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa,GAAA,EAAgD;AAC3D,IAAA,OAAO,YAAA,CAAA,IAAA,EAAK,eAAA,CAAA,CAAgB,GAAA,CAAI,GAAG,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,KAAA,GAAgB;AAClB,IAAA,OAAO,mBAAK,UAAA,CAAA,CAAW,MAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ,GAAA,EAA2C;AACjD,IAAA,OAAO,YAAA,CAAA,IAAA,EAAK,UAAA,CAAA,CAAW,GAAA,CAAI,GAAG,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,QAAA,GAAsB;AACxB,IAAA,OAAO,mBAAK,aAAA,CAAA,CAAc,MAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW,GAAA,EAA8C;AACvD,IAAA,OAAO,YAAA,CAAA,IAAA,EAAK,aAAA,CAAA,CAAc,GAAA,CAAI,GAAG,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,QAAA,GAAsB;AACxB,IAAA,OAAO,mBAAK,aAAA,CAAA,CAAc,MAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW,GAAA,EAA8C;AACvD,IAAA,OAAO,YAAA,CAAA,IAAA,EAAK,aAAA,CAAA,CAAc,GAAA,CAAI,GAAG,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,MAAA,GAAkB;AACpB,IAAA,OAAO,mBAAK,WAAA,CAAA,CAAY,MAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS,GAAA,EAA4C;AACnD,IAAA,OAAO,YAAA,CAAA,IAAA,EAAK,WAAA,CAAA,CAAY,GAAA,CAAI,GAAG,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,aAAa,OAAA,EAA4C;AACvD,IAAA,OAAO,YAAA,CAAA,IAAA,EAAK,WAAA,CAAA,CAAY,MAAA,CAAO,OAAO,CAAA;AAAA,EACxC;AACF;AA5HW,eAAA,GAAA,IAAA,OAAA,EAAA;AACA,UAAA,GAAA,IAAA,OAAA,EAAA;AACA,aAAA,GAAA,IAAA,OAAA,EAAA;AACA,aAAA,GAAA,IAAA,OAAA,EAAA;AACA,WAAA,GAAA,IAAA,OAAA,EAAA;AAEA,OAAA,GAAA,IAAA,OAAA,EAAA;AACA,QAAA,GAAA,IAAA,OAAA,EAAA;;;;;AClBJ,MAAM,QAAA,CAAS;AAAA,EAqBpB,YAAY,IAAA,EAAoB;AAjBhC;AAAA;AAAA;AAAA,IAAA,aAAA,CAAA,IAAA,EAAS,SAAA,CAAA;AAKT;AAAA;AAAA;AAAA,IAAA,aAAA,CAAA,IAAA,EAAS,QAAA,CAAA;AAKT;AAAA;AAAA;AAAA,IAAA,aAAA,CAAA,IAAA,EAAS,MAAA,CAAA;AAKT;AAAA;AAAA;AAAA,IAAA,aAAA,CAAA,IAAA,EAAS,UAAA,CAAA;AAGP,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK,OAAA;AACpB,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA;AACnB,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AACjB,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK,QAAA;AAAA,EACvB;AACF;;ACbO,SAAS,SAAS,MAAA,EAA4C;AACnE,EAAA,MAAM,GAAA,GAAM,OAAO,MAAA,KAAW,QAAA,GAAW,SAAS,MAAA,CAAO,GAAA;AACzD,EAAA,OAAO,WAAW,GAAG,CAAA,CAAA;AACvB;AASO,SAAS,UAAU,MAAA,EAA4C;AACpE,EAAA,MAAM,GAAA,GAAM,OAAO,MAAA,KAAW,QAAA,GAAW,SAAS,MAAA,CAAO,GAAA;AACzD,EAAA,OAAO,CAAA,CAAA,EAAI,GAAG,CAAA,EAAA,EAAK,QAAA,CAAS,MAAM,CAAC,CAAA,CAAA,CAAA;AACrC;AASO,SAAS,WAAW,MAAA,EAAgD;AACzE,EAAA,MAAM,GAAA,GAAM,OAAO,MAAA,KAAW,QAAA,GAAW,SAAS,MAAA,CAAO,GAAA;AACzD,EAAA,OAAO,aAAa,GAAG,CAAA,CAAA;AACzB;AASO,SAAS,YAAY,MAAA,EAAgD;AAC1E,EAAA,MAAM,GAAA,GAAM,OAAO,MAAA,KAAW,QAAA,GAAW,SAAS,MAAA,CAAO,GAAA;AACzD,EAAA,OAAO,CAAA,CAAA,EAAI,GAAG,CAAA,EAAA,EAAK,UAAA,CAAW,MAAM,CAAC,CAAA,CAAA,CAAA;AACvC;AASO,SAAS,WAAW,MAAA,EAAgD;AACzE,EAAA,MAAM,GAAA,GAAM,OAAO,MAAA,KAAW,QAAA,GAAW,SAAS,MAAA,CAAO,GAAA;AACzD,EAAA,OAAO,aAAa,GAAG,CAAA,CAAA;AACzB;AASO,SAAS,YAAY,MAAA,EAAgD;AAC1E,EAAA,MAAM,GAAA,GAAM,OAAO,MAAA,KAAW,QAAA,GAAW,SAAS,MAAA,CAAO,GAAA;AACzD,EAAA,OAAO,CAAA,CAAA,EAAI,GAAG,CAAA,EAAA,EAAK,UAAA,CAAW,MAAM,CAAC,CAAA,CAAA,CAAA;AACvC;AASO,SAAS,QAAQ,MAAA,EAA0C;AAChE,EAAA,MAAM,GAAA,GAAM,OAAO,MAAA,KAAW,QAAA,GAAW,SAAS,MAAA,CAAO,GAAA;AACzD,EAAA,OAAO,UAAU,GAAG,CAAA,CAAA;AACtB;AASO,SAAS,SAAS,MAAA,EAA0C;AACjE,EAAA,MAAM,GAAA,GAAM,OAAO,MAAA,KAAW,QAAA,GAAW,SAAS,MAAA,CAAO,GAAA;AACzD,EAAA,OAAO,CAAA,CAAA,EAAI,GAAG,CAAA,EAAA,EAAK,OAAA,CAAQ,MAAM,CAAC,CAAA,CAAA,CAAA;AACpC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/dist/coh-content-db.mjs
CHANGED
|
@@ -749,17 +749,19 @@ class BadgeIndex extends AbstractIndex {
|
|
|
749
749
|
__privateAdd$1(this, _BadgeIndex_instances);
|
|
750
750
|
}
|
|
751
751
|
search(options) {
|
|
752
|
-
const
|
|
753
|
-
const sorted = __privateMethod(this, _BadgeIndex_instances, sort_fn).call(this,
|
|
754
|
-
const totalPages = options?.pageSize ? Math.ceil(
|
|
755
|
-
const
|
|
756
|
-
const
|
|
752
|
+
const matched = options?.query || options?.filter ? this._values.filter((badge) => __privateMethod(this, _BadgeIndex_instances, satisfiesQueryPredicate_fn).call(this, badge, options?.query) && __privateMethod(this, _BadgeIndex_instances, satisfiesFilterPredicate_fn).call(this, badge, options?.filter)) : this._values;
|
|
753
|
+
const sorted = __privateMethod(this, _BadgeIndex_instances, sort_fn).call(this, matched, options);
|
|
754
|
+
const totalPages = options?.pageSize ? Math.ceil(matched.length / options?.pageSize) : 1;
|
|
755
|
+
const pageNumber = Math.max(1, Math.min(totalPages, options?.page ?? 1));
|
|
756
|
+
const items = options?.pageSize ? sorted.slice((pageNumber - 1) * options.pageSize, pageNumber * options?.pageSize) : sorted;
|
|
757
757
|
return {
|
|
758
|
-
items
|
|
759
|
-
|
|
758
|
+
items,
|
|
759
|
+
pageIndex: pageNumber - 1,
|
|
760
|
+
pageNumber,
|
|
760
761
|
pageSize: options?.pageSize,
|
|
761
|
-
|
|
762
|
-
|
|
762
|
+
matchedItemCount: matched.length,
|
|
763
|
+
totalItemCount: this._values.length,
|
|
764
|
+
totalPageCount: totalPages
|
|
763
765
|
};
|
|
764
766
|
}
|
|
765
767
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coh-content-db.mjs","sources":["../src/main/api/alignment.ts","../src/main/api/badge-requirement-type.ts","../src/main/api/badge-type.ts","../src/main/api/enhancement-category.ts","../src/main/api/mission-type.ts","../src/main/api/morality.ts","../src/main/api/sex.ts","../src/main/api/zone-type.ts","../src/main/db/alignment-list.ts","../src/main/db/key.ts","../src/main/db/archetype.ts","../src/main/util/coalesce-to-array.ts","../src/main/db/badge-requirement.ts","../src/main/db/variants.ts","../src/main/db/morality-list.ts","../src/main/db/abstract-index.ts","../src/main/util/to-date.ts","../src/main/db/set-title-ids.ts","../src/main/db/badge.ts","../src/main/db/badge-index.ts","../src/main/db/bundle-header.ts","../src/main/db/level-range.ts","../src/main/db/zone.ts","../src/main/db/contact.ts","../src/main/db/mission.ts","../src/main/db/coh-content-database.ts","../src/main/db/location.ts","../src/main/util/links.ts"],"sourcesContent":["export const ALIGNMENT = ['hero', 'villain', 'praetorian'] as const\nexport type Alignment = typeof ALIGNMENT[number]\nexport type AlignmentExtended = Alignment\n /**\n * The alignments available for Primal Earth characters - Hero and Villain.\n */\n | 'primal'\n /**\n * All the alignments.\n */\n | 'all'\n\nconst ALIGNMENT_ORDER = Object.fromEntries(ALIGNMENT.map((x, index) => [x, index]))\n\nexport function compareAlignment(a?: Alignment, b?: Alignment): number {\n const orderA = a ? ALIGNMENT_ORDER[a] : -1\n const orderB = b ? ALIGNMENT_ORDER[b] : -1\n return orderA - orderB\n}\n","export const BADGE_REQUIREMENT_TYPE = [\n /**\n * Collect a badge.\n */\n 'badge',\n /**\n * Craft an invention.\n */\n 'invention',\n /**\n * Some invention badges require you to build x of two different invention levels, 'plus one of either level'.\n */\n 'invention-plus-one',\n /**\n * Visit a location.\n */\n 'location',\n /**\n * Click on a monument.\n */\n 'monument',\n /**\n * Complete a mission.\n */\n 'mission',\n /**\n * Complete an arbitrary task.\n */\n 'task',\n] as const\n\nexport type BadgeRequirementType = typeof BADGE_REQUIREMENT_TYPE[number]\n","export const BADGE_TYPE = [\n 'exploration',\n 'history',\n 'accomplishment',\n 'achievement',\n 'accolade',\n 'gladiator',\n 'veteran',\n 'pvp',\n 'invention',\n 'defeat',\n 'event',\n 'ouroboros',\n 'consignment',\n 'day-job',\n 'architect-entertainment',\n] as const\n\nexport type BadgeType = typeof BADGE_TYPE[number]\n","export const ENHANCEMENT_CATEGORY = [\n 'defense-debuff',\n 'to-hit-debuff',\n 'taunt',\n 'confuse',\n 'healing',\n 'defense-buff',\n 'resist-damage',\n 'intangibility',\n 'sleep',\n 'slow',\n 'hold',\n 'stun',\n 'immobilize',\n 'fear',\n 'endurance-modification',\n 'endurance-reduction',\n 'recharge-reduction',\n 'interrupt-duration',\n 'accuracy',\n 'to-hit-buff',\n 'damage',\n 'knockback',\n 'run-speed',\n 'jump',\n 'fly-speed',\n 'range',\n] as const\n\nexport type EnhancementCategory = typeof ENHANCEMENT_CATEGORY[number]\n","export const MISSION_TYPE = ['story-arc', 'mission', 'task-force', 'strike-force', 'trial', 'personal-story'] as const\nexport type MissionType = typeof MISSION_TYPE[number]\n","import { Alignment } from './alignment'\n\nexport const MORALITY = ['hero', 'vigilante', 'villain', 'rogue', 'resistance', 'loyalist'] as const\nexport const MORALITY_EXTENDED = [\n ...MORALITY,\n /**\n * Any of the Primal Earth moralities - Hero, Vigilante, Villain, Rogue.\n */\n 'primal',\n /**\n * Either of the Praetorian Earth moralities - Resistance or Loyalist.\n */\n 'praetorian',\n /**\n * The moralities that roll up to the Hero {@link Alignment} - Hero and Vigilante.\n */\n 'heroic',\n /**\n * The moralities that roll up to the Villain {@link Alignment} - Villain and Rogue.\n */\n 'villainous',\n /**\n * Moralities with access to Paragon City - Hero, Vigilante and Rogue.\n */\n 'paragon-city-access',\n /**\n * Moralities with access to the Rogue Isles - Villain, Rogue and Vigilante.\n */\n 'rogue-isles-access',\n /**\n * All the moralities.\n */\n 'all',\n] as const\nexport type Morality = typeof MORALITY[number]\nexport type MoralityExtended = typeof MORALITY_EXTENDED[number]\n\n/**\n * Maps a morality to the underlying alignment\n */\nexport const MoralityMap: Record<Morality | Alignment, Alignment> = {\n hero: 'hero',\n vigilante: 'hero',\n villain: 'villain',\n rogue: 'villain',\n loyalist: 'praetorian',\n resistance: 'praetorian',\n praetorian: 'praetorian',\n}\n","export const SEX = ['M', 'F'] as const\nexport type Sex = typeof SEX[number]\n\nconst SEX_ORDER = Object.fromEntries(SEX.map((x, index) => [x, index]))\n\nexport function compareSex(a?: Sex, b?: Sex): number {\n const orderA = a ? SEX_ORDER[a] : -1\n const orderB = b ? SEX_ORDER[b] : -1\n return orderA - orderB\n}\n","export const ZONE_TYPE = [\n /**\n * The standard zone type, even if not technically occurring in the 'City' proper.\n */\n 'city',\n /**\n * An Ouroboros flashback to a zone as it was in a previous era.\n */\n 'echo',\n /**\n * Tutorial zon, usually inaccessible after leaving.\n */\n 'tutorial',\n /**\n * Trial zones, like the Abandoned Sewers trial.\n */\n 'trial',\n /**\n * Hazard zones like the Hollows.\n */\n 'hazard',\n /**\n * Mayhem mission zones.\n */\n 'mayhem',\n /**\n * Safeguard mission zones.\n */\n 'safeguard',\n /**\n * Exists inside a mission not covered by the other types.\n */\n 'mission',\n /**\n * Incarnate trial zones.\n */\n 'incarnate',\n /**\n * Cooprative zones where Heroes and Villains can team up for PvE content.\n */\n 'co-op',\n /**\n * PvP zones like Bloody Bay.\n */\n 'pvp',\n /**\n * Located in an arena PvP map.\n */\n 'arena',\n /**\n * A building, usually contained within another zone, like the AE buildings.\n */\n 'building',\n /**\n * Stuff like the (Phone only) zone.\n */\n 'other',\n] as const\nexport type ZoneType = typeof ZONE_TYPE[number]\n","import { ALIGNMENT, Alignment, AlignmentExtended } from '../api/alignment'\n\nexport class AlignmentList {\n readonly #items: Set<Alignment>\n\n readonly hero: boolean\n readonly villain: boolean\n readonly praetorian: boolean\n\n readonly primal: boolean\n readonly all: boolean\n\n constructor(items?: AlignmentExtended[]) {\n const set = new Set(items ?? [...ALIGNMENT])\n this.hero = set.has('hero') || set.has('primal') || set.has('all')\n this.villain = set.has('villain') || set.has('primal') || set.has('all')\n this.praetorian = set.has('praetorian') || set.has('all')\n\n this.primal = this.hero && this.villain\n this.all = this.hero && this.villain && this.praetorian\n\n this.#items = new Set()\n if (this.hero) this.#items.add('hero')\n if (this.villain) this.#items.add('villain')\n if (this.praetorian) this.#items.add('praetorian')\n }\n\n get items(): Alignment[] {\n return [...this.#items]\n }\n\n has(alignment?: AlignmentExtended): boolean {\n switch (alignment) {\n case 'hero': {\n return this.hero\n }\n case 'villain': {\n return this.villain\n }\n case 'praetorian': {\n return this.praetorian\n }\n case 'primal' : {\n return this.primal\n }\n case 'all': {\n return this.all\n }\n default: {\n return false\n }\n }\n }\n}\n","const INVALID_KEY_PATTERN = /[^a-z0-9-]/\n\nexport class Key {\n readonly #value: string\n\n constructor(value: string) {\n this.#validateKey(value)\n this.#value = value\n }\n\n get value(): string {\n return this.#value\n }\n\n #validateKey(key: string): void {\n if (INVALID_KEY_PATTERN.test(key)) throw new Error(`Invalid key: [${key}]; Keys can only contain lowercase characters, numbers and dashes.`)\n }\n}\n","import { Key } from './key'\nimport { ArchetypeData } from '../api/archetype-data'\n\nexport class Archetype {\n readonly key: string\n readonly name: string\n readonly description?: string\n\n constructor(data: ArchetypeData) {\n this.key = new Key(data.key).value\n this.name = data.name\n this.description = data.description\n }\n}\n","/**\n * For fields that accept either an array of values or a single value, coalesces the value to an array.\n *\n * Arrays are returned as-is.\n * Single values are returned as a single-value array.\n * Undefined values are returned as undefined.\n *\n * @param value The value to coalesce.\n */\nexport function coalesceToArray<T>(value?: T | T[]): T[] | undefined {\n if (!value) return undefined\n return Array.isArray(value) ? value as T[] : [value]\n}\n","import { BadgeRequirementData } from '../api/badge-requirement-data'\nimport { BadgeRequirementType } from '../api/badge-requirement-type'\nimport { EnhancementCategory } from '../api/enhancement-category'\nimport { Key } from './key'\nimport { MarkdownString } from '../api/markdown-string'\nimport { Link } from '../api/link'\nimport { Location } from './location'\nimport { coalesceToArray } from '../util/coalesce-to-array'\n\nexport class BadgeRequirement {\n /**\n * Unique key used to reference this badge requirement.\n *\n * Keys must be unique and can only contain lowercase letters, numbers and hyphens (`-`).\n */\n readonly key: string\n\n /**\n * The requirement type.\n */\n readonly type: BadgeRequirementType\n\n /**\n * If the requirement involves a location, where it is.\n */\n readonly location?: Location[]\n\n /**\n * If the requirement involves a badge, the badge key.\n */\n readonly badgeKey?: string\n\n /**\n * If the requirement involves a mission, the mission key.\n */\n readonly missionKey?: string\n\n /**\n * If the requirement involves a monument, the text that is displayed thereon.\n */\n readonly monumentText?: string\n\n /**\n * If the requirement involves crafting an invention, the Level of the invention required.\n */\n readonly inventionLevel?: number\n\n /**\n * If the requirement involves crafting an invention, the types of enhancements that will qualify.\n */\n readonly inventionTypes?: EnhancementCategory[]\n\n /**\n * Number of times the task needs to be repeated.\n */\n readonly count?: number\n\n /**\n * Additional information about the requirement.\n */\n readonly notes?: MarkdownString\n\n /**\n * List of external links. Wiki, forums, etc.\n */\n readonly links: Link[]\n\n constructor(data: BadgeRequirementData) {\n this.key = new Key(data.key).value\n this.type = data.type\n this.location = coalesceToArray(data.location)\n this.badgeKey = data.badgeKey\n this.missionKey = data.missionKey\n this.monumentText = data.monumentText\n this.inventionLevel = data.inventionLevel\n this.inventionTypes = data.inventionTypes\n this.count = data.count\n this.notes = data.notes\n this.links = data.links ?? []\n }\n}\n","import { VariantData } from '../api/variant-data'\nimport { compareSex } from '../api/sex'\nimport { compareAlignment } from '../api/alignment'\nimport { VariantContext } from '../api/variant-context'\nimport { MoralityMap } from '../api/morality'\n\nexport class Variants<T> {\n readonly #sortedValues: VariantData<T>[] = []\n\n /**\n * Create a variant set from either a list of categorized values, or a single value when there are no variants.\n * @param value List of variants, or a single value.\n */\n constructor(value: VariantData<T>[] | T) {\n if (Array.isArray(value)) {\n this.#sortedValues = value.toSorted()\n this.#sortedValues.sort((a, b) => this.#compareVariants(a, b))\n } else {\n this.#sortedValues = [{ value }]\n }\n }\n\n /**\n * Get a variant by context\n * @param context The context\n */\n getVariant(context?: VariantContext): VariantData<T> | undefined {\n const alignment = context?.morality ? MoralityMap[context.morality] : undefined\n const sex = context?.sex\n\n for (let index = this.#sortedValues.length; index--;) {\n const entry = this.#sortedValues[index]\n if ((entry.alignment === undefined || entry.alignment === alignment)\n && (entry.sex === undefined || entry.sex === sex)\n ) return entry\n }\n\n return this.default\n }\n\n /**\n * Get a value by variant context\n * @param context The context\n */\n getValue(context?: VariantContext): T | undefined {\n return this.getVariant(context)?.value\n }\n\n /**\n * Get the default value for this list of variants, the value with the highest priority and lowest specificity.\n */\n get default(): VariantData<T> | undefined {\n return this.#sortedValues[0]\n }\n\n /**\n * Get the list of variants sorted in canonical order (alignment then sex, low to high specificity).\n */\n get canonical(): VariantData<T>[] {\n return this.#sortedValues\n }\n\n /**\n * Create a joined string from the variant values in canonical order.\n * @param separator Separator to use. Default is ' / '\n */\n toString(separator: string): string {\n return this.canonical.map(x => x.value).join(separator)\n }\n\n #compareVariants(a: VariantData<T>, b: VariantData<T>): number {\n const aSpecificity = (a.alignment ? 2 : 0) + (a.sex ? 1 : 0)\n const bSpecificity = (b.alignment ? 2 : 0) + (b.sex ? 1 : 0)\n if (aSpecificity !== bSpecificity) return aSpecificity - bSpecificity // Order first by least-specific\n\n const alignmentComparison = compareAlignment(a.alignment, b.alignment) // Next by alignment\n if (alignmentComparison !== 0) return alignmentComparison\n\n const sexComparison = compareSex(a.sex, b.sex) // Last by sex\n if (sexComparison !== 0) return sexComparison\n\n return String(a.value).localeCompare(String(b.value))\n }\n}\n","import { MORALITY, Morality, MoralityExtended } from '../api/morality'\n\nexport class MoralityList {\n readonly #items: Set<Morality>\n\n readonly hero: boolean\n readonly vigilante: boolean\n readonly villain: boolean\n readonly rogue: boolean\n readonly resistance: boolean\n readonly loyalist: boolean\n\n readonly primal: boolean\n readonly praetorian: boolean\n readonly heroic: boolean\n readonly villainous: boolean\n readonly paragonCityAccess: boolean\n readonly rogueIslesAccess: boolean\n\n readonly all: boolean\n\n constructor(items?: MoralityExtended[]) {\n const set = new Set(items ?? [...MORALITY])\n this.hero = set.has('hero') || set.has('primal') || set.has('heroic') || set.has('paragon-city-access') || set.has('all')\n this.vigilante = set.has('vigilante') || set.has('primal') || set.has('heroic') || set.has('paragon-city-access') || set.has('rogue-isles-access') || set.has('all')\n this.villain = set.has('villain') || set.has('primal') || set.has('villainous') || set.has('rogue-isles-access') || set.has('all')\n this.rogue = set.has('rogue') || set.has('primal') || set.has('villainous') || set.has('paragon-city-access') || set.has('rogue-isles-access') || set.has('all')\n this.resistance = set.has('resistance') || set.has('praetorian') || set.has('all')\n this.loyalist = set.has('loyalist') || set.has('praetorian') || set.has('all')\n\n this.primal = this.hero && this.vigilante && this.villain && this.rogue\n this.praetorian = this.loyalist && this.resistance\n this.heroic = this.hero && this.vigilante\n this.villainous = this.villain && this.rogue\n this.paragonCityAccess = this.heroic && this.rogue\n this.rogueIslesAccess = this.villainous && this.vigilante\n\n this.all = this.primal && this.praetorian\n\n this.#items = new Set()\n if (this.hero) this.#items.add('hero')\n if (this.vigilante) this.#items.add('vigilante')\n if (this.villain) this.#items.add('villain')\n if (this.rogue) this.#items.add('rogue')\n if (this.resistance) this.#items.add('resistance')\n if (this.loyalist) this.#items.add('loyalist')\n }\n\n get items(): Morality[] {\n return [...this.#items]\n }\n\n has(morality?: MoralityExtended): boolean {\n switch (morality) {\n case 'hero': {\n return this.hero\n }\n case 'vigilante': {\n return this.vigilante\n }\n case 'villain': {\n return this.villain\n }\n case 'rogue': {\n return this.rogue\n }\n case 'resistance': {\n return this.resistance\n }\n case 'loyalist': {\n return this.loyalist\n }\n case 'primal' : {\n return this.primal\n }\n case 'praetorian': {\n return this.praetorian\n }\n case 'heroic': {\n return this.hero\n }\n case 'paragon-city-access': {\n return this.paragonCityAccess\n }\n case 'rogue-isles-access': {\n return this.rogueIslesAccess\n }\n case 'villainous': {\n return this.villainous\n }\n case 'all': {\n return this.all\n }\n default: {\n return false\n }\n }\n }\n}\n","type KeysOfType<T, V> = { [P in keyof T]: T[P] extends V ? P : never }[keyof T]\n\nexport class AbstractIndex<T> {\n protected _values: T[] = []\n protected _hashTable: Record<string, T> = {}\n\n /**\n * Create a new index.\n * @param keyField The field of the values that will act as the key.\n * @param values Values to index.\n */\n constructor(keyField: KeysOfType<T, string>, values: T[] | undefined) {\n this._values = values ?? []\n this._hashTable = {}\n for (const value of this.values) {\n const key = value[keyField] as string\n if (this._hashTable[key] !== undefined) throw new Error(`Duplicate key [${key}]`)\n this._hashTable[key] = value\n }\n }\n\n /**\n * Return all indexed values\n */\n get values(): T[] {\n return this._values\n }\n\n /**\n * Get a value from the index\n * @param key Key string\n */\n get(key: string | undefined): T | undefined {\n if (!key) return undefined\n return this._hashTable[key]\n }\n}\n","/**\n * Converts an iso string to a Date object, throwing an error if the iso string is invalid.\n * @param iso ISO-8601 Date string\n */\nexport function toDate(iso: string): Date {\n const date = new Date(iso)\n if (!date || Number.isNaN(date.getTime())) throw new Error(`Invalid date format: [${iso}]`)\n return date\n}\n","import { SetTitleData } from '../api/set-title-data'\n\nexport class SetTitleIds {\n readonly primal: number\n readonly praetorian?: number\n\n constructor(value: SetTitleData) {\n [this.primal, this.praetorian] = value\n }\n}\n","import { BadgeType } from '../api/badge-type'\nimport { Link } from '../api/link'\nimport { BadgeData } from '../api/badge-data'\nimport { BadgeRequirement } from './badge-requirement'\nimport { Key } from './key'\nimport { Variants } from './variants'\nimport { MarkdownString } from '../api/markdown-string'\nimport { MoralityList } from './morality-list'\nimport { AbstractIndex } from './abstract-index'\nimport { toDate } from '../util/to-date'\nimport { coalesceToArray } from '../util/coalesce-to-array'\nimport { SetTitleIds } from './set-title-ids'\nimport { VariantContext } from '../api/variant-context'\n\nexport class Badge {\n readonly #requirementsIndex: AbstractIndex<BadgeRequirement>\n readonly #zoneKeys = new Set<string>()\n\n /**\n * The database key for this badge.\n */\n readonly key: string\n\n /**\n * The type of badge.\n */\n readonly type: BadgeType\n\n /**\n * The name of this badge.\n *\n * May vary by character sex or alignment.\n */\n readonly name: Variants<string>\n\n /**\n * The date that the badge was added to the game.\n */\n readonly releaseDate: Date\n\n /**\n * The character moralities that this badge is available to.\n */\n readonly morality: MoralityList\n\n /**\n * The badge text as it appears in-game. May vary by character sex or alignment.\n */\n readonly badgeText: Variants<MarkdownString>\n\n /**\n * Short description of how to acquire the badge. Detailed instructions will be in the notes field.\n */\n readonly acquisition?: MarkdownString\n\n /**\n * Absolute URL to this badge's icon.\n *\n * May vary by character sex or alignment.\n */\n readonly icon: Variants<string>\n\n /**\n * Freeform notes or tips about the badge.\n */\n readonly notes?: MarkdownString\n\n /**\n * List of external links. Wiki, forums, etc.\n */\n readonly links: Link[]\n\n /**\n * The id used with the in-game `/settitle` command to apply the badge.\n * The first value is the id for primal characters and the (optional) second number is the id for praetorian characters.\n */\n readonly setTitleId?: SetTitleIds\n\n /**\n * A description of the effect the badge will have, such as a buff or granting a temporary power.\n */\n readonly effect?: MarkdownString\n\n /**\n * Some badges are not included in the badge total count... such as Flames of Prometheus, which can be removed by redeeming it for a Notice of the Well.\n */\n readonly ignoreInTotals: boolean\n\n constructor(badgeData: BadgeData) {\n this.key = new Key(badgeData.key).value\n this.type = badgeData.type\n this.name = new Variants(badgeData.name)\n this.releaseDate = toDate(badgeData.releaseDate)\n this.morality = new MoralityList(coalesceToArray(badgeData.morality))\n this.badgeText = new Variants(badgeData.badgeText ?? [])\n this.acquisition = badgeData.acquisition\n this.icon = new Variants(badgeData.icon ?? [])\n this.notes = badgeData.notes\n this.links = badgeData.links ?? []\n this.effect = badgeData.effect\n this.setTitleId = badgeData.setTitleId ? new SetTitleIds(badgeData.setTitleId) : undefined\n this.ignoreInTotals = badgeData.ignoreInTotals ?? false\n\n this.#requirementsIndex = new AbstractIndex<BadgeRequirement>('key', badgeData.requirements?.map(x => new BadgeRequirement(x)))\n\n for (const requirement of this.#requirementsIndex.values) {\n if (requirement.location) for (const location of requirement.location) {\n if (location.zoneKey) this.#zoneKeys.add(location.zoneKey)\n }\n }\n }\n\n /**\n * Represents the requirements for badges with multiple fulfillment steps, such as visiting monuments for history badges, completing missions, or collecting other badges.\n */\n get requirements(): BadgeRequirement[] {\n return this.#requirementsIndex.values\n }\n\n getRequirement(key: string): BadgeRequirement | undefined {\n return this.#requirementsIndex.get(key)\n }\n\n /**\n * Return a list of all the zone keys referenced by this badge.\n */\n get zoneKeys(): string[] {\n return [...this.#zoneKeys]\n }\n\n /**\n * The zone key if this badge relates to a single zone.\n */\n get zoneKey(): string | undefined {\n return this.#zoneKeys.size === 1 ? this.#zoneKeys.values().next().value : undefined\n }\n}\n\nexport function compareByName(a?: Badge, b?: Badge, context?: VariantContext): number {\n const aName = a?.name?.getValue(context)\n const bName = b?.name?.getValue(context)\n if (!aName && !bName) return 0\n if (!aName) return 1\n if (!bName) return -1\n return aName.localeCompare(bName)\n}\n\nexport function compareByZoneKey(a?: Badge, b?: Badge): number {\n const aZone = a?.zoneKey\n const bZone = b?.zoneKey\n if (!aZone && !bZone) return 0\n if (!aZone) return 1\n if (!bZone) return -1\n return aZone.localeCompare(bZone)\n}\n\nexport function compareByReleaseDate(a?: Badge, b?: Badge): number {\n const aReleaseDate = a?.releaseDate?.getTime()\n const bReleaseDate = b?.releaseDate?.getTime()\n if (aReleaseDate === bReleaseDate) return 0\n if (!aReleaseDate) return 1\n if (!bReleaseDate) return -1\n return aReleaseDate < bReleaseDate ? -1 : 1\n}\n","import { Badge, compareByName, compareByReleaseDate, compareByZoneKey } from './badge'\nimport { BadgeSearchOptions } from './badge-search-options'\nimport { Paged } from './paged'\nimport { AbstractIndex } from './abstract-index'\n\nexport class BadgeIndex extends AbstractIndex<Badge> {\n constructor(values: Badge[] | undefined) {\n super('key', values)\n }\n\n search(options?: BadgeSearchOptions): Paged<Badge> {\n const filtered = (options?.query || options?.filter)\n ? this._values.filter(badge => this.#satisfiesQueryPredicate(badge, options?.query) && this.#satisfiesFilterPredicate(badge, options?.filter))\n : this._values\n\n const sorted = this.#sort(filtered, options)\n\n const totalPages = options?.pageSize ? Math.ceil(filtered.length / (options?.pageSize)) : 1\n const page = Math.max(1, Math.min(totalPages, options?.page ?? 1))\n const paged = options?.pageSize ? sorted.slice((page - 1) * options.pageSize, page * options?.pageSize) : sorted\n\n return {\n items: paged,\n page: page,\n pageSize: options?.pageSize,\n totalItems: filtered.length,\n totalPages: totalPages,\n }\n }\n\n #satisfiesQueryPredicate(badge: Badge, query?: BadgeSearchOptions['query']): boolean {\n const queryString = query?.str?.toLowerCase() ?? ''\n const fields = query?.fields ? new Set(query?.fields) : new Set(['name']) // Default to name if not provided\n if (fields.size === 0) return true\n\n return !!((fields.has('name') && badge.name.canonical.some(x => x.value.toLowerCase().includes(queryString)))\n || (fields.has('badge-text') && badge.badgeText.canonical.some(x => x.value.toLowerCase().includes(queryString)))\n || (fields.has('acquisition') && badge.acquisition?.toLowerCase().includes(queryString))\n || (fields.has('effect') && badge.effect?.toLowerCase().includes(queryString))\n || (fields.has('notes') && badge.notes?.toLowerCase().includes(queryString))\n || (fields.has('set-title-id') && (badge.setTitleId?.primal.toString() === queryString))\n || (fields.has('set-title-id') && (badge.setTitleId?.praetorian?.toString() === queryString))\n )\n }\n\n #satisfiesFilterPredicate(badge: Badge, filter?: BadgeSearchOptions['filter']): boolean {\n return (!filter?.type || badge.type === filter.type)\n && (!filter?.zoneKey || badge.zoneKey === filter.zoneKey)\n && (!filter?.morality || badge.morality.has(filter.morality))\n && (!filter?.predicate || filter.predicate(badge))\n }\n\n #sort(badges: Badge[], options?: BadgeSearchOptions): Badge[] {\n switch (options?.sort) {\n case 'name.asc': {\n return badges.toSorted((a, b) => compareByName(a, b, options.variantContext))\n }\n case 'name.desc': {\n return badges.toSorted((a, b) => compareByName(b, a, options.variantContext))\n }\n case 'zone-key.asc': {\n return badges.toSorted(compareByZoneKey)\n }\n case 'zone-key.desc': {\n return badges.toSorted((a, b) => compareByZoneKey(b, a))\n }\n case 'release-date.asc': {\n return badges.toSorted(compareByReleaseDate)\n }\n case 'release-date.desc': {\n return badges.toSorted((a, b) => compareByReleaseDate(b, a))\n }\n case 'canonical.desc': {\n return badges.toReversed()\n }\n default: {\n return [...badges]\n }\n }\n }\n}\n","import { Link } from '../api/link'\nimport { MarkdownString } from '../api/markdown-string'\nimport { BundleHeaderData } from '../api/bundle-header-data'\nimport { toDate } from '../util/to-date'\n\nexport class BundleHeader {\n /**\n * Name of the fork this bundle contains data for.\n */\n readonly name: string\n\n /**\n * Version number for this data package.\n */\n readonly version: string\n\n /**\n * The time this bundle was last updated.\n */\n readonly lastUpdateTime: Date\n\n /**\n * Description of the fork.\n */\n readonly description?: MarkdownString\n\n /**\n * Url for the repository where the bundle is maintained.\n */\n readonly repositoryUrl?: string\n\n /**\n * Url for the location of the changelog.\n */\n readonly changelogUrl?: string\n\n /**\n * List of external links. Wiki, forums, etc.\n */\n readonly links?: Link[]\n\n constructor(data: BundleHeaderData) {\n if (!data) throw new Error('Missing header data')\n this.name = data.name\n this.version = data.version\n this.lastUpdateTime = toDate(data.lastUpdateTime)\n this.description = data?.description\n this.repositoryUrl = data?.repositoryUrl\n this.changelogUrl = data?.changelogUrl\n this.links = data?.links ?? []\n }\n}\n","import { LevelRangeData } from '../api/level-range-data'\n\nexport class LevelRange {\n readonly min: number\n readonly max?: number\n\n constructor(value: LevelRangeData) {\n if (Array.isArray(value)) {\n this.min = value[0]\n this.max = value[1] === undefined ? undefined : value[1]\n } else {\n this.min = value\n }\n }\n}\n","import { Link } from '../api/link'\nimport { ZoneData } from '../api/zone-data'\nimport { Key } from './key'\nimport { MoralityList } from './morality-list'\nimport { coalesceToArray } from '../util/coalesce-to-array'\nimport { ZoneType } from '../api/zone-type'\nimport { MarkdownString } from '../api/markdown-string'\nimport { LevelRange } from './level-range'\n\nexport class Zone {\n /**\n * Unique key used to reference this zone.\n *\n * Keys must be unique and can only contain lowercase letters, numbers and hyphens (`-`).\n */\n readonly key: string\n\n /**\n * The name of the zone as it appears in-game.\n */\n readonly name: string\n\n /**\n * The type of zone.\n */\n readonly type: ZoneType\n\n /**\n * The character moralities that this zone is accessible by.\n */\n readonly morality: MoralityList\n\n /**\n * The level range this zone is recommended for.\n */\n readonly levelRange?: LevelRange\n\n /**\n * Freeform notes or tips about the zone.\n */\n readonly notes?: MarkdownString\n\n /**\n * List of external links. Wiki, forums, etc.\n */\n readonly links: Link[]\n\n constructor(data: ZoneData) {\n this.key = new Key(data.key).value\n this.name = data.name\n this.type = data.type\n this.morality = new MoralityList(coalesceToArray(data.morality))\n this.levelRange = data.levelRange ? new LevelRange(data.levelRange) : undefined\n this.notes = data.notes\n this.links = data.links ?? []\n }\n}\n","import { Link } from '../api/link'\nimport { Key } from './key'\nimport { MarkdownString } from '../api/markdown-string'\nimport { ContactData } from '../api/contact-data'\nimport { Location } from './location'\nimport { MoralityList } from './morality-list'\nimport { coalesceToArray } from '../util/coalesce-to-array'\nimport { LevelRange } from './level-range'\n\nexport class Contact {\n /**\n * Unique key used to reference this contact.\n *\n * Keys must be unique and can only contain lowercase letters, numbers and hyphens (`-`).\n */\n readonly key: string\n\n /**\n * The name of this contact.\n */\n readonly name: string\n\n /**\n * The contact's title.\n */\n readonly title?: string\n\n /**\n * The character moralities that this contact will interact with.\n */\n readonly morality: MoralityList\n\n /**\n * The location of this contact.\n */\n readonly location?: Location\n\n /**\n * The level range this contact will offer missions for.\n */\n readonly levelRange?: LevelRange\n\n /**\n * Freeform notes or tips about the contact.\n */\n readonly notes?: MarkdownString\n\n /**\n * List of external links. Wiki, forums, etc.\n */\n readonly links: Link[]\n\n constructor(data: ContactData) {\n this.key = new Key(data.key).value\n this.name = data.name\n this.title = data.title\n this.morality = new MoralityList(coalesceToArray(data.morality))\n this.location = data.location\n this.levelRange = data.levelRange ? new LevelRange(data.levelRange) : undefined\n this.notes = data.notes\n this.links = data.links ?? []\n }\n}\n","import { MissionType } from '../api/mission-type'\nimport { MarkdownString } from '../api/markdown-string'\nimport { Link } from '../api/link'\nimport { MissionData } from '../api/mission-data'\nimport { Key } from './key'\nimport { MoralityList } from './morality-list'\nimport { coalesceToArray } from '../util/coalesce-to-array'\nimport { LevelRange } from './level-range'\n\nexport class Mission {\n /**\n * Unique key used to reference this mission.\n *\n * Keys must be unique and can only contain lowercase letters, numbers and hyphens (`-`).\n */\n readonly key: string\n\n /**\n * The name of the mission as it appears from the contact.\n *\n * The name may be different when viewed in Ouroboros as a Flashback.\n */\n readonly name: string\n\n /**\n * The type of mission... Story arc, task force, trial, etc.\n */\n readonly type: MissionType\n\n /**\n * The character moralities that may accept the mission.\n */\n readonly morality: MoralityList\n\n /**\n * The keys of any contacts that provide this mission.\n */\n readonly contactKeys?: string[]\n\n /**\n * The level range this mission is available for.\n */\n readonly levelRange?: LevelRange\n\n /**\n * Freeform notes or tips about the mission.\n */\n readonly notes?: MarkdownString\n\n /**\n * List of external links. Wiki, forums, etc.\n */\n readonly links: Link[]\n\n /**\n * If the mission is available in Ouroboros as a Flashback.\n */\n readonly flashback?: {\n\n /**\n * The id of the mission as seen in the Flashback menu, i.e. '14.01'.\n */\n readonly id: string\n\n /**\n * The level range this mission appears under as a Flashback.\n */\n readonly levelRange?: LevelRange\n\n /**\n * The name as it appears in the Flashback list.\n */\n readonly name: string\n\n /**\n * The character moralities that the mission will appear for in the Flashback list.\n */\n readonly morality: MoralityList\n\n /**\n * Freeform notes or tips about the Flashback version of the mission.\n */\n readonly notes?: MarkdownString\n }\n\n constructor(data: MissionData) {\n this.key = new Key(data.key).value\n this.name = data.name\n this.type = data.type\n this.morality = new MoralityList(coalesceToArray(data.morality))\n this.contactKeys = coalesceToArray(data.contactKeys)\n this.levelRange = data.levelRange ? new LevelRange(data.levelRange) : undefined\n this.notes = data.notes\n this.links = data.links ?? []\n this.flashback = createFlashback(data)\n }\n}\n\nfunction createFlashback(data: MissionData): Mission['flashback'] {\n if (!data.flashback) return undefined\n return {\n id: data.flashback.id,\n levelRange: data.flashback.levelRange ? new LevelRange(data.flashback.levelRange) : undefined,\n name: data.flashback.name ?? data.name,\n morality: new MoralityList(coalesceToArray(data.flashback.morality ?? data.morality)),\n notes: data.flashback.notes,\n }\n}\n","import { BundleData } from '../api/bundle-data'\nimport { Archetype } from './archetype'\nimport { Zone } from './zone'\nimport { Badge } from './badge'\nimport { BundleHeader } from './bundle-header'\nimport { BadgeSearchOptions } from './badge-search-options'\nimport { Paged } from './paged'\nimport { Contact } from './contact'\nimport { Mission } from './mission'\nimport { AbstractIndex } from './abstract-index'\nimport { BadgeIndex } from './badge-index'\n\nexport class CohContentDatabase {\n readonly #archetypeIndex\n readonly #zoneIndex\n readonly #contactIndex\n readonly #missionIndex\n readonly #badgeIndex\n\n readonly #header: BundleHeader\n readonly #servers: string[]\n\n /**\n * Create a db instance from the given content bundle.\n * @param bundle The bundle to load.\n */\n constructor(bundle: BundleData) {\n this.#header = new BundleHeader(bundle.header)\n this.#servers = bundle.servers ?? []\n\n this.#archetypeIndex = new AbstractIndex<Archetype>('key', bundle.archetypes?.map(x => new Archetype(x)))\n this.#zoneIndex = new AbstractIndex<Zone>('key', bundle.zones?.map(x => new Zone(x)))\n this.#contactIndex = new AbstractIndex<Contact>('key', bundle.contacts?.map(x => new Contact(x)))\n this.#missionIndex = new AbstractIndex<Mission>('key', bundle.missions?.map(x => new Mission(x)))\n this.#badgeIndex = new BadgeIndex(bundle.badges?.map(x => new Badge(x)))\n }\n\n /**\n * Header information about the content bundle.\n */\n get header(): BundleHeader {\n return this.#header\n }\n\n /**\n * List of the game server names.\n *\n * Torchbearer, Excelsior, etc.\n */\n get servers(): string[] {\n return this.#servers\n }\n\n /**\n * List of archetypes.\n */\n get archetypes(): Archetype[] {\n return this.#archetypeIndex.values\n }\n\n /**\n * Get archetype by key.\n * @param key The key.\n */\n getArchetype(key: string | undefined): Archetype | undefined {\n return this.#archetypeIndex.get(key)\n }\n\n /**\n * List of game zones.\n */\n get zones(): Zone[] {\n return this.#zoneIndex.values\n }\n\n /**\n * Get zone by key.\n * @param key The key.\n */\n getZone(key: string | undefined): Zone | undefined {\n return this.#zoneIndex.get(key)\n }\n\n /**\n * List of contacts.\n */\n get contacts(): Contact[] {\n return this.#contactIndex.values\n }\n\n /**\n * Get contact by key.\n * @param key The key.\n */\n getContact(key: string | undefined): Contact | undefined {\n return this.#contactIndex.get(key)\n }\n\n /**\n * List of missions.\n */\n get missions(): Mission[] {\n return this.#missionIndex.values\n }\n\n /**\n * Get mission by key.\n * @param key The key.\n */\n getMission(key: string | undefined): Mission | undefined {\n return this.#missionIndex.get(key)\n }\n\n /**\n * List of badges.\n */\n get badges(): Badge[] {\n return this.#badgeIndex.values\n }\n\n /**\n * Get badge by key.\n * @param key The key.\n */\n getBadge(key: string | undefined): Badge | undefined {\n return this.#badgeIndex.get(key)\n }\n\n /**\n * Search, sort and filter the badge list.\n * This is a fairly brute-forced approach and will not be as performant as loading the badge data into a traditional\n * database engine, but is sufficient for most operations.\n * @param options {@link BadgeSearchOptions}\n */\n searchBadges(options?: BadgeSearchOptions): Paged<Badge> {\n return this.#badgeIndex.search(options)\n }\n}\n","import { Coords, LocationData, LocationIcon } from '../api/location-data'\n\nexport class Location {\n /**\n * Key of the {@link Zone} that the location references.\n */\n readonly zoneKey?: string\n\n /**\n * In-game `/loc` coordinates of the location.\n */\n readonly coords?: Coords\n\n /**\n * The type of icon to use if the location appears on a map. (Typically the Vidiot map icon).\n */\n readonly icon?: LocationIcon\n\n /**\n * The text that should appear in the location icon. (Typically a number or symbol from the Vidiot map).\n */\n readonly iconText?: string\n\n constructor(data: LocationData) {\n this.zoneKey = data.zoneKey\n this.coords = data.coords\n this.icon = data.icon\n this.iconText = data.iconText\n }\n}\n","import { BadgeData } from '../api/badge-data'\nimport { Badge } from '../db/badge'\nimport { ZoneData } from '../api/zone-data'\nimport { Zone } from '../db/zone'\nimport { Contact } from '../db/contact'\nimport { ContactData } from '../api/contact-data'\nimport { Mission } from '../db/mission'\nimport { MissionData } from '../api/mission-data'\n\n/**\n * Returns the URI of the given badge that can be used in {@link MarkdownString} fields.\n *\n * URI format: `badge://<key>`\n *\n * @param target The badge or badge key to target.\n */\nexport function badgeUri(target: string | Badge | BadgeData): string {\n const key = typeof target === 'string' ? target : target.key\n return `badge://${key}`\n}\n\n/**\n * Returns a {@link MarkdownString} link to the given badge.\n *\n * Link format: `[<key>](badge://<key>)`\n *\n * @param target The {@link Badge} or badge key to target.\n */\nexport function badgeLink(target: string | Badge | BadgeData): string {\n const key = typeof target === 'string' ? target : target.key\n return `[${key}](${badgeUri(target)})`\n}\n\n/**\n * Returns the URI of the given contact that can be used in {@link MarkdownString} fields.\n *\n * URI format: `contact://<key>`\n *\n * @param target The {@link Contact} or contact key to target.\n */\nexport function contactUri(target: string | Contact | ContactData): string {\n const key = typeof target === 'string' ? target : target.key\n return `contact://${key}`\n}\n\n/**\n * Returns a {@link MarkdownString} link to the given contact.\n *\n * Link format: `[<key>](contact://<key>)`\n *\n * @param target The {@link Contact} or contact key to target.\n */\nexport function contactLink(target: string | Contact | ContactData): string {\n const key = typeof target === 'string' ? target : target.key\n return `[${key}](${contactUri(target)})`\n}\n\n/**\n * Returns the URI of the given mission that can be used in {@link MarkdownString} fields.\n *\n * URI format: `mission://<key>`\n *\n * @param target The {@link Mission} or mission key to target.\n */\nexport function missionUri(target: string | Mission | MissionData): string {\n const key = typeof target === 'string' ? target : target.key\n return `mission://${key}`\n}\n\n/**\n * Returns a {@link MarkdownString} link to the given mission.\n *\n * Link format: `[<key>](mission://<key>)`\n *\n * @param target The {@link Mission} or mission key to target.\n */\nexport function missionLink(target: string | Mission | MissionData): string {\n const key = typeof target === 'string' ? target : target.key\n return `[${key}](${missionUri(target)})`\n}\n\n/**\n * Returns the URI of the given zone that can be used in {@link MarkdownString} fields.\n *\n * URI format: `zone://<key>`\n *\n * @param target The {@link Zone} or zone key to target.\n */\nexport function zoneUri(target: string | Zone | ZoneData): string {\n const key = typeof target === 'string' ? target : target.key\n return `zone://${key}`\n}\n\n/**\n * Returns a {@link MarkdownString} link to the given zone.\n *\n * Link format: `[<key>](zone://<key>)`\n *\n * @param target The {@link Zone} or zone key to target.\n */\nexport function zoneLink(target: string | Zone | ZoneData): string {\n const key = typeof target === 'string' ? target : target.key\n return `[${key}](${zoneUri(target)})`\n}\n"],"names":["_items","__privateAdd","__publicField","__privateSet","__privateGet","__privateMethod"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"coh-content-db.mjs","sources":["../src/main/api/alignment.ts","../src/main/api/badge-requirement-type.ts","../src/main/api/badge-type.ts","../src/main/api/enhancement-category.ts","../src/main/api/mission-type.ts","../src/main/api/morality.ts","../src/main/api/sex.ts","../src/main/api/zone-type.ts","../src/main/db/alignment-list.ts","../src/main/db/key.ts","../src/main/db/archetype.ts","../src/main/util/coalesce-to-array.ts","../src/main/db/badge-requirement.ts","../src/main/db/variants.ts","../src/main/db/morality-list.ts","../src/main/db/abstract-index.ts","../src/main/util/to-date.ts","../src/main/db/set-title-ids.ts","../src/main/db/badge.ts","../src/main/db/badge-index.ts","../src/main/db/bundle-header.ts","../src/main/db/level-range.ts","../src/main/db/zone.ts","../src/main/db/contact.ts","../src/main/db/mission.ts","../src/main/db/coh-content-database.ts","../src/main/db/location.ts","../src/main/util/links.ts"],"sourcesContent":["export const ALIGNMENT = ['hero', 'villain', 'praetorian'] as const\nexport type Alignment = typeof ALIGNMENT[number]\nexport type AlignmentExtended = Alignment\n /**\n * The alignments available for Primal Earth characters - Hero and Villain.\n */\n | 'primal'\n /**\n * All the alignments.\n */\n | 'all'\n\nconst ALIGNMENT_ORDER = Object.fromEntries(ALIGNMENT.map((x, index) => [x, index]))\n\nexport function compareAlignment(a?: Alignment, b?: Alignment): number {\n const orderA = a ? ALIGNMENT_ORDER[a] : -1\n const orderB = b ? ALIGNMENT_ORDER[b] : -1\n return orderA - orderB\n}\n","export const BADGE_REQUIREMENT_TYPE = [\n /**\n * Collect a badge.\n */\n 'badge',\n /**\n * Craft an invention.\n */\n 'invention',\n /**\n * Some invention badges require you to build x of two different invention levels, 'plus one of either level'.\n */\n 'invention-plus-one',\n /**\n * Visit a location.\n */\n 'location',\n /**\n * Click on a monument.\n */\n 'monument',\n /**\n * Complete a mission.\n */\n 'mission',\n /**\n * Complete an arbitrary task.\n */\n 'task',\n] as const\n\nexport type BadgeRequirementType = typeof BADGE_REQUIREMENT_TYPE[number]\n","export const BADGE_TYPE = [\n 'exploration',\n 'history',\n 'accomplishment',\n 'achievement',\n 'accolade',\n 'gladiator',\n 'veteran',\n 'pvp',\n 'invention',\n 'defeat',\n 'event',\n 'ouroboros',\n 'consignment',\n 'day-job',\n 'architect-entertainment',\n] as const\n\nexport type BadgeType = typeof BADGE_TYPE[number]\n","export const ENHANCEMENT_CATEGORY = [\n 'defense-debuff',\n 'to-hit-debuff',\n 'taunt',\n 'confuse',\n 'healing',\n 'defense-buff',\n 'resist-damage',\n 'intangibility',\n 'sleep',\n 'slow',\n 'hold',\n 'stun',\n 'immobilize',\n 'fear',\n 'endurance-modification',\n 'endurance-reduction',\n 'recharge-reduction',\n 'interrupt-duration',\n 'accuracy',\n 'to-hit-buff',\n 'damage',\n 'knockback',\n 'run-speed',\n 'jump',\n 'fly-speed',\n 'range',\n] as const\n\nexport type EnhancementCategory = typeof ENHANCEMENT_CATEGORY[number]\n","export const MISSION_TYPE = ['story-arc', 'mission', 'task-force', 'strike-force', 'trial', 'personal-story'] as const\nexport type MissionType = typeof MISSION_TYPE[number]\n","import { Alignment } from './alignment'\n\nexport const MORALITY = ['hero', 'vigilante', 'villain', 'rogue', 'resistance', 'loyalist'] as const\nexport const MORALITY_EXTENDED = [\n ...MORALITY,\n /**\n * Any of the Primal Earth moralities - Hero, Vigilante, Villain, Rogue.\n */\n 'primal',\n /**\n * Either of the Praetorian Earth moralities - Resistance or Loyalist.\n */\n 'praetorian',\n /**\n * The moralities that roll up to the Hero {@link Alignment} - Hero and Vigilante.\n */\n 'heroic',\n /**\n * The moralities that roll up to the Villain {@link Alignment} - Villain and Rogue.\n */\n 'villainous',\n /**\n * Moralities with access to Paragon City - Hero, Vigilante and Rogue.\n */\n 'paragon-city-access',\n /**\n * Moralities with access to the Rogue Isles - Villain, Rogue and Vigilante.\n */\n 'rogue-isles-access',\n /**\n * All the moralities.\n */\n 'all',\n] as const\nexport type Morality = typeof MORALITY[number]\nexport type MoralityExtended = typeof MORALITY_EXTENDED[number]\n\n/**\n * Maps a morality to the underlying alignment\n */\nexport const MoralityMap: Record<Morality | Alignment, Alignment> = {\n hero: 'hero',\n vigilante: 'hero',\n villain: 'villain',\n rogue: 'villain',\n loyalist: 'praetorian',\n resistance: 'praetorian',\n praetorian: 'praetorian',\n}\n","export const SEX = ['M', 'F'] as const\nexport type Sex = typeof SEX[number]\n\nconst SEX_ORDER = Object.fromEntries(SEX.map((x, index) => [x, index]))\n\nexport function compareSex(a?: Sex, b?: Sex): number {\n const orderA = a ? SEX_ORDER[a] : -1\n const orderB = b ? SEX_ORDER[b] : -1\n return orderA - orderB\n}\n","export const ZONE_TYPE = [\n /**\n * The standard zone type, even if not technically occurring in the 'City' proper.\n */\n 'city',\n /**\n * An Ouroboros flashback to a zone as it was in a previous era.\n */\n 'echo',\n /**\n * Tutorial zon, usually inaccessible after leaving.\n */\n 'tutorial',\n /**\n * Trial zones, like the Abandoned Sewers trial.\n */\n 'trial',\n /**\n * Hazard zones like the Hollows.\n */\n 'hazard',\n /**\n * Mayhem mission zones.\n */\n 'mayhem',\n /**\n * Safeguard mission zones.\n */\n 'safeguard',\n /**\n * Exists inside a mission not covered by the other types.\n */\n 'mission',\n /**\n * Incarnate trial zones.\n */\n 'incarnate',\n /**\n * Cooprative zones where Heroes and Villains can team up for PvE content.\n */\n 'co-op',\n /**\n * PvP zones like Bloody Bay.\n */\n 'pvp',\n /**\n * Located in an arena PvP map.\n */\n 'arena',\n /**\n * A building, usually contained within another zone, like the AE buildings.\n */\n 'building',\n /**\n * Stuff like the (Phone only) zone.\n */\n 'other',\n] as const\nexport type ZoneType = typeof ZONE_TYPE[number]\n","import { ALIGNMENT, Alignment, AlignmentExtended } from '../api/alignment'\n\nexport class AlignmentList {\n readonly #items: Set<Alignment>\n\n readonly hero: boolean\n readonly villain: boolean\n readonly praetorian: boolean\n\n readonly primal: boolean\n readonly all: boolean\n\n constructor(items?: AlignmentExtended[]) {\n const set = new Set(items ?? [...ALIGNMENT])\n this.hero = set.has('hero') || set.has('primal') || set.has('all')\n this.villain = set.has('villain') || set.has('primal') || set.has('all')\n this.praetorian = set.has('praetorian') || set.has('all')\n\n this.primal = this.hero && this.villain\n this.all = this.hero && this.villain && this.praetorian\n\n this.#items = new Set()\n if (this.hero) this.#items.add('hero')\n if (this.villain) this.#items.add('villain')\n if (this.praetorian) this.#items.add('praetorian')\n }\n\n get items(): Alignment[] {\n return [...this.#items]\n }\n\n has(alignment?: AlignmentExtended): boolean {\n switch (alignment) {\n case 'hero': {\n return this.hero\n }\n case 'villain': {\n return this.villain\n }\n case 'praetorian': {\n return this.praetorian\n }\n case 'primal' : {\n return this.primal\n }\n case 'all': {\n return this.all\n }\n default: {\n return false\n }\n }\n }\n}\n","const INVALID_KEY_PATTERN = /[^a-z0-9-]/\n\nexport class Key {\n readonly #value: string\n\n constructor(value: string) {\n this.#validateKey(value)\n this.#value = value\n }\n\n get value(): string {\n return this.#value\n }\n\n #validateKey(key: string): void {\n if (INVALID_KEY_PATTERN.test(key)) throw new Error(`Invalid key: [${key}]; Keys can only contain lowercase characters, numbers and dashes.`)\n }\n}\n","import { Key } from './key'\nimport { ArchetypeData } from '../api/archetype-data'\n\nexport class Archetype {\n readonly key: string\n readonly name: string\n readonly description?: string\n\n constructor(data: ArchetypeData) {\n this.key = new Key(data.key).value\n this.name = data.name\n this.description = data.description\n }\n}\n","/**\n * For fields that accept either an array of values or a single value, coalesces the value to an array.\n *\n * Arrays are returned as-is.\n * Single values are returned as a single-value array.\n * Undefined values are returned as undefined.\n *\n * @param value The value to coalesce.\n */\nexport function coalesceToArray<T>(value?: T | T[]): T[] | undefined {\n if (!value) return undefined\n return Array.isArray(value) ? value as T[] : [value]\n}\n","import { BadgeRequirementData } from '../api/badge-requirement-data'\nimport { BadgeRequirementType } from '../api/badge-requirement-type'\nimport { EnhancementCategory } from '../api/enhancement-category'\nimport { Key } from './key'\nimport { MarkdownString } from '../api/markdown-string'\nimport { Link } from '../api/link'\nimport { Location } from './location'\nimport { coalesceToArray } from '../util/coalesce-to-array'\n\nexport class BadgeRequirement {\n /**\n * Unique key used to reference this badge requirement.\n *\n * Keys must be unique and can only contain lowercase letters, numbers and hyphens (`-`).\n */\n readonly key: string\n\n /**\n * The requirement type.\n */\n readonly type: BadgeRequirementType\n\n /**\n * If the requirement involves a location, where it is.\n */\n readonly location?: Location[]\n\n /**\n * If the requirement involves a badge, the badge key.\n */\n readonly badgeKey?: string\n\n /**\n * If the requirement involves a mission, the mission key.\n */\n readonly missionKey?: string\n\n /**\n * If the requirement involves a monument, the text that is displayed thereon.\n */\n readonly monumentText?: string\n\n /**\n * If the requirement involves crafting an invention, the Level of the invention required.\n */\n readonly inventionLevel?: number\n\n /**\n * If the requirement involves crafting an invention, the types of enhancements that will qualify.\n */\n readonly inventionTypes?: EnhancementCategory[]\n\n /**\n * Number of times the task needs to be repeated.\n */\n readonly count?: number\n\n /**\n * Additional information about the requirement.\n */\n readonly notes?: MarkdownString\n\n /**\n * List of external links. Wiki, forums, etc.\n */\n readonly links: Link[]\n\n constructor(data: BadgeRequirementData) {\n this.key = new Key(data.key).value\n this.type = data.type\n this.location = coalesceToArray(data.location)\n this.badgeKey = data.badgeKey\n this.missionKey = data.missionKey\n this.monumentText = data.monumentText\n this.inventionLevel = data.inventionLevel\n this.inventionTypes = data.inventionTypes\n this.count = data.count\n this.notes = data.notes\n this.links = data.links ?? []\n }\n}\n","import { VariantData } from '../api/variant-data'\nimport { compareSex } from '../api/sex'\nimport { compareAlignment } from '../api/alignment'\nimport { VariantContext } from '../api/variant-context'\nimport { MoralityMap } from '../api/morality'\n\nexport class Variants<T> {\n readonly #sortedValues: VariantData<T>[] = []\n\n /**\n * Create a variant set from either a list of categorized values, or a single value when there are no variants.\n * @param value List of variants, or a single value.\n */\n constructor(value: VariantData<T>[] | T) {\n if (Array.isArray(value)) {\n this.#sortedValues = value.toSorted()\n this.#sortedValues.sort((a, b) => this.#compareVariants(a, b))\n } else {\n this.#sortedValues = [{ value }]\n }\n }\n\n /**\n * Get a variant by context\n * @param context The context\n */\n getVariant(context?: VariantContext): VariantData<T> | undefined {\n const alignment = context?.morality ? MoralityMap[context.morality] : undefined\n const sex = context?.sex\n\n for (let index = this.#sortedValues.length; index--;) {\n const entry = this.#sortedValues[index]\n if ((entry.alignment === undefined || entry.alignment === alignment)\n && (entry.sex === undefined || entry.sex === sex)\n ) return entry\n }\n\n return this.default\n }\n\n /**\n * Get a value by variant context\n * @param context The context\n */\n getValue(context?: VariantContext): T | undefined {\n return this.getVariant(context)?.value\n }\n\n /**\n * Get the default value for this list of variants, the value with the highest priority and lowest specificity.\n */\n get default(): VariantData<T> | undefined {\n return this.#sortedValues[0]\n }\n\n /**\n * Get the list of variants sorted in canonical order (alignment then sex, low to high specificity).\n */\n get canonical(): VariantData<T>[] {\n return this.#sortedValues\n }\n\n /**\n * Create a joined string from the variant values in canonical order.\n * @param separator Separator to use. Default is ' / '\n */\n toString(separator: string): string {\n return this.canonical.map(x => x.value).join(separator)\n }\n\n #compareVariants(a: VariantData<T>, b: VariantData<T>): number {\n const aSpecificity = (a.alignment ? 2 : 0) + (a.sex ? 1 : 0)\n const bSpecificity = (b.alignment ? 2 : 0) + (b.sex ? 1 : 0)\n if (aSpecificity !== bSpecificity) return aSpecificity - bSpecificity // Order first by least-specific\n\n const alignmentComparison = compareAlignment(a.alignment, b.alignment) // Next by alignment\n if (alignmentComparison !== 0) return alignmentComparison\n\n const sexComparison = compareSex(a.sex, b.sex) // Last by sex\n if (sexComparison !== 0) return sexComparison\n\n return String(a.value).localeCompare(String(b.value))\n }\n}\n","import { MORALITY, Morality, MoralityExtended } from '../api/morality'\n\nexport class MoralityList {\n readonly #items: Set<Morality>\n\n readonly hero: boolean\n readonly vigilante: boolean\n readonly villain: boolean\n readonly rogue: boolean\n readonly resistance: boolean\n readonly loyalist: boolean\n\n readonly primal: boolean\n readonly praetorian: boolean\n readonly heroic: boolean\n readonly villainous: boolean\n readonly paragonCityAccess: boolean\n readonly rogueIslesAccess: boolean\n\n readonly all: boolean\n\n constructor(items?: MoralityExtended[]) {\n const set = new Set(items ?? [...MORALITY])\n this.hero = set.has('hero') || set.has('primal') || set.has('heroic') || set.has('paragon-city-access') || set.has('all')\n this.vigilante = set.has('vigilante') || set.has('primal') || set.has('heroic') || set.has('paragon-city-access') || set.has('rogue-isles-access') || set.has('all')\n this.villain = set.has('villain') || set.has('primal') || set.has('villainous') || set.has('rogue-isles-access') || set.has('all')\n this.rogue = set.has('rogue') || set.has('primal') || set.has('villainous') || set.has('paragon-city-access') || set.has('rogue-isles-access') || set.has('all')\n this.resistance = set.has('resistance') || set.has('praetorian') || set.has('all')\n this.loyalist = set.has('loyalist') || set.has('praetorian') || set.has('all')\n\n this.primal = this.hero && this.vigilante && this.villain && this.rogue\n this.praetorian = this.loyalist && this.resistance\n this.heroic = this.hero && this.vigilante\n this.villainous = this.villain && this.rogue\n this.paragonCityAccess = this.heroic && this.rogue\n this.rogueIslesAccess = this.villainous && this.vigilante\n\n this.all = this.primal && this.praetorian\n\n this.#items = new Set()\n if (this.hero) this.#items.add('hero')\n if (this.vigilante) this.#items.add('vigilante')\n if (this.villain) this.#items.add('villain')\n if (this.rogue) this.#items.add('rogue')\n if (this.resistance) this.#items.add('resistance')\n if (this.loyalist) this.#items.add('loyalist')\n }\n\n get items(): Morality[] {\n return [...this.#items]\n }\n\n has(morality?: MoralityExtended): boolean {\n switch (morality) {\n case 'hero': {\n return this.hero\n }\n case 'vigilante': {\n return this.vigilante\n }\n case 'villain': {\n return this.villain\n }\n case 'rogue': {\n return this.rogue\n }\n case 'resistance': {\n return this.resistance\n }\n case 'loyalist': {\n return this.loyalist\n }\n case 'primal' : {\n return this.primal\n }\n case 'praetorian': {\n return this.praetorian\n }\n case 'heroic': {\n return this.hero\n }\n case 'paragon-city-access': {\n return this.paragonCityAccess\n }\n case 'rogue-isles-access': {\n return this.rogueIslesAccess\n }\n case 'villainous': {\n return this.villainous\n }\n case 'all': {\n return this.all\n }\n default: {\n return false\n }\n }\n }\n}\n","type KeysOfType<T, V> = { [P in keyof T]: T[P] extends V ? P : never }[keyof T]\n\nexport class AbstractIndex<T> {\n protected _values: T[] = []\n protected _hashTable: Record<string, T> = {}\n\n /**\n * Create a new index.\n * @param keyField The field of the values that will act as the key.\n * @param values Values to index.\n */\n constructor(keyField: KeysOfType<T, string>, values: T[] | undefined) {\n this._values = values ?? []\n this._hashTable = {}\n for (const value of this.values) {\n const key = value[keyField] as string\n if (this._hashTable[key] !== undefined) throw new Error(`Duplicate key [${key}]`)\n this._hashTable[key] = value\n }\n }\n\n /**\n * Return all indexed values\n */\n get values(): T[] {\n return this._values\n }\n\n /**\n * Get a value from the index\n * @param key Key string\n */\n get(key: string | undefined): T | undefined {\n if (!key) return undefined\n return this._hashTable[key]\n }\n}\n","/**\n * Converts an iso string to a Date object, throwing an error if the iso string is invalid.\n * @param iso ISO-8601 Date string\n */\nexport function toDate(iso: string): Date {\n const date = new Date(iso)\n if (!date || Number.isNaN(date.getTime())) throw new Error(`Invalid date format: [${iso}]`)\n return date\n}\n","import { SetTitleData } from '../api/set-title-data'\n\nexport class SetTitleIds {\n readonly primal: number\n readonly praetorian?: number\n\n constructor(value: SetTitleData) {\n [this.primal, this.praetorian] = value\n }\n}\n","import { BadgeType } from '../api/badge-type'\nimport { Link } from '../api/link'\nimport { BadgeData } from '../api/badge-data'\nimport { BadgeRequirement } from './badge-requirement'\nimport { Key } from './key'\nimport { Variants } from './variants'\nimport { MarkdownString } from '../api/markdown-string'\nimport { MoralityList } from './morality-list'\nimport { AbstractIndex } from './abstract-index'\nimport { toDate } from '../util/to-date'\nimport { coalesceToArray } from '../util/coalesce-to-array'\nimport { SetTitleIds } from './set-title-ids'\nimport { VariantContext } from '../api/variant-context'\n\nexport class Badge {\n readonly #requirementsIndex: AbstractIndex<BadgeRequirement>\n readonly #zoneKeys = new Set<string>()\n\n /**\n * The database key for this badge.\n */\n readonly key: string\n\n /**\n * The type of badge.\n */\n readonly type: BadgeType\n\n /**\n * The name of this badge.\n *\n * May vary by character sex or alignment.\n */\n readonly name: Variants<string>\n\n /**\n * The date that the badge was added to the game.\n */\n readonly releaseDate: Date\n\n /**\n * The character moralities that this badge is available to.\n */\n readonly morality: MoralityList\n\n /**\n * The badge text as it appears in-game. May vary by character sex or alignment.\n */\n readonly badgeText: Variants<MarkdownString>\n\n /**\n * Short description of how to acquire the badge. Detailed instructions will be in the notes field.\n */\n readonly acquisition?: MarkdownString\n\n /**\n * Absolute URL to this badge's icon.\n *\n * May vary by character sex or alignment.\n */\n readonly icon: Variants<string>\n\n /**\n * Freeform notes or tips about the badge.\n */\n readonly notes?: MarkdownString\n\n /**\n * List of external links. Wiki, forums, etc.\n */\n readonly links: Link[]\n\n /**\n * The id used with the in-game `/settitle` command to apply the badge.\n * The first value is the id for primal characters and the (optional) second number is the id for praetorian characters.\n */\n readonly setTitleId?: SetTitleIds\n\n /**\n * A description of the effect the badge will have, such as a buff or granting a temporary power.\n */\n readonly effect?: MarkdownString\n\n /**\n * Some badges are not included in the badge total count... such as Flames of Prometheus, which can be removed by redeeming it for a Notice of the Well.\n */\n readonly ignoreInTotals: boolean\n\n constructor(badgeData: BadgeData) {\n this.key = new Key(badgeData.key).value\n this.type = badgeData.type\n this.name = new Variants(badgeData.name)\n this.releaseDate = toDate(badgeData.releaseDate)\n this.morality = new MoralityList(coalesceToArray(badgeData.morality))\n this.badgeText = new Variants(badgeData.badgeText ?? [])\n this.acquisition = badgeData.acquisition\n this.icon = new Variants(badgeData.icon ?? [])\n this.notes = badgeData.notes\n this.links = badgeData.links ?? []\n this.effect = badgeData.effect\n this.setTitleId = badgeData.setTitleId ? new SetTitleIds(badgeData.setTitleId) : undefined\n this.ignoreInTotals = badgeData.ignoreInTotals ?? false\n\n this.#requirementsIndex = new AbstractIndex<BadgeRequirement>('key', badgeData.requirements?.map(x => new BadgeRequirement(x)))\n\n for (const requirement of this.#requirementsIndex.values) {\n if (requirement.location) for (const location of requirement.location) {\n if (location.zoneKey) this.#zoneKeys.add(location.zoneKey)\n }\n }\n }\n\n /**\n * Represents the requirements for badges with multiple fulfillment steps, such as visiting monuments for history badges, completing missions, or collecting other badges.\n */\n get requirements(): BadgeRequirement[] {\n return this.#requirementsIndex.values\n }\n\n getRequirement(key: string): BadgeRequirement | undefined {\n return this.#requirementsIndex.get(key)\n }\n\n /**\n * Return a list of all the zone keys referenced by this badge.\n */\n get zoneKeys(): string[] {\n return [...this.#zoneKeys]\n }\n\n /**\n * The zone key if this badge relates to a single zone.\n */\n get zoneKey(): string | undefined {\n return this.#zoneKeys.size === 1 ? this.#zoneKeys.values().next().value : undefined\n }\n}\n\nexport function compareByName(a?: Badge, b?: Badge, context?: VariantContext): number {\n const aName = a?.name?.getValue(context)\n const bName = b?.name?.getValue(context)\n if (!aName && !bName) return 0\n if (!aName) return 1\n if (!bName) return -1\n return aName.localeCompare(bName)\n}\n\nexport function compareByZoneKey(a?: Badge, b?: Badge): number {\n const aZone = a?.zoneKey\n const bZone = b?.zoneKey\n if (!aZone && !bZone) return 0\n if (!aZone) return 1\n if (!bZone) return -1\n return aZone.localeCompare(bZone)\n}\n\nexport function compareByReleaseDate(a?: Badge, b?: Badge): number {\n const aReleaseDate = a?.releaseDate?.getTime()\n const bReleaseDate = b?.releaseDate?.getTime()\n if (aReleaseDate === bReleaseDate) return 0\n if (!aReleaseDate) return 1\n if (!bReleaseDate) return -1\n return aReleaseDate < bReleaseDate ? -1 : 1\n}\n","import { Badge, compareByName, compareByReleaseDate, compareByZoneKey } from './badge'\nimport { BadgeSearchOptions } from './badge-search-options'\nimport { Paged } from './paged'\nimport { AbstractIndex } from './abstract-index'\n\nexport class BadgeIndex extends AbstractIndex<Badge> {\n constructor(values: Badge[] | undefined) {\n super('key', values)\n }\n\n search(options?: BadgeSearchOptions): Paged<Badge> {\n const matched = (options?.query || options?.filter)\n ? this._values.filter(badge => this.#satisfiesQueryPredicate(badge, options?.query) && this.#satisfiesFilterPredicate(badge, options?.filter))\n : this._values\n\n const sorted = this.#sort(matched, options)\n\n const totalPages = options?.pageSize ? Math.ceil(matched.length / (options?.pageSize)) : 1\n const pageNumber = Math.max(1, Math.min(totalPages, options?.page ?? 1))\n const items = options?.pageSize ? sorted.slice((pageNumber - 1) * options.pageSize, pageNumber * options?.pageSize) : sorted\n\n return {\n items: items,\n pageIndex: pageNumber - 1,\n pageNumber: pageNumber,\n pageSize: options?.pageSize,\n matchedItemCount: matched.length,\n totalItemCount: this._values.length,\n totalPageCount: totalPages,\n }\n }\n\n #satisfiesQueryPredicate(badge: Badge, query?: BadgeSearchOptions['query']): boolean {\n const queryString = query?.str?.toLowerCase() ?? ''\n const fields = query?.fields ? new Set(query?.fields) : new Set(['name']) // Default to name if not provided\n if (fields.size === 0) return true\n\n return !!((fields.has('name') && badge.name.canonical.some(x => x.value.toLowerCase().includes(queryString)))\n || (fields.has('badge-text') && badge.badgeText.canonical.some(x => x.value.toLowerCase().includes(queryString)))\n || (fields.has('acquisition') && badge.acquisition?.toLowerCase().includes(queryString))\n || (fields.has('effect') && badge.effect?.toLowerCase().includes(queryString))\n || (fields.has('notes') && badge.notes?.toLowerCase().includes(queryString))\n || (fields.has('set-title-id') && (badge.setTitleId?.primal.toString() === queryString))\n || (fields.has('set-title-id') && (badge.setTitleId?.praetorian?.toString() === queryString))\n )\n }\n\n #satisfiesFilterPredicate(badge: Badge, filter?: BadgeSearchOptions['filter']): boolean {\n return (!filter?.type || badge.type === filter.type)\n && (!filter?.zoneKey || badge.zoneKey === filter.zoneKey)\n && (!filter?.morality || badge.morality.has(filter.morality))\n && (!filter?.predicate || filter.predicate(badge))\n }\n\n #sort(badges: Badge[], options?: BadgeSearchOptions): Badge[] {\n switch (options?.sort) {\n case 'name.asc': {\n return badges.toSorted((a, b) => compareByName(a, b, options.variantContext))\n }\n case 'name.desc': {\n return badges.toSorted((a, b) => compareByName(b, a, options.variantContext))\n }\n case 'zone-key.asc': {\n return badges.toSorted(compareByZoneKey)\n }\n case 'zone-key.desc': {\n return badges.toSorted((a, b) => compareByZoneKey(b, a))\n }\n case 'release-date.asc': {\n return badges.toSorted(compareByReleaseDate)\n }\n case 'release-date.desc': {\n return badges.toSorted((a, b) => compareByReleaseDate(b, a))\n }\n case 'canonical.desc': {\n return badges.toReversed()\n }\n default: {\n return [...badges]\n }\n }\n }\n}\n","import { Link } from '../api/link'\nimport { MarkdownString } from '../api/markdown-string'\nimport { BundleHeaderData } from '../api/bundle-header-data'\nimport { toDate } from '../util/to-date'\n\nexport class BundleHeader {\n /**\n * Name of the fork this bundle contains data for.\n */\n readonly name: string\n\n /**\n * Version number for this data package.\n */\n readonly version: string\n\n /**\n * The time this bundle was last updated.\n */\n readonly lastUpdateTime: Date\n\n /**\n * Description of the fork.\n */\n readonly description?: MarkdownString\n\n /**\n * Url for the repository where the bundle is maintained.\n */\n readonly repositoryUrl?: string\n\n /**\n * Url for the location of the changelog.\n */\n readonly changelogUrl?: string\n\n /**\n * List of external links. Wiki, forums, etc.\n */\n readonly links?: Link[]\n\n constructor(data: BundleHeaderData) {\n if (!data) throw new Error('Missing header data')\n this.name = data.name\n this.version = data.version\n this.lastUpdateTime = toDate(data.lastUpdateTime)\n this.description = data?.description\n this.repositoryUrl = data?.repositoryUrl\n this.changelogUrl = data?.changelogUrl\n this.links = data?.links ?? []\n }\n}\n","import { LevelRangeData } from '../api/level-range-data'\n\nexport class LevelRange {\n readonly min: number\n readonly max?: number\n\n constructor(value: LevelRangeData) {\n if (Array.isArray(value)) {\n this.min = value[0]\n this.max = value[1] === undefined ? undefined : value[1]\n } else {\n this.min = value\n }\n }\n}\n","import { Link } from '../api/link'\nimport { ZoneData } from '../api/zone-data'\nimport { Key } from './key'\nimport { MoralityList } from './morality-list'\nimport { coalesceToArray } from '../util/coalesce-to-array'\nimport { ZoneType } from '../api/zone-type'\nimport { MarkdownString } from '../api/markdown-string'\nimport { LevelRange } from './level-range'\n\nexport class Zone {\n /**\n * Unique key used to reference this zone.\n *\n * Keys must be unique and can only contain lowercase letters, numbers and hyphens (`-`).\n */\n readonly key: string\n\n /**\n * The name of the zone as it appears in-game.\n */\n readonly name: string\n\n /**\n * The type of zone.\n */\n readonly type: ZoneType\n\n /**\n * The character moralities that this zone is accessible by.\n */\n readonly morality: MoralityList\n\n /**\n * The level range this zone is recommended for.\n */\n readonly levelRange?: LevelRange\n\n /**\n * Freeform notes or tips about the zone.\n */\n readonly notes?: MarkdownString\n\n /**\n * List of external links. Wiki, forums, etc.\n */\n readonly links: Link[]\n\n constructor(data: ZoneData) {\n this.key = new Key(data.key).value\n this.name = data.name\n this.type = data.type\n this.morality = new MoralityList(coalesceToArray(data.morality))\n this.levelRange = data.levelRange ? new LevelRange(data.levelRange) : undefined\n this.notes = data.notes\n this.links = data.links ?? []\n }\n}\n","import { Link } from '../api/link'\nimport { Key } from './key'\nimport { MarkdownString } from '../api/markdown-string'\nimport { ContactData } from '../api/contact-data'\nimport { Location } from './location'\nimport { MoralityList } from './morality-list'\nimport { coalesceToArray } from '../util/coalesce-to-array'\nimport { LevelRange } from './level-range'\n\nexport class Contact {\n /**\n * Unique key used to reference this contact.\n *\n * Keys must be unique and can only contain lowercase letters, numbers and hyphens (`-`).\n */\n readonly key: string\n\n /**\n * The name of this contact.\n */\n readonly name: string\n\n /**\n * The contact's title.\n */\n readonly title?: string\n\n /**\n * The character moralities that this contact will interact with.\n */\n readonly morality: MoralityList\n\n /**\n * The location of this contact.\n */\n readonly location?: Location\n\n /**\n * The level range this contact will offer missions for.\n */\n readonly levelRange?: LevelRange\n\n /**\n * Freeform notes or tips about the contact.\n */\n readonly notes?: MarkdownString\n\n /**\n * List of external links. Wiki, forums, etc.\n */\n readonly links: Link[]\n\n constructor(data: ContactData) {\n this.key = new Key(data.key).value\n this.name = data.name\n this.title = data.title\n this.morality = new MoralityList(coalesceToArray(data.morality))\n this.location = data.location\n this.levelRange = data.levelRange ? new LevelRange(data.levelRange) : undefined\n this.notes = data.notes\n this.links = data.links ?? []\n }\n}\n","import { MissionType } from '../api/mission-type'\nimport { MarkdownString } from '../api/markdown-string'\nimport { Link } from '../api/link'\nimport { MissionData } from '../api/mission-data'\nimport { Key } from './key'\nimport { MoralityList } from './morality-list'\nimport { coalesceToArray } from '../util/coalesce-to-array'\nimport { LevelRange } from './level-range'\n\nexport class Mission {\n /**\n * Unique key used to reference this mission.\n *\n * Keys must be unique and can only contain lowercase letters, numbers and hyphens (`-`).\n */\n readonly key: string\n\n /**\n * The name of the mission as it appears from the contact.\n *\n * The name may be different when viewed in Ouroboros as a Flashback.\n */\n readonly name: string\n\n /**\n * The type of mission... Story arc, task force, trial, etc.\n */\n readonly type: MissionType\n\n /**\n * The character moralities that may accept the mission.\n */\n readonly morality: MoralityList\n\n /**\n * The keys of any contacts that provide this mission.\n */\n readonly contactKeys?: string[]\n\n /**\n * The level range this mission is available for.\n */\n readonly levelRange?: LevelRange\n\n /**\n * Freeform notes or tips about the mission.\n */\n readonly notes?: MarkdownString\n\n /**\n * List of external links. Wiki, forums, etc.\n */\n readonly links: Link[]\n\n /**\n * If the mission is available in Ouroboros as a Flashback.\n */\n readonly flashback?: {\n\n /**\n * The id of the mission as seen in the Flashback menu, i.e. '14.01'.\n */\n readonly id: string\n\n /**\n * The level range this mission appears under as a Flashback.\n */\n readonly levelRange?: LevelRange\n\n /**\n * The name as it appears in the Flashback list.\n */\n readonly name: string\n\n /**\n * The character moralities that the mission will appear for in the Flashback list.\n */\n readonly morality: MoralityList\n\n /**\n * Freeform notes or tips about the Flashback version of the mission.\n */\n readonly notes?: MarkdownString\n }\n\n constructor(data: MissionData) {\n this.key = new Key(data.key).value\n this.name = data.name\n this.type = data.type\n this.morality = new MoralityList(coalesceToArray(data.morality))\n this.contactKeys = coalesceToArray(data.contactKeys)\n this.levelRange = data.levelRange ? new LevelRange(data.levelRange) : undefined\n this.notes = data.notes\n this.links = data.links ?? []\n this.flashback = createFlashback(data)\n }\n}\n\nfunction createFlashback(data: MissionData): Mission['flashback'] {\n if (!data.flashback) return undefined\n return {\n id: data.flashback.id,\n levelRange: data.flashback.levelRange ? new LevelRange(data.flashback.levelRange) : undefined,\n name: data.flashback.name ?? data.name,\n morality: new MoralityList(coalesceToArray(data.flashback.morality ?? data.morality)),\n notes: data.flashback.notes,\n }\n}\n","import { BundleData } from '../api/bundle-data'\nimport { Archetype } from './archetype'\nimport { Zone } from './zone'\nimport { Badge } from './badge'\nimport { BundleHeader } from './bundle-header'\nimport { BadgeSearchOptions } from './badge-search-options'\nimport { Paged } from './paged'\nimport { Contact } from './contact'\nimport { Mission } from './mission'\nimport { AbstractIndex } from './abstract-index'\nimport { BadgeIndex } from './badge-index'\n\nexport class CohContentDatabase {\n readonly #archetypeIndex\n readonly #zoneIndex\n readonly #contactIndex\n readonly #missionIndex\n readonly #badgeIndex\n\n readonly #header: BundleHeader\n readonly #servers: string[]\n\n /**\n * Create a db instance from the given content bundle.\n * @param bundle The bundle to load.\n */\n constructor(bundle: BundleData) {\n this.#header = new BundleHeader(bundle.header)\n this.#servers = bundle.servers ?? []\n\n this.#archetypeIndex = new AbstractIndex<Archetype>('key', bundle.archetypes?.map(x => new Archetype(x)))\n this.#zoneIndex = new AbstractIndex<Zone>('key', bundle.zones?.map(x => new Zone(x)))\n this.#contactIndex = new AbstractIndex<Contact>('key', bundle.contacts?.map(x => new Contact(x)))\n this.#missionIndex = new AbstractIndex<Mission>('key', bundle.missions?.map(x => new Mission(x)))\n this.#badgeIndex = new BadgeIndex(bundle.badges?.map(x => new Badge(x)))\n }\n\n /**\n * Header information about the content bundle.\n */\n get header(): BundleHeader {\n return this.#header\n }\n\n /**\n * List of the game server names.\n *\n * Torchbearer, Excelsior, etc.\n */\n get servers(): string[] {\n return this.#servers\n }\n\n /**\n * List of archetypes.\n */\n get archetypes(): Archetype[] {\n return this.#archetypeIndex.values\n }\n\n /**\n * Get archetype by key.\n * @param key The key.\n */\n getArchetype(key: string | undefined): Archetype | undefined {\n return this.#archetypeIndex.get(key)\n }\n\n /**\n * List of game zones.\n */\n get zones(): Zone[] {\n return this.#zoneIndex.values\n }\n\n /**\n * Get zone by key.\n * @param key The key.\n */\n getZone(key: string | undefined): Zone | undefined {\n return this.#zoneIndex.get(key)\n }\n\n /**\n * List of contacts.\n */\n get contacts(): Contact[] {\n return this.#contactIndex.values\n }\n\n /**\n * Get contact by key.\n * @param key The key.\n */\n getContact(key: string | undefined): Contact | undefined {\n return this.#contactIndex.get(key)\n }\n\n /**\n * List of missions.\n */\n get missions(): Mission[] {\n return this.#missionIndex.values\n }\n\n /**\n * Get mission by key.\n * @param key The key.\n */\n getMission(key: string | undefined): Mission | undefined {\n return this.#missionIndex.get(key)\n }\n\n /**\n * List of badges.\n */\n get badges(): Badge[] {\n return this.#badgeIndex.values\n }\n\n /**\n * Get badge by key.\n * @param key The key.\n */\n getBadge(key: string | undefined): Badge | undefined {\n return this.#badgeIndex.get(key)\n }\n\n /**\n * Search, sort and filter the badge list.\n * This is a fairly brute-forced approach and will not be as performant as loading the badge data into a traditional\n * database engine, but is sufficient for most operations.\n * @param options {@link BadgeSearchOptions}\n */\n searchBadges(options?: BadgeSearchOptions): Paged<Badge> {\n return this.#badgeIndex.search(options)\n }\n}\n","import { Coords, LocationData, LocationIcon } from '../api/location-data'\n\nexport class Location {\n /**\n * Key of the {@link Zone} that the location references.\n */\n readonly zoneKey?: string\n\n /**\n * In-game `/loc` coordinates of the location.\n */\n readonly coords?: Coords\n\n /**\n * The type of icon to use if the location appears on a map. (Typically the Vidiot map icon).\n */\n readonly icon?: LocationIcon\n\n /**\n * The text that should appear in the location icon. (Typically a number or symbol from the Vidiot map).\n */\n readonly iconText?: string\n\n constructor(data: LocationData) {\n this.zoneKey = data.zoneKey\n this.coords = data.coords\n this.icon = data.icon\n this.iconText = data.iconText\n }\n}\n","import { BadgeData } from '../api/badge-data'\nimport { Badge } from '../db/badge'\nimport { ZoneData } from '../api/zone-data'\nimport { Zone } from '../db/zone'\nimport { Contact } from '../db/contact'\nimport { ContactData } from '../api/contact-data'\nimport { Mission } from '../db/mission'\nimport { MissionData } from '../api/mission-data'\n\n/**\n * Returns the URI of the given badge that can be used in {@link MarkdownString} fields.\n *\n * URI format: `badge://<key>`\n *\n * @param target The badge or badge key to target.\n */\nexport function badgeUri(target: string | Badge | BadgeData): string {\n const key = typeof target === 'string' ? target : target.key\n return `badge://${key}`\n}\n\n/**\n * Returns a {@link MarkdownString} link to the given badge.\n *\n * Link format: `[<key>](badge://<key>)`\n *\n * @param target The {@link Badge} or badge key to target.\n */\nexport function badgeLink(target: string | Badge | BadgeData): string {\n const key = typeof target === 'string' ? target : target.key\n return `[${key}](${badgeUri(target)})`\n}\n\n/**\n * Returns the URI of the given contact that can be used in {@link MarkdownString} fields.\n *\n * URI format: `contact://<key>`\n *\n * @param target The {@link Contact} or contact key to target.\n */\nexport function contactUri(target: string | Contact | ContactData): string {\n const key = typeof target === 'string' ? target : target.key\n return `contact://${key}`\n}\n\n/**\n * Returns a {@link MarkdownString} link to the given contact.\n *\n * Link format: `[<key>](contact://<key>)`\n *\n * @param target The {@link Contact} or contact key to target.\n */\nexport function contactLink(target: string | Contact | ContactData): string {\n const key = typeof target === 'string' ? target : target.key\n return `[${key}](${contactUri(target)})`\n}\n\n/**\n * Returns the URI of the given mission that can be used in {@link MarkdownString} fields.\n *\n * URI format: `mission://<key>`\n *\n * @param target The {@link Mission} or mission key to target.\n */\nexport function missionUri(target: string | Mission | MissionData): string {\n const key = typeof target === 'string' ? target : target.key\n return `mission://${key}`\n}\n\n/**\n * Returns a {@link MarkdownString} link to the given mission.\n *\n * Link format: `[<key>](mission://<key>)`\n *\n * @param target The {@link Mission} or mission key to target.\n */\nexport function missionLink(target: string | Mission | MissionData): string {\n const key = typeof target === 'string' ? target : target.key\n return `[${key}](${missionUri(target)})`\n}\n\n/**\n * Returns the URI of the given zone that can be used in {@link MarkdownString} fields.\n *\n * URI format: `zone://<key>`\n *\n * @param target The {@link Zone} or zone key to target.\n */\nexport function zoneUri(target: string | Zone | ZoneData): string {\n const key = typeof target === 'string' ? target : target.key\n return `zone://${key}`\n}\n\n/**\n * Returns a {@link MarkdownString} link to the given zone.\n *\n * Link format: `[<key>](zone://<key>)`\n *\n * @param target The {@link Zone} or zone key to target.\n */\nexport function zoneLink(target: string | Zone | ZoneData): string {\n const key = typeof target === 'string' ? target : target.key\n return `[${key}](${zoneUri(target)})`\n}\n"],"names":["_items","__privateAdd","__publicField","__privateSet","__privateGet","__privateMethod"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -9,22 +9,24 @@ export class BadgeIndex extends AbstractIndex<Badge> {
|
|
|
9
9
|
}
|
|
10
10
|
|
|
11
11
|
search(options?: BadgeSearchOptions): Paged<Badge> {
|
|
12
|
-
const
|
|
12
|
+
const matched = (options?.query || options?.filter)
|
|
13
13
|
? this._values.filter(badge => this.#satisfiesQueryPredicate(badge, options?.query) && this.#satisfiesFilterPredicate(badge, options?.filter))
|
|
14
14
|
: this._values
|
|
15
15
|
|
|
16
|
-
const sorted = this.#sort(
|
|
16
|
+
const sorted = this.#sort(matched, options)
|
|
17
17
|
|
|
18
|
-
const totalPages = options?.pageSize ? Math.ceil(
|
|
19
|
-
const
|
|
20
|
-
const
|
|
18
|
+
const totalPages = options?.pageSize ? Math.ceil(matched.length / (options?.pageSize)) : 1
|
|
19
|
+
const pageNumber = Math.max(1, Math.min(totalPages, options?.page ?? 1))
|
|
20
|
+
const items = options?.pageSize ? sorted.slice((pageNumber - 1) * options.pageSize, pageNumber * options?.pageSize) : sorted
|
|
21
21
|
|
|
22
22
|
return {
|
|
23
|
-
items:
|
|
24
|
-
|
|
23
|
+
items: items,
|
|
24
|
+
pageIndex: pageNumber - 1,
|
|
25
|
+
pageNumber: pageNumber,
|
|
25
26
|
pageSize: options?.pageSize,
|
|
26
|
-
|
|
27
|
-
|
|
27
|
+
matchedItemCount: matched.length,
|
|
28
|
+
totalItemCount: this._values.length,
|
|
29
|
+
totalPageCount: totalPages,
|
|
28
30
|
}
|
|
29
31
|
}
|
|
30
32
|
|
package/src/main/db/paged.ts
CHANGED
|
@@ -292,7 +292,27 @@ describe(BadgeIndex.name, () => {
|
|
|
292
292
|
|
|
293
293
|
test(`should be 1-based for page number`, () => {
|
|
294
294
|
const result = new BadgeIndex([]).search()
|
|
295
|
-
expect(result.
|
|
295
|
+
expect(result.pageNumber).toBe(1)
|
|
296
|
+
})
|
|
297
|
+
|
|
298
|
+
test(`should be 0-based for page index`, () => {
|
|
299
|
+
const result = new BadgeIndex([]).search()
|
|
300
|
+
expect(result.pageIndex).toBe(0)
|
|
301
|
+
})
|
|
302
|
+
|
|
303
|
+
test(`should return the correct page number and index`, () => {
|
|
304
|
+
const index = new BadgeIndex([
|
|
305
|
+
new Badge(badgeDataFixture.create({ key: 'badge-1' })),
|
|
306
|
+
new Badge(badgeDataFixture.create({ key: 'badge-2' })),
|
|
307
|
+
new Badge(badgeDataFixture.create({ key: 'badge-3' })),
|
|
308
|
+
new Badge(badgeDataFixture.create({ key: 'badge-4' })),
|
|
309
|
+
new Badge(badgeDataFixture.create({ key: 'badge-5' })),
|
|
310
|
+
new Badge(badgeDataFixture.create({ key: 'badge-6' })),
|
|
311
|
+
])
|
|
312
|
+
|
|
313
|
+
const result = index.search({ page: 2, pageSize: 2 })
|
|
314
|
+
expect(result.pageIndex).toBe(1)
|
|
315
|
+
expect(result.pageNumber).toBe(2)
|
|
296
316
|
})
|
|
297
317
|
|
|
298
318
|
test(`should return the requested page size`, () => {
|
|
@@ -363,7 +383,21 @@ describe(BadgeIndex.name, () => {
|
|
|
363
383
|
])
|
|
364
384
|
|
|
365
385
|
const result = index.search({ page: 1, pageSize: 2 })
|
|
366
|
-
expect(result.
|
|
386
|
+
expect(result.totalItemCount).toBe(5)
|
|
387
|
+
})
|
|
388
|
+
|
|
389
|
+
test(`should return the correct matched entry count`, () => {
|
|
390
|
+
const index = new BadgeIndex([
|
|
391
|
+
new Badge(badgeDataFixture.create({ key: 'badge-1', type: 'exploration' })),
|
|
392
|
+
new Badge(badgeDataFixture.create({ key: 'badge-2', type: 'history' })),
|
|
393
|
+
new Badge(badgeDataFixture.create({ key: 'badge-3', type: 'exploration' })),
|
|
394
|
+
new Badge(badgeDataFixture.create({ key: 'badge-4', type: 'accomplishment' })),
|
|
395
|
+
new Badge(badgeDataFixture.create({ key: 'badge-5', type: 'exploration' })),
|
|
396
|
+
])
|
|
397
|
+
|
|
398
|
+
const result = index.search({ page: 1, pageSize: 2, filter: { type: 'exploration' } })
|
|
399
|
+
expect(result.totalItemCount).toBe(5)
|
|
400
|
+
expect(result.matchedItemCount).toBe(3)
|
|
367
401
|
})
|
|
368
402
|
|
|
369
403
|
test(`should return the page size`, () => {
|
|
@@ -389,7 +423,7 @@ describe(BadgeIndex.name, () => {
|
|
|
389
423
|
])
|
|
390
424
|
|
|
391
425
|
const result = index.search({ pageSize: 2 })
|
|
392
|
-
expect(result.
|
|
426
|
+
expect(result.totalPageCount).toBe(3)
|
|
393
427
|
})
|
|
394
428
|
|
|
395
429
|
test(`should return a total page count of 1 when no page size is provided`, () => {
|
|
@@ -402,7 +436,7 @@ describe(BadgeIndex.name, () => {
|
|
|
402
436
|
])
|
|
403
437
|
|
|
404
438
|
const result = index.search()
|
|
405
|
-
expect(result.
|
|
439
|
+
expect(result.totalPageCount).toBe(1)
|
|
406
440
|
})
|
|
407
441
|
|
|
408
442
|
test(`should return the last page if a page is requested past the max`, () => {
|
|
@@ -417,12 +451,12 @@ describe(BadgeIndex.name, () => {
|
|
|
417
451
|
const result = index.search({ pageSize: 2, page: 10 })
|
|
418
452
|
const keys = result.items.map(x => x.key)
|
|
419
453
|
expect(keys).toStrictEqual(['badge-5'])
|
|
420
|
-
expect(result.
|
|
454
|
+
expect(result.pageNumber).toBe(3)
|
|
421
455
|
})
|
|
422
456
|
|
|
423
457
|
test(`should return the first page if a page is requested lower than 1`, () => {
|
|
424
458
|
const result = new BadgeIndex([]).search({ page: -10 })
|
|
425
|
-
expect(result.
|
|
459
|
+
expect(result.pageNumber).toBe(1)
|
|
426
460
|
})
|
|
427
461
|
})
|
|
428
462
|
|
|
@@ -275,7 +275,8 @@ describe(CohContentDatabase.name, () => {
|
|
|
275
275
|
)
|
|
276
276
|
|
|
277
277
|
const result = database.searchBadges({ query: { str: 'oo', fields: ['name'] } })
|
|
278
|
-
expect(result.
|
|
278
|
+
expect(result.matchedItemCount).toBe(1)
|
|
279
|
+
expect(result.totalItemCount).toBe(2)
|
|
279
280
|
expect(result.items.map(x => x.key)).toStrictEqual(['foo'])
|
|
280
281
|
})
|
|
281
282
|
})
|