@itwin/core-quantity 5.3.0-dev.9 → 5.4.0-dev.3
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 +21 -1
- package/lib/cjs/Parser.d.ts.map +1 -1
- package/lib/cjs/Parser.js +11 -1
- package/lib/cjs/Parser.js.map +1 -1
- package/lib/esm/Parser.d.ts.map +1 -1
- package/lib/esm/Parser.js +11 -1
- package/lib/esm/Parser.js.map +1 -1
- package/package.json +4 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,26 @@
|
|
|
1
1
|
# Change Log - @itwin/core-quantity
|
|
2
2
|
|
|
3
|
-
This log was last generated on
|
|
3
|
+
This log was last generated on Fri, 24 Oct 2025 16:22:31 GMT and should not be manually modified.
|
|
4
|
+
|
|
5
|
+
## 5.2.4
|
|
6
|
+
Fri, 24 Oct 2025 16:20:38 GMT
|
|
7
|
+
|
|
8
|
+
_Version update only_
|
|
9
|
+
|
|
10
|
+
## 5.2.3
|
|
11
|
+
Thu, 16 Oct 2025 23:00:31 GMT
|
|
12
|
+
|
|
13
|
+
_Version update only_
|
|
14
|
+
|
|
15
|
+
## 5.2.2
|
|
16
|
+
Fri, 10 Oct 2025 14:49:15 GMT
|
|
17
|
+
|
|
18
|
+
_Version update only_
|
|
19
|
+
|
|
20
|
+
## 5.2.1
|
|
21
|
+
Thu, 09 Oct 2025 17:10:26 GMT
|
|
22
|
+
|
|
23
|
+
_Version update only_
|
|
4
24
|
|
|
5
25
|
## 5.2.0
|
|
6
26
|
Wed, 01 Oct 2025 20:22:54 GMT
|
package/lib/cjs/Parser.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Parser.d.ts","sourceRoot":"","sources":["../../src/Parser.ts"],"names":[],"mappings":"AAIA;;GAEG;AAIH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,OAAO,EAAE,2BAA2B,EAAE,kBAAkB,EAAE,aAAa,EAAuB,kBAAkB,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AACjK,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG1C;;GAEG;AACH,oBAAY,UAAU;IACpB,2BAA2B,IAAI;IAC/B,0BAA0B,IAAA;IAC1B,8BAA8B,IAAA;IAC9B,WAAW,IAAA;IACX,oCAAoC,IAAA;IACpC,iBAAiB,IAAA;IACjB,4BAA4B,IAAA;IAC5B,uCAAuC,IAAA;IACvC,sBAAsB,IAAA;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,uDAAuD;IACvD,EAAE,EAAE,KAAK,CAAC;IACV,uDAAuD;IACvD,KAAK,EAAE,UAAU,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,uDAAuD;IACvD,EAAE,EAAE,IAAI,CAAC;IACT,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC;CACf;AAED,aAAK,QAAQ;IACX,QAAQ,MAAM;IACd,WAAW,MAAM;IACjB,cAAc,MAAM,CAAE,iDAAiD;IACvE,QAAQ,MAAM;CACf;AAUD;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAAG,cAAc,GAAG,kBAAkB,CAAC;AAEtE;;GAEG;AACH,cAAM,UAAU;IACP,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;IAClC,UAAU,EAAE,OAAO,CAAS;gBAEvB,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ;IAS7C,IAAW,QAAQ,IAAI,OAAO,CAA+D;IAC7F,IAAW,QAAQ,IAAI,OAAO,CAA2C;IACzE,IAAW,kBAAkB,IAAI,OAAO,CAGvC;CACF;AA+BD;;GAEG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAC,IAAI,CAAS;WAEd,gBAAgB,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI,IAAI,cAAc;WAInE,YAAY,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI,IAAI,kBAAkB;IAIjF,OAAO,CAAC,MAAM,CAAC,0BAA0B;IAoBzC,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAyChC,OAAO,CAAC,MAAM,CAAC,OAAO;IAItB,OAAO,CAAC,MAAM,CAAC,yBAAyB;IAIxC;;OAEG;WACW,0BAA0B,CAAC,qBAAqB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,EAAE;IAyLrG,OAAO,CAAC,MAAM,CAAC,qBAAqB;mBAYf,iBAAiB;IA6BtC;;OAEG;mBACkB,wCAAwC;IAqC7D;;OAEG;mBACkB,6BAA6B;IAYlD;;;;OAIG;WACiB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,qBAAqB,CAAC,EAAE,2BAA2B,GAAG,OAAO,CAAC,aAAa,CAAC;IAMlL,2DAA2D;IAC3D,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAyCpC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,wBAAwB;
|
|
1
|
+
{"version":3,"file":"Parser.d.ts","sourceRoot":"","sources":["../../src/Parser.ts"],"names":[],"mappings":"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"}
|
package/lib/cjs/Parser.js
CHANGED
|
@@ -478,6 +478,9 @@ class Parser {
|
|
|
478
478
|
if (unitConversion !== undefined)
|
|
479
479
|
return unitConversion;
|
|
480
480
|
}
|
|
481
|
+
// if there were unique unit labels but not matched to any units, throw an error
|
|
482
|
+
if (uniqueUnitLabels.length > 0)
|
|
483
|
+
throw new Exception_1.QuantityError(Exception_1.QuantityStatus.UnitLabelSuppliedButNotMatched, `The unit label(s) ${uniqueUnitLabels.join(", ")} could not be matched to a known unit.`);
|
|
481
484
|
}
|
|
482
485
|
return unitConversion;
|
|
483
486
|
}
|
|
@@ -525,7 +528,14 @@ class Parser {
|
|
|
525
528
|
return { ok: false, error: ParseError.UnableToConvertParseTokensToQuantity };
|
|
526
529
|
}
|
|
527
530
|
const defaultUnit = format.units && format.units.length > 0 ? format.units[0][0] : undefined;
|
|
528
|
-
|
|
531
|
+
try {
|
|
532
|
+
defaultUnitConversion = defaultUnitConversion ? defaultUnitConversion : Parser.getDefaultUnitConversion(tokens, unitsConversions, defaultUnit);
|
|
533
|
+
}
|
|
534
|
+
catch (e) {
|
|
535
|
+
// If we failed to get the default unit conversion, we need to return an error.
|
|
536
|
+
if (e instanceof Exception_1.QuantityError && e.errorNumber === Exception_1.QuantityStatus.UnitLabelSuppliedButNotMatched)
|
|
537
|
+
return { ok: false, error: ParseError.UnitLabelSuppliedButNotMatched };
|
|
538
|
+
}
|
|
529
539
|
if (format.type === FormatEnums_1.FormatType.Bearing && format.units !== undefined && format.units.length > 0) {
|
|
530
540
|
const units = format.units;
|
|
531
541
|
const desiredNumberOfTokens = units.length;
|
package/lib/cjs/Parser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Parser.js","sourceRoot":"","sources":["../../src/Parser.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Quantity\n */\n\nimport { QuantityConstants } from \"./Constants\";\nimport { QuantityError, QuantityStatus } from \"./Exception\";\nimport { Format } from \"./Formatter/Format\";\nimport { FormatTraits, FormatType } from \"./Formatter/FormatEnums\";\nimport { AlternateUnitLabelsProvider, PotentialParseUnit, QuantityProps, UnitConversionProps, UnitConversionSpec, UnitProps, UnitsProvider } from \"./Interfaces\";\nimport { ParserSpec } from \"./ParserSpec\";\nimport { applyConversion, Quantity } from \"./Quantity\";\n\n/** Possible parser errors\n * @beta\n */\nexport enum ParseError {\n UnableToGenerateParseTokens = 1,\n NoValueOrUnitFoundInString,\n UnitLabelSuppliedButNotMatched,\n UnknownUnit,\n UnableToConvertParseTokensToQuantity,\n InvalidParserSpec,\n BearingPrefixOrSuffixMissing,\n MathematicOperationFoundButIsNotAllowed,\n BearingAngleOutOfRange,\n}\n\n/** Parse error result from [[Parser.parseToQuantityValue]] or [[Parser.parseToQuantityValue]].\n * @beta\n */\nexport interface ParseQuantityError {\n /** Union discriminator for [[QuantityParseResult]]. */\n ok: false;\n /** The specific error that occurred during parsing. */\n error: ParseError;\n}\n\n/** Successful result from [[Parser.parseToQuantityValue]] or [[Parser.parseToQuantityValue]].\n * @beta\n */\nexport interface ParsedQuantity {\n /** Union discriminator for [[QuantityParseResult]]. */\n ok: true;\n /** The magnitude of the parsed quantity. */\n value: number;\n}\n\nenum Operator {\n addition = \"+\",\n subtraction = \"-\",\n multiplication = \"*\", // unsupported but we recognize it during parsing\n division = \"/\" // unsupported but we recognize it during parsing\n}\n\nfunction isOperator(char: number | string): boolean {\n if (typeof char === \"number\") {\n // Convert the CharCode to string.\n char = String.fromCharCode(char);\n }\n return Object.values(Operator).includes(char as Operator);\n}\n\n/**\n * Defines Results of parsing a string input by a user into its desired value type\n * @beta\n */\nexport type QuantityParseResult = ParsedQuantity | ParseQuantityError;\n\n/** A ParseToken holds either a numeric or string token extracted from a string that represents a quantity value.\n * @beta\n */\nclass ParseToken {\n public value: number | string | Operator;\n public isOperator: boolean = false;\n\n constructor(value: string | number | Operator) {\n if (typeof value === \"string\") {\n this.value = value.trim();\n this.isOperator = isOperator(this.value);\n } else {\n this.value = value;\n }\n }\n\n public get isString(): boolean { return !this.isOperator && typeof this.value === \"string\"; }\n public get isNumber(): boolean { return typeof this.value === \"number\"; }\n public get isSpecialCharacter(): boolean {\n const format = /^[!@#$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>\\/?]+$/;\n return this.isString && this.value.toString().match(format) !== null;\n }\n}\n\n/** A ScientificToken holds an index and string representing the exponent.\n * @beta\n */\nclass ScientificToken {\n public index: number;\n public exponent = \"\";\n\n constructor(index: number, exponent?: string) {\n this.index = index;\n if (exponent)\n this.exponent = exponent;\n }\n}\n\n/** A FractionToken holds an index and the fraction value of numerator / denominator.\n * @beta\n */\nclass FractionToken {\n public index: number;\n public fraction = 0.0;\n public exponent = \"\";\n\n constructor(index: number, fraction?: number) {\n this.index = index;\n if (fraction)\n this.fraction = fraction;\n }\n}\n\n/** A Parser class that is used to break a string that represents a quantity value into tokens.\n * @beta\n */\nexport class Parser {\n private static _log = false;\n\n public static isParsedQuantity(item: QuantityParseResult): item is ParsedQuantity {\n return item.ok;\n }\n\n public static isParseError(item: QuantityParseResult): item is ParseQuantityError {\n return !item.ok;\n }\n\n private static checkForScientificNotation(index: number, stringToParse: string, uomSeparatorToIgnore: number): ScientificToken {\n let exponentString = \"\";\n let i = index + 1;\n\n for (; i < stringToParse.length; i++) {\n const charCode = stringToParse.charCodeAt(i);\n if (Parser.isDigit(charCode) || ((charCode === QuantityConstants.CHAR_MINUS || charCode === QuantityConstants.CHAR_PLUS) && (i === (index + 1)))) {\n exponentString = exponentString.concat(stringToParse[i]);\n } else {\n i = uomSeparatorToIgnore === charCode ? i : i - 1;\n break;\n }\n }\n\n if (exponentString.length > 1 || ((exponentString.length === 1) && (exponentString.charCodeAt(0) !== QuantityConstants.CHAR_MINUS) && (exponentString.charCodeAt(0) !== QuantityConstants.CHAR_PLUS)))\n return new ScientificToken(i, exponentString);\n\n return new ScientificToken(index);\n }\n\n private static checkForFractions(index: number, stringToParse: string, uomSeparatorToIgnore: number, numeratorStr?: string): FractionToken {\n let numeratorToken = \"\";\n let denominatorToken = \"\";\n let processingNumerator = true;\n let i = index;\n if (numeratorStr && numeratorStr.length > 0) {\n numeratorToken = numeratorStr;\n processingNumerator = false;\n }\n\n for (; i < stringToParse.length; i++) {\n const charCode = stringToParse.charCodeAt(i);\n if (Parser.isDigit(charCode)) {\n if (processingNumerator) {\n numeratorToken = numeratorToken.concat(stringToParse[i]);\n } else {\n denominatorToken = denominatorToken.concat(stringToParse[i]);\n }\n } else {\n if (processingNumerator && (charCode === QuantityConstants.CHAR_SLASH || charCode === QuantityConstants.CHAR_DIVISION_SLASH || charCode === QuantityConstants.CHAR_DIVISION_SLASH)) {\n processingNumerator = false;\n } else {\n if (uomSeparatorToIgnore !== charCode)\n i = i - 1; // skip over uom separator after fraction\n\n break;\n }\n }\n }\n\n if (numeratorToken.length > 0 && denominatorToken.length > 0) {\n const numerator = parseInt(numeratorToken, 10);\n const denominator = parseInt(denominatorToken, 10);\n if (denominator > 0)\n return new FractionToken(i, numerator / denominator);\n return new FractionToken(i);\n }\n\n return new FractionToken(index + 1);\n }\n\n private static isDigit(charCode: number): boolean {\n return (charCode >= QuantityConstants.CHAR_DIGIT_ZERO) && (charCode <= QuantityConstants.CHAR_DIGIT_NINE);\n }\n\n private static isDigitOrDecimalSeparator(charCode: number, format: Format): boolean {\n return (charCode === format.decimalSeparator.charCodeAt(0)) || Parser.isDigit(charCode);\n }\n\n /** Parse the quantity string and return and array of ParseTokens that represent the component invariant values and unit labels.\n * @param quantitySpecification The quantity string to ba parsed.\n */\n public static parseQuantitySpecification(quantitySpecification: string, format: Format): ParseToken[] {\n const tokens: ParseToken[] = [];\n const str = quantitySpecification.trim();\n let processingNumber = false;\n let wipToken = \"\";\n let signToken = \"\";\n let isStationSeparatorAdded = false;\n let uomSeparatorToIgnore = 0;\n let fractionDashCode = 0;\n\n const skipCodes: number[] = [format.thousandSeparator.charCodeAt(0)];\n\n if (format.type === FormatType.Station && format.stationSeparator && format.stationSeparator.length === 1)\n skipCodes.push(format.stationSeparator.charCodeAt(0));\n\n if (format.type === FormatType.Fractional && format.hasFormatTraitSet(FormatTraits.FractionDash)) {\n fractionDashCode = QuantityConstants.CHAR_MINUS;\n }\n\n if (format.uomSeparator && format.uomSeparator !== \" \" && format.uomSeparator.length === 1) {\n uomSeparatorToIgnore = format.uomSeparator.charCodeAt(0);\n skipCodes.push(uomSeparatorToIgnore);\n }\n\n for (let i = 0; i < str.length; i++) {\n const charCode = str.charCodeAt(i);\n if (Parser.isDigitOrDecimalSeparator(charCode, format)) {\n if (!processingNumber) {\n if (wipToken.length > 0) {\n tokens.push(new ParseToken(wipToken));\n wipToken = \"\";\n }\n processingNumber = true;\n }\n // Decimal separators must be replaced with '.' before converting to a number - parseFloat() only supports '.' as the decimal separator.\n const charToAdd = charCode === format.decimalSeparator.charCodeAt(0) ? \".\" : str[i];\n wipToken = wipToken.concat(charToAdd);\n } else {\n if (processingNumber) {\n if (charCode === QuantityConstants.CHAR_SLASH || charCode === QuantityConstants.CHAR_FRACTION_SLASH || charCode === QuantityConstants.CHAR_DIVISION_SLASH) {\n const fractSymbol = Parser.checkForFractions(i + 1, str, uomSeparatorToIgnore, wipToken);\n let fraction = fractSymbol.fraction;\n i = fractSymbol.index;\n if (fractSymbol.fraction !== 0.0) {\n wipToken = \"\";\n if (signToken.length > 0) {\n if (signToken === \"-\")\n fraction = 0 - fraction;\n\n signToken = \"\";\n }\n\n tokens.push(new ParseToken(fraction));\n processingNumber = false;\n continue;\n }\n } else {\n // a space may signify end of number or start of decimal\n if (charCode === QuantityConstants.CHAR_SPACE || charCode === fractionDashCode) {\n const fractSymbol = Parser.checkForFractions(i + 1, str, uomSeparatorToIgnore);\n let fraction = fractSymbol.fraction;\n if (fractSymbol.fraction !== 0.0) {\n i = fractSymbol.index;\n if (signToken.length > 0) {\n wipToken = signToken + wipToken;\n if (signToken === \"-\")\n fraction = 0 - fraction;\n\n signToken = \"\";\n }\n\n const valueWithFraction = parseFloat(wipToken) + fraction;\n tokens.push(new ParseToken(valueWithFraction));\n processingNumber = false;\n wipToken = \"\";\n }\n else if (format.type === FormatType.Bearing && wipToken.length > 0) {\n if (signToken.length > 0) {\n wipToken = signToken + wipToken;\n signToken = \"\";\n }\n tokens.push(new ParseToken(parseFloat(wipToken))); // Create token for the current number\n processingNumber = false;\n wipToken = \"\";\n }\n continue;\n } else {\n // an \"E\" or \"e\" may signify scientific notation\n if (charCode === QuantityConstants.CHAR_UPPER_E || charCode === QuantityConstants.CHAR_LOWER_E) {\n const exponentSymbol = Parser.checkForScientificNotation(i, str, uomSeparatorToIgnore);\n i = exponentSymbol.index;\n\n if (exponentSymbol.exponent && exponentSymbol.exponent.length > 0) {\n if (signToken.length > 0) {\n wipToken = signToken + wipToken;\n signToken = \"\";\n }\n\n wipToken = `${wipToken}e${exponentSymbol.exponent}`;\n const scientificValue = Number(wipToken);\n tokens.push(new ParseToken(scientificValue));\n processingNumber = false;\n wipToken = \"\";\n continue;\n }\n }\n }\n }\n\n if (format.type === FormatType.Station && charCode === format.stationSeparator.charCodeAt(0)) {\n if (!isStationSeparatorAdded) {\n isStationSeparatorAdded = true;\n continue;\n }\n isStationSeparatorAdded = false;\n } else if (skipCodes.findIndex((ref) => ref === charCode) !== -1) {\n // ignore any codes in skipCodes\n continue;\n }\n\n if (signToken.length > 0) {\n wipToken = signToken + wipToken;\n signToken = \"\";\n }\n\n tokens.push(new ParseToken(parseFloat(wipToken)));\n\n wipToken = (i < str.length) ? str[i] : \"\";\n processingNumber = false;\n\n if (wipToken.length === 1 && isOperator(wipToken)) {\n tokens.push(new ParseToken(wipToken)); // Push operator token.\n wipToken = \"\";\n }\n } else {\n // not processing a number\n const isCharOperator = isOperator(charCode);\n const isSpacer = charCode === format.spacerOrDefault.charCodeAt(0) && charCode !== QuantityConstants.CHAR_SPACE;\n\n if (isSpacer && i > 0 && i < str.length - 1) {\n const prevCharCode = str.charCodeAt(i - 1);\n if (isCharOperator && prevCharCode !== QuantityConstants.CHAR_SPACE) {\n // ignore spacer if it's not at the start or end, not whitespace, and is not in front of a whitespace\n continue;\n }\n }\n\n if (wipToken.length === 0 && charCode === QuantityConstants.CHAR_SPACE) {\n // Don't add space when the wip token is empty.\n continue;\n }\n\n if (isCharOperator) {\n if (wipToken.length > 0) {\n // There is a token is progress, process it now, before adding the new operator token.\n tokens.push(new ParseToken(wipToken));\n wipToken = \"\";\n }\n tokens.push(new ParseToken(str[i])); // Push an Operator Token in the list.\n continue;\n }\n\n wipToken = wipToken.concat(str[i]);\n }\n }\n }\n\n // handle case where end of input string is reached.\n if (wipToken.length > 0) {\n if (processingNumber) {\n if (signToken.length > 0) {\n wipToken = signToken + wipToken;\n }\n if (isNaN(Number(wipToken))) {\n tokens.push(new ParseToken(NaN));\n } else {\n tokens.push(new ParseToken(parseFloat(wipToken)));\n }\n } else {\n tokens.push(new ParseToken(wipToken));\n }\n }\n return tokens;\n }\n\n private static isMathematicOperation(tokens: ParseToken[]) {\n if (tokens.length > 1) {\n // The loop starts at one because the first token can be a operator without it being maths. Ex: \"-5FT\"\n for (let i = 1; i < tokens.length; i++) {\n if (tokens[i].isOperator)\n // Operator found, it's a math operation.\n return true;\n }\n }\n return false;\n }\n\n private static async lookupUnitByLabel(unitLabel: string, format: Format, unitsProvider: UnitsProvider, altUnitLabelsProvider?: AlternateUnitLabelsProvider) {\n const defaultUnit = format.units && format.units.length > 0 ? format.units[0][0] : undefined;\n\n const labelToFind = unitLabel.toLowerCase();\n // First look in format for a label and matches\n if (format.units && format.units.length > 0) {\n const formatUnit = format.units.find(([unit, label]) => {\n if (label && label.toLowerCase() === labelToFind)\n return true;\n const alternateLabels = altUnitLabelsProvider?.getAlternateUnitLabels(unit);\n // check any alternate labels that may be defined for the Unit\n if (alternateLabels && alternateLabels.find((lbl) => lbl.toLowerCase() === labelToFind))\n return true;\n\n return false;\n });\n if (formatUnit)\n return formatUnit[0];\n }\n\n // now try to find a unit from the same family and system\n let foundUnit = await unitsProvider.findUnit(unitLabel, defaultUnit ? defaultUnit.phenomenon : undefined, defaultUnit ? defaultUnit.system : undefined);\n\n // if nothing found yet just limit to family\n if (!foundUnit.isValid && defaultUnit)\n foundUnit = await unitsProvider.findUnit(unitLabel, defaultUnit ? defaultUnit.phenomenon : undefined);\n return foundUnit;\n }\n\n /**\n * Get the output unit and all the conversion specs required to parse a given list of tokens.\n */\n private static async getRequiredUnitsConversionsToParseTokens(tokens: ParseToken[], format: Format, unitsProvider: UnitsProvider, altUnitLabelsProvider?: AlternateUnitLabelsProvider): Promise<{\n outUnit?: UnitProps;\n specs: UnitConversionSpec[];\n }> {\n let outUnit = (format.units && format.units.length > 0 ? format.units[0][0] : undefined);\n const unitConversions: UnitConversionSpec[] = [];\n const uniqueUnitLabels = [...new Set(tokens.filter((token) => token.isString).map((token) => token.value as string))];\n for (const label of uniqueUnitLabels) {\n const unitProps = await this.lookupUnitByLabel(label, format, unitsProvider, altUnitLabelsProvider);\n if (!outUnit) {\n // No default unit, assume that the first unit found is the desired output unit.\n outUnit = unitProps;\n }\n\n let spec = unitConversions.find((specB) => specB.name === unitProps.name);\n if (spec) {\n // Already in the list, just add the label.\n spec.parseLabels?.push(label.toLocaleLowerCase());\n } else {\n // Add new conversion to the list.\n const conversion = await unitsProvider.getConversion(unitProps, outUnit);\n if (conversion) {\n spec = {\n conversion,\n label: unitProps.label,\n system: unitProps.system,\n name: unitProps.name,\n parseLabels: [label.toLocaleLowerCase()],\n };\n unitConversions.push(spec);\n }\n }\n }\n\n return { outUnit, specs: unitConversions };\n }\n\n /**\n * Get the units information asynchronously, then convert the tokens into quantity using the synchronous tokens -> value.\n */\n private static async createQuantityFromParseTokens(tokens: ParseToken[], format: Format, unitsProvider: UnitsProvider, altUnitLabelsProvider?: AlternateUnitLabelsProvider): Promise<QuantityProps> {\n const unitConversionInfos = await this.getRequiredUnitsConversionsToParseTokens(tokens, format, unitsProvider, altUnitLabelsProvider);\n if (unitConversionInfos.outUnit) {\n const value = Parser.getQuantityValueFromParseTokens(tokens, format, unitConversionInfos.specs, await unitsProvider.getConversion(unitConversionInfos.outUnit, unitConversionInfos.outUnit));\n if (value.ok) {\n return new Quantity(unitConversionInfos.outUnit, value.value);\n }\n }\n\n return new Quantity();\n }\n\n /** Async method to generate a Quantity given a string that represents a quantity value and likely a unit label.\n * @param inString A string that contains text represent a quantity.\n * @param format Defines the likely format of inString.\n * @param unitsProvider required to look up units that may be specified in inString\n */\n public static async parseIntoQuantity(inString: string, format: Format, unitsProvider: UnitsProvider, altUnitLabelsProvider?: AlternateUnitLabelsProvider): Promise<QuantityProps> {\n const tokens: ParseToken[] = Parser.parseQuantitySpecification(inString, format);\n\n return Parser.createQuantityFromParseTokens(tokens, format, unitsProvider, altUnitLabelsProvider);\n }\n\n /** method to get the Unit Conversion given a unit label */\n private static tryFindUnitConversion(unitLabel: string, unitsConversions: UnitConversionSpec[], preferredUnit?: UnitProps): UnitConversionProps | undefined {\n if (unitsConversions.length > 0) {\n const label = unitLabel.toLocaleLowerCase();\n\n /* A preferred unit is used to target a unit if a unit label is used in more that one unit definition from the same unit family.\n * An example is if \"ft\" is used as the unitLabel and the preferredUnit is \"SURVEY_FT\" since that unit has an alternate label of \"ft\" the\n * conversion to \"SURVEY_FT\" is returned. If no preferredUnit is specified then the unit \"FT\" would likely to have been found first.\n * If \"in\" is the unit label and \"SURVEY_FT\" is the preferredUnit then conversion to \"SURVEY_IN\" would be returned.\n */\n if (preferredUnit) {\n // if there is a preferred unit defined see if unit label matched it or one of its alternates\n const preferredConversion = unitsConversions.find((conversion) => conversion.name === preferredUnit.name);\n if (preferredConversion && preferredConversion.parseLabels) {\n if (-1 !== preferredConversion.parseLabels.findIndex((lbl) => lbl === label))\n return preferredConversion.conversion;\n }\n // see if we can find a matching unitLabel in any unit within the same system as the preferred unit\n const preferredSystemConversions = unitsConversions.filter((conversion) => conversion.system === preferredUnit.system);\n for (const conversion of preferredSystemConversions) {\n if (conversion.parseLabels) {\n if (-1 !== conversion.parseLabels.findIndex((lbl) => lbl === label))\n return conversion.conversion;\n }\n }\n }\n\n // if no unit found based on preferredUnit see if an unit label matches\n for (const conversion of unitsConversions) {\n if (conversion.parseLabels) {\n if (-1 !== conversion.parseLabels.findIndex((lbl) => lbl === label))\n return conversion.conversion;\n } else {\n // eslint-disable-next-line no-console\n console.log(\"ERROR: Parser expects to find parseLabels array populate with all possible unit labels for the unit.\");\n }\n }\n }\n\n return undefined;\n }\n\n /**\n * Get what the unit conversion is for a unitless value.\n */\n private static getDefaultUnitConversion(tokens: ParseToken[], unitsConversions: UnitConversionSpec[], defaultUnit?: UnitProps) {\n let unitConversion = defaultUnit ? Parser.tryFindUnitConversion(defaultUnit.label, unitsConversions, defaultUnit) : undefined;\n if (!unitConversion) {\n // No default unit conversion, take the first valid unit.\n const uniqueUnitLabels = [...new Set(tokens.filter((token) => token.isString).map((token) => token.value as string))];\n for (const label of uniqueUnitLabels) {\n unitConversion = Parser.tryFindUnitConversion(label, unitsConversions, defaultUnit);\n if (unitConversion !== undefined)\n return unitConversion;\n }\n }\n return unitConversion;\n }\n\n // Get the next token pair to parse into a quantity.\n private static getNextTokenPair(index: number, tokens: ParseToken[]): ParseToken[] | undefined {\n if (index >= tokens.length)\n return;\n\n // 6 possible combination of token pair.\n // Stringified to ease comparison later.\n const validCombinations = [\n JSON.stringify([\"string\"]), // ['FT']\n JSON.stringify([\"string\", \"number\"]), // ['$', 5] unit specification comes before value (like currency)\n JSON.stringify([\"number\"]), // [5]\n JSON.stringify([\"number\", \"string\"]), // [5, 'FT']\n JSON.stringify([\"operator\", \"number\"]), // ['-', 5]\n JSON.stringify([\"operator\", \"number\", \"string\"]), // ['-', 5, 'FT']\n ];\n\n // Push up to 3 tokens in the list, if the length allows it.\n const maxNbrTokensInThePair = Math.min(tokens.length - index, 3);\n const tokenPair = tokens.slice(index, index + maxNbrTokensInThePair);\n const currentCombination = tokenPair.map((token) => token.isOperator ? \"operator\" : (token.isNumber ? \"number\" : \"string\"));\n\n // Check if the token pair is valid. If not, try again by removing the last token util empty.\n // Ex: ['5', 'FT', '7'] invalid => ['5', 'FT'] valid returned\n for (let i = currentCombination.length - 1; i >= 0; i--) {\n if (validCombinations.includes(JSON.stringify(currentCombination))) {\n break;\n } else {\n currentCombination.pop();\n tokenPair.pop();\n }\n }\n\n return tokenPair.length > 0 ? tokenPair : undefined;\n }\n\n /**\n * Accumulate the given list of tokens into a single quantity value. Formatting the tokens along the way.\n */\n private static getQuantityValueFromParseTokens(tokens: ParseToken[], format: Format, unitsConversions: UnitConversionSpec[], defaultUnitConversion?: UnitConversionProps): QuantityParseResult {\n if (tokens.length === 0)\n return { ok: false, error: ParseError.UnableToGenerateParseTokens };\n\n if (!format.allowMathematicOperations && Parser.isMathematicOperation(tokens))\n return { ok: false, error: ParseError.MathematicOperationFoundButIsNotAllowed };\n\n if (\n tokens.some((token) => token.isNumber && isNaN(token.value as number)) ||\n tokens.every((token) => token.isSpecialCharacter)\n ) {\n return { ok: false, error: ParseError.UnableToConvertParseTokensToQuantity };\n }\n\n const defaultUnit = format.units && format.units.length > 0 ? format.units[0][0] : undefined;\n defaultUnitConversion = defaultUnitConversion ? defaultUnitConversion : Parser.getDefaultUnitConversion(tokens, unitsConversions, defaultUnit);\n\n if (format.type === FormatType.Bearing && format.units !== undefined && format.units.length > 0) {\n const units = format.units;\n const desiredNumberOfTokens = units.length;\n if (tokens.length < desiredNumberOfTokens && tokens[0].isNumber && desiredNumberOfTokens <= 3) {\n // handle the special XX.YYZZ format which is common for bearings. It uses no separators, so we need to split based on numeric indexes. We support up to 3 units\n const value: number = tokens[0].value as number;\n const firstToken = Math.floor(value);\n tokens.pop();\n tokens.push(new ParseToken(firstToken)); // Add the first token back to the list.\n if (desiredNumberOfTokens >= 2) {\n const remaining = (value - firstToken) * 100;\n const secondToken = Math.floor(remaining);\n tokens.push(new ParseToken(secondToken));\n if (desiredNumberOfTokens === 3) {\n const thirdToken = (remaining - secondToken) * 100;\n tokens.push(new ParseToken(thirdToken));\n }\n }\n }\n }\n\n let tokenPair: ParseToken[] | undefined;\n let increment: number = 1;\n let mag = 0.0;\n // The sign is saved outside from the loop for cases like this. '-1m 50cm 10mm + 2m 30cm 40mm' => -1.51m + 2.34m\n let sign: 1 | -1 = 1;\n let compositeUnitIndex = 0;\n\n for (let i = 0; i < tokens.length; i = i + increment) {\n tokenPair = this.getNextTokenPair(i, tokens);\n if (!tokenPair || tokenPair.length === 0) {\n return { ok: false, error: ParseError.UnableToConvertParseTokensToQuantity };\n }\n increment = tokenPair.length;\n\n // Keep the sign so its applied to the next tokens.\n if (tokenPair[0].isOperator) {\n sign = tokenPair[0].value === Operator.addition ? 1 : -1;\n tokenPair.shift();\n compositeUnitIndex = 0; // Reset the composite unit index, the following tokens begin from start.\n }\n\n // unit specification comes before value (like currency)\n if (tokenPair.length === 2 && tokenPair[0].isString) {\n // Invert it so the currency sign comes second.\n tokenPair = [tokenPair[1], tokenPair[0]];\n }\n\n if (tokenPair[0].isNumber) {\n let value = sign * (tokenPair[0].value as number);\n let conversion: UnitConversionProps | undefined;\n if (tokenPair.length === 2 && tokenPair[1].isString) {\n conversion = Parser.tryFindUnitConversion(tokenPair[1].value as string, unitsConversions, defaultUnit);\n }\n if (!conversion) {\n if (compositeUnitIndex > 0 && format.units && format.units.length > compositeUnitIndex) {\n // if this is not the first token, and we have a composite spec, look up the unit from the current index\n const presUnitAtIndex = format.units[compositeUnitIndex][0];\n conversion = Parser.tryFindUnitConversion(presUnitAtIndex.label, unitsConversions, presUnitAtIndex);\n } else if (defaultUnitConversion) {\n conversion = defaultUnitConversion;\n }\n }\n if (conversion) {\n value = applyConversion(value, conversion);\n }\n mag = mag + value;\n compositeUnitIndex++;\n } else {\n // only the unit label was specified so assume magnitude of 0\n const conversion = Parser.tryFindUnitConversion(tokenPair[0].value as string, unitsConversions, defaultUnit);\n if (conversion === undefined) {\n // Unknown unit label\n return { ok: false, error: ParseError.NoValueOrUnitFoundInString };\n }\n }\n }\n\n return { ok: true, value: mag };\n }\n\n /** Method to generate a Quantity given a string that represents a quantity value.\n * @param inString A string that contains text represent a quantity.\n * @param parserSpec unit label if not explicitly defined by user. Must have matching entry in supplied array of unitsConversions.\n */\n public static parseQuantityString(inString: string, parserSpec: ParserSpec): QuantityParseResult {\n // ensure any labels defined in composite unit definition are specified in unitConversions\n if (parserSpec.format.units) {\n parserSpec.format.units.forEach(([unit, label]) => {\n if (label) {\n if (unit.label !== label) { // if default unit label does not match composite label ensure the label is in the list of parse labels for the conversion\n const unitConversion = parserSpec.unitConversions.find((conversion) => conversion.name === unit.name);\n if (unitConversion && unitConversion.parseLabels && !unitConversion.parseLabels.find((entry) => entry === label))\n unitConversion.parseLabels.push(label);\n }\n }\n });\n }\n\n if (parserSpec.format.type === FormatType.Bearing) {\n return this.parseBearingFormat(inString, parserSpec);\n }\n if (parserSpec.format.type === FormatType.Azimuth) {\n return this.parseAzimuthFormat(inString, parserSpec);\n }\n\n if (parserSpec.format.type === FormatType.Ratio) {\n return this.parseRatioFormat(inString, parserSpec);\n }\n\n return this.parseAndProcessTokens(inString, parserSpec.format, parserSpec.unitConversions);\n }\n\n /** Method to generate a Quantity given a string that represents a quantity value and likely a unit label.\n * @param inString A string that contains text represent a quantity.\n * @param format Defines the likely format of inString. Primary unit serves as a default unit if no unit label found in string.\n * @param unitsConversions dictionary of conversions used to convert from unit used in inString to output quantity\n * @deprecated in 4.10 - will not be removed until after 2026-06-13. Check [[Parser.parseQuantityString]] for replacements.\n */\n public static parseToQuantityValue(inString: string, format: Format, unitsConversions: UnitConversionSpec[]): QuantityParseResult {\n // TODO: This method is not able to do bearing and azimuth formatting and is overlapping with parseQuantityString.\n // We should consider deprecating and removing it, there do not seem to be any upstream callers at this moment\n\n // ensure any labels defined in composite unit definition are specified in unitConversions\n if (format.units) {\n format.units.forEach(([unit, label]) => {\n if (label) {\n if (unit.label !== label) { // if default unit label does not match composite label ensure the label is in the list of parse labels for the conversion\n const unitConversion = unitsConversions.find((conversion) => conversion.name === unit.name);\n if (unitConversion && unitConversion.parseLabels && !unitConversion.parseLabels.find((entry) => entry === label))\n unitConversion.parseLabels.push(label);\n }\n }\n });\n }\n\n if (format.type === FormatType.Bearing || format.type === FormatType.Azimuth || format.type === FormatType.Ratio) {\n // throw error indicating to call parseQuantityString instead\n throw new QuantityError(QuantityStatus.UnsupportedUnit, `Bearing, Azimuth or Ratio format must be parsed using a ParserSpec. Call parseQuantityString instead.`);\n }\n\n return this.parseAndProcessTokens(inString, format, unitsConversions);\n }\n\n /** The value of special direction is always in degrees, try to find the unit conversion for that. */\n private static processSpecialBearingDirection(mag: number, spec: ParserSpec): QuantityParseResult {\n const specialDirUnit = spec.unitConversions.find((unitConversion) => unitConversion.name === \"Units.ARC_DEG\");\n if (!specialDirUnit)\n return { ok: false, error: ParseError.UnknownUnit };\n const preferredUnit = spec.outUnit;\n const conversion = this.tryFindUnitConversion(specialDirUnit.label, spec.unitConversions, preferredUnit);\n if (!conversion) return { ok: true, value: mag };\n return { ok: true, value: applyConversion(mag, conversion) };\n }\n\n private static parseBearingFormat(inString: string, spec: ParserSpec): QuantityParseResult {\n const specialDirections: Record<string, number> = {\n n: 0,\n ne: 45,\n e: 90,\n se: 135,\n s: 180,\n sw: 225,\n w: 270,\n nw: 315,\n };\n\n // TODO: at some point we will want to open this for localization, in the first release it's going to be hard coded\n enum DirectionLabel {\n North = \"N\",\n South = \"S\",\n East = \"E\",\n West = \"W\"\n }\n let matchedPrefix: DirectionLabel | null = null;\n let matchedSuffix: DirectionLabel | null = null;\n\n // check if input string begins with northLabel or southLabel and strip it off\n if (inString.toUpperCase().startsWith(DirectionLabel.North)) {\n inString = inString.substring(DirectionLabel.North.length);\n matchedPrefix = DirectionLabel.North;\n } else if (inString.toUpperCase().startsWith(DirectionLabel.South)) {\n inString = inString.substring(DirectionLabel.South.length);\n matchedPrefix = DirectionLabel.South;\n }\n\n // check if input string ends with eastLabel or westLabel (case-insensitive) and strip it off\n if (inString.toUpperCase().endsWith(DirectionLabel.East)) {\n inString = inString.substring(0, inString.length - DirectionLabel.East.length);\n matchedSuffix = DirectionLabel.East;\n } else if (inString.toUpperCase().endsWith(DirectionLabel.West)) {\n inString = inString.substring(0, inString.length - DirectionLabel.West.length);\n matchedSuffix = DirectionLabel.West;\n }\n\n // check if the remaining string is a special direction\n if (inString.trim() === \"\") {\n const prefix = matchedPrefix?.toLowerCase() || \"\";\n const suffix = matchedSuffix?.toLowerCase() || \"\";\n const specialDirection = specialDirections[`${prefix}${suffix}`];\n if (specialDirection !== undefined)\n return this.processSpecialBearingDirection(specialDirection, spec);\n }\n\n if (matchedPrefix === null || matchedSuffix === null) {\n return { ok: false, error: ParseError.BearingPrefixOrSuffixMissing };\n }\n\n const parsedResult = this.parseAndProcessTokens(inString, spec.format, spec.unitConversions);\n if (this.isParseError(parsedResult)) {\n return parsedResult;\n }\n const revolution = this.getRevolution(spec);\n const quarterRevolution = revolution / 4;\n\n let magnitude = parsedResult.value;\n if (magnitude < -quarterRevolution || magnitude > quarterRevolution) {\n return { ok: false, error: ParseError.BearingAngleOutOfRange };\n }\n\n // we have to turn the value into an east base and counter clockwise (NW and SE are already counter clockwise)\n if (matchedPrefix === DirectionLabel.North) {\n if (matchedSuffix === DirectionLabel.West) {\n magnitude = revolution - magnitude;\n }\n } else if (matchedPrefix === DirectionLabel.South) {\n if (matchedSuffix === DirectionLabel.West) {\n magnitude = (2 * quarterRevolution) + magnitude;\n } else if (matchedSuffix === DirectionLabel.East) {\n magnitude = (2 * quarterRevolution) - magnitude;\n }\n }\n magnitude = this.normalizeAngle(magnitude, revolution);\n\n return { ok: true, value: magnitude };\n }\n\n private static parseAzimuthFormat(inString: string, spec: ParserSpec): QuantityParseResult {\n const parsedResult = this.parseAndProcessTokens(inString, spec.format, spec.unitConversions);\n if (this.isParseError(parsedResult)) {\n return parsedResult;\n }\n\n let magnitude = parsedResult.value;\n\n const revolution = this.getRevolution(spec);\n magnitude = this.normalizeAngle(magnitude, revolution);\n let azimuthBase = 0.0;\n if (spec.format.azimuthBase !== undefined) {\n if (spec.azimuthBaseConversion === undefined) {\n throw new QuantityError(QuantityStatus.MissingRequiredProperty, `Missing azimuth base conversion for interpreting ${spec.format.name}'s azimuth base.`);\n }\n const azBaseQuantity: Quantity = new Quantity(spec.format.azimuthBaseUnit, spec.format.azimuthBase);\n const azBaseConverted = azBaseQuantity.convertTo(spec.outUnit, spec.azimuthBaseConversion);\n if (azBaseConverted === undefined || !azBaseConverted.isValid) {\n throw new QuantityError(QuantityStatus.UnsupportedUnit, `Failed to convert azimuth base unit to ${spec.outUnit.name}.`);\n }\n azimuthBase = this.normalizeAngle(azBaseConverted.magnitude, revolution);\n }\n const inputIsClockwise = spec.format.azimuthClockwiseOrDefault;\n\n if (inputIsClockwise && azimuthBase === 0) {\n // parsed result already has the same base and orientation as our desired output\n return parsedResult;\n }\n\n if (inputIsClockwise)\n magnitude = azimuthBase + magnitude;\n else\n magnitude = azimuthBase - magnitude;\n\n magnitude = this.normalizeAngle(magnitude, revolution);\n\n return { ok: true, value: magnitude };\n }\n\n private static parseRatioFormat(inString: string, spec: ParserSpec): QuantityParseResult {\n if (!inString)\n return { ok: false, error: ParseError.NoValueOrUnitFoundInString };\n\n const parts = inString.split(\":\");\n if (parts.length > 2)\n return { ok: false, error: ParseError.UnableToConvertParseTokensToQuantity };\n\n const numerator = parseFloat(parts[0]);\n let denominator;\n if (parts.length === 1) {\n denominator = 1.0;\n } else {\n denominator = parseFloat(parts[1]);\n }\n\n if (isNaN(numerator) || isNaN(denominator))\n return { ok: false, error: ParseError.NoValueOrUnitFoundInString };\n\n const defaultUnit = spec.format.units && spec.format.units.length > 0 ? spec.format.units[0][0] : undefined;\n const unitConversion = defaultUnit ? Parser.tryFindUnitConversion(defaultUnit.label, spec.unitConversions, defaultUnit) : undefined;\n\n if (!unitConversion) {\n throw new QuantityError(QuantityStatus.MissingRequiredProperty, `Missing input unit or unit conversion for interpreting ${spec.format.name}.`);\n }\n\n if (denominator === 0) {\n if (unitConversion.inversion && numerator === 1)\n return { ok: true, value: 0.0 };\n else\n return { ok: false, error: ParseError.MathematicOperationFoundButIsNotAllowed };\n }\n\n let quantity: Quantity;\n if (spec.format.units && spec.outUnit) {\n quantity = new Quantity(spec.format.units[0][0], numerator / denominator);\n } else {\n throw new QuantityError(QuantityStatus.MissingRequiredProperty, \"Missing presentation unit or persistence unit for ratio format.\");\n }\n\n let converted: Quantity | undefined;\n try {\n converted = quantity.convertTo(spec.outUnit, unitConversion);\n } catch (err) {\n // for input of \"0:N\" with reversed unit\n if (err instanceof QuantityError && err.errorNumber === QuantityStatus.InvertingZero) {\n return { ok: false, error: ParseError.MathematicOperationFoundButIsNotAllowed };\n }\n }\n\n if (converted === undefined || !converted.isValid) {\n throw new QuantityError(QuantityStatus.UnsupportedUnit, `Failed to convert from ${spec.format.units[0][0].name} to ${spec.outUnit.name} On format ${spec.format.name}.`);\n }\n\n return { ok: true, value: converted.magnitude };\n }\n\n // TODO: The following two methods are redundant with Formatter. We should consider consolidating them.\n private static normalizeAngle(magnitude: number, revolution: number): number {\n magnitude = magnitude % revolution; // Strip anything that goes around more than once\n\n if (magnitude < 0) // If the value is negative, we want to normalize it to a positive angle\n magnitude += revolution;\n\n return magnitude;\n }\n\n private static getRevolution(spec: ParserSpec): number {\n if (spec.revolutionConversion === undefined) {\n throw new QuantityError(QuantityStatus.MissingRequiredProperty, `Missing revolution unit conversion for calculating ${spec.format.name}'s revolution.`);\n }\n\n const revolution: Quantity = new Quantity(spec.format.revolutionUnit, 1.0);\n const converted = revolution.convertTo(spec.outUnit, spec.revolutionConversion);\n if (converted === undefined || !converted.isValid) {\n throw new QuantityError(QuantityStatus.UnsupportedUnit, `Failed to convert revolution unit to ${spec.outUnit.name} On format ${spec.format.name}.`);\n }\n\n return converted.magnitude;\n }\n\n private static parseAndProcessTokens(inString: string, format: Format, unitsConversions: UnitConversionSpec[]): QuantityParseResult {\n const tokens: ParseToken[] = Parser.parseQuantitySpecification(inString, format);\n if (Parser._log) {\n // eslint-disable-next-line no-console\n console.log(`Parse tokens`);\n let i = 0;\n for (const token of tokens) {\n // eslint-disable-next-line no-console\n console.log(` [${i++}] isNumber=${token.isNumber} isString=${token.isString} token=${token.value}`);\n }\n }\n\n return Parser.getQuantityValueFromParseTokens(tokens, format, unitsConversions);\n }\n\n /** Async Method used to create an array of UnitConversionSpec entries that can be used in synchronous calls to parse units. */\n public static async createUnitConversionSpecsForUnit(unitsProvider: UnitsProvider, outUnit: UnitProps, altUnitLabelsProvider?: AlternateUnitLabelsProvider): Promise<UnitConversionSpec[]> {\n const unitConversionSpecs: UnitConversionSpec[] = [];\n\n const familyUnits = await unitsProvider.getUnitsByFamily(outUnit.phenomenon);\n for (const unit of familyUnits) {\n const conversion = await unitsProvider.getConversion(unit, outUnit);\n const parseLabels: string[] = [unit.label.toLocaleLowerCase()];\n const alternateLabels = altUnitLabelsProvider?.getAlternateUnitLabels(unit);\n // add any alternate labels that may be defined for the Unit\n if (alternateLabels) {\n alternateLabels.forEach((label: string) => {\n const potentialLabel = label.toLocaleLowerCase();\n if (-1 === parseLabels.findIndex((lbl) => lbl === potentialLabel))\n parseLabels.push(label.toLocaleLowerCase());\n });\n }\n\n unitConversionSpecs.push({\n name: unit.name,\n label: unit.label,\n conversion,\n parseLabels,\n system: unit.system,\n });\n }\n return unitConversionSpecs;\n }\n\n /** Async Method used to create an array of UnitConversionSpec entries that can be used in synchronous calls to parse units. */\n public static async createUnitConversionSpecs(unitsProvider: UnitsProvider, outUnitName: string, potentialParseUnits: PotentialParseUnit[], altUnitLabelsProvider?: AlternateUnitLabelsProvider): Promise<UnitConversionSpec[]> {\n const unitConversionSpecs: UnitConversionSpec[] = [];\n\n const outUnit = await unitsProvider.findUnitByName(outUnitName);\n if (!outUnit || !outUnit.name || 0 === outUnit.name.length) {\n // eslint-disable-next-line no-console\n console.log(`[Parser.createUnitConversionSpecs] ERROR: Unable to locate out unit ${outUnitName}.`);\n return unitConversionSpecs;\n }\n\n for (const potentialParseUnit of potentialParseUnits) {\n const unit = await unitsProvider.findUnitByName(potentialParseUnit.unitName);\n if (!unit || !unit.name || 0 === unit.name.length) {\n // eslint-disable-next-line no-console\n console.log(`[Parser.createUnitConversionSpecs] ERROR: Unable to locate potential unit ${potentialParseUnit.unitName}.`);\n continue;\n }\n\n const conversion = await unitsProvider.getConversion(unit, outUnit);\n const parseLabels: string[] = [unit.label.toLocaleLowerCase()];\n const alternateLabels = altUnitLabelsProvider?.getAlternateUnitLabels(unit);\n // add any alternate labels that may be defined for the Unit\n if (alternateLabels) {\n alternateLabels.forEach((label: string) => {\n const potentialLabel = label.toLocaleLowerCase();\n if (-1 === parseLabels.findIndex((lbl) => lbl === potentialLabel))\n parseLabels.push(label.toLocaleLowerCase());\n });\n }\n\n // add any alternate labels that where provided by caller\n if (potentialParseUnit.altLabels) {\n potentialParseUnit.altLabels.forEach((label: string) => {\n const potentialLabel = label.toLocaleLowerCase();\n if (-1 === parseLabels.findIndex((lbl) => lbl === potentialLabel))\n parseLabels.push(label.toLocaleLowerCase());\n });\n }\n unitConversionSpecs.push({\n name: unit.name,\n label: unit.label,\n conversion,\n parseLabels,\n system: unit.system,\n });\n }\n return unitConversionSpecs;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Parser.js","sourceRoot":"","sources":["../../src/Parser.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAEH,2CAAgD;AAChD,2CAA4D;AAE5D,yDAAmE;AAGnE,yCAAuD;AAEvD;;GAEG;AACH,IAAY,UAUX;AAVD,WAAY,UAAU;IACpB,yFAA+B,CAAA;IAC/B,uFAA0B,CAAA;IAC1B,+FAA8B,CAAA;IAC9B,yDAAW,CAAA;IACX,2GAAoC,CAAA;IACpC,qEAAiB,CAAA;IACjB,2FAA4B,CAAA;IAC5B,iHAAuC,CAAA;IACvC,+EAAsB,CAAA;AACxB,CAAC,EAVW,UAAU,0BAAV,UAAU,QAUrB;AAsBD,IAAK,QAKJ;AALD,WAAK,QAAQ;IACX,0BAAc,CAAA;IACd,6BAAiB,CAAA;IACjB,gCAAoB,CAAA;IACpB,0BAAc,CAAA,CAAC,iDAAiD;AAClE,CAAC,EALI,QAAQ,KAAR,QAAQ,QAKZ;AAED,SAAS,UAAU,CAAC,IAAqB;IACvC,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,kCAAkC;QAClC,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,IAAgB,CAAC,CAAC;AAC5D,CAAC;AAQD;;GAEG;AACH,MAAM,UAAU;IACP,KAAK,CAA6B;IAClC,UAAU,GAAY,KAAK,CAAC;IAEnC,YAAY,KAAiC;QAC3C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;YAC1B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3C,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACrB,CAAC;IACH,CAAC;IAED,IAAW,QAAQ,KAAc,OAAO,CAAC,IAAI,CAAC,UAAU,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC;IAC7F,IAAW,QAAQ,KAAc,OAAO,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC;IACzE,IAAW,kBAAkB;QAC3B,MAAM,MAAM,GAAG,0CAA0C,CAAC;QAC1D,OAAO,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;IACvE,CAAC;CACF;AAED;;GAEG;AACH,MAAM,eAAe;IACZ,KAAK,CAAS;IACd,QAAQ,GAAG,EAAE,CAAC;IAErB,YAAY,KAAa,EAAE,QAAiB;QAC1C,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,QAAQ;YACV,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC7B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,aAAa;IACV,KAAK,CAAS;IACd,QAAQ,GAAG,GAAG,CAAC;IACf,QAAQ,GAAG,EAAE,CAAC;IAErB,YAAY,KAAa,EAAE,QAAiB;QAC1C,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,QAAQ;YACV,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC7B,CAAC;CACF;AAED;;GAEG;AACH,MAAa,MAAM;IACT,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC;IAErB,MAAM,CAAC,gBAAgB,CAAC,IAAyB;QACtD,OAAO,IAAI,CAAC,EAAE,CAAC;IACjB,CAAC;IAEM,MAAM,CAAC,YAAY,CAAC,IAAyB;QAClD,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;IAClB,CAAC;IAEO,MAAM,CAAC,0BAA0B,CAAC,KAAa,EAAE,aAAqB,EAAE,oBAA4B;QAC1G,IAAI,cAAc,GAAG,EAAE,CAAC;QACxB,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;QAElB,OAAO,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,MAAM,QAAQ,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAC7C,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,KAAK,6BAAiB,CAAC,UAAU,IAAI,QAAQ,KAAK,6BAAiB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjJ,cAAc,GAAG,cAAc,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3D,CAAC;iBAAM,CAAC;gBACN,CAAC,GAAG,oBAAoB,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBAClD,MAAM;YACR,CAAC;QACH,CAAC;QAED,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,6BAAiB,CAAC,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,6BAAiB,CAAC,SAAS,CAAC,CAAC;YACnM,OAAO,IAAI,eAAe,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;QAEhD,OAAO,IAAI,eAAe,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IAEO,MAAM,CAAC,iBAAiB,CAAC,KAAa,EAAE,aAAqB,EAAE,oBAA4B,EAAE,YAAqB;QACxH,IAAI,cAAc,GAAG,EAAE,CAAC;QACxB,IAAI,gBAAgB,GAAG,EAAE,CAAC;QAC1B,IAAI,mBAAmB,GAAG,IAAI,CAAC;QAC/B,IAAI,CAAC,GAAG,KAAK,CAAC;QACd,IAAI,YAAY,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5C,cAAc,GAAG,YAAY,CAAC;YAC9B,mBAAmB,GAAG,KAAK,CAAC;QAC9B,CAAC;QAED,OAAO,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,MAAM,QAAQ,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAC7C,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC7B,IAAI,mBAAmB,EAAE,CAAC;oBACxB,cAAc,GAAG,cAAc,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC3D,CAAC;qBAAM,CAAC;oBACN,gBAAgB,GAAG,gBAAgB,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC/D,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,IAAI,mBAAmB,IAAI,CAAC,QAAQ,KAAK,6BAAiB,CAAC,UAAU,IAAI,QAAQ,KAAK,6BAAiB,CAAC,mBAAmB,IAAI,QAAQ,KAAK,6BAAiB,CAAC,mBAAmB,CAAC,EAAE,CAAC;oBACnL,mBAAmB,GAAG,KAAK,CAAC;gBAC9B,CAAC;qBAAM,CAAC;oBACN,IAAI,oBAAoB,KAAK,QAAQ;wBACnC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,yCAAyC;oBAEtD,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7D,MAAM,SAAS,GAAG,QAAQ,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;YAC/C,MAAM,WAAW,GAAG,QAAQ,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;YACnD,IAAI,WAAW,GAAG,CAAC;gBACjB,OAAO,IAAI,aAAa,CAAC,CAAC,EAAE,SAAS,GAAG,WAAW,CAAC,CAAC;YACvD,OAAO,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC;QAC9B,CAAC;QAED,OAAO,IAAI,aAAa,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IACtC,CAAC;IAEO,MAAM,CAAC,OAAO,CAAC,QAAgB;QACrC,OAAO,CAAC,QAAQ,IAAI,6BAAiB,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,IAAI,6BAAiB,CAAC,eAAe,CAAC,CAAC;IAC5G,CAAC;IAEO,MAAM,CAAC,yBAAyB,CAAC,QAAgB,EAAE,MAAc;QACvE,OAAO,CAAC,QAAQ,KAAK,MAAM,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC1F,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,0BAA0B,CAAC,qBAA6B,EAAE,MAAc;QACpF,MAAM,MAAM,GAAiB,EAAE,CAAC;QAChC,MAAM,GAAG,GAAG,qBAAqB,CAAC,IAAI,EAAE,CAAC;QACzC,IAAI,gBAAgB,GAAG,KAAK,CAAC;QAC7B,IAAI,QAAQ,GAAG,EAAE,CAAC;QAClB,IAAI,SAAS,GAAG,EAAE,CAAC;QACnB,IAAI,uBAAuB,GAAG,KAAK,CAAC;QACpC,IAAI,oBAAoB,GAAG,CAAC,CAAC;QAC7B,IAAI,gBAAgB,GAAG,CAAC,CAAC;QAEzB,MAAM,SAAS,GAAa,CAAC,MAAM,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QAErE,IAAI,MAAM,CAAC,IAAI,KAAK,wBAAU,CAAC,OAAO,IAAI,MAAM,CAAC,gBAAgB,IAAI,MAAM,CAAC,gBAAgB,CAAC,MAAM,KAAK,CAAC;YACvG,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QAExD,IAAI,MAAM,CAAC,IAAI,KAAK,wBAAU,CAAC,UAAU,IAAI,MAAM,CAAC,iBAAiB,CAAC,0BAAY,CAAC,YAAY,CAAC,EAAE,CAAC;YACjG,gBAAgB,GAAG,6BAAiB,CAAC,UAAU,CAAC;QAClD,CAAC;QAED,IAAI,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,YAAY,KAAK,GAAG,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3F,oBAAoB,GAAG,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACzD,SAAS,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACvC,CAAC;QAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACnC,IAAI,MAAM,CAAC,yBAAyB,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC;gBACvD,IAAI,CAAC,gBAAgB,EAAE,CAAC;oBACtB,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACxB,MAAM,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;wBACtC,QAAQ,GAAG,EAAE,CAAC;oBAChB,CAAC;oBACD,gBAAgB,GAAG,IAAI,CAAC;gBAC1B,CAAC;gBACD,wIAAwI;gBACxI,MAAM,SAAS,GAAG,QAAQ,KAAK,MAAM,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACpF,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACxC,CAAC;iBAAM,CAAC;gBACN,IAAI,gBAAgB,EAAE,CAAC;oBACrB,IAAI,QAAQ,KAAK,6BAAiB,CAAC,UAAU,IAAI,QAAQ,KAAK,6BAAiB,CAAC,mBAAmB,IAAI,QAAQ,KAAK,6BAAiB,CAAC,mBAAmB,EAAE,CAAC;wBAC1J,MAAM,WAAW,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,oBAAoB,EAAE,QAAQ,CAAC,CAAC;wBACzF,IAAI,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC;wBACpC,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC;wBACtB,IAAI,WAAW,CAAC,QAAQ,KAAK,GAAG,EAAE,CAAC;4BACjC,QAAQ,GAAG,EAAE,CAAC;4BACd,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gCACzB,IAAI,SAAS,KAAK,GAAG;oCACnB,QAAQ,GAAG,CAAC,GAAG,QAAQ,CAAC;gCAE1B,SAAS,GAAG,EAAE,CAAC;4BACjB,CAAC;4BAED,MAAM,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;4BACtC,gBAAgB,GAAG,KAAK,CAAC;4BACzB,SAAS;wBACX,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACN,wDAAwD;wBACxD,IAAI,QAAQ,KAAK,6BAAiB,CAAC,UAAU,IAAI,QAAQ,KAAK,gBAAgB,EAAE,CAAC;4BAC/E,MAAM,WAAW,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,oBAAoB,CAAC,CAAC;4BAC/E,IAAI,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC;4BACpC,IAAI,WAAW,CAAC,QAAQ,KAAK,GAAG,EAAE,CAAC;gCACjC,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC;gCACtB,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oCACzB,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;oCAChC,IAAI,SAAS,KAAK,GAAG;wCACnB,QAAQ,GAAG,CAAC,GAAG,QAAQ,CAAC;oCAE1B,SAAS,GAAG,EAAE,CAAC;gCACjB,CAAC;gCAED,MAAM,iBAAiB,GAAG,UAAU,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC;gCAC1D,MAAM,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC;gCAC/C,gBAAgB,GAAG,KAAK,CAAC;gCACzB,QAAQ,GAAG,EAAE,CAAC;4BAChB,CAAC;iCACI,IAAI,MAAM,CAAC,IAAI,KAAK,wBAAU,CAAC,OAAO,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gCACnE,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oCACzB,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;oCAChC,SAAS,GAAG,EAAE,CAAC;gCACjB,CAAC;gCACD,MAAM,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,sCAAsC;gCACzF,gBAAgB,GAAG,KAAK,CAAC;gCACzB,QAAQ,GAAG,EAAE,CAAC;4BAChB,CAAC;4BACD,SAAS;wBACX,CAAC;6BAAM,CAAC;4BACN,gDAAgD;4BAChD,IAAI,QAAQ,KAAK,6BAAiB,CAAC,YAAY,IAAI,QAAQ,KAAK,6BAAiB,CAAC,YAAY,EAAE,CAAC;gCAC/F,MAAM,cAAc,GAAG,MAAM,CAAC,0BAA0B,CAAC,CAAC,EAAE,GAAG,EAAE,oBAAoB,CAAC,CAAC;gCACvF,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC;gCAEzB,IAAI,cAAc,CAAC,QAAQ,IAAI,cAAc,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oCAClE,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wCACzB,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;wCAChC,SAAS,GAAG,EAAE,CAAC;oCACjB,CAAC;oCAED,QAAQ,GAAG,GAAG,QAAQ,IAAI,cAAc,CAAC,QAAQ,EAAE,CAAC;oCACpD,MAAM,eAAe,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;oCACzC,MAAM,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC;oCAC7C,gBAAgB,GAAG,KAAK,CAAC;oCACzB,QAAQ,GAAG,EAAE,CAAC;oCACd,SAAS;gCACX,CAAC;4BACH,CAAC;wBACH,CAAC;oBACH,CAAC;oBAED,IAAI,MAAM,CAAC,IAAI,KAAK,wBAAU,CAAC,OAAO,IAAI,QAAQ,KAAK,MAAM,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;wBAC7F,IAAI,CAAC,uBAAuB,EAAE,CAAC;4BAC7B,uBAAuB,GAAG,IAAI,CAAC;4BAC/B,SAAS;wBACX,CAAC;wBACD,uBAAuB,GAAG,KAAK,CAAC;oBAClC,CAAC;yBAAM,IAAI,SAAS,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;wBACjE,gCAAgC;wBAChC,SAAS;oBACX,CAAC;oBAED,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACzB,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;wBAChC,SAAS,GAAG,EAAE,CAAC;oBACjB,CAAC;oBAED,MAAM,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;oBAElD,QAAQ,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC1C,gBAAgB,GAAG,KAAK,CAAC;oBAEzB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;wBAClD,MAAM,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,uBAAuB;wBAC9D,QAAQ,GAAG,EAAE,CAAC;oBAChB,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,0BAA0B;oBAC1B,MAAM,cAAc,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;oBAC5C,MAAM,QAAQ,GAAG,QAAQ,KAAK,MAAM,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,QAAQ,KAAK,6BAAiB,CAAC,UAAU,CAAC;oBAEhH,IAAI,QAAQ,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC5C,MAAM,YAAY,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;wBAC3C,IAAI,cAAc,IAAI,YAAY,KAAK,6BAAiB,CAAC,UAAU,EAAE,CAAC;4BACpE,qGAAqG;4BACrG,SAAS;wBACX,CAAC;oBACH,CAAC;oBAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,KAAK,6BAAiB,CAAC,UAAU,EAAE,CAAC;wBACvE,+CAA+C;wBAC/C,SAAS;oBACX,CAAC;oBAED,IAAI,cAAc,EAAE,CAAC;wBACnB,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;4BACxB,sFAAsF;4BACtF,MAAM,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;4BACtC,QAAQ,GAAG,EAAE,CAAC;wBAChB,CAAC;wBACD,MAAM,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,sCAAsC;wBAC3E,SAAS;oBACX,CAAC;oBAED,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBACrC,CAAC;YACH,CAAC;QACH,CAAC;QAED,oDAAoD;QACpD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,IAAI,gBAAgB,EAAE,CAAC;gBACrB,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACzB,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;gBAClC,CAAC;gBACD,IAAI,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;oBAC5B,MAAM,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;gBACnC,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBACpD,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,MAAM,CAAC,qBAAqB,CAAC,MAAoB;QACvD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,sGAAsG;YACtG,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACvC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU;oBACtB,yCAAyC;oBACzC,OAAO,IAAI,CAAC;YAChB,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,SAAiB,EAAE,MAAc,EAAE,aAA4B,EAAE,qBAAmD;QACzJ,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAE7F,MAAM,WAAW,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;QAC5C,+CAA+C;QAC/C,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5C,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE;gBACrD,IAAI,KAAK,IAAI,KAAK,CAAC,WAAW,EAAE,KAAK,WAAW;oBAC9C,OAAO,IAAI,CAAC;gBACd,MAAM,eAAe,GAAG,qBAAqB,EAAE,sBAAsB,CAAC,IAAI,CAAC,CAAC;gBAC5E,8DAA8D;gBAC9D,IAAI,eAAe,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,WAAW,CAAC;oBACrF,OAAO,IAAI,CAAC;gBAEd,OAAO,KAAK,CAAC;YACf,CAAC,CAAC,CAAC;YACH,IAAI,UAAU;gBACZ,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC;QACzB,CAAC;QAED,yDAAyD;QACzD,IAAI,SAAS,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAExJ,4CAA4C;QAC5C,IAAI,CAAC,SAAS,CAAC,OAAO,IAAI,WAAW;YACnC,SAAS,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACxG,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,KAAK,CAAC,wCAAwC,CAAC,MAAoB,EAAE,MAAc,EAAE,aAA4B,EAAE,qBAAmD;QAInL,IAAI,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACzF,MAAM,eAAe,GAAyB,EAAE,CAAC;QACjD,MAAM,gBAAgB,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAe,CAAC,CAAC,CAAC,CAAC;QACtH,KAAK,MAAM,KAAK,IAAI,gBAAgB,EAAE,CAAC;YACrC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,qBAAqB,CAAC,CAAC;YACpG,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,gFAAgF;gBAChF,OAAO,GAAG,SAAS,CAAC;YACtB,CAAC;YAED,IAAI,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,IAAI,CAAC,CAAC;YAC1E,IAAI,IAAI,EAAE,CAAC;gBACT,2CAA2C;gBAC3C,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC,CAAC;YACpD,CAAC;iBAAM,CAAC;gBACN,kCAAkC;gBAClC,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;gBACzE,IAAI,UAAU,EAAE,CAAC;oBACf,IAAI,GAAG;wBACL,UAAU;wBACV,KAAK,EAAE,SAAS,CAAC,KAAK;wBACtB,MAAM,EAAE,SAAS,CAAC,MAAM;wBACxB,IAAI,EAAE,SAAS,CAAC,IAAI;wBACpB,WAAW,EAAE,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC;qBACzC,CAAC;oBACF,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC;IAC7C,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,KAAK,CAAC,6BAA6B,CAAC,MAAoB,EAAE,MAAc,EAAE,aAA4B,EAAE,qBAAmD;QACxK,MAAM,mBAAmB,GAAG,MAAM,IAAI,CAAC,wCAAwC,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,qBAAqB,CAAC,CAAC;QACtI,IAAI,mBAAmB,CAAC,OAAO,EAAE,CAAC;YAChC,MAAM,KAAK,GAAG,MAAM,CAAC,+BAA+B,CAAC,MAAM,EAAE,MAAM,EAAE,mBAAmB,CAAC,KAAK,EAAE,MAAM,aAAa,CAAC,aAAa,CAAC,mBAAmB,CAAC,OAAO,EAAE,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC;YAC7L,IAAI,KAAK,CAAC,EAAE,EAAE,CAAC;gBACb,OAAO,IAAI,mBAAQ,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YAChE,CAAC;QACH,CAAC;QAED,OAAO,IAAI,mBAAQ,EAAE,CAAC;IACxB,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,QAAgB,EAAE,MAAc,EAAE,aAA4B,EAAE,qBAAmD;QACvJ,MAAM,MAAM,GAAiB,MAAM,CAAC,0BAA0B,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAEjF,OAAO,MAAM,CAAC,6BAA6B,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,qBAAqB,CAAC,CAAC;IACpG,CAAC;IAED,2DAA2D;IACnD,MAAM,CAAC,qBAAqB,CAAC,SAAiB,EAAE,gBAAsC,EAAE,aAAyB;QACvH,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,MAAM,KAAK,GAAG,SAAS,CAAC,iBAAiB,EAAE,CAAC;YAE5C;;;;cAIE;YACF,IAAI,aAAa,EAAE,CAAC;gBAClB,6FAA6F;gBAC7F,MAAM,mBAAmB,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,KAAK,aAAa,CAAC,IAAI,CAAC,CAAC;gBAC1G,IAAI,mBAAmB,IAAI,mBAAmB,CAAC,WAAW,EAAE,CAAC;oBAC3D,IAAI,CAAC,CAAC,KAAK,mBAAmB,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,KAAK,CAAC;wBAC1E,OAAO,mBAAmB,CAAC,UAAU,CAAC;gBAC1C,CAAC;gBACD,mGAAmG;gBACnG,MAAM,0BAA0B,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,KAAK,aAAa,CAAC,MAAM,CAAC,CAAC;gBACvH,KAAK,MAAM,UAAU,IAAI,0BAA0B,EAAE,CAAC;oBACpD,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC;wBAC3B,IAAI,CAAC,CAAC,KAAK,UAAU,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,KAAK,CAAC;4BACjE,OAAO,UAAU,CAAC,UAAU,CAAC;oBACjC,CAAC;gBACH,CAAC;YACH,CAAC;YAED,uEAAuE;YACvE,KAAK,MAAM,UAAU,IAAI,gBAAgB,EAAE,CAAC;gBAC1C,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC;oBAC3B,IAAI,CAAC,CAAC,KAAK,UAAU,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,KAAK,CAAC;wBACjE,OAAO,UAAU,CAAC,UAAU,CAAC;gBACjC,CAAC;qBAAM,CAAC;oBACN,sCAAsC;oBACtC,OAAO,CAAC,GAAG,CAAC,sGAAsG,CAAC,CAAC;gBACtH,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,wBAAwB,CAAC,MAAoB,EAAE,gBAAsC,EAAE,WAAuB;QAC3H,IAAI,cAAc,GAAG,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,qBAAqB,CAAC,WAAW,CAAC,KAAK,EAAE,gBAAgB,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9H,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,yDAAyD;YACzD,MAAM,gBAAgB,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAe,CAAC,CAAC,CAAC,CAAC;YACtH,KAAK,MAAM,KAAK,IAAI,gBAAgB,EAAE,CAAC;gBACrC,cAAc,GAAG,MAAM,CAAC,qBAAqB,CAAC,KAAK,EAAE,gBAAgB,EAAE,WAAW,CAAC,CAAC;gBACpF,IAAI,cAAc,KAAK,SAAS;oBAC9B,OAAO,cAAc,CAAC;YAC1B,CAAC;YACD,gFAAgF;YAChF,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC;gBAAE,MAAM,IAAI,yBAAa,CAAC,0BAAc,CAAC,8BAA8B,EAAE,qBAAqB,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;QACpM,CAAC;QACD,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,oDAAoD;IAC5C,MAAM,CAAC,gBAAgB,CAAC,KAAa,EAAE,MAAoB;QACjE,IAAI,KAAK,IAAI,MAAM,CAAC,MAAM;YACxB,OAAO;QAET,wCAAwC;QACxC,wCAAwC;QACxC,MAAM,iBAAiB,GAAG;YACxB,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS;YACrC,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,EAAE,iEAAiE;YACvG,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM;YAClC,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,EAAE,YAAY;YAClD,IAAI,CAAC,SAAS,CAAC,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,EAAE,WAAW;YACnD,IAAI,CAAC,SAAS,CAAC,CAAC,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,EAAE,iBAAiB;SACpE,CAAC;QAEF,4DAA4D;QAC5D,MAAM,qBAAqB,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC;QACjE,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,qBAAqB,CAAC,CAAC;QACrE,MAAM,kBAAkB,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAE5H,6FAA6F;QAC7F,6DAA6D;QAC7D,KAAK,IAAI,CAAC,GAAG,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACxD,IAAI,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC;gBACnE,MAAM;YACR,CAAC;iBAAM,CAAC;gBACN,kBAAkB,CAAC,GAAG,EAAE,CAAC;gBACzB,SAAS,CAAC,GAAG,EAAE,CAAC;YAClB,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IACtD,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,+BAA+B,CAAC,MAAoB,EAAE,MAAc,EAAE,gBAAsC,EAAE,qBAA2C;QACtK,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YACrB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,2BAA2B,EAAE,CAAC;QAEtE,IAAI,CAAC,MAAM,CAAC,yBAAyB,IAAI,MAAM,CAAC,qBAAqB,CAAC,MAAM,CAAC;YAC3E,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,uCAAuC,EAAE,CAAC;QAElF,IACE,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,CAAC,KAAe,CAAC,CAAC;YACtE,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAC,EACjD,CAAC;YACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,oCAAoC,EAAE,CAAC;QAC/E,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC7F,IAAI,CAAC;YACH,qBAAqB,GAAG,qBAAqB,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,MAAM,CAAC,wBAAwB,CAAC,MAAM,EAAE,gBAAgB,EAAE,WAAW,CAAC,CAAC;QACjJ,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,+EAA+E;YAC/E,IAAI,CAAC,YAAY,yBAAa,IAAI,CAAC,CAAC,WAAW,KAAK,0BAAc,CAAC,8BAA8B;gBAC/F,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,8BAA8B,EAAE,CAAC;QAC3E,CAAC;QAED,IAAI,MAAM,CAAC,IAAI,KAAK,wBAAU,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChG,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;YAC3B,MAAM,qBAAqB,GAAG,KAAK,CAAC,MAAM,CAAC;YAC3C,IAAI,MAAM,CAAC,MAAM,GAAG,qBAAqB,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,qBAAqB,IAAI,CAAC,EAAE,CAAC;gBAC9F,gKAAgK;gBAChK,MAAM,KAAK,GAAW,MAAM,CAAC,CAAC,CAAC,CAAC,KAAe,CAAC;gBAChD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACrC,MAAM,CAAC,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,wCAAwC;gBACjF,IAAI,qBAAqB,IAAI,CAAC,EAAE,CAAC;oBAC/B,MAAM,SAAS,GAAG,CAAC,KAAK,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC;oBAC7C,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;oBAC1C,MAAM,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC;oBACzC,IAAI,qBAAqB,KAAK,CAAC,EAAE,CAAC;wBAChC,MAAM,UAAU,GAAG,CAAC,SAAS,GAAG,WAAW,CAAC,GAAG,GAAG,CAAC;wBACnD,MAAM,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;oBAC1C,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,SAAmC,CAAC;QACxC,IAAI,SAAS,GAAW,CAAC,CAAC;QAC1B,IAAI,GAAG,GAAG,GAAG,CAAC;QACd,gHAAgH;QAChH,IAAI,IAAI,GAAW,CAAC,CAAC;QACrB,IAAI,kBAAkB,GAAG,CAAC,CAAC;QAE3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS,EAAE,CAAC;YACrD,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YAC7C,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,oCAAoC,EAAE,CAAC;YAC/E,CAAC;YACD,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC;YAE7B,mDAAmD;YACnD,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;gBAC5B,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACzD,SAAS,CAAC,KAAK,EAAE,CAAC;gBAClB,kBAAkB,GAAG,CAAC,CAAC,CAAC,yEAAyE;YACnG,CAAC;YAED,wDAAwD;YACxD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;gBACpD,+CAA+C;gBAC/C,SAAS,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3C,CAAC;YAED,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;gBAC1B,IAAI,KAAK,GAAG,IAAI,GAAI,SAAS,CAAC,CAAC,CAAC,CAAC,KAAgB,CAAC;gBAClD,IAAI,UAA2C,CAAC;gBAChD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;oBACpD,UAAU,GAAG,MAAM,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAe,EAAE,gBAAgB,EAAE,WAAW,CAAC,CAAC;gBACzG,CAAC;gBACD,IAAI,CAAC,UAAU,EAAE,CAAC;oBAChB,IAAI,kBAAkB,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,kBAAkB,EAAE,CAAC;wBACvF,wGAAwG;wBACxG,MAAM,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC;wBAC5D,UAAU,GAAG,MAAM,CAAC,qBAAqB,CAAC,eAAe,CAAC,KAAK,EAAE,gBAAgB,EAAE,eAAe,CAAC,CAAC;oBACtG,CAAC;yBAAM,IAAI,qBAAqB,EAAE,CAAC;wBACjC,UAAU,GAAG,qBAAqB,CAAC;oBACrC,CAAC;gBACH,CAAC;gBACD,IAAI,UAAU,EAAE,CAAC;oBACf,KAAK,GAAG,IAAA,0BAAe,EAAC,KAAK,EAAE,UAAU,CAAC,CAAC;gBAC7C,CAAC;gBACD,GAAG,GAAG,GAAG,GAAG,KAAK,CAAC;gBAClB,kBAAkB,EAAE,CAAC;YACvB,CAAC;iBAAM,CAAC;gBACN,6DAA6D;gBAC7D,MAAM,UAAU,GAAG,MAAM,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAe,EAAE,gBAAgB,EAAE,WAAW,CAAC,CAAC;gBAC7G,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;oBAC7B,qBAAqB;oBACrB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,0BAA0B,EAAE,CAAC;gBACrE,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;IAClC,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,mBAAmB,CAAC,QAAgB,EAAE,UAAsB;QACxE,0FAA0F;QAC1F,IAAI,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAC5B,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE;gBAChD,IAAI,KAAK,EAAE,CAAC;oBACV,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC,CAAC,0HAA0H;wBACpJ,MAAM,cAAc,GAAG,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC;wBACtG,IAAI,cAAc,IAAI,cAAc,CAAC,WAAW,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,KAAK,CAAC;4BAC9G,cAAc,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBAC3C,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,KAAK,wBAAU,CAAC,OAAO,EAAE,CAAC;YAClD,OAAO,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QACvD,CAAC;QACD,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,KAAK,wBAAU,CAAC,OAAO,EAAE,CAAC;YAClD,OAAO,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QACvD,CAAC;QAED,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,KAAK,wBAAU,CAAC,KAAK,EAAE,CAAC;YAChD,OAAO,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QACrD,CAAC;QAED,OAAO,IAAI,CAAC,qBAAqB,CAAC,QAAQ,EAAE,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,eAAe,CAAC,CAAC;IAC7F,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,oBAAoB,CAAC,QAAgB,EAAE,MAAc,EAAE,gBAAsC;QACzG,kHAAkH;QAClH,8GAA8G;QAE9G,0FAA0F;QAC1F,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE;gBACrC,IAAI,KAAK,EAAE,CAAC;oBACV,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC,CAAC,0HAA0H;wBACpJ,MAAM,cAAc,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC;wBAC5F,IAAI,cAAc,IAAI,cAAc,CAAC,WAAW,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,KAAK,CAAC;4BAC9G,cAAc,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBAC3C,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,MAAM,CAAC,IAAI,KAAK,wBAAU,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,KAAK,wBAAU,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,KAAK,wBAAU,CAAC,KAAK,EAAE,CAAC;YACjH,6DAA6D;YAC7D,MAAM,IAAI,yBAAa,CAAC,0BAAc,CAAC,eAAe,EAAE,uGAAuG,CAAC,CAAC;QACnK,CAAC;QAED,OAAO,IAAI,CAAC,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC;IACxE,CAAC;IAED,qGAAqG;IAC7F,MAAM,CAAC,8BAA8B,CAAC,GAAW,EAAE,IAAgB;QACzE,MAAM,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,KAAK,eAAe,CAAC,CAAC;QAC9G,IAAI,CAAC,cAAc;YACjB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,WAAW,EAAE,CAAC;QACtD,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC;QACnC,MAAM,UAAU,GAAG,IAAI,CAAC,qBAAqB,CAAC,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;QACzG,IAAI,CAAC,UAAU;YAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;QACjD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAA,0BAAe,EAAC,GAAG,EAAE,UAAU,CAAC,EAAE,CAAC;IAC/D,CAAC;IAEO,MAAM,CAAC,kBAAkB,CAAC,QAAgB,EAAE,IAAgB;QAClE,MAAM,iBAAiB,GAA2B;YAChD,CAAC,EAAE,CAAC;YACJ,EAAE,EAAE,EAAE;YACN,CAAC,EAAE,EAAE;YACL,EAAE,EAAE,GAAG;YACP,CAAC,EAAE,GAAG;YACN,EAAE,EAAE,GAAG;YACP,CAAC,EAAE,GAAG;YACN,EAAE,EAAE,GAAG;SACR,CAAC;QAEF,mHAAmH;QACnH,IAAK,cAKJ;QALD,WAAK,cAAc;YACjB,6BAAW,CAAA;YACX,6BAAW,CAAA;YACX,4BAAU,CAAA;YACV,4BAAU,CAAA;QACZ,CAAC,EALI,cAAc,KAAd,cAAc,QAKlB;QACD,IAAI,aAAa,GAA0B,IAAI,CAAC;QAChD,IAAI,aAAa,GAA0B,IAAI,CAAC;QAEhD,8EAA8E;QAC9E,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5D,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC3D,aAAa,GAAG,cAAc,CAAC,KAAK,CAAC;QACvC,CAAC;aAAM,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;YACnE,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC3D,aAAa,GAAG,cAAc,CAAC,KAAK,CAAC;QACvC,CAAC;QAED,6FAA6F;QAC7F,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;YACzD,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC/E,aAAa,GAAG,cAAc,CAAC,IAAI,CAAC;QACtC,CAAC;aAAM,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;YAChE,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC/E,aAAa,GAAG,cAAc,CAAC,IAAI,CAAC;QACtC,CAAC;QAED,uDAAuD;QACvD,IAAI,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,aAAa,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;YAClD,MAAM,MAAM,GAAG,aAAa,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;YAClD,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,GAAG,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;YACjE,IAAI,gBAAgB,KAAK,SAAS;gBAChC,OAAO,IAAI,CAAC,8BAA8B,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;QACvE,CAAC;QAED,IAAI,aAAa,KAAK,IAAI,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;YACrD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,4BAA4B,EAAE,CAAC;QACvE,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,qBAAqB,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QAC7F,IAAI,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,CAAC;YACpC,OAAO,YAAY,CAAC;QACtB,CAAC;QACD,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,iBAAiB,GAAG,UAAU,GAAG,CAAC,CAAC;QAEzC,IAAI,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC;QACnC,IAAI,SAAS,GAAG,CAAC,iBAAiB,IAAI,SAAS,GAAG,iBAAiB,EAAE,CAAC;YACpE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,sBAAsB,EAAE,CAAC;QACjE,CAAC;QAED,8GAA8G;QAC9G,IAAI,aAAa,KAAK,cAAc,CAAC,KAAK,EAAE,CAAC;YAC3C,IAAI,aAAa,KAAK,cAAc,CAAC,IAAI,EAAE,CAAC;gBAC1C,SAAS,GAAG,UAAU,GAAG,SAAS,CAAC;YACrC,CAAC;QACH,CAAC;aAAM,IAAI,aAAa,KAAK,cAAc,CAAC,KAAK,EAAE,CAAC;YAClD,IAAI,aAAa,KAAK,cAAc,CAAC,IAAI,EAAE,CAAC;gBAC1C,SAAS,GAAG,CAAC,CAAC,GAAG,iBAAiB,CAAC,GAAG,SAAS,CAAC;YAClD,CAAC;iBAAM,IAAI,aAAa,KAAK,cAAc,CAAC,IAAI,EAAE,CAAC;gBACjD,SAAS,GAAG,CAAC,CAAC,GAAG,iBAAiB,CAAC,GAAG,SAAS,CAAC;YAClD,CAAC;QACH,CAAC;QACD,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QAEvD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IACxC,CAAC;IAEO,MAAM,CAAC,kBAAkB,CAAC,QAAgB,EAAE,IAAgB;QAClE,MAAM,YAAY,GAAG,IAAI,CAAC,qBAAqB,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QAC7F,IAAI,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,CAAC;YACpC,OAAO,YAAY,CAAC;QACtB,CAAC;QAED,IAAI,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC;QAEnC,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAC5C,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QACvD,IAAI,WAAW,GAAG,GAAG,CAAC;QACtB,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YAC1C,IAAI,IAAI,CAAC,qBAAqB,KAAK,SAAS,EAAE,CAAC;gBAC7C,MAAM,IAAI,yBAAa,CAAC,0BAAc,CAAC,uBAAuB,EAAE,oDAAoD,IAAI,CAAC,MAAM,CAAC,IAAI,kBAAkB,CAAC,CAAC;YAC1J,CAAC;YACD,MAAM,cAAc,GAAa,IAAI,mBAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YACpG,MAAM,eAAe,GAAG,cAAc,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,qBAAqB,CAAC,CAAC;YAC3F,IAAI,eAAe,KAAK,SAAS,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC;gBAC9D,MAAM,IAAI,yBAAa,CAAC,0BAAc,CAAC,eAAe,EAAE,0CAA0C,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC;YAC1H,CAAC;YACD,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QAC3E,CAAC;QACD,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,yBAAyB,CAAC;QAE/D,IAAI,gBAAgB,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;YAC1C,gFAAgF;YAChF,OAAO,YAAY,CAAC;QACtB,CAAC;QAED,IAAI,gBAAgB;YAClB,SAAS,GAAG,WAAW,GAAG,SAAS,CAAC;;YAEpC,SAAS,GAAG,WAAW,GAAG,SAAS,CAAC;QAEtC,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QAEvD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IACxC,CAAC;IAEO,MAAM,CAAC,gBAAgB,CAAC,QAAgB,EAAE,IAAgB;QAChE,IAAI,CAAC,QAAQ;YACX,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,0BAA0B,EAAE,CAAC;QAErE,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAClB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,oCAAoC,EAAE,CAAC;QAE/E,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACvC,IAAI,WAAW,CAAC;QAChB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,WAAW,GAAG,GAAG,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,WAAW,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,CAAC;QAED,IAAI,KAAK,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,WAAW,CAAC;YACxC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,0BAA0B,EAAE,CAAC;QAErE,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC5G,MAAM,cAAc,GAAG,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,qBAAqB,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAEpI,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,MAAM,IAAI,yBAAa,CAAC,0BAAc,CAAC,uBAAuB,EAAE,0DAA0D,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC;QACjJ,CAAC;QAED,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;YACtB,IAAI,cAAc,CAAC,SAAS,IAAI,SAAS,KAAK,CAAC;gBAC7C,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;;gBAEhC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,uCAAuC,EAAE,CAAC;QACpF,CAAC;QAED,IAAI,QAAkB,CAAC;QACvB,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACtC,QAAQ,GAAG,IAAI,mBAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,GAAG,WAAW,CAAC,CAAC;QAC5E,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,yBAAa,CAAC,0BAAc,CAAC,uBAAuB,EAAE,iEAAiE,CAAC,CAAC;QACrI,CAAC;QAED,IAAI,SAA+B,CAAC;QACpC,IAAI,CAAC;YACH,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QAC/D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,wCAAwC;YACxC,IAAI,GAAG,YAAY,yBAAa,IAAI,GAAG,CAAC,WAAW,KAAK,0BAAc,CAAC,aAAa,EAAE,CAAC;gBACrF,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,uCAAuC,EAAE,CAAC;YAClF,CAAC;QACH,CAAC;QAED,IAAI,SAAS,KAAK,SAAS,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;YAClD,MAAM,IAAI,yBAAa,CAAC,0BAAc,CAAC,eAAe,EAAE,0BAA0B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,cAAc,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC;QAC3K,CAAC;QAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,SAAS,EAAE,CAAC;IAClD,CAAC;IAED,uGAAuG;IAC/F,MAAM,CAAC,cAAc,CAAC,SAAiB,EAAE,UAAkB;QACjE,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC,CAAC,iDAAiD;QAErF,IAAI,SAAS,GAAG,CAAC,EAAE,wEAAwE;YACzF,SAAS,IAAI,UAAU,CAAC;QAE1B,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,MAAM,CAAC,aAAa,CAAC,IAAgB;QAC3C,IAAI,IAAI,CAAC,oBAAoB,KAAK,SAAS,EAAE,CAAC;YAC5C,MAAM,IAAI,yBAAa,CAAC,0BAAc,CAAC,uBAAuB,EAAE,sDAAsD,IAAI,CAAC,MAAM,CAAC,IAAI,gBAAgB,CAAC,CAAC;QAC1J,CAAC;QAED,MAAM,UAAU,GAAa,IAAI,mBAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;QAC3E,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAChF,IAAI,SAAS,KAAK,SAAS,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;YAClD,MAAM,IAAI,yBAAa,CAAC,0BAAc,CAAC,eAAe,EAAE,wCAAwC,IAAI,CAAC,OAAO,CAAC,IAAI,cAAc,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC;QACtJ,CAAC;QAED,OAAO,SAAS,CAAC,SAAS,CAAC;IAC7B,CAAC;IAEO,MAAM,CAAC,qBAAqB,CAAC,QAAgB,EAAE,MAAc,EAAE,gBAAsC;QAC3G,MAAM,MAAM,GAAiB,MAAM,CAAC,0BAA0B,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACjF,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAChB,sCAAsC;YACtC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YAC5B,IAAI,CAAC,GAAG,CAAC,CAAC;YACV,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,sCAAsC;gBACtC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,cAAc,KAAK,CAAC,QAAQ,aAAa,KAAK,CAAC,QAAQ,UAAU,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;YACvG,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC,+BAA+B,CAAC,MAAM,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAClF,CAAC;IAED,+HAA+H;IACxH,MAAM,CAAC,KAAK,CAAC,gCAAgC,CAAC,aAA4B,EAAE,OAAkB,EAAE,qBAAmD;QACxJ,MAAM,mBAAmB,GAAyB,EAAE,CAAC;QAErD,MAAM,WAAW,GAAG,MAAM,aAAa,CAAC,gBAAgB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC7E,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC/B,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACpE,MAAM,WAAW,GAAa,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC,CAAC;YAC/D,MAAM,eAAe,GAAG,qBAAqB,EAAE,sBAAsB,CAAC,IAAI,CAAC,CAAC;YAC5E,4DAA4D;YAC5D,IAAI,eAAe,EAAE,CAAC;gBACpB,eAAe,CAAC,OAAO,CAAC,CAAC,KAAa,EAAE,EAAE;oBACxC,MAAM,cAAc,GAAG,KAAK,CAAC,iBAAiB,EAAE,CAAC;oBACjD,IAAI,CAAC,CAAC,KAAK,WAAW,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,cAAc,CAAC;wBAC/D,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC,CAAC;gBAChD,CAAC,CAAC,CAAC;YACL,CAAC;YAED,mBAAmB,CAAC,IAAI,CAAC;gBACvB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,UAAU;gBACV,WAAW;gBACX,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,CAAC,CAAC;QACL,CAAC;QACD,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IAED,+HAA+H;IACxH,MAAM,CAAC,KAAK,CAAC,yBAAyB,CAAC,aAA4B,EAAE,WAAmB,EAAE,mBAAyC,EAAE,qBAAmD;QAC7L,MAAM,mBAAmB,GAAyB,EAAE,CAAC;QAErD,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;QAChE,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YAC3D,sCAAsC;YACtC,OAAO,CAAC,GAAG,CAAC,uEAAuE,WAAW,GAAG,CAAC,CAAC;YACnG,OAAO,mBAAmB,CAAC;QAC7B,CAAC;QAED,KAAK,MAAM,kBAAkB,IAAI,mBAAmB,EAAE,CAAC;YACrD,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,cAAc,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;YAC7E,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBAClD,sCAAsC;gBACtC,OAAO,CAAC,GAAG,CAAC,6EAA6E,kBAAkB,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACzH,SAAS;YACX,CAAC;YAED,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACpE,MAAM,WAAW,GAAa,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC,CAAC;YAC/D,MAAM,eAAe,GAAG,qBAAqB,EAAE,sBAAsB,CAAC,IAAI,CAAC,CAAC;YAC5E,4DAA4D;YAC5D,IAAI,eAAe,EAAE,CAAC;gBACpB,eAAe,CAAC,OAAO,CAAC,CAAC,KAAa,EAAE,EAAE;oBACxC,MAAM,cAAc,GAAG,KAAK,CAAC,iBAAiB,EAAE,CAAC;oBACjD,IAAI,CAAC,CAAC,KAAK,WAAW,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,cAAc,CAAC;wBAC/D,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC,CAAC;gBAChD,CAAC,CAAC,CAAC;YACL,CAAC;YAED,yDAAyD;YACzD,IAAI,kBAAkB,CAAC,SAAS,EAAE,CAAC;gBACjC,kBAAkB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,KAAa,EAAE,EAAE;oBACrD,MAAM,cAAc,GAAG,KAAK,CAAC,iBAAiB,EAAE,CAAC;oBACjD,IAAI,CAAC,CAAC,KAAK,WAAW,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,cAAc,CAAC;wBAC/D,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC,CAAC;gBAChD,CAAC,CAAC,CAAC;YACL,CAAC;YACD,mBAAmB,CAAC,IAAI,CAAC;gBACvB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,UAAU;gBACV,WAAW;gBACX,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,CAAC,CAAC;QACL,CAAC;QACD,OAAO,mBAAmB,CAAC;IAC7B,CAAC;;AAl7BH,wBAm7BC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Quantity\n */\n\nimport { QuantityConstants } from \"./Constants\";\nimport { QuantityError, QuantityStatus } from \"./Exception\";\nimport { Format } from \"./Formatter/Format\";\nimport { FormatTraits, FormatType } from \"./Formatter/FormatEnums\";\nimport { AlternateUnitLabelsProvider, PotentialParseUnit, QuantityProps, UnitConversionProps, UnitConversionSpec, UnitProps, UnitsProvider } from \"./Interfaces\";\nimport { ParserSpec } from \"./ParserSpec\";\nimport { applyConversion, Quantity } from \"./Quantity\";\n\n/** Possible parser errors\n * @beta\n */\nexport enum ParseError {\n UnableToGenerateParseTokens = 1,\n NoValueOrUnitFoundInString,\n UnitLabelSuppliedButNotMatched,\n UnknownUnit,\n UnableToConvertParseTokensToQuantity,\n InvalidParserSpec,\n BearingPrefixOrSuffixMissing,\n MathematicOperationFoundButIsNotAllowed,\n BearingAngleOutOfRange,\n}\n\n/** Parse error result from [[Parser.parseToQuantityValue]] or [[Parser.parseToQuantityValue]].\n * @beta\n */\nexport interface ParseQuantityError {\n /** Union discriminator for [[QuantityParseResult]]. */\n ok: false;\n /** The specific error that occurred during parsing. */\n error: ParseError;\n}\n\n/** Successful result from [[Parser.parseToQuantityValue]] or [[Parser.parseToQuantityValue]].\n * @beta\n */\nexport interface ParsedQuantity {\n /** Union discriminator for [[QuantityParseResult]]. */\n ok: true;\n /** The magnitude of the parsed quantity. */\n value: number;\n}\n\nenum Operator {\n addition = \"+\",\n subtraction = \"-\",\n multiplication = \"*\", // unsupported but we recognize it during parsing\n division = \"/\" // unsupported but we recognize it during parsing\n}\n\nfunction isOperator(char: number | string): boolean {\n if (typeof char === \"number\") {\n // Convert the CharCode to string.\n char = String.fromCharCode(char);\n }\n return Object.values(Operator).includes(char as Operator);\n}\n\n/**\n * Defines Results of parsing a string input by a user into its desired value type\n * @beta\n */\nexport type QuantityParseResult = ParsedQuantity | ParseQuantityError;\n\n/** A ParseToken holds either a numeric or string token extracted from a string that represents a quantity value.\n * @beta\n */\nclass ParseToken {\n public value: number | string | Operator;\n public isOperator: boolean = false;\n\n constructor(value: string | number | Operator) {\n if (typeof value === \"string\") {\n this.value = value.trim();\n this.isOperator = isOperator(this.value);\n } else {\n this.value = value;\n }\n }\n\n public get isString(): boolean { return !this.isOperator && typeof this.value === \"string\"; }\n public get isNumber(): boolean { return typeof this.value === \"number\"; }\n public get isSpecialCharacter(): boolean {\n const format = /^[!@#$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>\\/?]+$/;\n return this.isString && this.value.toString().match(format) !== null;\n }\n}\n\n/** A ScientificToken holds an index and string representing the exponent.\n * @beta\n */\nclass ScientificToken {\n public index: number;\n public exponent = \"\";\n\n constructor(index: number, exponent?: string) {\n this.index = index;\n if (exponent)\n this.exponent = exponent;\n }\n}\n\n/** A FractionToken holds an index and the fraction value of numerator / denominator.\n * @beta\n */\nclass FractionToken {\n public index: number;\n public fraction = 0.0;\n public exponent = \"\";\n\n constructor(index: number, fraction?: number) {\n this.index = index;\n if (fraction)\n this.fraction = fraction;\n }\n}\n\n/** A Parser class that is used to break a string that represents a quantity value into tokens.\n * @beta\n */\nexport class Parser {\n private static _log = false;\n\n public static isParsedQuantity(item: QuantityParseResult): item is ParsedQuantity {\n return item.ok;\n }\n\n public static isParseError(item: QuantityParseResult): item is ParseQuantityError {\n return !item.ok;\n }\n\n private static checkForScientificNotation(index: number, stringToParse: string, uomSeparatorToIgnore: number): ScientificToken {\n let exponentString = \"\";\n let i = index + 1;\n\n for (; i < stringToParse.length; i++) {\n const charCode = stringToParse.charCodeAt(i);\n if (Parser.isDigit(charCode) || ((charCode === QuantityConstants.CHAR_MINUS || charCode === QuantityConstants.CHAR_PLUS) && (i === (index + 1)))) {\n exponentString = exponentString.concat(stringToParse[i]);\n } else {\n i = uomSeparatorToIgnore === charCode ? i : i - 1;\n break;\n }\n }\n\n if (exponentString.length > 1 || ((exponentString.length === 1) && (exponentString.charCodeAt(0) !== QuantityConstants.CHAR_MINUS) && (exponentString.charCodeAt(0) !== QuantityConstants.CHAR_PLUS)))\n return new ScientificToken(i, exponentString);\n\n return new ScientificToken(index);\n }\n\n private static checkForFractions(index: number, stringToParse: string, uomSeparatorToIgnore: number, numeratorStr?: string): FractionToken {\n let numeratorToken = \"\";\n let denominatorToken = \"\";\n let processingNumerator = true;\n let i = index;\n if (numeratorStr && numeratorStr.length > 0) {\n numeratorToken = numeratorStr;\n processingNumerator = false;\n }\n\n for (; i < stringToParse.length; i++) {\n const charCode = stringToParse.charCodeAt(i);\n if (Parser.isDigit(charCode)) {\n if (processingNumerator) {\n numeratorToken = numeratorToken.concat(stringToParse[i]);\n } else {\n denominatorToken = denominatorToken.concat(stringToParse[i]);\n }\n } else {\n if (processingNumerator && (charCode === QuantityConstants.CHAR_SLASH || charCode === QuantityConstants.CHAR_DIVISION_SLASH || charCode === QuantityConstants.CHAR_DIVISION_SLASH)) {\n processingNumerator = false;\n } else {\n if (uomSeparatorToIgnore !== charCode)\n i = i - 1; // skip over uom separator after fraction\n\n break;\n }\n }\n }\n\n if (numeratorToken.length > 0 && denominatorToken.length > 0) {\n const numerator = parseInt(numeratorToken, 10);\n const denominator = parseInt(denominatorToken, 10);\n if (denominator > 0)\n return new FractionToken(i, numerator / denominator);\n return new FractionToken(i);\n }\n\n return new FractionToken(index + 1);\n }\n\n private static isDigit(charCode: number): boolean {\n return (charCode >= QuantityConstants.CHAR_DIGIT_ZERO) && (charCode <= QuantityConstants.CHAR_DIGIT_NINE);\n }\n\n private static isDigitOrDecimalSeparator(charCode: number, format: Format): boolean {\n return (charCode === format.decimalSeparator.charCodeAt(0)) || Parser.isDigit(charCode);\n }\n\n /** Parse the quantity string and return and array of ParseTokens that represent the component invariant values and unit labels.\n * @param quantitySpecification The quantity string to ba parsed.\n */\n public static parseQuantitySpecification(quantitySpecification: string, format: Format): ParseToken[] {\n const tokens: ParseToken[] = [];\n const str = quantitySpecification.trim();\n let processingNumber = false;\n let wipToken = \"\";\n let signToken = \"\";\n let isStationSeparatorAdded = false;\n let uomSeparatorToIgnore = 0;\n let fractionDashCode = 0;\n\n const skipCodes: number[] = [format.thousandSeparator.charCodeAt(0)];\n\n if (format.type === FormatType.Station && format.stationSeparator && format.stationSeparator.length === 1)\n skipCodes.push(format.stationSeparator.charCodeAt(0));\n\n if (format.type === FormatType.Fractional && format.hasFormatTraitSet(FormatTraits.FractionDash)) {\n fractionDashCode = QuantityConstants.CHAR_MINUS;\n }\n\n if (format.uomSeparator && format.uomSeparator !== \" \" && format.uomSeparator.length === 1) {\n uomSeparatorToIgnore = format.uomSeparator.charCodeAt(0);\n skipCodes.push(uomSeparatorToIgnore);\n }\n\n for (let i = 0; i < str.length; i++) {\n const charCode = str.charCodeAt(i);\n if (Parser.isDigitOrDecimalSeparator(charCode, format)) {\n if (!processingNumber) {\n if (wipToken.length > 0) {\n tokens.push(new ParseToken(wipToken));\n wipToken = \"\";\n }\n processingNumber = true;\n }\n // Decimal separators must be replaced with '.' before converting to a number - parseFloat() only supports '.' as the decimal separator.\n const charToAdd = charCode === format.decimalSeparator.charCodeAt(0) ? \".\" : str[i];\n wipToken = wipToken.concat(charToAdd);\n } else {\n if (processingNumber) {\n if (charCode === QuantityConstants.CHAR_SLASH || charCode === QuantityConstants.CHAR_FRACTION_SLASH || charCode === QuantityConstants.CHAR_DIVISION_SLASH) {\n const fractSymbol = Parser.checkForFractions(i + 1, str, uomSeparatorToIgnore, wipToken);\n let fraction = fractSymbol.fraction;\n i = fractSymbol.index;\n if (fractSymbol.fraction !== 0.0) {\n wipToken = \"\";\n if (signToken.length > 0) {\n if (signToken === \"-\")\n fraction = 0 - fraction;\n\n signToken = \"\";\n }\n\n tokens.push(new ParseToken(fraction));\n processingNumber = false;\n continue;\n }\n } else {\n // a space may signify end of number or start of decimal\n if (charCode === QuantityConstants.CHAR_SPACE || charCode === fractionDashCode) {\n const fractSymbol = Parser.checkForFractions(i + 1, str, uomSeparatorToIgnore);\n let fraction = fractSymbol.fraction;\n if (fractSymbol.fraction !== 0.0) {\n i = fractSymbol.index;\n if (signToken.length > 0) {\n wipToken = signToken + wipToken;\n if (signToken === \"-\")\n fraction = 0 - fraction;\n\n signToken = \"\";\n }\n\n const valueWithFraction = parseFloat(wipToken) + fraction;\n tokens.push(new ParseToken(valueWithFraction));\n processingNumber = false;\n wipToken = \"\";\n }\n else if (format.type === FormatType.Bearing && wipToken.length > 0) {\n if (signToken.length > 0) {\n wipToken = signToken + wipToken;\n signToken = \"\";\n }\n tokens.push(new ParseToken(parseFloat(wipToken))); // Create token for the current number\n processingNumber = false;\n wipToken = \"\";\n }\n continue;\n } else {\n // an \"E\" or \"e\" may signify scientific notation\n if (charCode === QuantityConstants.CHAR_UPPER_E || charCode === QuantityConstants.CHAR_LOWER_E) {\n const exponentSymbol = Parser.checkForScientificNotation(i, str, uomSeparatorToIgnore);\n i = exponentSymbol.index;\n\n if (exponentSymbol.exponent && exponentSymbol.exponent.length > 0) {\n if (signToken.length > 0) {\n wipToken = signToken + wipToken;\n signToken = \"\";\n }\n\n wipToken = `${wipToken}e${exponentSymbol.exponent}`;\n const scientificValue = Number(wipToken);\n tokens.push(new ParseToken(scientificValue));\n processingNumber = false;\n wipToken = \"\";\n continue;\n }\n }\n }\n }\n\n if (format.type === FormatType.Station && charCode === format.stationSeparator.charCodeAt(0)) {\n if (!isStationSeparatorAdded) {\n isStationSeparatorAdded = true;\n continue;\n }\n isStationSeparatorAdded = false;\n } else if (skipCodes.findIndex((ref) => ref === charCode) !== -1) {\n // ignore any codes in skipCodes\n continue;\n }\n\n if (signToken.length > 0) {\n wipToken = signToken + wipToken;\n signToken = \"\";\n }\n\n tokens.push(new ParseToken(parseFloat(wipToken)));\n\n wipToken = (i < str.length) ? str[i] : \"\";\n processingNumber = false;\n\n if (wipToken.length === 1 && isOperator(wipToken)) {\n tokens.push(new ParseToken(wipToken)); // Push operator token.\n wipToken = \"\";\n }\n } else {\n // not processing a number\n const isCharOperator = isOperator(charCode);\n const isSpacer = charCode === format.spacerOrDefault.charCodeAt(0) && charCode !== QuantityConstants.CHAR_SPACE;\n\n if (isSpacer && i > 0 && i < str.length - 1) {\n const prevCharCode = str.charCodeAt(i - 1);\n if (isCharOperator && prevCharCode !== QuantityConstants.CHAR_SPACE) {\n // ignore spacer if it's not at the start or end, not whitespace, and is not in front of a whitespace\n continue;\n }\n }\n\n if (wipToken.length === 0 && charCode === QuantityConstants.CHAR_SPACE) {\n // Don't add space when the wip token is empty.\n continue;\n }\n\n if (isCharOperator) {\n if (wipToken.length > 0) {\n // There is a token is progress, process it now, before adding the new operator token.\n tokens.push(new ParseToken(wipToken));\n wipToken = \"\";\n }\n tokens.push(new ParseToken(str[i])); // Push an Operator Token in the list.\n continue;\n }\n\n wipToken = wipToken.concat(str[i]);\n }\n }\n }\n\n // handle case where end of input string is reached.\n if (wipToken.length > 0) {\n if (processingNumber) {\n if (signToken.length > 0) {\n wipToken = signToken + wipToken;\n }\n if (isNaN(Number(wipToken))) {\n tokens.push(new ParseToken(NaN));\n } else {\n tokens.push(new ParseToken(parseFloat(wipToken)));\n }\n } else {\n tokens.push(new ParseToken(wipToken));\n }\n }\n return tokens;\n }\n\n private static isMathematicOperation(tokens: ParseToken[]) {\n if (tokens.length > 1) {\n // The loop starts at one because the first token can be a operator without it being maths. Ex: \"-5FT\"\n for (let i = 1; i < tokens.length; i++) {\n if (tokens[i].isOperator)\n // Operator found, it's a math operation.\n return true;\n }\n }\n return false;\n }\n\n private static async lookupUnitByLabel(unitLabel: string, format: Format, unitsProvider: UnitsProvider, altUnitLabelsProvider?: AlternateUnitLabelsProvider) {\n const defaultUnit = format.units && format.units.length > 0 ? format.units[0][0] : undefined;\n\n const labelToFind = unitLabel.toLowerCase();\n // First look in format for a label and matches\n if (format.units && format.units.length > 0) {\n const formatUnit = format.units.find(([unit, label]) => {\n if (label && label.toLowerCase() === labelToFind)\n return true;\n const alternateLabels = altUnitLabelsProvider?.getAlternateUnitLabels(unit);\n // check any alternate labels that may be defined for the Unit\n if (alternateLabels && alternateLabels.find((lbl) => lbl.toLowerCase() === labelToFind))\n return true;\n\n return false;\n });\n if (formatUnit)\n return formatUnit[0];\n }\n\n // now try to find a unit from the same family and system\n let foundUnit = await unitsProvider.findUnit(unitLabel, defaultUnit ? defaultUnit.phenomenon : undefined, defaultUnit ? defaultUnit.system : undefined);\n\n // if nothing found yet just limit to family\n if (!foundUnit.isValid && defaultUnit)\n foundUnit = await unitsProvider.findUnit(unitLabel, defaultUnit ? defaultUnit.phenomenon : undefined);\n return foundUnit;\n }\n\n /**\n * Get the output unit and all the conversion specs required to parse a given list of tokens.\n */\n private static async getRequiredUnitsConversionsToParseTokens(tokens: ParseToken[], format: Format, unitsProvider: UnitsProvider, altUnitLabelsProvider?: AlternateUnitLabelsProvider): Promise<{\n outUnit?: UnitProps;\n specs: UnitConversionSpec[];\n }> {\n let outUnit = (format.units && format.units.length > 0 ? format.units[0][0] : undefined);\n const unitConversions: UnitConversionSpec[] = [];\n const uniqueUnitLabels = [...new Set(tokens.filter((token) => token.isString).map((token) => token.value as string))];\n for (const label of uniqueUnitLabels) {\n const unitProps = await this.lookupUnitByLabel(label, format, unitsProvider, altUnitLabelsProvider);\n if (!outUnit) {\n // No default unit, assume that the first unit found is the desired output unit.\n outUnit = unitProps;\n }\n\n let spec = unitConversions.find((specB) => specB.name === unitProps.name);\n if (spec) {\n // Already in the list, just add the label.\n spec.parseLabels?.push(label.toLocaleLowerCase());\n } else {\n // Add new conversion to the list.\n const conversion = await unitsProvider.getConversion(unitProps, outUnit);\n if (conversion) {\n spec = {\n conversion,\n label: unitProps.label,\n system: unitProps.system,\n name: unitProps.name,\n parseLabels: [label.toLocaleLowerCase()],\n };\n unitConversions.push(spec);\n }\n }\n }\n\n return { outUnit, specs: unitConversions };\n }\n\n /**\n * Get the units information asynchronously, then convert the tokens into quantity using the synchronous tokens -> value.\n */\n private static async createQuantityFromParseTokens(tokens: ParseToken[], format: Format, unitsProvider: UnitsProvider, altUnitLabelsProvider?: AlternateUnitLabelsProvider): Promise<QuantityProps> {\n const unitConversionInfos = await this.getRequiredUnitsConversionsToParseTokens(tokens, format, unitsProvider, altUnitLabelsProvider);\n if (unitConversionInfos.outUnit) {\n const value = Parser.getQuantityValueFromParseTokens(tokens, format, unitConversionInfos.specs, await unitsProvider.getConversion(unitConversionInfos.outUnit, unitConversionInfos.outUnit));\n if (value.ok) {\n return new Quantity(unitConversionInfos.outUnit, value.value);\n }\n }\n\n return new Quantity();\n }\n\n /** Async method to generate a Quantity given a string that represents a quantity value and likely a unit label.\n * @param inString A string that contains text represent a quantity.\n * @param format Defines the likely format of inString.\n * @param unitsProvider required to look up units that may be specified in inString\n */\n public static async parseIntoQuantity(inString: string, format: Format, unitsProvider: UnitsProvider, altUnitLabelsProvider?: AlternateUnitLabelsProvider): Promise<QuantityProps> {\n const tokens: ParseToken[] = Parser.parseQuantitySpecification(inString, format);\n\n return Parser.createQuantityFromParseTokens(tokens, format, unitsProvider, altUnitLabelsProvider);\n }\n\n /** method to get the Unit Conversion given a unit label */\n private static tryFindUnitConversion(unitLabel: string, unitsConversions: UnitConversionSpec[], preferredUnit?: UnitProps): UnitConversionProps | undefined {\n if (unitsConversions.length > 0) {\n const label = unitLabel.toLocaleLowerCase();\n\n /* A preferred unit is used to target a unit if a unit label is used in more that one unit definition from the same unit family.\n * An example is if \"ft\" is used as the unitLabel and the preferredUnit is \"SURVEY_FT\" since that unit has an alternate label of \"ft\" the\n * conversion to \"SURVEY_FT\" is returned. If no preferredUnit is specified then the unit \"FT\" would likely to have been found first.\n * If \"in\" is the unit label and \"SURVEY_FT\" is the preferredUnit then conversion to \"SURVEY_IN\" would be returned.\n */\n if (preferredUnit) {\n // if there is a preferred unit defined see if unit label matched it or one of its alternates\n const preferredConversion = unitsConversions.find((conversion) => conversion.name === preferredUnit.name);\n if (preferredConversion && preferredConversion.parseLabels) {\n if (-1 !== preferredConversion.parseLabels.findIndex((lbl) => lbl === label))\n return preferredConversion.conversion;\n }\n // see if we can find a matching unitLabel in any unit within the same system as the preferred unit\n const preferredSystemConversions = unitsConversions.filter((conversion) => conversion.system === preferredUnit.system);\n for (const conversion of preferredSystemConversions) {\n if (conversion.parseLabels) {\n if (-1 !== conversion.parseLabels.findIndex((lbl) => lbl === label))\n return conversion.conversion;\n }\n }\n }\n\n // if no unit found based on preferredUnit see if an unit label matches\n for (const conversion of unitsConversions) {\n if (conversion.parseLabels) {\n if (-1 !== conversion.parseLabels.findIndex((lbl) => lbl === label))\n return conversion.conversion;\n } else {\n // eslint-disable-next-line no-console\n console.log(\"ERROR: Parser expects to find parseLabels array populate with all possible unit labels for the unit.\");\n }\n }\n }\n\n return undefined;\n }\n\n /**\n * Get what the unit conversion is for a unitless value.\n */\n private static getDefaultUnitConversion(tokens: ParseToken[], unitsConversions: UnitConversionSpec[], defaultUnit?: UnitProps) {\n let unitConversion = defaultUnit ? Parser.tryFindUnitConversion(defaultUnit.label, unitsConversions, defaultUnit) : undefined;\n if (!unitConversion) {\n // No default unit conversion, take the first valid unit.\n const uniqueUnitLabels = [...new Set(tokens.filter((token) => token.isString).map((token) => token.value as string))];\n for (const label of uniqueUnitLabels) {\n unitConversion = Parser.tryFindUnitConversion(label, unitsConversions, defaultUnit);\n if (unitConversion !== undefined)\n return unitConversion;\n }\n // if there were unique unit labels but not matched to any units, throw an error\n if (uniqueUnitLabels.length > 0) throw new QuantityError(QuantityStatus.UnitLabelSuppliedButNotMatched, `The unit label(s) ${uniqueUnitLabels.join(\", \")} could not be matched to a known unit.`);\n }\n return unitConversion;\n }\n\n // Get the next token pair to parse into a quantity.\n private static getNextTokenPair(index: number, tokens: ParseToken[]): ParseToken[] | undefined {\n if (index >= tokens.length)\n return;\n\n // 6 possible combination of token pair.\n // Stringified to ease comparison later.\n const validCombinations = [\n JSON.stringify([\"string\"]), // ['FT']\n JSON.stringify([\"string\", \"number\"]), // ['$', 5] unit specification comes before value (like currency)\n JSON.stringify([\"number\"]), // [5]\n JSON.stringify([\"number\", \"string\"]), // [5, 'FT']\n JSON.stringify([\"operator\", \"number\"]), // ['-', 5]\n JSON.stringify([\"operator\", \"number\", \"string\"]), // ['-', 5, 'FT']\n ];\n\n // Push up to 3 tokens in the list, if the length allows it.\n const maxNbrTokensInThePair = Math.min(tokens.length - index, 3);\n const tokenPair = tokens.slice(index, index + maxNbrTokensInThePair);\n const currentCombination = tokenPair.map((token) => token.isOperator ? \"operator\" : (token.isNumber ? \"number\" : \"string\"));\n\n // Check if the token pair is valid. If not, try again by removing the last token util empty.\n // Ex: ['5', 'FT', '7'] invalid => ['5', 'FT'] valid returned\n for (let i = currentCombination.length - 1; i >= 0; i--) {\n if (validCombinations.includes(JSON.stringify(currentCombination))) {\n break;\n } else {\n currentCombination.pop();\n tokenPair.pop();\n }\n }\n\n return tokenPair.length > 0 ? tokenPair : undefined;\n }\n\n /**\n * Accumulate the given list of tokens into a single quantity value. Formatting the tokens along the way.\n */\n private static getQuantityValueFromParseTokens(tokens: ParseToken[], format: Format, unitsConversions: UnitConversionSpec[], defaultUnitConversion?: UnitConversionProps): QuantityParseResult {\n if (tokens.length === 0)\n return { ok: false, error: ParseError.UnableToGenerateParseTokens };\n\n if (!format.allowMathematicOperations && Parser.isMathematicOperation(tokens))\n return { ok: false, error: ParseError.MathematicOperationFoundButIsNotAllowed };\n\n if (\n tokens.some((token) => token.isNumber && isNaN(token.value as number)) ||\n tokens.every((token) => token.isSpecialCharacter)\n ) {\n return { ok: false, error: ParseError.UnableToConvertParseTokensToQuantity };\n }\n\n const defaultUnit = format.units && format.units.length > 0 ? format.units[0][0] : undefined;\n try {\n defaultUnitConversion = defaultUnitConversion ? defaultUnitConversion : Parser.getDefaultUnitConversion(tokens, unitsConversions, defaultUnit);\n } catch (e) {\n // If we failed to get the default unit conversion, we need to return an error.\n if (e instanceof QuantityError && e.errorNumber === QuantityStatus.UnitLabelSuppliedButNotMatched)\n return { ok: false, error: ParseError.UnitLabelSuppliedButNotMatched };\n }\n\n if (format.type === FormatType.Bearing && format.units !== undefined && format.units.length > 0) {\n const units = format.units;\n const desiredNumberOfTokens = units.length;\n if (tokens.length < desiredNumberOfTokens && tokens[0].isNumber && desiredNumberOfTokens <= 3) {\n // handle the special XX.YYZZ format which is common for bearings. It uses no separators, so we need to split based on numeric indexes. We support up to 3 units\n const value: number = tokens[0].value as number;\n const firstToken = Math.floor(value);\n tokens.pop();\n tokens.push(new ParseToken(firstToken)); // Add the first token back to the list.\n if (desiredNumberOfTokens >= 2) {\n const remaining = (value - firstToken) * 100;\n const secondToken = Math.floor(remaining);\n tokens.push(new ParseToken(secondToken));\n if (desiredNumberOfTokens === 3) {\n const thirdToken = (remaining - secondToken) * 100;\n tokens.push(new ParseToken(thirdToken));\n }\n }\n }\n }\n\n let tokenPair: ParseToken[] | undefined;\n let increment: number = 1;\n let mag = 0.0;\n // The sign is saved outside from the loop for cases like this. '-1m 50cm 10mm + 2m 30cm 40mm' => -1.51m + 2.34m\n let sign: 1 | -1 = 1;\n let compositeUnitIndex = 0;\n\n for (let i = 0; i < tokens.length; i = i + increment) {\n tokenPair = this.getNextTokenPair(i, tokens);\n if (!tokenPair || tokenPair.length === 0) {\n return { ok: false, error: ParseError.UnableToConvertParseTokensToQuantity };\n }\n increment = tokenPair.length;\n\n // Keep the sign so its applied to the next tokens.\n if (tokenPair[0].isOperator) {\n sign = tokenPair[0].value === Operator.addition ? 1 : -1;\n tokenPair.shift();\n compositeUnitIndex = 0; // Reset the composite unit index, the following tokens begin from start.\n }\n\n // unit specification comes before value (like currency)\n if (tokenPair.length === 2 && tokenPair[0].isString) {\n // Invert it so the currency sign comes second.\n tokenPair = [tokenPair[1], tokenPair[0]];\n }\n\n if (tokenPair[0].isNumber) {\n let value = sign * (tokenPair[0].value as number);\n let conversion: UnitConversionProps | undefined;\n if (tokenPair.length === 2 && tokenPair[1].isString) {\n conversion = Parser.tryFindUnitConversion(tokenPair[1].value as string, unitsConversions, defaultUnit);\n }\n if (!conversion) {\n if (compositeUnitIndex > 0 && format.units && format.units.length > compositeUnitIndex) {\n // if this is not the first token, and we have a composite spec, look up the unit from the current index\n const presUnitAtIndex = format.units[compositeUnitIndex][0];\n conversion = Parser.tryFindUnitConversion(presUnitAtIndex.label, unitsConversions, presUnitAtIndex);\n } else if (defaultUnitConversion) {\n conversion = defaultUnitConversion;\n }\n }\n if (conversion) {\n value = applyConversion(value, conversion);\n }\n mag = mag + value;\n compositeUnitIndex++;\n } else {\n // only the unit label was specified so assume magnitude of 0\n const conversion = Parser.tryFindUnitConversion(tokenPair[0].value as string, unitsConversions, defaultUnit);\n if (conversion === undefined) {\n // Unknown unit label\n return { ok: false, error: ParseError.NoValueOrUnitFoundInString };\n }\n }\n }\n\n return { ok: true, value: mag };\n }\n\n /** Method to generate a Quantity given a string that represents a quantity value.\n * @param inString A string that contains text represent a quantity.\n * @param parserSpec unit label if not explicitly defined by user. Must have matching entry in supplied array of unitsConversions.\n */\n public static parseQuantityString(inString: string, parserSpec: ParserSpec): QuantityParseResult {\n // ensure any labels defined in composite unit definition are specified in unitConversions\n if (parserSpec.format.units) {\n parserSpec.format.units.forEach(([unit, label]) => {\n if (label) {\n if (unit.label !== label) { // if default unit label does not match composite label ensure the label is in the list of parse labels for the conversion\n const unitConversion = parserSpec.unitConversions.find((conversion) => conversion.name === unit.name);\n if (unitConversion && unitConversion.parseLabels && !unitConversion.parseLabels.find((entry) => entry === label))\n unitConversion.parseLabels.push(label);\n }\n }\n });\n }\n\n if (parserSpec.format.type === FormatType.Bearing) {\n return this.parseBearingFormat(inString, parserSpec);\n }\n if (parserSpec.format.type === FormatType.Azimuth) {\n return this.parseAzimuthFormat(inString, parserSpec);\n }\n\n if (parserSpec.format.type === FormatType.Ratio) {\n return this.parseRatioFormat(inString, parserSpec);\n }\n\n return this.parseAndProcessTokens(inString, parserSpec.format, parserSpec.unitConversions);\n }\n\n /** Method to generate a Quantity given a string that represents a quantity value and likely a unit label.\n * @param inString A string that contains text represent a quantity.\n * @param format Defines the likely format of inString. Primary unit serves as a default unit if no unit label found in string.\n * @param unitsConversions dictionary of conversions used to convert from unit used in inString to output quantity\n * @deprecated in 4.10 - will not be removed until after 2026-06-13. Check [[Parser.parseQuantityString]] for replacements.\n */\n public static parseToQuantityValue(inString: string, format: Format, unitsConversions: UnitConversionSpec[]): QuantityParseResult {\n // TODO: This method is not able to do bearing and azimuth formatting and is overlapping with parseQuantityString.\n // We should consider deprecating and removing it, there do not seem to be any upstream callers at this moment\n\n // ensure any labels defined in composite unit definition are specified in unitConversions\n if (format.units) {\n format.units.forEach(([unit, label]) => {\n if (label) {\n if (unit.label !== label) { // if default unit label does not match composite label ensure the label is in the list of parse labels for the conversion\n const unitConversion = unitsConversions.find((conversion) => conversion.name === unit.name);\n if (unitConversion && unitConversion.parseLabels && !unitConversion.parseLabels.find((entry) => entry === label))\n unitConversion.parseLabels.push(label);\n }\n }\n });\n }\n\n if (format.type === FormatType.Bearing || format.type === FormatType.Azimuth || format.type === FormatType.Ratio) {\n // throw error indicating to call parseQuantityString instead\n throw new QuantityError(QuantityStatus.UnsupportedUnit, `Bearing, Azimuth or Ratio format must be parsed using a ParserSpec. Call parseQuantityString instead.`);\n }\n\n return this.parseAndProcessTokens(inString, format, unitsConversions);\n }\n\n /** The value of special direction is always in degrees, try to find the unit conversion for that. */\n private static processSpecialBearingDirection(mag: number, spec: ParserSpec): QuantityParseResult {\n const specialDirUnit = spec.unitConversions.find((unitConversion) => unitConversion.name === \"Units.ARC_DEG\");\n if (!specialDirUnit)\n return { ok: false, error: ParseError.UnknownUnit };\n const preferredUnit = spec.outUnit;\n const conversion = this.tryFindUnitConversion(specialDirUnit.label, spec.unitConversions, preferredUnit);\n if (!conversion) return { ok: true, value: mag };\n return { ok: true, value: applyConversion(mag, conversion) };\n }\n\n private static parseBearingFormat(inString: string, spec: ParserSpec): QuantityParseResult {\n const specialDirections: Record<string, number> = {\n n: 0,\n ne: 45,\n e: 90,\n se: 135,\n s: 180,\n sw: 225,\n w: 270,\n nw: 315,\n };\n\n // TODO: at some point we will want to open this for localization, in the first release it's going to be hard coded\n enum DirectionLabel {\n North = \"N\",\n South = \"S\",\n East = \"E\",\n West = \"W\"\n }\n let matchedPrefix: DirectionLabel | null = null;\n let matchedSuffix: DirectionLabel | null = null;\n\n // check if input string begins with northLabel or southLabel and strip it off\n if (inString.toUpperCase().startsWith(DirectionLabel.North)) {\n inString = inString.substring(DirectionLabel.North.length);\n matchedPrefix = DirectionLabel.North;\n } else if (inString.toUpperCase().startsWith(DirectionLabel.South)) {\n inString = inString.substring(DirectionLabel.South.length);\n matchedPrefix = DirectionLabel.South;\n }\n\n // check if input string ends with eastLabel or westLabel (case-insensitive) and strip it off\n if (inString.toUpperCase().endsWith(DirectionLabel.East)) {\n inString = inString.substring(0, inString.length - DirectionLabel.East.length);\n matchedSuffix = DirectionLabel.East;\n } else if (inString.toUpperCase().endsWith(DirectionLabel.West)) {\n inString = inString.substring(0, inString.length - DirectionLabel.West.length);\n matchedSuffix = DirectionLabel.West;\n }\n\n // check if the remaining string is a special direction\n if (inString.trim() === \"\") {\n const prefix = matchedPrefix?.toLowerCase() || \"\";\n const suffix = matchedSuffix?.toLowerCase() || \"\";\n const specialDirection = specialDirections[`${prefix}${suffix}`];\n if (specialDirection !== undefined)\n return this.processSpecialBearingDirection(specialDirection, spec);\n }\n\n if (matchedPrefix === null || matchedSuffix === null) {\n return { ok: false, error: ParseError.BearingPrefixOrSuffixMissing };\n }\n\n const parsedResult = this.parseAndProcessTokens(inString, spec.format, spec.unitConversions);\n if (this.isParseError(parsedResult)) {\n return parsedResult;\n }\n const revolution = this.getRevolution(spec);\n const quarterRevolution = revolution / 4;\n\n let magnitude = parsedResult.value;\n if (magnitude < -quarterRevolution || magnitude > quarterRevolution) {\n return { ok: false, error: ParseError.BearingAngleOutOfRange };\n }\n\n // we have to turn the value into an east base and counter clockwise (NW and SE are already counter clockwise)\n if (matchedPrefix === DirectionLabel.North) {\n if (matchedSuffix === DirectionLabel.West) {\n magnitude = revolution - magnitude;\n }\n } else if (matchedPrefix === DirectionLabel.South) {\n if (matchedSuffix === DirectionLabel.West) {\n magnitude = (2 * quarterRevolution) + magnitude;\n } else if (matchedSuffix === DirectionLabel.East) {\n magnitude = (2 * quarterRevolution) - magnitude;\n }\n }\n magnitude = this.normalizeAngle(magnitude, revolution);\n\n return { ok: true, value: magnitude };\n }\n\n private static parseAzimuthFormat(inString: string, spec: ParserSpec): QuantityParseResult {\n const parsedResult = this.parseAndProcessTokens(inString, spec.format, spec.unitConversions);\n if (this.isParseError(parsedResult)) {\n return parsedResult;\n }\n\n let magnitude = parsedResult.value;\n\n const revolution = this.getRevolution(spec);\n magnitude = this.normalizeAngle(magnitude, revolution);\n let azimuthBase = 0.0;\n if (spec.format.azimuthBase !== undefined) {\n if (spec.azimuthBaseConversion === undefined) {\n throw new QuantityError(QuantityStatus.MissingRequiredProperty, `Missing azimuth base conversion for interpreting ${spec.format.name}'s azimuth base.`);\n }\n const azBaseQuantity: Quantity = new Quantity(spec.format.azimuthBaseUnit, spec.format.azimuthBase);\n const azBaseConverted = azBaseQuantity.convertTo(spec.outUnit, spec.azimuthBaseConversion);\n if (azBaseConverted === undefined || !azBaseConverted.isValid) {\n throw new QuantityError(QuantityStatus.UnsupportedUnit, `Failed to convert azimuth base unit to ${spec.outUnit.name}.`);\n }\n azimuthBase = this.normalizeAngle(azBaseConverted.magnitude, revolution);\n }\n const inputIsClockwise = spec.format.azimuthClockwiseOrDefault;\n\n if (inputIsClockwise && azimuthBase === 0) {\n // parsed result already has the same base and orientation as our desired output\n return parsedResult;\n }\n\n if (inputIsClockwise)\n magnitude = azimuthBase + magnitude;\n else\n magnitude = azimuthBase - magnitude;\n\n magnitude = this.normalizeAngle(magnitude, revolution);\n\n return { ok: true, value: magnitude };\n }\n\n private static parseRatioFormat(inString: string, spec: ParserSpec): QuantityParseResult {\n if (!inString)\n return { ok: false, error: ParseError.NoValueOrUnitFoundInString };\n\n const parts = inString.split(\":\");\n if (parts.length > 2)\n return { ok: false, error: ParseError.UnableToConvertParseTokensToQuantity };\n\n const numerator = parseFloat(parts[0]);\n let denominator;\n if (parts.length === 1) {\n denominator = 1.0;\n } else {\n denominator = parseFloat(parts[1]);\n }\n\n if (isNaN(numerator) || isNaN(denominator))\n return { ok: false, error: ParseError.NoValueOrUnitFoundInString };\n\n const defaultUnit = spec.format.units && spec.format.units.length > 0 ? spec.format.units[0][0] : undefined;\n const unitConversion = defaultUnit ? Parser.tryFindUnitConversion(defaultUnit.label, spec.unitConversions, defaultUnit) : undefined;\n\n if (!unitConversion) {\n throw new QuantityError(QuantityStatus.MissingRequiredProperty, `Missing input unit or unit conversion for interpreting ${spec.format.name}.`);\n }\n\n if (denominator === 0) {\n if (unitConversion.inversion && numerator === 1)\n return { ok: true, value: 0.0 };\n else\n return { ok: false, error: ParseError.MathematicOperationFoundButIsNotAllowed };\n }\n\n let quantity: Quantity;\n if (spec.format.units && spec.outUnit) {\n quantity = new Quantity(spec.format.units[0][0], numerator / denominator);\n } else {\n throw new QuantityError(QuantityStatus.MissingRequiredProperty, \"Missing presentation unit or persistence unit for ratio format.\");\n }\n\n let converted: Quantity | undefined;\n try {\n converted = quantity.convertTo(spec.outUnit, unitConversion);\n } catch (err) {\n // for input of \"0:N\" with reversed unit\n if (err instanceof QuantityError && err.errorNumber === QuantityStatus.InvertingZero) {\n return { ok: false, error: ParseError.MathematicOperationFoundButIsNotAllowed };\n }\n }\n\n if (converted === undefined || !converted.isValid) {\n throw new QuantityError(QuantityStatus.UnsupportedUnit, `Failed to convert from ${spec.format.units[0][0].name} to ${spec.outUnit.name} On format ${spec.format.name}.`);\n }\n\n return { ok: true, value: converted.magnitude };\n }\n\n // TODO: The following two methods are redundant with Formatter. We should consider consolidating them.\n private static normalizeAngle(magnitude: number, revolution: number): number {\n magnitude = magnitude % revolution; // Strip anything that goes around more than once\n\n if (magnitude < 0) // If the value is negative, we want to normalize it to a positive angle\n magnitude += revolution;\n\n return magnitude;\n }\n\n private static getRevolution(spec: ParserSpec): number {\n if (spec.revolutionConversion === undefined) {\n throw new QuantityError(QuantityStatus.MissingRequiredProperty, `Missing revolution unit conversion for calculating ${spec.format.name}'s revolution.`);\n }\n\n const revolution: Quantity = new Quantity(spec.format.revolutionUnit, 1.0);\n const converted = revolution.convertTo(spec.outUnit, spec.revolutionConversion);\n if (converted === undefined || !converted.isValid) {\n throw new QuantityError(QuantityStatus.UnsupportedUnit, `Failed to convert revolution unit to ${spec.outUnit.name} On format ${spec.format.name}.`);\n }\n\n return converted.magnitude;\n }\n\n private static parseAndProcessTokens(inString: string, format: Format, unitsConversions: UnitConversionSpec[]): QuantityParseResult {\n const tokens: ParseToken[] = Parser.parseQuantitySpecification(inString, format);\n if (Parser._log) {\n // eslint-disable-next-line no-console\n console.log(`Parse tokens`);\n let i = 0;\n for (const token of tokens) {\n // eslint-disable-next-line no-console\n console.log(` [${i++}] isNumber=${token.isNumber} isString=${token.isString} token=${token.value}`);\n }\n }\n\n return Parser.getQuantityValueFromParseTokens(tokens, format, unitsConversions);\n }\n\n /** Async Method used to create an array of UnitConversionSpec entries that can be used in synchronous calls to parse units. */\n public static async createUnitConversionSpecsForUnit(unitsProvider: UnitsProvider, outUnit: UnitProps, altUnitLabelsProvider?: AlternateUnitLabelsProvider): Promise<UnitConversionSpec[]> {\n const unitConversionSpecs: UnitConversionSpec[] = [];\n\n const familyUnits = await unitsProvider.getUnitsByFamily(outUnit.phenomenon);\n for (const unit of familyUnits) {\n const conversion = await unitsProvider.getConversion(unit, outUnit);\n const parseLabels: string[] = [unit.label.toLocaleLowerCase()];\n const alternateLabels = altUnitLabelsProvider?.getAlternateUnitLabels(unit);\n // add any alternate labels that may be defined for the Unit\n if (alternateLabels) {\n alternateLabels.forEach((label: string) => {\n const potentialLabel = label.toLocaleLowerCase();\n if (-1 === parseLabels.findIndex((lbl) => lbl === potentialLabel))\n parseLabels.push(label.toLocaleLowerCase());\n });\n }\n\n unitConversionSpecs.push({\n name: unit.name,\n label: unit.label,\n conversion,\n parseLabels,\n system: unit.system,\n });\n }\n return unitConversionSpecs;\n }\n\n /** Async Method used to create an array of UnitConversionSpec entries that can be used in synchronous calls to parse units. */\n public static async createUnitConversionSpecs(unitsProvider: UnitsProvider, outUnitName: string, potentialParseUnits: PotentialParseUnit[], altUnitLabelsProvider?: AlternateUnitLabelsProvider): Promise<UnitConversionSpec[]> {\n const unitConversionSpecs: UnitConversionSpec[] = [];\n\n const outUnit = await unitsProvider.findUnitByName(outUnitName);\n if (!outUnit || !outUnit.name || 0 === outUnit.name.length) {\n // eslint-disable-next-line no-console\n console.log(`[Parser.createUnitConversionSpecs] ERROR: Unable to locate out unit ${outUnitName}.`);\n return unitConversionSpecs;\n }\n\n for (const potentialParseUnit of potentialParseUnits) {\n const unit = await unitsProvider.findUnitByName(potentialParseUnit.unitName);\n if (!unit || !unit.name || 0 === unit.name.length) {\n // eslint-disable-next-line no-console\n console.log(`[Parser.createUnitConversionSpecs] ERROR: Unable to locate potential unit ${potentialParseUnit.unitName}.`);\n continue;\n }\n\n const conversion = await unitsProvider.getConversion(unit, outUnit);\n const parseLabels: string[] = [unit.label.toLocaleLowerCase()];\n const alternateLabels = altUnitLabelsProvider?.getAlternateUnitLabels(unit);\n // add any alternate labels that may be defined for the Unit\n if (alternateLabels) {\n alternateLabels.forEach((label: string) => {\n const potentialLabel = label.toLocaleLowerCase();\n if (-1 === parseLabels.findIndex((lbl) => lbl === potentialLabel))\n parseLabels.push(label.toLocaleLowerCase());\n });\n }\n\n // add any alternate labels that where provided by caller\n if (potentialParseUnit.altLabels) {\n potentialParseUnit.altLabels.forEach((label: string) => {\n const potentialLabel = label.toLocaleLowerCase();\n if (-1 === parseLabels.findIndex((lbl) => lbl === potentialLabel))\n parseLabels.push(label.toLocaleLowerCase());\n });\n }\n unitConversionSpecs.push({\n name: unit.name,\n label: unit.label,\n conversion,\n parseLabels,\n system: unit.system,\n });\n }\n return unitConversionSpecs;\n }\n}\n"]}
|
package/lib/esm/Parser.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Parser.d.ts","sourceRoot":"","sources":["../../src/Parser.ts"],"names":[],"mappings":"AAIA;;GAEG;AAIH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,OAAO,EAAE,2BAA2B,EAAE,kBAAkB,EAAE,aAAa,EAAuB,kBAAkB,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AACjK,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG1C;;GAEG;AACH,oBAAY,UAAU;IACpB,2BAA2B,IAAI;IAC/B,0BAA0B,IAAA;IAC1B,8BAA8B,IAAA;IAC9B,WAAW,IAAA;IACX,oCAAoC,IAAA;IACpC,iBAAiB,IAAA;IACjB,4BAA4B,IAAA;IAC5B,uCAAuC,IAAA;IACvC,sBAAsB,IAAA;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,uDAAuD;IACvD,EAAE,EAAE,KAAK,CAAC;IACV,uDAAuD;IACvD,KAAK,EAAE,UAAU,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,uDAAuD;IACvD,EAAE,EAAE,IAAI,CAAC;IACT,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC;CACf;AAED,aAAK,QAAQ;IACX,QAAQ,MAAM;IACd,WAAW,MAAM;IACjB,cAAc,MAAM,CAAE,iDAAiD;IACvE,QAAQ,MAAM;CACf;AAUD;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAAG,cAAc,GAAG,kBAAkB,CAAC;AAEtE;;GAEG;AACH,cAAM,UAAU;IACP,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;IAClC,UAAU,EAAE,OAAO,CAAS;gBAEvB,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ;IAS7C,IAAW,QAAQ,IAAI,OAAO,CAA+D;IAC7F,IAAW,QAAQ,IAAI,OAAO,CAA2C;IACzE,IAAW,kBAAkB,IAAI,OAAO,CAGvC;CACF;AA+BD;;GAEG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAC,IAAI,CAAS;WAEd,gBAAgB,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI,IAAI,cAAc;WAInE,YAAY,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI,IAAI,kBAAkB;IAIjF,OAAO,CAAC,MAAM,CAAC,0BAA0B;IAoBzC,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAyChC,OAAO,CAAC,MAAM,CAAC,OAAO;IAItB,OAAO,CAAC,MAAM,CAAC,yBAAyB;IAIxC;;OAEG;WACW,0BAA0B,CAAC,qBAAqB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,EAAE;IAyLrG,OAAO,CAAC,MAAM,CAAC,qBAAqB;mBAYf,iBAAiB;IA6BtC;;OAEG;mBACkB,wCAAwC;IAqC7D;;OAEG;mBACkB,6BAA6B;IAYlD;;;;OAIG;WACiB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,qBAAqB,CAAC,EAAE,2BAA2B,GAAG,OAAO,CAAC,aAAa,CAAC;IAMlL,2DAA2D;IAC3D,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAyCpC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,wBAAwB;
|
|
1
|
+
{"version":3,"file":"Parser.d.ts","sourceRoot":"","sources":["../../src/Parser.ts"],"names":[],"mappings":"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"}
|
package/lib/esm/Parser.js
CHANGED
|
@@ -475,6 +475,9 @@ export class Parser {
|
|
|
475
475
|
if (unitConversion !== undefined)
|
|
476
476
|
return unitConversion;
|
|
477
477
|
}
|
|
478
|
+
// if there were unique unit labels but not matched to any units, throw an error
|
|
479
|
+
if (uniqueUnitLabels.length > 0)
|
|
480
|
+
throw new QuantityError(QuantityStatus.UnitLabelSuppliedButNotMatched, `The unit label(s) ${uniqueUnitLabels.join(", ")} could not be matched to a known unit.`);
|
|
478
481
|
}
|
|
479
482
|
return unitConversion;
|
|
480
483
|
}
|
|
@@ -522,7 +525,14 @@ export class Parser {
|
|
|
522
525
|
return { ok: false, error: ParseError.UnableToConvertParseTokensToQuantity };
|
|
523
526
|
}
|
|
524
527
|
const defaultUnit = format.units && format.units.length > 0 ? format.units[0][0] : undefined;
|
|
525
|
-
|
|
528
|
+
try {
|
|
529
|
+
defaultUnitConversion = defaultUnitConversion ? defaultUnitConversion : Parser.getDefaultUnitConversion(tokens, unitsConversions, defaultUnit);
|
|
530
|
+
}
|
|
531
|
+
catch (e) {
|
|
532
|
+
// If we failed to get the default unit conversion, we need to return an error.
|
|
533
|
+
if (e instanceof QuantityError && e.errorNumber === QuantityStatus.UnitLabelSuppliedButNotMatched)
|
|
534
|
+
return { ok: false, error: ParseError.UnitLabelSuppliedButNotMatched };
|
|
535
|
+
}
|
|
526
536
|
if (format.type === FormatType.Bearing && format.units !== undefined && format.units.length > 0) {
|
|
527
537
|
const units = format.units;
|
|
528
538
|
const desiredNumberOfTokens = units.length;
|
package/lib/esm/Parser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Parser.js","sourceRoot":"","sources":["../../src/Parser.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Quantity\n */\n\nimport { QuantityConstants } from \"./Constants\";\nimport { QuantityError, QuantityStatus } from \"./Exception\";\nimport { Format } from \"./Formatter/Format\";\nimport { FormatTraits, FormatType } from \"./Formatter/FormatEnums\";\nimport { AlternateUnitLabelsProvider, PotentialParseUnit, QuantityProps, UnitConversionProps, UnitConversionSpec, UnitProps, UnitsProvider } from \"./Interfaces\";\nimport { ParserSpec } from \"./ParserSpec\";\nimport { applyConversion, Quantity } from \"./Quantity\";\n\n/** Possible parser errors\n * @beta\n */\nexport enum ParseError {\n UnableToGenerateParseTokens = 1,\n NoValueOrUnitFoundInString,\n UnitLabelSuppliedButNotMatched,\n UnknownUnit,\n UnableToConvertParseTokensToQuantity,\n InvalidParserSpec,\n BearingPrefixOrSuffixMissing,\n MathematicOperationFoundButIsNotAllowed,\n BearingAngleOutOfRange,\n}\n\n/** Parse error result from [[Parser.parseToQuantityValue]] or [[Parser.parseToQuantityValue]].\n * @beta\n */\nexport interface ParseQuantityError {\n /** Union discriminator for [[QuantityParseResult]]. */\n ok: false;\n /** The specific error that occurred during parsing. */\n error: ParseError;\n}\n\n/** Successful result from [[Parser.parseToQuantityValue]] or [[Parser.parseToQuantityValue]].\n * @beta\n */\nexport interface ParsedQuantity {\n /** Union discriminator for [[QuantityParseResult]]. */\n ok: true;\n /** The magnitude of the parsed quantity. */\n value: number;\n}\n\nenum Operator {\n addition = \"+\",\n subtraction = \"-\",\n multiplication = \"*\", // unsupported but we recognize it during parsing\n division = \"/\" // unsupported but we recognize it during parsing\n}\n\nfunction isOperator(char: number | string): boolean {\n if (typeof char === \"number\") {\n // Convert the CharCode to string.\n char = String.fromCharCode(char);\n }\n return Object.values(Operator).includes(char as Operator);\n}\n\n/**\n * Defines Results of parsing a string input by a user into its desired value type\n * @beta\n */\nexport type QuantityParseResult = ParsedQuantity | ParseQuantityError;\n\n/** A ParseToken holds either a numeric or string token extracted from a string that represents a quantity value.\n * @beta\n */\nclass ParseToken {\n public value: number | string | Operator;\n public isOperator: boolean = false;\n\n constructor(value: string | number | Operator) {\n if (typeof value === \"string\") {\n this.value = value.trim();\n this.isOperator = isOperator(this.value);\n } else {\n this.value = value;\n }\n }\n\n public get isString(): boolean { return !this.isOperator && typeof this.value === \"string\"; }\n public get isNumber(): boolean { return typeof this.value === \"number\"; }\n public get isSpecialCharacter(): boolean {\n const format = /^[!@#$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>\\/?]+$/;\n return this.isString && this.value.toString().match(format) !== null;\n }\n}\n\n/** A ScientificToken holds an index and string representing the exponent.\n * @beta\n */\nclass ScientificToken {\n public index: number;\n public exponent = \"\";\n\n constructor(index: number, exponent?: string) {\n this.index = index;\n if (exponent)\n this.exponent = exponent;\n }\n}\n\n/** A FractionToken holds an index and the fraction value of numerator / denominator.\n * @beta\n */\nclass FractionToken {\n public index: number;\n public fraction = 0.0;\n public exponent = \"\";\n\n constructor(index: number, fraction?: number) {\n this.index = index;\n if (fraction)\n this.fraction = fraction;\n }\n}\n\n/** A Parser class that is used to break a string that represents a quantity value into tokens.\n * @beta\n */\nexport class Parser {\n private static _log = false;\n\n public static isParsedQuantity(item: QuantityParseResult): item is ParsedQuantity {\n return item.ok;\n }\n\n public static isParseError(item: QuantityParseResult): item is ParseQuantityError {\n return !item.ok;\n }\n\n private static checkForScientificNotation(index: number, stringToParse: string, uomSeparatorToIgnore: number): ScientificToken {\n let exponentString = \"\";\n let i = index + 1;\n\n for (; i < stringToParse.length; i++) {\n const charCode = stringToParse.charCodeAt(i);\n if (Parser.isDigit(charCode) || ((charCode === QuantityConstants.CHAR_MINUS || charCode === QuantityConstants.CHAR_PLUS) && (i === (index + 1)))) {\n exponentString = exponentString.concat(stringToParse[i]);\n } else {\n i = uomSeparatorToIgnore === charCode ? i : i - 1;\n break;\n }\n }\n\n if (exponentString.length > 1 || ((exponentString.length === 1) && (exponentString.charCodeAt(0) !== QuantityConstants.CHAR_MINUS) && (exponentString.charCodeAt(0) !== QuantityConstants.CHAR_PLUS)))\n return new ScientificToken(i, exponentString);\n\n return new ScientificToken(index);\n }\n\n private static checkForFractions(index: number, stringToParse: string, uomSeparatorToIgnore: number, numeratorStr?: string): FractionToken {\n let numeratorToken = \"\";\n let denominatorToken = \"\";\n let processingNumerator = true;\n let i = index;\n if (numeratorStr && numeratorStr.length > 0) {\n numeratorToken = numeratorStr;\n processingNumerator = false;\n }\n\n for (; i < stringToParse.length; i++) {\n const charCode = stringToParse.charCodeAt(i);\n if (Parser.isDigit(charCode)) {\n if (processingNumerator) {\n numeratorToken = numeratorToken.concat(stringToParse[i]);\n } else {\n denominatorToken = denominatorToken.concat(stringToParse[i]);\n }\n } else {\n if (processingNumerator && (charCode === QuantityConstants.CHAR_SLASH || charCode === QuantityConstants.CHAR_DIVISION_SLASH || charCode === QuantityConstants.CHAR_DIVISION_SLASH)) {\n processingNumerator = false;\n } else {\n if (uomSeparatorToIgnore !== charCode)\n i = i - 1; // skip over uom separator after fraction\n\n break;\n }\n }\n }\n\n if (numeratorToken.length > 0 && denominatorToken.length > 0) {\n const numerator = parseInt(numeratorToken, 10);\n const denominator = parseInt(denominatorToken, 10);\n if (denominator > 0)\n return new FractionToken(i, numerator / denominator);\n return new FractionToken(i);\n }\n\n return new FractionToken(index + 1);\n }\n\n private static isDigit(charCode: number): boolean {\n return (charCode >= QuantityConstants.CHAR_DIGIT_ZERO) && (charCode <= QuantityConstants.CHAR_DIGIT_NINE);\n }\n\n private static isDigitOrDecimalSeparator(charCode: number, format: Format): boolean {\n return (charCode === format.decimalSeparator.charCodeAt(0)) || Parser.isDigit(charCode);\n }\n\n /** Parse the quantity string and return and array of ParseTokens that represent the component invariant values and unit labels.\n * @param quantitySpecification The quantity string to ba parsed.\n */\n public static parseQuantitySpecification(quantitySpecification: string, format: Format): ParseToken[] {\n const tokens: ParseToken[] = [];\n const str = quantitySpecification.trim();\n let processingNumber = false;\n let wipToken = \"\";\n let signToken = \"\";\n let isStationSeparatorAdded = false;\n let uomSeparatorToIgnore = 0;\n let fractionDashCode = 0;\n\n const skipCodes: number[] = [format.thousandSeparator.charCodeAt(0)];\n\n if (format.type === FormatType.Station && format.stationSeparator && format.stationSeparator.length === 1)\n skipCodes.push(format.stationSeparator.charCodeAt(0));\n\n if (format.type === FormatType.Fractional && format.hasFormatTraitSet(FormatTraits.FractionDash)) {\n fractionDashCode = QuantityConstants.CHAR_MINUS;\n }\n\n if (format.uomSeparator && format.uomSeparator !== \" \" && format.uomSeparator.length === 1) {\n uomSeparatorToIgnore = format.uomSeparator.charCodeAt(0);\n skipCodes.push(uomSeparatorToIgnore);\n }\n\n for (let i = 0; i < str.length; i++) {\n const charCode = str.charCodeAt(i);\n if (Parser.isDigitOrDecimalSeparator(charCode, format)) {\n if (!processingNumber) {\n if (wipToken.length > 0) {\n tokens.push(new ParseToken(wipToken));\n wipToken = \"\";\n }\n processingNumber = true;\n }\n // Decimal separators must be replaced with '.' before converting to a number - parseFloat() only supports '.' as the decimal separator.\n const charToAdd = charCode === format.decimalSeparator.charCodeAt(0) ? \".\" : str[i];\n wipToken = wipToken.concat(charToAdd);\n } else {\n if (processingNumber) {\n if (charCode === QuantityConstants.CHAR_SLASH || charCode === QuantityConstants.CHAR_FRACTION_SLASH || charCode === QuantityConstants.CHAR_DIVISION_SLASH) {\n const fractSymbol = Parser.checkForFractions(i + 1, str, uomSeparatorToIgnore, wipToken);\n let fraction = fractSymbol.fraction;\n i = fractSymbol.index;\n if (fractSymbol.fraction !== 0.0) {\n wipToken = \"\";\n if (signToken.length > 0) {\n if (signToken === \"-\")\n fraction = 0 - fraction;\n\n signToken = \"\";\n }\n\n tokens.push(new ParseToken(fraction));\n processingNumber = false;\n continue;\n }\n } else {\n // a space may signify end of number or start of decimal\n if (charCode === QuantityConstants.CHAR_SPACE || charCode === fractionDashCode) {\n const fractSymbol = Parser.checkForFractions(i + 1, str, uomSeparatorToIgnore);\n let fraction = fractSymbol.fraction;\n if (fractSymbol.fraction !== 0.0) {\n i = fractSymbol.index;\n if (signToken.length > 0) {\n wipToken = signToken + wipToken;\n if (signToken === \"-\")\n fraction = 0 - fraction;\n\n signToken = \"\";\n }\n\n const valueWithFraction = parseFloat(wipToken) + fraction;\n tokens.push(new ParseToken(valueWithFraction));\n processingNumber = false;\n wipToken = \"\";\n }\n else if (format.type === FormatType.Bearing && wipToken.length > 0) {\n if (signToken.length > 0) {\n wipToken = signToken + wipToken;\n signToken = \"\";\n }\n tokens.push(new ParseToken(parseFloat(wipToken))); // Create token for the current number\n processingNumber = false;\n wipToken = \"\";\n }\n continue;\n } else {\n // an \"E\" or \"e\" may signify scientific notation\n if (charCode === QuantityConstants.CHAR_UPPER_E || charCode === QuantityConstants.CHAR_LOWER_E) {\n const exponentSymbol = Parser.checkForScientificNotation(i, str, uomSeparatorToIgnore);\n i = exponentSymbol.index;\n\n if (exponentSymbol.exponent && exponentSymbol.exponent.length > 0) {\n if (signToken.length > 0) {\n wipToken = signToken + wipToken;\n signToken = \"\";\n }\n\n wipToken = `${wipToken}e${exponentSymbol.exponent}`;\n const scientificValue = Number(wipToken);\n tokens.push(new ParseToken(scientificValue));\n processingNumber = false;\n wipToken = \"\";\n continue;\n }\n }\n }\n }\n\n if (format.type === FormatType.Station && charCode === format.stationSeparator.charCodeAt(0)) {\n if (!isStationSeparatorAdded) {\n isStationSeparatorAdded = true;\n continue;\n }\n isStationSeparatorAdded = false;\n } else if (skipCodes.findIndex((ref) => ref === charCode) !== -1) {\n // ignore any codes in skipCodes\n continue;\n }\n\n if (signToken.length > 0) {\n wipToken = signToken + wipToken;\n signToken = \"\";\n }\n\n tokens.push(new ParseToken(parseFloat(wipToken)));\n\n wipToken = (i < str.length) ? str[i] : \"\";\n processingNumber = false;\n\n if (wipToken.length === 1 && isOperator(wipToken)) {\n tokens.push(new ParseToken(wipToken)); // Push operator token.\n wipToken = \"\";\n }\n } else {\n // not processing a number\n const isCharOperator = isOperator(charCode);\n const isSpacer = charCode === format.spacerOrDefault.charCodeAt(0) && charCode !== QuantityConstants.CHAR_SPACE;\n\n if (isSpacer && i > 0 && i < str.length - 1) {\n const prevCharCode = str.charCodeAt(i - 1);\n if (isCharOperator && prevCharCode !== QuantityConstants.CHAR_SPACE) {\n // ignore spacer if it's not at the start or end, not whitespace, and is not in front of a whitespace\n continue;\n }\n }\n\n if (wipToken.length === 0 && charCode === QuantityConstants.CHAR_SPACE) {\n // Don't add space when the wip token is empty.\n continue;\n }\n\n if (isCharOperator) {\n if (wipToken.length > 0) {\n // There is a token is progress, process it now, before adding the new operator token.\n tokens.push(new ParseToken(wipToken));\n wipToken = \"\";\n }\n tokens.push(new ParseToken(str[i])); // Push an Operator Token in the list.\n continue;\n }\n\n wipToken = wipToken.concat(str[i]);\n }\n }\n }\n\n // handle case where end of input string is reached.\n if (wipToken.length > 0) {\n if (processingNumber) {\n if (signToken.length > 0) {\n wipToken = signToken + wipToken;\n }\n if (isNaN(Number(wipToken))) {\n tokens.push(new ParseToken(NaN));\n } else {\n tokens.push(new ParseToken(parseFloat(wipToken)));\n }\n } else {\n tokens.push(new ParseToken(wipToken));\n }\n }\n return tokens;\n }\n\n private static isMathematicOperation(tokens: ParseToken[]) {\n if (tokens.length > 1) {\n // The loop starts at one because the first token can be a operator without it being maths. Ex: \"-5FT\"\n for (let i = 1; i < tokens.length; i++) {\n if (tokens[i].isOperator)\n // Operator found, it's a math operation.\n return true;\n }\n }\n return false;\n }\n\n private static async lookupUnitByLabel(unitLabel: string, format: Format, unitsProvider: UnitsProvider, altUnitLabelsProvider?: AlternateUnitLabelsProvider) {\n const defaultUnit = format.units && format.units.length > 0 ? format.units[0][0] : undefined;\n\n const labelToFind = unitLabel.toLowerCase();\n // First look in format for a label and matches\n if (format.units && format.units.length > 0) {\n const formatUnit = format.units.find(([unit, label]) => {\n if (label && label.toLowerCase() === labelToFind)\n return true;\n const alternateLabels = altUnitLabelsProvider?.getAlternateUnitLabels(unit);\n // check any alternate labels that may be defined for the Unit\n if (alternateLabels && alternateLabels.find((lbl) => lbl.toLowerCase() === labelToFind))\n return true;\n\n return false;\n });\n if (formatUnit)\n return formatUnit[0];\n }\n\n // now try to find a unit from the same family and system\n let foundUnit = await unitsProvider.findUnit(unitLabel, defaultUnit ? defaultUnit.phenomenon : undefined, defaultUnit ? defaultUnit.system : undefined);\n\n // if nothing found yet just limit to family\n if (!foundUnit.isValid && defaultUnit)\n foundUnit = await unitsProvider.findUnit(unitLabel, defaultUnit ? defaultUnit.phenomenon : undefined);\n return foundUnit;\n }\n\n /**\n * Get the output unit and all the conversion specs required to parse a given list of tokens.\n */\n private static async getRequiredUnitsConversionsToParseTokens(tokens: ParseToken[], format: Format, unitsProvider: UnitsProvider, altUnitLabelsProvider?: AlternateUnitLabelsProvider): Promise<{\n outUnit?: UnitProps;\n specs: UnitConversionSpec[];\n }> {\n let outUnit = (format.units && format.units.length > 0 ? format.units[0][0] : undefined);\n const unitConversions: UnitConversionSpec[] = [];\n const uniqueUnitLabels = [...new Set(tokens.filter((token) => token.isString).map((token) => token.value as string))];\n for (const label of uniqueUnitLabels) {\n const unitProps = await this.lookupUnitByLabel(label, format, unitsProvider, altUnitLabelsProvider);\n if (!outUnit) {\n // No default unit, assume that the first unit found is the desired output unit.\n outUnit = unitProps;\n }\n\n let spec = unitConversions.find((specB) => specB.name === unitProps.name);\n if (spec) {\n // Already in the list, just add the label.\n spec.parseLabels?.push(label.toLocaleLowerCase());\n } else {\n // Add new conversion to the list.\n const conversion = await unitsProvider.getConversion(unitProps, outUnit);\n if (conversion) {\n spec = {\n conversion,\n label: unitProps.label,\n system: unitProps.system,\n name: unitProps.name,\n parseLabels: [label.toLocaleLowerCase()],\n };\n unitConversions.push(spec);\n }\n }\n }\n\n return { outUnit, specs: unitConversions };\n }\n\n /**\n * Get the units information asynchronously, then convert the tokens into quantity using the synchronous tokens -> value.\n */\n private static async createQuantityFromParseTokens(tokens: ParseToken[], format: Format, unitsProvider: UnitsProvider, altUnitLabelsProvider?: AlternateUnitLabelsProvider): Promise<QuantityProps> {\n const unitConversionInfos = await this.getRequiredUnitsConversionsToParseTokens(tokens, format, unitsProvider, altUnitLabelsProvider);\n if (unitConversionInfos.outUnit) {\n const value = Parser.getQuantityValueFromParseTokens(tokens, format, unitConversionInfos.specs, await unitsProvider.getConversion(unitConversionInfos.outUnit, unitConversionInfos.outUnit));\n if (value.ok) {\n return new Quantity(unitConversionInfos.outUnit, value.value);\n }\n }\n\n return new Quantity();\n }\n\n /** Async method to generate a Quantity given a string that represents a quantity value and likely a unit label.\n * @param inString A string that contains text represent a quantity.\n * @param format Defines the likely format of inString.\n * @param unitsProvider required to look up units that may be specified in inString\n */\n public static async parseIntoQuantity(inString: string, format: Format, unitsProvider: UnitsProvider, altUnitLabelsProvider?: AlternateUnitLabelsProvider): Promise<QuantityProps> {\n const tokens: ParseToken[] = Parser.parseQuantitySpecification(inString, format);\n\n return Parser.createQuantityFromParseTokens(tokens, format, unitsProvider, altUnitLabelsProvider);\n }\n\n /** method to get the Unit Conversion given a unit label */\n private static tryFindUnitConversion(unitLabel: string, unitsConversions: UnitConversionSpec[], preferredUnit?: UnitProps): UnitConversionProps | undefined {\n if (unitsConversions.length > 0) {\n const label = unitLabel.toLocaleLowerCase();\n\n /* A preferred unit is used to target a unit if a unit label is used in more that one unit definition from the same unit family.\n * An example is if \"ft\" is used as the unitLabel and the preferredUnit is \"SURVEY_FT\" since that unit has an alternate label of \"ft\" the\n * conversion to \"SURVEY_FT\" is returned. If no preferredUnit is specified then the unit \"FT\" would likely to have been found first.\n * If \"in\" is the unit label and \"SURVEY_FT\" is the preferredUnit then conversion to \"SURVEY_IN\" would be returned.\n */\n if (preferredUnit) {\n // if there is a preferred unit defined see if unit label matched it or one of its alternates\n const preferredConversion = unitsConversions.find((conversion) => conversion.name === preferredUnit.name);\n if (preferredConversion && preferredConversion.parseLabels) {\n if (-1 !== preferredConversion.parseLabels.findIndex((lbl) => lbl === label))\n return preferredConversion.conversion;\n }\n // see if we can find a matching unitLabel in any unit within the same system as the preferred unit\n const preferredSystemConversions = unitsConversions.filter((conversion) => conversion.system === preferredUnit.system);\n for (const conversion of preferredSystemConversions) {\n if (conversion.parseLabels) {\n if (-1 !== conversion.parseLabels.findIndex((lbl) => lbl === label))\n return conversion.conversion;\n }\n }\n }\n\n // if no unit found based on preferredUnit see if an unit label matches\n for (const conversion of unitsConversions) {\n if (conversion.parseLabels) {\n if (-1 !== conversion.parseLabels.findIndex((lbl) => lbl === label))\n return conversion.conversion;\n } else {\n // eslint-disable-next-line no-console\n console.log(\"ERROR: Parser expects to find parseLabels array populate with all possible unit labels for the unit.\");\n }\n }\n }\n\n return undefined;\n }\n\n /**\n * Get what the unit conversion is for a unitless value.\n */\n private static getDefaultUnitConversion(tokens: ParseToken[], unitsConversions: UnitConversionSpec[], defaultUnit?: UnitProps) {\n let unitConversion = defaultUnit ? Parser.tryFindUnitConversion(defaultUnit.label, unitsConversions, defaultUnit) : undefined;\n if (!unitConversion) {\n // No default unit conversion, take the first valid unit.\n const uniqueUnitLabels = [...new Set(tokens.filter((token) => token.isString).map((token) => token.value as string))];\n for (const label of uniqueUnitLabels) {\n unitConversion = Parser.tryFindUnitConversion(label, unitsConversions, defaultUnit);\n if (unitConversion !== undefined)\n return unitConversion;\n }\n }\n return unitConversion;\n }\n\n // Get the next token pair to parse into a quantity.\n private static getNextTokenPair(index: number, tokens: ParseToken[]): ParseToken[] | undefined {\n if (index >= tokens.length)\n return;\n\n // 6 possible combination of token pair.\n // Stringified to ease comparison later.\n const validCombinations = [\n JSON.stringify([\"string\"]), // ['FT']\n JSON.stringify([\"string\", \"number\"]), // ['$', 5] unit specification comes before value (like currency)\n JSON.stringify([\"number\"]), // [5]\n JSON.stringify([\"number\", \"string\"]), // [5, 'FT']\n JSON.stringify([\"operator\", \"number\"]), // ['-', 5]\n JSON.stringify([\"operator\", \"number\", \"string\"]), // ['-', 5, 'FT']\n ];\n\n // Push up to 3 tokens in the list, if the length allows it.\n const maxNbrTokensInThePair = Math.min(tokens.length - index, 3);\n const tokenPair = tokens.slice(index, index + maxNbrTokensInThePair);\n const currentCombination = tokenPair.map((token) => token.isOperator ? \"operator\" : (token.isNumber ? \"number\" : \"string\"));\n\n // Check if the token pair is valid. If not, try again by removing the last token util empty.\n // Ex: ['5', 'FT', '7'] invalid => ['5', 'FT'] valid returned\n for (let i = currentCombination.length - 1; i >= 0; i--) {\n if (validCombinations.includes(JSON.stringify(currentCombination))) {\n break;\n } else {\n currentCombination.pop();\n tokenPair.pop();\n }\n }\n\n return tokenPair.length > 0 ? tokenPair : undefined;\n }\n\n /**\n * Accumulate the given list of tokens into a single quantity value. Formatting the tokens along the way.\n */\n private static getQuantityValueFromParseTokens(tokens: ParseToken[], format: Format, unitsConversions: UnitConversionSpec[], defaultUnitConversion?: UnitConversionProps): QuantityParseResult {\n if (tokens.length === 0)\n return { ok: false, error: ParseError.UnableToGenerateParseTokens };\n\n if (!format.allowMathematicOperations && Parser.isMathematicOperation(tokens))\n return { ok: false, error: ParseError.MathematicOperationFoundButIsNotAllowed };\n\n if (\n tokens.some((token) => token.isNumber && isNaN(token.value as number)) ||\n tokens.every((token) => token.isSpecialCharacter)\n ) {\n return { ok: false, error: ParseError.UnableToConvertParseTokensToQuantity };\n }\n\n const defaultUnit = format.units && format.units.length > 0 ? format.units[0][0] : undefined;\n defaultUnitConversion = defaultUnitConversion ? defaultUnitConversion : Parser.getDefaultUnitConversion(tokens, unitsConversions, defaultUnit);\n\n if (format.type === FormatType.Bearing && format.units !== undefined && format.units.length > 0) {\n const units = format.units;\n const desiredNumberOfTokens = units.length;\n if (tokens.length < desiredNumberOfTokens && tokens[0].isNumber && desiredNumberOfTokens <= 3) {\n // handle the special XX.YYZZ format which is common for bearings. It uses no separators, so we need to split based on numeric indexes. We support up to 3 units\n const value: number = tokens[0].value as number;\n const firstToken = Math.floor(value);\n tokens.pop();\n tokens.push(new ParseToken(firstToken)); // Add the first token back to the list.\n if (desiredNumberOfTokens >= 2) {\n const remaining = (value - firstToken) * 100;\n const secondToken = Math.floor(remaining);\n tokens.push(new ParseToken(secondToken));\n if (desiredNumberOfTokens === 3) {\n const thirdToken = (remaining - secondToken) * 100;\n tokens.push(new ParseToken(thirdToken));\n }\n }\n }\n }\n\n let tokenPair: ParseToken[] | undefined;\n let increment: number = 1;\n let mag = 0.0;\n // The sign is saved outside from the loop for cases like this. '-1m 50cm 10mm + 2m 30cm 40mm' => -1.51m + 2.34m\n let sign: 1 | -1 = 1;\n let compositeUnitIndex = 0;\n\n for (let i = 0; i < tokens.length; i = i + increment) {\n tokenPair = this.getNextTokenPair(i, tokens);\n if (!tokenPair || tokenPair.length === 0) {\n return { ok: false, error: ParseError.UnableToConvertParseTokensToQuantity };\n }\n increment = tokenPair.length;\n\n // Keep the sign so its applied to the next tokens.\n if (tokenPair[0].isOperator) {\n sign = tokenPair[0].value === Operator.addition ? 1 : -1;\n tokenPair.shift();\n compositeUnitIndex = 0; // Reset the composite unit index, the following tokens begin from start.\n }\n\n // unit specification comes before value (like currency)\n if (tokenPair.length === 2 && tokenPair[0].isString) {\n // Invert it so the currency sign comes second.\n tokenPair = [tokenPair[1], tokenPair[0]];\n }\n\n if (tokenPair[0].isNumber) {\n let value = sign * (tokenPair[0].value as number);\n let conversion: UnitConversionProps | undefined;\n if (tokenPair.length === 2 && tokenPair[1].isString) {\n conversion = Parser.tryFindUnitConversion(tokenPair[1].value as string, unitsConversions, defaultUnit);\n }\n if (!conversion) {\n if (compositeUnitIndex > 0 && format.units && format.units.length > compositeUnitIndex) {\n // if this is not the first token, and we have a composite spec, look up the unit from the current index\n const presUnitAtIndex = format.units[compositeUnitIndex][0];\n conversion = Parser.tryFindUnitConversion(presUnitAtIndex.label, unitsConversions, presUnitAtIndex);\n } else if (defaultUnitConversion) {\n conversion = defaultUnitConversion;\n }\n }\n if (conversion) {\n value = applyConversion(value, conversion);\n }\n mag = mag + value;\n compositeUnitIndex++;\n } else {\n // only the unit label was specified so assume magnitude of 0\n const conversion = Parser.tryFindUnitConversion(tokenPair[0].value as string, unitsConversions, defaultUnit);\n if (conversion === undefined) {\n // Unknown unit label\n return { ok: false, error: ParseError.NoValueOrUnitFoundInString };\n }\n }\n }\n\n return { ok: true, value: mag };\n }\n\n /** Method to generate a Quantity given a string that represents a quantity value.\n * @param inString A string that contains text represent a quantity.\n * @param parserSpec unit label if not explicitly defined by user. Must have matching entry in supplied array of unitsConversions.\n */\n public static parseQuantityString(inString: string, parserSpec: ParserSpec): QuantityParseResult {\n // ensure any labels defined in composite unit definition are specified in unitConversions\n if (parserSpec.format.units) {\n parserSpec.format.units.forEach(([unit, label]) => {\n if (label) {\n if (unit.label !== label) { // if default unit label does not match composite label ensure the label is in the list of parse labels for the conversion\n const unitConversion = parserSpec.unitConversions.find((conversion) => conversion.name === unit.name);\n if (unitConversion && unitConversion.parseLabels && !unitConversion.parseLabels.find((entry) => entry === label))\n unitConversion.parseLabels.push(label);\n }\n }\n });\n }\n\n if (parserSpec.format.type === FormatType.Bearing) {\n return this.parseBearingFormat(inString, parserSpec);\n }\n if (parserSpec.format.type === FormatType.Azimuth) {\n return this.parseAzimuthFormat(inString, parserSpec);\n }\n\n if (parserSpec.format.type === FormatType.Ratio) {\n return this.parseRatioFormat(inString, parserSpec);\n }\n\n return this.parseAndProcessTokens(inString, parserSpec.format, parserSpec.unitConversions);\n }\n\n /** Method to generate a Quantity given a string that represents a quantity value and likely a unit label.\n * @param inString A string that contains text represent a quantity.\n * @param format Defines the likely format of inString. Primary unit serves as a default unit if no unit label found in string.\n * @param unitsConversions dictionary of conversions used to convert from unit used in inString to output quantity\n * @deprecated in 4.10 - will not be removed until after 2026-06-13. Check [[Parser.parseQuantityString]] for replacements.\n */\n public static parseToQuantityValue(inString: string, format: Format, unitsConversions: UnitConversionSpec[]): QuantityParseResult {\n // TODO: This method is not able to do bearing and azimuth formatting and is overlapping with parseQuantityString.\n // We should consider deprecating and removing it, there do not seem to be any upstream callers at this moment\n\n // ensure any labels defined in composite unit definition are specified in unitConversions\n if (format.units) {\n format.units.forEach(([unit, label]) => {\n if (label) {\n if (unit.label !== label) { // if default unit label does not match composite label ensure the label is in the list of parse labels for the conversion\n const unitConversion = unitsConversions.find((conversion) => conversion.name === unit.name);\n if (unitConversion && unitConversion.parseLabels && !unitConversion.parseLabels.find((entry) => entry === label))\n unitConversion.parseLabels.push(label);\n }\n }\n });\n }\n\n if (format.type === FormatType.Bearing || format.type === FormatType.Azimuth || format.type === FormatType.Ratio) {\n // throw error indicating to call parseQuantityString instead\n throw new QuantityError(QuantityStatus.UnsupportedUnit, `Bearing, Azimuth or Ratio format must be parsed using a ParserSpec. Call parseQuantityString instead.`);\n }\n\n return this.parseAndProcessTokens(inString, format, unitsConversions);\n }\n\n /** The value of special direction is always in degrees, try to find the unit conversion for that. */\n private static processSpecialBearingDirection(mag: number, spec: ParserSpec): QuantityParseResult {\n const specialDirUnit = spec.unitConversions.find((unitConversion) => unitConversion.name === \"Units.ARC_DEG\");\n if (!specialDirUnit)\n return { ok: false, error: ParseError.UnknownUnit };\n const preferredUnit = spec.outUnit;\n const conversion = this.tryFindUnitConversion(specialDirUnit.label, spec.unitConversions, preferredUnit);\n if (!conversion) return { ok: true, value: mag };\n return { ok: true, value: applyConversion(mag, conversion) };\n }\n\n private static parseBearingFormat(inString: string, spec: ParserSpec): QuantityParseResult {\n const specialDirections: Record<string, number> = {\n n: 0,\n ne: 45,\n e: 90,\n se: 135,\n s: 180,\n sw: 225,\n w: 270,\n nw: 315,\n };\n\n // TODO: at some point we will want to open this for localization, in the first release it's going to be hard coded\n enum DirectionLabel {\n North = \"N\",\n South = \"S\",\n East = \"E\",\n West = \"W\"\n }\n let matchedPrefix: DirectionLabel | null = null;\n let matchedSuffix: DirectionLabel | null = null;\n\n // check if input string begins with northLabel or southLabel and strip it off\n if (inString.toUpperCase().startsWith(DirectionLabel.North)) {\n inString = inString.substring(DirectionLabel.North.length);\n matchedPrefix = DirectionLabel.North;\n } else if (inString.toUpperCase().startsWith(DirectionLabel.South)) {\n inString = inString.substring(DirectionLabel.South.length);\n matchedPrefix = DirectionLabel.South;\n }\n\n // check if input string ends with eastLabel or westLabel (case-insensitive) and strip it off\n if (inString.toUpperCase().endsWith(DirectionLabel.East)) {\n inString = inString.substring(0, inString.length - DirectionLabel.East.length);\n matchedSuffix = DirectionLabel.East;\n } else if (inString.toUpperCase().endsWith(DirectionLabel.West)) {\n inString = inString.substring(0, inString.length - DirectionLabel.West.length);\n matchedSuffix = DirectionLabel.West;\n }\n\n // check if the remaining string is a special direction\n if (inString.trim() === \"\") {\n const prefix = matchedPrefix?.toLowerCase() || \"\";\n const suffix = matchedSuffix?.toLowerCase() || \"\";\n const specialDirection = specialDirections[`${prefix}${suffix}`];\n if (specialDirection !== undefined)\n return this.processSpecialBearingDirection(specialDirection, spec);\n }\n\n if (matchedPrefix === null || matchedSuffix === null) {\n return { ok: false, error: ParseError.BearingPrefixOrSuffixMissing };\n }\n\n const parsedResult = this.parseAndProcessTokens(inString, spec.format, spec.unitConversions);\n if (this.isParseError(parsedResult)) {\n return parsedResult;\n }\n const revolution = this.getRevolution(spec);\n const quarterRevolution = revolution / 4;\n\n let magnitude = parsedResult.value;\n if (magnitude < -quarterRevolution || magnitude > quarterRevolution) {\n return { ok: false, error: ParseError.BearingAngleOutOfRange };\n }\n\n // we have to turn the value into an east base and counter clockwise (NW and SE are already counter clockwise)\n if (matchedPrefix === DirectionLabel.North) {\n if (matchedSuffix === DirectionLabel.West) {\n magnitude = revolution - magnitude;\n }\n } else if (matchedPrefix === DirectionLabel.South) {\n if (matchedSuffix === DirectionLabel.West) {\n magnitude = (2 * quarterRevolution) + magnitude;\n } else if (matchedSuffix === DirectionLabel.East) {\n magnitude = (2 * quarterRevolution) - magnitude;\n }\n }\n magnitude = this.normalizeAngle(magnitude, revolution);\n\n return { ok: true, value: magnitude };\n }\n\n private static parseAzimuthFormat(inString: string, spec: ParserSpec): QuantityParseResult {\n const parsedResult = this.parseAndProcessTokens(inString, spec.format, spec.unitConversions);\n if (this.isParseError(parsedResult)) {\n return parsedResult;\n }\n\n let magnitude = parsedResult.value;\n\n const revolution = this.getRevolution(spec);\n magnitude = this.normalizeAngle(magnitude, revolution);\n let azimuthBase = 0.0;\n if (spec.format.azimuthBase !== undefined) {\n if (spec.azimuthBaseConversion === undefined) {\n throw new QuantityError(QuantityStatus.MissingRequiredProperty, `Missing azimuth base conversion for interpreting ${spec.format.name}'s azimuth base.`);\n }\n const azBaseQuantity: Quantity = new Quantity(spec.format.azimuthBaseUnit, spec.format.azimuthBase);\n const azBaseConverted = azBaseQuantity.convertTo(spec.outUnit, spec.azimuthBaseConversion);\n if (azBaseConverted === undefined || !azBaseConverted.isValid) {\n throw new QuantityError(QuantityStatus.UnsupportedUnit, `Failed to convert azimuth base unit to ${spec.outUnit.name}.`);\n }\n azimuthBase = this.normalizeAngle(azBaseConverted.magnitude, revolution);\n }\n const inputIsClockwise = spec.format.azimuthClockwiseOrDefault;\n\n if (inputIsClockwise && azimuthBase === 0) {\n // parsed result already has the same base and orientation as our desired output\n return parsedResult;\n }\n\n if (inputIsClockwise)\n magnitude = azimuthBase + magnitude;\n else\n magnitude = azimuthBase - magnitude;\n\n magnitude = this.normalizeAngle(magnitude, revolution);\n\n return { ok: true, value: magnitude };\n }\n\n private static parseRatioFormat(inString: string, spec: ParserSpec): QuantityParseResult {\n if (!inString)\n return { ok: false, error: ParseError.NoValueOrUnitFoundInString };\n\n const parts = inString.split(\":\");\n if (parts.length > 2)\n return { ok: false, error: ParseError.UnableToConvertParseTokensToQuantity };\n\n const numerator = parseFloat(parts[0]);\n let denominator;\n if (parts.length === 1) {\n denominator = 1.0;\n } else {\n denominator = parseFloat(parts[1]);\n }\n\n if (isNaN(numerator) || isNaN(denominator))\n return { ok: false, error: ParseError.NoValueOrUnitFoundInString };\n\n const defaultUnit = spec.format.units && spec.format.units.length > 0 ? spec.format.units[0][0] : undefined;\n const unitConversion = defaultUnit ? Parser.tryFindUnitConversion(defaultUnit.label, spec.unitConversions, defaultUnit) : undefined;\n\n if (!unitConversion) {\n throw new QuantityError(QuantityStatus.MissingRequiredProperty, `Missing input unit or unit conversion for interpreting ${spec.format.name}.`);\n }\n\n if (denominator === 0) {\n if (unitConversion.inversion && numerator === 1)\n return { ok: true, value: 0.0 };\n else\n return { ok: false, error: ParseError.MathematicOperationFoundButIsNotAllowed };\n }\n\n let quantity: Quantity;\n if (spec.format.units && spec.outUnit) {\n quantity = new Quantity(spec.format.units[0][0], numerator / denominator);\n } else {\n throw new QuantityError(QuantityStatus.MissingRequiredProperty, \"Missing presentation unit or persistence unit for ratio format.\");\n }\n\n let converted: Quantity | undefined;\n try {\n converted = quantity.convertTo(spec.outUnit, unitConversion);\n } catch (err) {\n // for input of \"0:N\" with reversed unit\n if (err instanceof QuantityError && err.errorNumber === QuantityStatus.InvertingZero) {\n return { ok: false, error: ParseError.MathematicOperationFoundButIsNotAllowed };\n }\n }\n\n if (converted === undefined || !converted.isValid) {\n throw new QuantityError(QuantityStatus.UnsupportedUnit, `Failed to convert from ${spec.format.units[0][0].name} to ${spec.outUnit.name} On format ${spec.format.name}.`);\n }\n\n return { ok: true, value: converted.magnitude };\n }\n\n // TODO: The following two methods are redundant with Formatter. We should consider consolidating them.\n private static normalizeAngle(magnitude: number, revolution: number): number {\n magnitude = magnitude % revolution; // Strip anything that goes around more than once\n\n if (magnitude < 0) // If the value is negative, we want to normalize it to a positive angle\n magnitude += revolution;\n\n return magnitude;\n }\n\n private static getRevolution(spec: ParserSpec): number {\n if (spec.revolutionConversion === undefined) {\n throw new QuantityError(QuantityStatus.MissingRequiredProperty, `Missing revolution unit conversion for calculating ${spec.format.name}'s revolution.`);\n }\n\n const revolution: Quantity = new Quantity(spec.format.revolutionUnit, 1.0);\n const converted = revolution.convertTo(spec.outUnit, spec.revolutionConversion);\n if (converted === undefined || !converted.isValid) {\n throw new QuantityError(QuantityStatus.UnsupportedUnit, `Failed to convert revolution unit to ${spec.outUnit.name} On format ${spec.format.name}.`);\n }\n\n return converted.magnitude;\n }\n\n private static parseAndProcessTokens(inString: string, format: Format, unitsConversions: UnitConversionSpec[]): QuantityParseResult {\n const tokens: ParseToken[] = Parser.parseQuantitySpecification(inString, format);\n if (Parser._log) {\n // eslint-disable-next-line no-console\n console.log(`Parse tokens`);\n let i = 0;\n for (const token of tokens) {\n // eslint-disable-next-line no-console\n console.log(` [${i++}] isNumber=${token.isNumber} isString=${token.isString} token=${token.value}`);\n }\n }\n\n return Parser.getQuantityValueFromParseTokens(tokens, format, unitsConversions);\n }\n\n /** Async Method used to create an array of UnitConversionSpec entries that can be used in synchronous calls to parse units. */\n public static async createUnitConversionSpecsForUnit(unitsProvider: UnitsProvider, outUnit: UnitProps, altUnitLabelsProvider?: AlternateUnitLabelsProvider): Promise<UnitConversionSpec[]> {\n const unitConversionSpecs: UnitConversionSpec[] = [];\n\n const familyUnits = await unitsProvider.getUnitsByFamily(outUnit.phenomenon);\n for (const unit of familyUnits) {\n const conversion = await unitsProvider.getConversion(unit, outUnit);\n const parseLabels: string[] = [unit.label.toLocaleLowerCase()];\n const alternateLabels = altUnitLabelsProvider?.getAlternateUnitLabels(unit);\n // add any alternate labels that may be defined for the Unit\n if (alternateLabels) {\n alternateLabels.forEach((label: string) => {\n const potentialLabel = label.toLocaleLowerCase();\n if (-1 === parseLabels.findIndex((lbl) => lbl === potentialLabel))\n parseLabels.push(label.toLocaleLowerCase());\n });\n }\n\n unitConversionSpecs.push({\n name: unit.name,\n label: unit.label,\n conversion,\n parseLabels,\n system: unit.system,\n });\n }\n return unitConversionSpecs;\n }\n\n /** Async Method used to create an array of UnitConversionSpec entries that can be used in synchronous calls to parse units. */\n public static async createUnitConversionSpecs(unitsProvider: UnitsProvider, outUnitName: string, potentialParseUnits: PotentialParseUnit[], altUnitLabelsProvider?: AlternateUnitLabelsProvider): Promise<UnitConversionSpec[]> {\n const unitConversionSpecs: UnitConversionSpec[] = [];\n\n const outUnit = await unitsProvider.findUnitByName(outUnitName);\n if (!outUnit || !outUnit.name || 0 === outUnit.name.length) {\n // eslint-disable-next-line no-console\n console.log(`[Parser.createUnitConversionSpecs] ERROR: Unable to locate out unit ${outUnitName}.`);\n return unitConversionSpecs;\n }\n\n for (const potentialParseUnit of potentialParseUnits) {\n const unit = await unitsProvider.findUnitByName(potentialParseUnit.unitName);\n if (!unit || !unit.name || 0 === unit.name.length) {\n // eslint-disable-next-line no-console\n console.log(`[Parser.createUnitConversionSpecs] ERROR: Unable to locate potential unit ${potentialParseUnit.unitName}.`);\n continue;\n }\n\n const conversion = await unitsProvider.getConversion(unit, outUnit);\n const parseLabels: string[] = [unit.label.toLocaleLowerCase()];\n const alternateLabels = altUnitLabelsProvider?.getAlternateUnitLabels(unit);\n // add any alternate labels that may be defined for the Unit\n if (alternateLabels) {\n alternateLabels.forEach((label: string) => {\n const potentialLabel = label.toLocaleLowerCase();\n if (-1 === parseLabels.findIndex((lbl) => lbl === potentialLabel))\n parseLabels.push(label.toLocaleLowerCase());\n });\n }\n\n // add any alternate labels that where provided by caller\n if (potentialParseUnit.altLabels) {\n potentialParseUnit.altLabels.forEach((label: string) => {\n const potentialLabel = label.toLocaleLowerCase();\n if (-1 === parseLabels.findIndex((lbl) => lbl === potentialLabel))\n parseLabels.push(label.toLocaleLowerCase());\n });\n }\n unitConversionSpecs.push({\n name: unit.name,\n label: unit.label,\n conversion,\n parseLabels,\n system: unit.system,\n });\n }\n return unitConversionSpecs;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Parser.js","sourceRoot":"","sources":["../../src/Parser.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Quantity\n */\n\nimport { QuantityConstants } from \"./Constants\";\nimport { QuantityError, QuantityStatus } from \"./Exception\";\nimport { Format } from \"./Formatter/Format\";\nimport { FormatTraits, FormatType } from \"./Formatter/FormatEnums\";\nimport { AlternateUnitLabelsProvider, PotentialParseUnit, QuantityProps, UnitConversionProps, UnitConversionSpec, UnitProps, UnitsProvider } from \"./Interfaces\";\nimport { ParserSpec } from \"./ParserSpec\";\nimport { applyConversion, Quantity } from \"./Quantity\";\n\n/** Possible parser errors\n * @beta\n */\nexport enum ParseError {\n UnableToGenerateParseTokens = 1,\n NoValueOrUnitFoundInString,\n UnitLabelSuppliedButNotMatched,\n UnknownUnit,\n UnableToConvertParseTokensToQuantity,\n InvalidParserSpec,\n BearingPrefixOrSuffixMissing,\n MathematicOperationFoundButIsNotAllowed,\n BearingAngleOutOfRange,\n}\n\n/** Parse error result from [[Parser.parseToQuantityValue]] or [[Parser.parseToQuantityValue]].\n * @beta\n */\nexport interface ParseQuantityError {\n /** Union discriminator for [[QuantityParseResult]]. */\n ok: false;\n /** The specific error that occurred during parsing. */\n error: ParseError;\n}\n\n/** Successful result from [[Parser.parseToQuantityValue]] or [[Parser.parseToQuantityValue]].\n * @beta\n */\nexport interface ParsedQuantity {\n /** Union discriminator for [[QuantityParseResult]]. */\n ok: true;\n /** The magnitude of the parsed quantity. */\n value: number;\n}\n\nenum Operator {\n addition = \"+\",\n subtraction = \"-\",\n multiplication = \"*\", // unsupported but we recognize it during parsing\n division = \"/\" // unsupported but we recognize it during parsing\n}\n\nfunction isOperator(char: number | string): boolean {\n if (typeof char === \"number\") {\n // Convert the CharCode to string.\n char = String.fromCharCode(char);\n }\n return Object.values(Operator).includes(char as Operator);\n}\n\n/**\n * Defines Results of parsing a string input by a user into its desired value type\n * @beta\n */\nexport type QuantityParseResult = ParsedQuantity | ParseQuantityError;\n\n/** A ParseToken holds either a numeric or string token extracted from a string that represents a quantity value.\n * @beta\n */\nclass ParseToken {\n public value: number | string | Operator;\n public isOperator: boolean = false;\n\n constructor(value: string | number | Operator) {\n if (typeof value === \"string\") {\n this.value = value.trim();\n this.isOperator = isOperator(this.value);\n } else {\n this.value = value;\n }\n }\n\n public get isString(): boolean { return !this.isOperator && typeof this.value === \"string\"; }\n public get isNumber(): boolean { return typeof this.value === \"number\"; }\n public get isSpecialCharacter(): boolean {\n const format = /^[!@#$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>\\/?]+$/;\n return this.isString && this.value.toString().match(format) !== null;\n }\n}\n\n/** A ScientificToken holds an index and string representing the exponent.\n * @beta\n */\nclass ScientificToken {\n public index: number;\n public exponent = \"\";\n\n constructor(index: number, exponent?: string) {\n this.index = index;\n if (exponent)\n this.exponent = exponent;\n }\n}\n\n/** A FractionToken holds an index and the fraction value of numerator / denominator.\n * @beta\n */\nclass FractionToken {\n public index: number;\n public fraction = 0.0;\n public exponent = \"\";\n\n constructor(index: number, fraction?: number) {\n this.index = index;\n if (fraction)\n this.fraction = fraction;\n }\n}\n\n/** A Parser class that is used to break a string that represents a quantity value into tokens.\n * @beta\n */\nexport class Parser {\n private static _log = false;\n\n public static isParsedQuantity(item: QuantityParseResult): item is ParsedQuantity {\n return item.ok;\n }\n\n public static isParseError(item: QuantityParseResult): item is ParseQuantityError {\n return !item.ok;\n }\n\n private static checkForScientificNotation(index: number, stringToParse: string, uomSeparatorToIgnore: number): ScientificToken {\n let exponentString = \"\";\n let i = index + 1;\n\n for (; i < stringToParse.length; i++) {\n const charCode = stringToParse.charCodeAt(i);\n if (Parser.isDigit(charCode) || ((charCode === QuantityConstants.CHAR_MINUS || charCode === QuantityConstants.CHAR_PLUS) && (i === (index + 1)))) {\n exponentString = exponentString.concat(stringToParse[i]);\n } else {\n i = uomSeparatorToIgnore === charCode ? i : i - 1;\n break;\n }\n }\n\n if (exponentString.length > 1 || ((exponentString.length === 1) && (exponentString.charCodeAt(0) !== QuantityConstants.CHAR_MINUS) && (exponentString.charCodeAt(0) !== QuantityConstants.CHAR_PLUS)))\n return new ScientificToken(i, exponentString);\n\n return new ScientificToken(index);\n }\n\n private static checkForFractions(index: number, stringToParse: string, uomSeparatorToIgnore: number, numeratorStr?: string): FractionToken {\n let numeratorToken = \"\";\n let denominatorToken = \"\";\n let processingNumerator = true;\n let i = index;\n if (numeratorStr && numeratorStr.length > 0) {\n numeratorToken = numeratorStr;\n processingNumerator = false;\n }\n\n for (; i < stringToParse.length; i++) {\n const charCode = stringToParse.charCodeAt(i);\n if (Parser.isDigit(charCode)) {\n if (processingNumerator) {\n numeratorToken = numeratorToken.concat(stringToParse[i]);\n } else {\n denominatorToken = denominatorToken.concat(stringToParse[i]);\n }\n } else {\n if (processingNumerator && (charCode === QuantityConstants.CHAR_SLASH || charCode === QuantityConstants.CHAR_DIVISION_SLASH || charCode === QuantityConstants.CHAR_DIVISION_SLASH)) {\n processingNumerator = false;\n } else {\n if (uomSeparatorToIgnore !== charCode)\n i = i - 1; // skip over uom separator after fraction\n\n break;\n }\n }\n }\n\n if (numeratorToken.length > 0 && denominatorToken.length > 0) {\n const numerator = parseInt(numeratorToken, 10);\n const denominator = parseInt(denominatorToken, 10);\n if (denominator > 0)\n return new FractionToken(i, numerator / denominator);\n return new FractionToken(i);\n }\n\n return new FractionToken(index + 1);\n }\n\n private static isDigit(charCode: number): boolean {\n return (charCode >= QuantityConstants.CHAR_DIGIT_ZERO) && (charCode <= QuantityConstants.CHAR_DIGIT_NINE);\n }\n\n private static isDigitOrDecimalSeparator(charCode: number, format: Format): boolean {\n return (charCode === format.decimalSeparator.charCodeAt(0)) || Parser.isDigit(charCode);\n }\n\n /** Parse the quantity string and return and array of ParseTokens that represent the component invariant values and unit labels.\n * @param quantitySpecification The quantity string to ba parsed.\n */\n public static parseQuantitySpecification(quantitySpecification: string, format: Format): ParseToken[] {\n const tokens: ParseToken[] = [];\n const str = quantitySpecification.trim();\n let processingNumber = false;\n let wipToken = \"\";\n let signToken = \"\";\n let isStationSeparatorAdded = false;\n let uomSeparatorToIgnore = 0;\n let fractionDashCode = 0;\n\n const skipCodes: number[] = [format.thousandSeparator.charCodeAt(0)];\n\n if (format.type === FormatType.Station && format.stationSeparator && format.stationSeparator.length === 1)\n skipCodes.push(format.stationSeparator.charCodeAt(0));\n\n if (format.type === FormatType.Fractional && format.hasFormatTraitSet(FormatTraits.FractionDash)) {\n fractionDashCode = QuantityConstants.CHAR_MINUS;\n }\n\n if (format.uomSeparator && format.uomSeparator !== \" \" && format.uomSeparator.length === 1) {\n uomSeparatorToIgnore = format.uomSeparator.charCodeAt(0);\n skipCodes.push(uomSeparatorToIgnore);\n }\n\n for (let i = 0; i < str.length; i++) {\n const charCode = str.charCodeAt(i);\n if (Parser.isDigitOrDecimalSeparator(charCode, format)) {\n if (!processingNumber) {\n if (wipToken.length > 0) {\n tokens.push(new ParseToken(wipToken));\n wipToken = \"\";\n }\n processingNumber = true;\n }\n // Decimal separators must be replaced with '.' before converting to a number - parseFloat() only supports '.' as the decimal separator.\n const charToAdd = charCode === format.decimalSeparator.charCodeAt(0) ? \".\" : str[i];\n wipToken = wipToken.concat(charToAdd);\n } else {\n if (processingNumber) {\n if (charCode === QuantityConstants.CHAR_SLASH || charCode === QuantityConstants.CHAR_FRACTION_SLASH || charCode === QuantityConstants.CHAR_DIVISION_SLASH) {\n const fractSymbol = Parser.checkForFractions(i + 1, str, uomSeparatorToIgnore, wipToken);\n let fraction = fractSymbol.fraction;\n i = fractSymbol.index;\n if (fractSymbol.fraction !== 0.0) {\n wipToken = \"\";\n if (signToken.length > 0) {\n if (signToken === \"-\")\n fraction = 0 - fraction;\n\n signToken = \"\";\n }\n\n tokens.push(new ParseToken(fraction));\n processingNumber = false;\n continue;\n }\n } else {\n // a space may signify end of number or start of decimal\n if (charCode === QuantityConstants.CHAR_SPACE || charCode === fractionDashCode) {\n const fractSymbol = Parser.checkForFractions(i + 1, str, uomSeparatorToIgnore);\n let fraction = fractSymbol.fraction;\n if (fractSymbol.fraction !== 0.0) {\n i = fractSymbol.index;\n if (signToken.length > 0) {\n wipToken = signToken + wipToken;\n if (signToken === \"-\")\n fraction = 0 - fraction;\n\n signToken = \"\";\n }\n\n const valueWithFraction = parseFloat(wipToken) + fraction;\n tokens.push(new ParseToken(valueWithFraction));\n processingNumber = false;\n wipToken = \"\";\n }\n else if (format.type === FormatType.Bearing && wipToken.length > 0) {\n if (signToken.length > 0) {\n wipToken = signToken + wipToken;\n signToken = \"\";\n }\n tokens.push(new ParseToken(parseFloat(wipToken))); // Create token for the current number\n processingNumber = false;\n wipToken = \"\";\n }\n continue;\n } else {\n // an \"E\" or \"e\" may signify scientific notation\n if (charCode === QuantityConstants.CHAR_UPPER_E || charCode === QuantityConstants.CHAR_LOWER_E) {\n const exponentSymbol = Parser.checkForScientificNotation(i, str, uomSeparatorToIgnore);\n i = exponentSymbol.index;\n\n if (exponentSymbol.exponent && exponentSymbol.exponent.length > 0) {\n if (signToken.length > 0) {\n wipToken = signToken + wipToken;\n signToken = \"\";\n }\n\n wipToken = `${wipToken}e${exponentSymbol.exponent}`;\n const scientificValue = Number(wipToken);\n tokens.push(new ParseToken(scientificValue));\n processingNumber = false;\n wipToken = \"\";\n continue;\n }\n }\n }\n }\n\n if (format.type === FormatType.Station && charCode === format.stationSeparator.charCodeAt(0)) {\n if (!isStationSeparatorAdded) {\n isStationSeparatorAdded = true;\n continue;\n }\n isStationSeparatorAdded = false;\n } else if (skipCodes.findIndex((ref) => ref === charCode) !== -1) {\n // ignore any codes in skipCodes\n continue;\n }\n\n if (signToken.length > 0) {\n wipToken = signToken + wipToken;\n signToken = \"\";\n }\n\n tokens.push(new ParseToken(parseFloat(wipToken)));\n\n wipToken = (i < str.length) ? str[i] : \"\";\n processingNumber = false;\n\n if (wipToken.length === 1 && isOperator(wipToken)) {\n tokens.push(new ParseToken(wipToken)); // Push operator token.\n wipToken = \"\";\n }\n } else {\n // not processing a number\n const isCharOperator = isOperator(charCode);\n const isSpacer = charCode === format.spacerOrDefault.charCodeAt(0) && charCode !== QuantityConstants.CHAR_SPACE;\n\n if (isSpacer && i > 0 && i < str.length - 1) {\n const prevCharCode = str.charCodeAt(i - 1);\n if (isCharOperator && prevCharCode !== QuantityConstants.CHAR_SPACE) {\n // ignore spacer if it's not at the start or end, not whitespace, and is not in front of a whitespace\n continue;\n }\n }\n\n if (wipToken.length === 0 && charCode === QuantityConstants.CHAR_SPACE) {\n // Don't add space when the wip token is empty.\n continue;\n }\n\n if (isCharOperator) {\n if (wipToken.length > 0) {\n // There is a token is progress, process it now, before adding the new operator token.\n tokens.push(new ParseToken(wipToken));\n wipToken = \"\";\n }\n tokens.push(new ParseToken(str[i])); // Push an Operator Token in the list.\n continue;\n }\n\n wipToken = wipToken.concat(str[i]);\n }\n }\n }\n\n // handle case where end of input string is reached.\n if (wipToken.length > 0) {\n if (processingNumber) {\n if (signToken.length > 0) {\n wipToken = signToken + wipToken;\n }\n if (isNaN(Number(wipToken))) {\n tokens.push(new ParseToken(NaN));\n } else {\n tokens.push(new ParseToken(parseFloat(wipToken)));\n }\n } else {\n tokens.push(new ParseToken(wipToken));\n }\n }\n return tokens;\n }\n\n private static isMathematicOperation(tokens: ParseToken[]) {\n if (tokens.length > 1) {\n // The loop starts at one because the first token can be a operator without it being maths. Ex: \"-5FT\"\n for (let i = 1; i < tokens.length; i++) {\n if (tokens[i].isOperator)\n // Operator found, it's a math operation.\n return true;\n }\n }\n return false;\n }\n\n private static async lookupUnitByLabel(unitLabel: string, format: Format, unitsProvider: UnitsProvider, altUnitLabelsProvider?: AlternateUnitLabelsProvider) {\n const defaultUnit = format.units && format.units.length > 0 ? format.units[0][0] : undefined;\n\n const labelToFind = unitLabel.toLowerCase();\n // First look in format for a label and matches\n if (format.units && format.units.length > 0) {\n const formatUnit = format.units.find(([unit, label]) => {\n if (label && label.toLowerCase() === labelToFind)\n return true;\n const alternateLabels = altUnitLabelsProvider?.getAlternateUnitLabels(unit);\n // check any alternate labels that may be defined for the Unit\n if (alternateLabels && alternateLabels.find((lbl) => lbl.toLowerCase() === labelToFind))\n return true;\n\n return false;\n });\n if (formatUnit)\n return formatUnit[0];\n }\n\n // now try to find a unit from the same family and system\n let foundUnit = await unitsProvider.findUnit(unitLabel, defaultUnit ? defaultUnit.phenomenon : undefined, defaultUnit ? defaultUnit.system : undefined);\n\n // if nothing found yet just limit to family\n if (!foundUnit.isValid && defaultUnit)\n foundUnit = await unitsProvider.findUnit(unitLabel, defaultUnit ? defaultUnit.phenomenon : undefined);\n return foundUnit;\n }\n\n /**\n * Get the output unit and all the conversion specs required to parse a given list of tokens.\n */\n private static async getRequiredUnitsConversionsToParseTokens(tokens: ParseToken[], format: Format, unitsProvider: UnitsProvider, altUnitLabelsProvider?: AlternateUnitLabelsProvider): Promise<{\n outUnit?: UnitProps;\n specs: UnitConversionSpec[];\n }> {\n let outUnit = (format.units && format.units.length > 0 ? format.units[0][0] : undefined);\n const unitConversions: UnitConversionSpec[] = [];\n const uniqueUnitLabels = [...new Set(tokens.filter((token) => token.isString).map((token) => token.value as string))];\n for (const label of uniqueUnitLabels) {\n const unitProps = await this.lookupUnitByLabel(label, format, unitsProvider, altUnitLabelsProvider);\n if (!outUnit) {\n // No default unit, assume that the first unit found is the desired output unit.\n outUnit = unitProps;\n }\n\n let spec = unitConversions.find((specB) => specB.name === unitProps.name);\n if (spec) {\n // Already in the list, just add the label.\n spec.parseLabels?.push(label.toLocaleLowerCase());\n } else {\n // Add new conversion to the list.\n const conversion = await unitsProvider.getConversion(unitProps, outUnit);\n if (conversion) {\n spec = {\n conversion,\n label: unitProps.label,\n system: unitProps.system,\n name: unitProps.name,\n parseLabels: [label.toLocaleLowerCase()],\n };\n unitConversions.push(spec);\n }\n }\n }\n\n return { outUnit, specs: unitConversions };\n }\n\n /**\n * Get the units information asynchronously, then convert the tokens into quantity using the synchronous tokens -> value.\n */\n private static async createQuantityFromParseTokens(tokens: ParseToken[], format: Format, unitsProvider: UnitsProvider, altUnitLabelsProvider?: AlternateUnitLabelsProvider): Promise<QuantityProps> {\n const unitConversionInfos = await this.getRequiredUnitsConversionsToParseTokens(tokens, format, unitsProvider, altUnitLabelsProvider);\n if (unitConversionInfos.outUnit) {\n const value = Parser.getQuantityValueFromParseTokens(tokens, format, unitConversionInfos.specs, await unitsProvider.getConversion(unitConversionInfos.outUnit, unitConversionInfos.outUnit));\n if (value.ok) {\n return new Quantity(unitConversionInfos.outUnit, value.value);\n }\n }\n\n return new Quantity();\n }\n\n /** Async method to generate a Quantity given a string that represents a quantity value and likely a unit label.\n * @param inString A string that contains text represent a quantity.\n * @param format Defines the likely format of inString.\n * @param unitsProvider required to look up units that may be specified in inString\n */\n public static async parseIntoQuantity(inString: string, format: Format, unitsProvider: UnitsProvider, altUnitLabelsProvider?: AlternateUnitLabelsProvider): Promise<QuantityProps> {\n const tokens: ParseToken[] = Parser.parseQuantitySpecification(inString, format);\n\n return Parser.createQuantityFromParseTokens(tokens, format, unitsProvider, altUnitLabelsProvider);\n }\n\n /** method to get the Unit Conversion given a unit label */\n private static tryFindUnitConversion(unitLabel: string, unitsConversions: UnitConversionSpec[], preferredUnit?: UnitProps): UnitConversionProps | undefined {\n if (unitsConversions.length > 0) {\n const label = unitLabel.toLocaleLowerCase();\n\n /* A preferred unit is used to target a unit if a unit label is used in more that one unit definition from the same unit family.\n * An example is if \"ft\" is used as the unitLabel and the preferredUnit is \"SURVEY_FT\" since that unit has an alternate label of \"ft\" the\n * conversion to \"SURVEY_FT\" is returned. If no preferredUnit is specified then the unit \"FT\" would likely to have been found first.\n * If \"in\" is the unit label and \"SURVEY_FT\" is the preferredUnit then conversion to \"SURVEY_IN\" would be returned.\n */\n if (preferredUnit) {\n // if there is a preferred unit defined see if unit label matched it or one of its alternates\n const preferredConversion = unitsConversions.find((conversion) => conversion.name === preferredUnit.name);\n if (preferredConversion && preferredConversion.parseLabels) {\n if (-1 !== preferredConversion.parseLabels.findIndex((lbl) => lbl === label))\n return preferredConversion.conversion;\n }\n // see if we can find a matching unitLabel in any unit within the same system as the preferred unit\n const preferredSystemConversions = unitsConversions.filter((conversion) => conversion.system === preferredUnit.system);\n for (const conversion of preferredSystemConversions) {\n if (conversion.parseLabels) {\n if (-1 !== conversion.parseLabels.findIndex((lbl) => lbl === label))\n return conversion.conversion;\n }\n }\n }\n\n // if no unit found based on preferredUnit see if an unit label matches\n for (const conversion of unitsConversions) {\n if (conversion.parseLabels) {\n if (-1 !== conversion.parseLabels.findIndex((lbl) => lbl === label))\n return conversion.conversion;\n } else {\n // eslint-disable-next-line no-console\n console.log(\"ERROR: Parser expects to find parseLabels array populate with all possible unit labels for the unit.\");\n }\n }\n }\n\n return undefined;\n }\n\n /**\n * Get what the unit conversion is for a unitless value.\n */\n private static getDefaultUnitConversion(tokens: ParseToken[], unitsConversions: UnitConversionSpec[], defaultUnit?: UnitProps) {\n let unitConversion = defaultUnit ? Parser.tryFindUnitConversion(defaultUnit.label, unitsConversions, defaultUnit) : undefined;\n if (!unitConversion) {\n // No default unit conversion, take the first valid unit.\n const uniqueUnitLabels = [...new Set(tokens.filter((token) => token.isString).map((token) => token.value as string))];\n for (const label of uniqueUnitLabels) {\n unitConversion = Parser.tryFindUnitConversion(label, unitsConversions, defaultUnit);\n if (unitConversion !== undefined)\n return unitConversion;\n }\n // if there were unique unit labels but not matched to any units, throw an error\n if (uniqueUnitLabels.length > 0) throw new QuantityError(QuantityStatus.UnitLabelSuppliedButNotMatched, `The unit label(s) ${uniqueUnitLabels.join(\", \")} could not be matched to a known unit.`);\n }\n return unitConversion;\n }\n\n // Get the next token pair to parse into a quantity.\n private static getNextTokenPair(index: number, tokens: ParseToken[]): ParseToken[] | undefined {\n if (index >= tokens.length)\n return;\n\n // 6 possible combination of token pair.\n // Stringified to ease comparison later.\n const validCombinations = [\n JSON.stringify([\"string\"]), // ['FT']\n JSON.stringify([\"string\", \"number\"]), // ['$', 5] unit specification comes before value (like currency)\n JSON.stringify([\"number\"]), // [5]\n JSON.stringify([\"number\", \"string\"]), // [5, 'FT']\n JSON.stringify([\"operator\", \"number\"]), // ['-', 5]\n JSON.stringify([\"operator\", \"number\", \"string\"]), // ['-', 5, 'FT']\n ];\n\n // Push up to 3 tokens in the list, if the length allows it.\n const maxNbrTokensInThePair = Math.min(tokens.length - index, 3);\n const tokenPair = tokens.slice(index, index + maxNbrTokensInThePair);\n const currentCombination = tokenPair.map((token) => token.isOperator ? \"operator\" : (token.isNumber ? \"number\" : \"string\"));\n\n // Check if the token pair is valid. If not, try again by removing the last token util empty.\n // Ex: ['5', 'FT', '7'] invalid => ['5', 'FT'] valid returned\n for (let i = currentCombination.length - 1; i >= 0; i--) {\n if (validCombinations.includes(JSON.stringify(currentCombination))) {\n break;\n } else {\n currentCombination.pop();\n tokenPair.pop();\n }\n }\n\n return tokenPair.length > 0 ? tokenPair : undefined;\n }\n\n /**\n * Accumulate the given list of tokens into a single quantity value. Formatting the tokens along the way.\n */\n private static getQuantityValueFromParseTokens(tokens: ParseToken[], format: Format, unitsConversions: UnitConversionSpec[], defaultUnitConversion?: UnitConversionProps): QuantityParseResult {\n if (tokens.length === 0)\n return { ok: false, error: ParseError.UnableToGenerateParseTokens };\n\n if (!format.allowMathematicOperations && Parser.isMathematicOperation(tokens))\n return { ok: false, error: ParseError.MathematicOperationFoundButIsNotAllowed };\n\n if (\n tokens.some((token) => token.isNumber && isNaN(token.value as number)) ||\n tokens.every((token) => token.isSpecialCharacter)\n ) {\n return { ok: false, error: ParseError.UnableToConvertParseTokensToQuantity };\n }\n\n const defaultUnit = format.units && format.units.length > 0 ? format.units[0][0] : undefined;\n try {\n defaultUnitConversion = defaultUnitConversion ? defaultUnitConversion : Parser.getDefaultUnitConversion(tokens, unitsConversions, defaultUnit);\n } catch (e) {\n // If we failed to get the default unit conversion, we need to return an error.\n if (e instanceof QuantityError && e.errorNumber === QuantityStatus.UnitLabelSuppliedButNotMatched)\n return { ok: false, error: ParseError.UnitLabelSuppliedButNotMatched };\n }\n\n if (format.type === FormatType.Bearing && format.units !== undefined && format.units.length > 0) {\n const units = format.units;\n const desiredNumberOfTokens = units.length;\n if (tokens.length < desiredNumberOfTokens && tokens[0].isNumber && desiredNumberOfTokens <= 3) {\n // handle the special XX.YYZZ format which is common for bearings. It uses no separators, so we need to split based on numeric indexes. We support up to 3 units\n const value: number = tokens[0].value as number;\n const firstToken = Math.floor(value);\n tokens.pop();\n tokens.push(new ParseToken(firstToken)); // Add the first token back to the list.\n if (desiredNumberOfTokens >= 2) {\n const remaining = (value - firstToken) * 100;\n const secondToken = Math.floor(remaining);\n tokens.push(new ParseToken(secondToken));\n if (desiredNumberOfTokens === 3) {\n const thirdToken = (remaining - secondToken) * 100;\n tokens.push(new ParseToken(thirdToken));\n }\n }\n }\n }\n\n let tokenPair: ParseToken[] | undefined;\n let increment: number = 1;\n let mag = 0.0;\n // The sign is saved outside from the loop for cases like this. '-1m 50cm 10mm + 2m 30cm 40mm' => -1.51m + 2.34m\n let sign: 1 | -1 = 1;\n let compositeUnitIndex = 0;\n\n for (let i = 0; i < tokens.length; i = i + increment) {\n tokenPair = this.getNextTokenPair(i, tokens);\n if (!tokenPair || tokenPair.length === 0) {\n return { ok: false, error: ParseError.UnableToConvertParseTokensToQuantity };\n }\n increment = tokenPair.length;\n\n // Keep the sign so its applied to the next tokens.\n if (tokenPair[0].isOperator) {\n sign = tokenPair[0].value === Operator.addition ? 1 : -1;\n tokenPair.shift();\n compositeUnitIndex = 0; // Reset the composite unit index, the following tokens begin from start.\n }\n\n // unit specification comes before value (like currency)\n if (tokenPair.length === 2 && tokenPair[0].isString) {\n // Invert it so the currency sign comes second.\n tokenPair = [tokenPair[1], tokenPair[0]];\n }\n\n if (tokenPair[0].isNumber) {\n let value = sign * (tokenPair[0].value as number);\n let conversion: UnitConversionProps | undefined;\n if (tokenPair.length === 2 && tokenPair[1].isString) {\n conversion = Parser.tryFindUnitConversion(tokenPair[1].value as string, unitsConversions, defaultUnit);\n }\n if (!conversion) {\n if (compositeUnitIndex > 0 && format.units && format.units.length > compositeUnitIndex) {\n // if this is not the first token, and we have a composite spec, look up the unit from the current index\n const presUnitAtIndex = format.units[compositeUnitIndex][0];\n conversion = Parser.tryFindUnitConversion(presUnitAtIndex.label, unitsConversions, presUnitAtIndex);\n } else if (defaultUnitConversion) {\n conversion = defaultUnitConversion;\n }\n }\n if (conversion) {\n value = applyConversion(value, conversion);\n }\n mag = mag + value;\n compositeUnitIndex++;\n } else {\n // only the unit label was specified so assume magnitude of 0\n const conversion = Parser.tryFindUnitConversion(tokenPair[0].value as string, unitsConversions, defaultUnit);\n if (conversion === undefined) {\n // Unknown unit label\n return { ok: false, error: ParseError.NoValueOrUnitFoundInString };\n }\n }\n }\n\n return { ok: true, value: mag };\n }\n\n /** Method to generate a Quantity given a string that represents a quantity value.\n * @param inString A string that contains text represent a quantity.\n * @param parserSpec unit label if not explicitly defined by user. Must have matching entry in supplied array of unitsConversions.\n */\n public static parseQuantityString(inString: string, parserSpec: ParserSpec): QuantityParseResult {\n // ensure any labels defined in composite unit definition are specified in unitConversions\n if (parserSpec.format.units) {\n parserSpec.format.units.forEach(([unit, label]) => {\n if (label) {\n if (unit.label !== label) { // if default unit label does not match composite label ensure the label is in the list of parse labels for the conversion\n const unitConversion = parserSpec.unitConversions.find((conversion) => conversion.name === unit.name);\n if (unitConversion && unitConversion.parseLabels && !unitConversion.parseLabels.find((entry) => entry === label))\n unitConversion.parseLabels.push(label);\n }\n }\n });\n }\n\n if (parserSpec.format.type === FormatType.Bearing) {\n return this.parseBearingFormat(inString, parserSpec);\n }\n if (parserSpec.format.type === FormatType.Azimuth) {\n return this.parseAzimuthFormat(inString, parserSpec);\n }\n\n if (parserSpec.format.type === FormatType.Ratio) {\n return this.parseRatioFormat(inString, parserSpec);\n }\n\n return this.parseAndProcessTokens(inString, parserSpec.format, parserSpec.unitConversions);\n }\n\n /** Method to generate a Quantity given a string that represents a quantity value and likely a unit label.\n * @param inString A string that contains text represent a quantity.\n * @param format Defines the likely format of inString. Primary unit serves as a default unit if no unit label found in string.\n * @param unitsConversions dictionary of conversions used to convert from unit used in inString to output quantity\n * @deprecated in 4.10 - will not be removed until after 2026-06-13. Check [[Parser.parseQuantityString]] for replacements.\n */\n public static parseToQuantityValue(inString: string, format: Format, unitsConversions: UnitConversionSpec[]): QuantityParseResult {\n // TODO: This method is not able to do bearing and azimuth formatting and is overlapping with parseQuantityString.\n // We should consider deprecating and removing it, there do not seem to be any upstream callers at this moment\n\n // ensure any labels defined in composite unit definition are specified in unitConversions\n if (format.units) {\n format.units.forEach(([unit, label]) => {\n if (label) {\n if (unit.label !== label) { // if default unit label does not match composite label ensure the label is in the list of parse labels for the conversion\n const unitConversion = unitsConversions.find((conversion) => conversion.name === unit.name);\n if (unitConversion && unitConversion.parseLabels && !unitConversion.parseLabels.find((entry) => entry === label))\n unitConversion.parseLabels.push(label);\n }\n }\n });\n }\n\n if (format.type === FormatType.Bearing || format.type === FormatType.Azimuth || format.type === FormatType.Ratio) {\n // throw error indicating to call parseQuantityString instead\n throw new QuantityError(QuantityStatus.UnsupportedUnit, `Bearing, Azimuth or Ratio format must be parsed using a ParserSpec. Call parseQuantityString instead.`);\n }\n\n return this.parseAndProcessTokens(inString, format, unitsConversions);\n }\n\n /** The value of special direction is always in degrees, try to find the unit conversion for that. */\n private static processSpecialBearingDirection(mag: number, spec: ParserSpec): QuantityParseResult {\n const specialDirUnit = spec.unitConversions.find((unitConversion) => unitConversion.name === \"Units.ARC_DEG\");\n if (!specialDirUnit)\n return { ok: false, error: ParseError.UnknownUnit };\n const preferredUnit = spec.outUnit;\n const conversion = this.tryFindUnitConversion(specialDirUnit.label, spec.unitConversions, preferredUnit);\n if (!conversion) return { ok: true, value: mag };\n return { ok: true, value: applyConversion(mag, conversion) };\n }\n\n private static parseBearingFormat(inString: string, spec: ParserSpec): QuantityParseResult {\n const specialDirections: Record<string, number> = {\n n: 0,\n ne: 45,\n e: 90,\n se: 135,\n s: 180,\n sw: 225,\n w: 270,\n nw: 315,\n };\n\n // TODO: at some point we will want to open this for localization, in the first release it's going to be hard coded\n enum DirectionLabel {\n North = \"N\",\n South = \"S\",\n East = \"E\",\n West = \"W\"\n }\n let matchedPrefix: DirectionLabel | null = null;\n let matchedSuffix: DirectionLabel | null = null;\n\n // check if input string begins with northLabel or southLabel and strip it off\n if (inString.toUpperCase().startsWith(DirectionLabel.North)) {\n inString = inString.substring(DirectionLabel.North.length);\n matchedPrefix = DirectionLabel.North;\n } else if (inString.toUpperCase().startsWith(DirectionLabel.South)) {\n inString = inString.substring(DirectionLabel.South.length);\n matchedPrefix = DirectionLabel.South;\n }\n\n // check if input string ends with eastLabel or westLabel (case-insensitive) and strip it off\n if (inString.toUpperCase().endsWith(DirectionLabel.East)) {\n inString = inString.substring(0, inString.length - DirectionLabel.East.length);\n matchedSuffix = DirectionLabel.East;\n } else if (inString.toUpperCase().endsWith(DirectionLabel.West)) {\n inString = inString.substring(0, inString.length - DirectionLabel.West.length);\n matchedSuffix = DirectionLabel.West;\n }\n\n // check if the remaining string is a special direction\n if (inString.trim() === \"\") {\n const prefix = matchedPrefix?.toLowerCase() || \"\";\n const suffix = matchedSuffix?.toLowerCase() || \"\";\n const specialDirection = specialDirections[`${prefix}${suffix}`];\n if (specialDirection !== undefined)\n return this.processSpecialBearingDirection(specialDirection, spec);\n }\n\n if (matchedPrefix === null || matchedSuffix === null) {\n return { ok: false, error: ParseError.BearingPrefixOrSuffixMissing };\n }\n\n const parsedResult = this.parseAndProcessTokens(inString, spec.format, spec.unitConversions);\n if (this.isParseError(parsedResult)) {\n return parsedResult;\n }\n const revolution = this.getRevolution(spec);\n const quarterRevolution = revolution / 4;\n\n let magnitude = parsedResult.value;\n if (magnitude < -quarterRevolution || magnitude > quarterRevolution) {\n return { ok: false, error: ParseError.BearingAngleOutOfRange };\n }\n\n // we have to turn the value into an east base and counter clockwise (NW and SE are already counter clockwise)\n if (matchedPrefix === DirectionLabel.North) {\n if (matchedSuffix === DirectionLabel.West) {\n magnitude = revolution - magnitude;\n }\n } else if (matchedPrefix === DirectionLabel.South) {\n if (matchedSuffix === DirectionLabel.West) {\n magnitude = (2 * quarterRevolution) + magnitude;\n } else if (matchedSuffix === DirectionLabel.East) {\n magnitude = (2 * quarterRevolution) - magnitude;\n }\n }\n magnitude = this.normalizeAngle(magnitude, revolution);\n\n return { ok: true, value: magnitude };\n }\n\n private static parseAzimuthFormat(inString: string, spec: ParserSpec): QuantityParseResult {\n const parsedResult = this.parseAndProcessTokens(inString, spec.format, spec.unitConversions);\n if (this.isParseError(parsedResult)) {\n return parsedResult;\n }\n\n let magnitude = parsedResult.value;\n\n const revolution = this.getRevolution(spec);\n magnitude = this.normalizeAngle(magnitude, revolution);\n let azimuthBase = 0.0;\n if (spec.format.azimuthBase !== undefined) {\n if (spec.azimuthBaseConversion === undefined) {\n throw new QuantityError(QuantityStatus.MissingRequiredProperty, `Missing azimuth base conversion for interpreting ${spec.format.name}'s azimuth base.`);\n }\n const azBaseQuantity: Quantity = new Quantity(spec.format.azimuthBaseUnit, spec.format.azimuthBase);\n const azBaseConverted = azBaseQuantity.convertTo(spec.outUnit, spec.azimuthBaseConversion);\n if (azBaseConverted === undefined || !azBaseConverted.isValid) {\n throw new QuantityError(QuantityStatus.UnsupportedUnit, `Failed to convert azimuth base unit to ${spec.outUnit.name}.`);\n }\n azimuthBase = this.normalizeAngle(azBaseConverted.magnitude, revolution);\n }\n const inputIsClockwise = spec.format.azimuthClockwiseOrDefault;\n\n if (inputIsClockwise && azimuthBase === 0) {\n // parsed result already has the same base and orientation as our desired output\n return parsedResult;\n }\n\n if (inputIsClockwise)\n magnitude = azimuthBase + magnitude;\n else\n magnitude = azimuthBase - magnitude;\n\n magnitude = this.normalizeAngle(magnitude, revolution);\n\n return { ok: true, value: magnitude };\n }\n\n private static parseRatioFormat(inString: string, spec: ParserSpec): QuantityParseResult {\n if (!inString)\n return { ok: false, error: ParseError.NoValueOrUnitFoundInString };\n\n const parts = inString.split(\":\");\n if (parts.length > 2)\n return { ok: false, error: ParseError.UnableToConvertParseTokensToQuantity };\n\n const numerator = parseFloat(parts[0]);\n let denominator;\n if (parts.length === 1) {\n denominator = 1.0;\n } else {\n denominator = parseFloat(parts[1]);\n }\n\n if (isNaN(numerator) || isNaN(denominator))\n return { ok: false, error: ParseError.NoValueOrUnitFoundInString };\n\n const defaultUnit = spec.format.units && spec.format.units.length > 0 ? spec.format.units[0][0] : undefined;\n const unitConversion = defaultUnit ? Parser.tryFindUnitConversion(defaultUnit.label, spec.unitConversions, defaultUnit) : undefined;\n\n if (!unitConversion) {\n throw new QuantityError(QuantityStatus.MissingRequiredProperty, `Missing input unit or unit conversion for interpreting ${spec.format.name}.`);\n }\n\n if (denominator === 0) {\n if (unitConversion.inversion && numerator === 1)\n return { ok: true, value: 0.0 };\n else\n return { ok: false, error: ParseError.MathematicOperationFoundButIsNotAllowed };\n }\n\n let quantity: Quantity;\n if (spec.format.units && spec.outUnit) {\n quantity = new Quantity(spec.format.units[0][0], numerator / denominator);\n } else {\n throw new QuantityError(QuantityStatus.MissingRequiredProperty, \"Missing presentation unit or persistence unit for ratio format.\");\n }\n\n let converted: Quantity | undefined;\n try {\n converted = quantity.convertTo(spec.outUnit, unitConversion);\n } catch (err) {\n // for input of \"0:N\" with reversed unit\n if (err instanceof QuantityError && err.errorNumber === QuantityStatus.InvertingZero) {\n return { ok: false, error: ParseError.MathematicOperationFoundButIsNotAllowed };\n }\n }\n\n if (converted === undefined || !converted.isValid) {\n throw new QuantityError(QuantityStatus.UnsupportedUnit, `Failed to convert from ${spec.format.units[0][0].name} to ${spec.outUnit.name} On format ${spec.format.name}.`);\n }\n\n return { ok: true, value: converted.magnitude };\n }\n\n // TODO: The following two methods are redundant with Formatter. We should consider consolidating them.\n private static normalizeAngle(magnitude: number, revolution: number): number {\n magnitude = magnitude % revolution; // Strip anything that goes around more than once\n\n if (magnitude < 0) // If the value is negative, we want to normalize it to a positive angle\n magnitude += revolution;\n\n return magnitude;\n }\n\n private static getRevolution(spec: ParserSpec): number {\n if (spec.revolutionConversion === undefined) {\n throw new QuantityError(QuantityStatus.MissingRequiredProperty, `Missing revolution unit conversion for calculating ${spec.format.name}'s revolution.`);\n }\n\n const revolution: Quantity = new Quantity(spec.format.revolutionUnit, 1.0);\n const converted = revolution.convertTo(spec.outUnit, spec.revolutionConversion);\n if (converted === undefined || !converted.isValid) {\n throw new QuantityError(QuantityStatus.UnsupportedUnit, `Failed to convert revolution unit to ${spec.outUnit.name} On format ${spec.format.name}.`);\n }\n\n return converted.magnitude;\n }\n\n private static parseAndProcessTokens(inString: string, format: Format, unitsConversions: UnitConversionSpec[]): QuantityParseResult {\n const tokens: ParseToken[] = Parser.parseQuantitySpecification(inString, format);\n if (Parser._log) {\n // eslint-disable-next-line no-console\n console.log(`Parse tokens`);\n let i = 0;\n for (const token of tokens) {\n // eslint-disable-next-line no-console\n console.log(` [${i++}] isNumber=${token.isNumber} isString=${token.isString} token=${token.value}`);\n }\n }\n\n return Parser.getQuantityValueFromParseTokens(tokens, format, unitsConversions);\n }\n\n /** Async Method used to create an array of UnitConversionSpec entries that can be used in synchronous calls to parse units. */\n public static async createUnitConversionSpecsForUnit(unitsProvider: UnitsProvider, outUnit: UnitProps, altUnitLabelsProvider?: AlternateUnitLabelsProvider): Promise<UnitConversionSpec[]> {\n const unitConversionSpecs: UnitConversionSpec[] = [];\n\n const familyUnits = await unitsProvider.getUnitsByFamily(outUnit.phenomenon);\n for (const unit of familyUnits) {\n const conversion = await unitsProvider.getConversion(unit, outUnit);\n const parseLabels: string[] = [unit.label.toLocaleLowerCase()];\n const alternateLabels = altUnitLabelsProvider?.getAlternateUnitLabels(unit);\n // add any alternate labels that may be defined for the Unit\n if (alternateLabels) {\n alternateLabels.forEach((label: string) => {\n const potentialLabel = label.toLocaleLowerCase();\n if (-1 === parseLabels.findIndex((lbl) => lbl === potentialLabel))\n parseLabels.push(label.toLocaleLowerCase());\n });\n }\n\n unitConversionSpecs.push({\n name: unit.name,\n label: unit.label,\n conversion,\n parseLabels,\n system: unit.system,\n });\n }\n return unitConversionSpecs;\n }\n\n /** Async Method used to create an array of UnitConversionSpec entries that can be used in synchronous calls to parse units. */\n public static async createUnitConversionSpecs(unitsProvider: UnitsProvider, outUnitName: string, potentialParseUnits: PotentialParseUnit[], altUnitLabelsProvider?: AlternateUnitLabelsProvider): Promise<UnitConversionSpec[]> {\n const unitConversionSpecs: UnitConversionSpec[] = [];\n\n const outUnit = await unitsProvider.findUnitByName(outUnitName);\n if (!outUnit || !outUnit.name || 0 === outUnit.name.length) {\n // eslint-disable-next-line no-console\n console.log(`[Parser.createUnitConversionSpecs] ERROR: Unable to locate out unit ${outUnitName}.`);\n return unitConversionSpecs;\n }\n\n for (const potentialParseUnit of potentialParseUnits) {\n const unit = await unitsProvider.findUnitByName(potentialParseUnit.unitName);\n if (!unit || !unit.name || 0 === unit.name.length) {\n // eslint-disable-next-line no-console\n console.log(`[Parser.createUnitConversionSpecs] ERROR: Unable to locate potential unit ${potentialParseUnit.unitName}.`);\n continue;\n }\n\n const conversion = await unitsProvider.getConversion(unit, outUnit);\n const parseLabels: string[] = [unit.label.toLocaleLowerCase()];\n const alternateLabels = altUnitLabelsProvider?.getAlternateUnitLabels(unit);\n // add any alternate labels that may be defined for the Unit\n if (alternateLabels) {\n alternateLabels.forEach((label: string) => {\n const potentialLabel = label.toLocaleLowerCase();\n if (-1 === parseLabels.findIndex((lbl) => lbl === potentialLabel))\n parseLabels.push(label.toLocaleLowerCase());\n });\n }\n\n // add any alternate labels that where provided by caller\n if (potentialParseUnit.altLabels) {\n potentialParseUnit.altLabels.forEach((label: string) => {\n const potentialLabel = label.toLocaleLowerCase();\n if (-1 === parseLabels.findIndex((lbl) => lbl === potentialLabel))\n parseLabels.push(label.toLocaleLowerCase());\n });\n }\n unitConversionSpecs.push({\n name: unit.name,\n label: unit.label,\n conversion,\n parseLabels,\n system: unit.system,\n });\n }\n return unitConversionSpecs;\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@itwin/core-quantity",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.4.0-dev.3",
|
|
4
4
|
"description": "Quantity parsing, formatting and conversions for iModel.js",
|
|
5
5
|
"main": "lib/cjs/core-quantity.js",
|
|
6
6
|
"module": "lib/esm/core-quantity.js",
|
|
@@ -28,11 +28,11 @@
|
|
|
28
28
|
"rimraf": "^6.0.1",
|
|
29
29
|
"typescript": "~5.6.2",
|
|
30
30
|
"vitest": "^3.0.6",
|
|
31
|
-
"@itwin/build-tools": "5.
|
|
32
|
-
"@itwin/core-bentley": "5.
|
|
31
|
+
"@itwin/build-tools": "5.4.0-dev.3",
|
|
32
|
+
"@itwin/core-bentley": "5.4.0-dev.3"
|
|
33
33
|
},
|
|
34
34
|
"peerDependencies": {
|
|
35
|
-
"@itwin/core-bentley": "5.
|
|
35
|
+
"@itwin/core-bentley": "5.4.0-dev.3"
|
|
36
36
|
},
|
|
37
37
|
"scripts": {
|
|
38
38
|
"build": "npm run -s build:cjs && npm run -s build:esm",
|