@itwin/core-frontend 5.7.0-dev.15 → 5.7.0-dev.17

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.
Files changed (34) hide show
  1. package/CHANGELOG.md +8 -1
  2. package/lib/cjs/GeoServices.js +1 -1
  3. package/lib/cjs/GeoServices.js.map +1 -1
  4. package/lib/cjs/common/gltf/GltfParser.js +1 -1
  5. package/lib/cjs/common/gltf/GltfParser.js.map +1 -1
  6. package/lib/cjs/internal/tile/MeshoptCompression.js +1 -1
  7. package/lib/cjs/internal/tile/MeshoptCompression.js.map +1 -1
  8. package/lib/cjs/internal/tile/PntsReader.js +1 -1
  9. package/lib/cjs/internal/tile/PntsReader.js.map +1 -1
  10. package/lib/cjs/internal/tile/RealityTileLoader.d.ts.map +1 -1
  11. package/lib/cjs/internal/tile/RealityTileLoader.js +26 -5
  12. package/lib/cjs/internal/tile/RealityTileLoader.js.map +1 -1
  13. package/lib/cjs/tile/GltfReader.d.ts +4 -2
  14. package/lib/cjs/tile/GltfReader.d.ts.map +1 -1
  15. package/lib/cjs/tile/GltfReader.js +55 -5
  16. package/lib/cjs/tile/GltfReader.js.map +1 -1
  17. package/lib/esm/GeoServices.js +1 -1
  18. package/lib/esm/GeoServices.js.map +1 -1
  19. package/lib/esm/common/gltf/GltfParser.js +1 -1
  20. package/lib/esm/common/gltf/GltfParser.js.map +1 -1
  21. package/lib/esm/internal/tile/MeshoptCompression.js +1 -1
  22. package/lib/esm/internal/tile/MeshoptCompression.js.map +1 -1
  23. package/lib/esm/internal/tile/PntsReader.js +1 -1
  24. package/lib/esm/internal/tile/PntsReader.js.map +1 -1
  25. package/lib/esm/internal/tile/RealityTileLoader.d.ts.map +1 -1
  26. package/lib/esm/internal/tile/RealityTileLoader.js +26 -5
  27. package/lib/esm/internal/tile/RealityTileLoader.js.map +1 -1
  28. package/lib/esm/tile/GltfReader.d.ts +4 -2
  29. package/lib/esm/tile/GltfReader.d.ts.map +1 -1
  30. package/lib/esm/tile/GltfReader.js +55 -5
  31. package/lib/esm/tile/GltfReader.js.map +1 -1
  32. package/lib/public/scripts/parse-imdl-worker.js +1 -1
  33. package/lib/workers/webpack/parse-imdl-worker.js +1 -1
  34. package/package.json +20 -20
package/CHANGELOG.md CHANGED
@@ -1,6 +1,13 @@
1
1
  # Change Log - @itwin/core-frontend
2
2
 
3
- This log was last generated on Fri, 13 Feb 2026 17:13:15 GMT and should not be manually modified.
3
+ This log was last generated on Thu, 26 Feb 2026 22:16:25 GMT and should not be manually modified.
4
+
5
+ ## 5.6.2
6
+ Thu, 26 Feb 2026 22:14:46 GMT
7
+
8
+ ### Updates
9
+
10
+ - Support geometry collection for reality meshes with glTF tiles
4
11
 
5
12
  ## 5.6.1
6
13
  Fri, 13 Feb 2026 17:11:47 GMT
@@ -103,7 +103,7 @@ class CoordinateConverter {
103
103
  this._cache.set(requests[j], results[j]);
104
104
  }
105
105
  }).catch((err) => {
106
- core_bentley_1.Logger.logException(`${FrontendLoggerCategory_1.FrontendLoggerCategory.Package}.geoservices`, err);
106
+ core_bentley_1.Logger.logError(`${FrontendLoggerCategory_1.FrontendLoggerCategory.Package}.geoservices`, err);
107
107
  });
108
108
  promises.push(promise);
109
109
  }
@@ -1 +1 @@
1
- {"version":3,"file":"GeoServices.js","sourceRoot":"","sources":["../../src/GeoServices.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module IModelConnection\r\n */\r\n\r\n// cspell:ignore GCRS\r\nimport {\r\n assert, BeEvent, Dictionary, Logger, SortedArray,\r\n} from \"@itwin/core-bentley\";\r\nimport { WritableXYAndZ, XYAndZ, XYZProps } from \"@itwin/core-geometry\";\r\nimport {\r\n GeoCoordinatesRequestProps, GeoCoordinatesResponseProps, GeoCoordStatus, GeographicCRSProps, IModelCoordinatesRequestProps, IModelCoordinatesResponseProps,\r\n IModelReadRpcInterface, PointWithStatus,\r\n} from \"@itwin/core-common\";\r\nimport { IModelConnection } from \"./IModelConnection\";\r\nimport { FrontendLoggerCategory } from \"./common/FrontendLoggerCategory\";\r\n\r\n/** Options used to create a [[CoordinateConverter]].\r\n * @internal exported strictly for tests.\r\n */\r\nexport interface CoordinateConverterOptions {\r\n isIModelClosed: () => boolean;\r\n /** Asynchronously convert each point. The resultant array should have the same number and order of points as the input. */\r\n requestPoints: (points: XYAndZ[]) => Promise<PointWithStatus[]>;\r\n /** Maximum number of points to include in each request. Default: 300. */\r\n maxPointsPerRequest?: number;\r\n}\r\n\r\nfunction compareXYAndZ(lhs: XYAndZ, rhs: XYAndZ): number {\r\n return lhs.x - rhs.x || lhs.y - rhs.y || lhs.z - rhs.z;\r\n}\r\n\r\nfunction cloneXYAndZ(xyz: XYAndZ): XYAndZ {\r\n return { x: xyz.x, y: xyz.y, z: xyz.z };\r\n}\r\n\r\ntype CoordinateConverterState =\r\n // No pending requests.\r\n \"idle\" |\r\n // We have scheduled a requestAnimationFrame to dispatch all pending requests.\r\n \"scheduled\" |\r\n // We have dispatched all requests that were pending at the most recent requestAnimationFrame callback.\r\n \"in-flight\";\r\n\r\n/** Performs conversion of coordinates from one coordinate system to another.\r\n * A [[GeoConverter]] has a pair of these for converting between iModel coordinates and geographic coordinates.\r\n * Uses a cache to avoid repeatedly requesting the same points, and a batching strategy to avoid making frequent small requests.\r\n * The cache stores every point that was ever converted by [[convert]]. It is currently permitted to grow to unbounded size.\r\n * The batching works as follows:\r\n * When a conversion is requested via [[convert]], if all the requested points are in the cache, they are returned immediately.\r\n * Otherwise, any points not in the cache and not in the current in-flight request (if any) are placed onto the queue of pending requests.\r\n * A pending request is scheduled if one hasn't already been scheduled, via requestAnimationFrame.\r\n * In the animation frame callback, the pending requests are split into batches of no more than options.maxPointsPerRequest and dispatched to the backend.\r\n * Once the response is received, the results are loaded into and returned from the cache.\r\n * If more calls to convert occurred while the request was in flight, another request is dispatched.\r\n * @internal exported strictly for tests.\r\n */\r\nexport class CoordinateConverter {\r\n protected readonly _cache: Dictionary<XYAndZ, PointWithStatus>;\r\n protected _state: CoordinateConverterState = \"idle\";\r\n // The accumulated set of points to be converted by the next request.\r\n protected _pending: SortedArray<XYAndZ>;\r\n // The set of points that were included in the current in-flight request, if any.\r\n protected _inflight: SortedArray<XYAndZ>;\r\n // An event fired when the next request completes.\r\n protected _onCompleted = new BeEvent<() => void>();\r\n // Used for creating cache keys (XYAndZ) from XYZProps without having to allocate temporary objects.\r\n protected readonly _scratchXYZ = { x: 0, y: 0, z: 0 };\r\n protected readonly _maxPointsPerRequest: number;\r\n protected readonly _isIModelClosed: () => boolean;\r\n protected readonly _requestPoints: (points: XYAndZ[]) => Promise<PointWithStatus[]>;\r\n // If true, [[dispatch]] will schedule another dispatch after it receives a response.\r\n // This is needed when all the points requested after the most recent dispatch were included in the currently-in-flight request -\r\n // _pending will be empty but new callers will be awaiting the results of the in-flight request.\r\n protected _redispatchOnCompletion = false;\r\n\r\n public get isIdle(): boolean {\r\n return \"idle\" === this._state;\r\n }\r\n\r\n protected toXYAndZ(input: XYZProps, output: WritableXYAndZ): XYAndZ {\r\n if (Array.isArray(input)) {\r\n output.x = input[0] ?? 0;\r\n output.y = input[1] ?? 0;\r\n output.z = input[2] ?? 0;\r\n } else {\r\n output.x = input.x ?? 0;\r\n output.y = input.y ?? 0;\r\n output.z = input.z ?? 0;\r\n }\r\n\r\n return output;\r\n }\r\n\r\n public constructor(opts: CoordinateConverterOptions) {\r\n this._maxPointsPerRequest = Math.max(1, opts.maxPointsPerRequest ?? 300);\r\n this._isIModelClosed = opts.isIModelClosed;\r\n this._requestPoints = opts.requestPoints;\r\n\r\n this._cache = new Dictionary<XYAndZ, PointWithStatus>(compareXYAndZ, cloneXYAndZ);\r\n this._pending = new SortedArray<XYAndZ>(compareXYAndZ, false, cloneXYAndZ);\r\n this._inflight = new SortedArray<XYAndZ>(compareXYAndZ, false, cloneXYAndZ);\r\n }\r\n\r\n protected async dispatch(): Promise<void> {\r\n assert(this._state === \"scheduled\");\r\n if (this._isIModelClosed() || this._pending.isEmpty) {\r\n this._state = \"idle\";\r\n this._onCompleted.raiseEvent();\r\n return;\r\n }\r\n\r\n this._state = \"in-flight\";\r\n\r\n // Ensure subsequently-enqueued requests listen for the *next* response to be received.\r\n const onCompleted = this._onCompleted;\r\n this._onCompleted = new BeEvent<() => void>();\r\n\r\n // Pending requests are now in flight. Start a new list of pending requests. It's cheaper to swap than to allocate new objects.\r\n const inflight = this._pending;\r\n this._pending = this._inflight;\r\n assert(this._pending.isEmpty);\r\n this._inflight = inflight;\r\n\r\n // Split requests if necessary to avoid requesting more than the maximum allowed number of points.\r\n const promises: Array<Promise<void>> = [];\r\n for (let i = 0; i < inflight.length; i += this._maxPointsPerRequest) {\r\n const requests = inflight.slice(i, i + this._maxPointsPerRequest).extractArray();\r\n const promise = this._requestPoints(requests).then((results) => {\r\n if (this._isIModelClosed())\r\n return;\r\n\r\n if (results.length !== requests.length)\r\n Logger.logError(`${FrontendLoggerCategory.Package}.geoservices`, `requested conversion of ${requests.length} points, but received ${results.length} points`);\r\n\r\n for (let j = 0; j < results.length; j++) {\r\n if (j < requests.length)\r\n this._cache.set(requests[j], results[j]);\r\n }\r\n }).catch((err) => {\r\n Logger.logException(`${FrontendLoggerCategory.Package}.geoservices`, err);\r\n });\r\n\r\n promises.push(promise);\r\n }\r\n\r\n await Promise.all(promises);\r\n\r\n assert(this._state === \"in-flight\");\r\n this._state = \"idle\";\r\n this._inflight.clear();\r\n\r\n // If any more pending conversions arrived while awaiting this request, schedule another request.\r\n if (!this._pending.isEmpty || this._redispatchOnCompletion) {\r\n this._redispatchOnCompletion = false;\r\n this.scheduleDispatch(); // eslint-disable-line @typescript-eslint/no-floating-promises\r\n }\r\n\r\n // Resolve promises of all callers who were awaiting this request.\r\n onCompleted.raiseEvent();\r\n }\r\n\r\n // Add any points not present in cache to pending request list.\r\n // Return the number of points present in cache.\r\n protected enqueue(points: XYZProps[]): number {\r\n let numInCache = 0;\r\n for (const point of points) {\r\n const xyz = this.toXYAndZ(point, this._scratchXYZ);\r\n if (this._cache.get(xyz))\r\n ++numInCache;\r\n else if (this._inflight.contains(xyz))\r\n this._redispatchOnCompletion = true;\r\n else\r\n this._pending.insert(xyz);\r\n }\r\n\r\n return numInCache;\r\n }\r\n\r\n // Obtain converted points from the cache. The assumption is that every point in `inputs` is already present in the cache.\r\n // Any point not present will be returned unconverted with an error status.\r\n protected getFromCache(inputs: XYZProps[]): PointWithStatus[] {\r\n const outputs: PointWithStatus[] = [];\r\n for (const input of inputs) {\r\n const xyz = this.toXYAndZ(input, this._scratchXYZ);\r\n let output = this._cache.get(xyz);\r\n if (!output)\r\n output = { p: { ...xyz }, s: GeoCoordStatus.CSMapError };\r\n\r\n outputs.push(output);\r\n }\r\n\r\n return outputs;\r\n }\r\n\r\n protected async scheduleDispatch(): Promise<void> {\r\n if (\"idle\" === this._state) {\r\n this._state = \"scheduled\";\r\n requestAnimationFrame(() => {\r\n this.dispatch(); // eslint-disable-line @typescript-eslint/no-floating-promises\r\n });\r\n }\r\n\r\n return new Promise((resolve) => {\r\n this._onCompleted.addOnce(() => resolve());\r\n });\r\n }\r\n\r\n public async convert(inputs: XYZProps[]): Promise<{ points: PointWithStatus[], fromCache: number }> {\r\n const fromCache = this.enqueue(inputs);\r\n assert(fromCache >= 0);\r\n assert(fromCache <= inputs.length);\r\n\r\n if (fromCache === inputs.length)\r\n return { points: this.getFromCache(inputs), fromCache };\r\n\r\n await this.scheduleDispatch();\r\n\r\n return { points: this.getFromCache(inputs), fromCache };\r\n }\r\n\r\n public findCached(inputs: XYZProps[]): CachedIModelCoordinatesResponseProps {\r\n const result: Array<PointWithStatus | undefined> = [];\r\n let missing: XYZProps[] | undefined;\r\n for (const input of inputs) {\r\n const key = this.toXYAndZ(input, this._scratchXYZ);\r\n const output = this._cache.get(key);\r\n result.push(output);\r\n if (!output) {\r\n if (!missing)\r\n missing = [];\r\n\r\n missing.push(input);\r\n }\r\n }\r\n\r\n return { result, missing };\r\n }\r\n}\r\n\r\n/** Response to a request to obtain imodel coordinates from cache.\r\n * @internal\r\n */\r\nexport interface CachedIModelCoordinatesResponseProps {\r\n /** An array of the same length as the input array, with undefined entries at indices corresponding to points not found in cache. */\r\n result: Array<PointWithStatus | undefined>;\r\n /** An array of points in the input array which were not found in the cache, or undefined if all points were found in the cache. */\r\n missing?: XYZProps[];\r\n}\r\n\r\n/** Options used to create a [[GeoConverter]].\r\n * @internal exported strictly for tests.\r\n */\r\nexport interface GeoConverterOptions {\r\n readonly datum: string;\r\n isIModelClosed: () => boolean;\r\n toIModelCoords: (request: IModelCoordinatesRequestProps) => Promise<PointWithStatus[]>;\r\n fromIModelCoords: (request: GeoCoordinatesRequestProps) => Promise<PointWithStatus[]>;\r\n}\r\n\r\n/** An object capable of communicating with the backend to convert between coordinates in a geographic coordinate system and coordinates in an [[IModelConnection]]'s own coordinate system.\r\n * @see [[GeoServices.getConverter]] to obtain a converter.\r\n * @see [GeographicCRS]($common) for more information about geographic coordinate reference systems.\r\n * @public\r\n */\r\nexport class GeoConverter {\r\n private readonly _geoToIModel: CoordinateConverter;\r\n private readonly _iModelToGeo: CoordinateConverter;\r\n /** Used for removing this converter from GeoServices' cache after all requests are completed.\r\n * @internal\r\n */\r\n public readonly onAllRequestsCompleted = new BeEvent<() => void>();\r\n\r\n /** @internal */\r\n constructor(opts: GeoConverterOptions) {\r\n const isIModelClosed = opts.isIModelClosed;\r\n this._geoToIModel = new CoordinateConverter({\r\n isIModelClosed,\r\n requestPoints: async (geoCoords: XYAndZ[]) => opts.toIModelCoords({ source: opts.datum, geoCoords }),\r\n });\r\n\r\n this._iModelToGeo = new CoordinateConverter({\r\n isIModelClosed,\r\n requestPoints: async (iModelCoords: XYAndZ[]) => opts.fromIModelCoords({ target: opts.datum, iModelCoords }),\r\n });\r\n }\r\n\r\n /** Convert the specified geographic coordinates into iModel coordinates. */\r\n public async convertToIModelCoords(geoPoints: XYZProps[]): Promise<PointWithStatus[]> {\r\n const result = await this.getIModelCoordinatesFromGeoCoordinates(geoPoints);\r\n return result.iModelCoords;\r\n }\r\n\r\n /** Convert the specified iModel coordinates into geographic coordinates. */\r\n public async convertFromIModelCoords(iModelCoords: XYZProps[]): Promise<PointWithStatus[]> {\r\n const result = await this.getGeoCoordinatesFromIModelCoordinates(iModelCoords);\r\n return result.geoCoords;\r\n }\r\n\r\n /** @internal */\r\n public async getIModelCoordinatesFromGeoCoordinates(geoPoints: XYZProps[]): Promise<IModelCoordinatesResponseProps> {\r\n const result = await this._geoToIModel.convert(geoPoints);\r\n this.checkCompletion();\r\n return {\r\n iModelCoords: result.points,\r\n fromCache: result.fromCache,\r\n };\r\n }\r\n\r\n /** @internal */\r\n public async getGeoCoordinatesFromIModelCoordinates(iModelPoints: XYZProps[]): Promise<GeoCoordinatesResponseProps> {\r\n const result = await this._iModelToGeo.convert(iModelPoints);\r\n this.checkCompletion();\r\n return {\r\n geoCoords: result.points,\r\n fromCache: result.fromCache,\r\n };\r\n }\r\n\r\n private checkCompletion(): void {\r\n if (this._geoToIModel.isIdle && this._iModelToGeo.isIdle)\r\n this.onAllRequestsCompleted.raiseEvent();\r\n }\r\n\r\n /** @internal */\r\n public getCachedIModelCoordinatesFromGeoCoordinates(geoPoints: XYZProps[]): CachedIModelCoordinatesResponseProps {\r\n return this._geoToIModel.findCached(geoPoints);\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport type GeoServicesOptions = Omit<GeoConverterOptions, \"datum\">;\r\n\r\n/** The Geographic Services available for an [[IModelConnection]].\r\n * @see [[IModelConnection.geoServices]] to obtain the GeoServices for a specific iModel.\r\n * @public\r\n */\r\nexport class GeoServices {\r\n private readonly _options: GeoServicesOptions;\r\n /** Each GeoConverter has its own independent request queue and cache of previously-converted points.\r\n * Some callers like RealityTileTree obtain a single GeoConverter and reuse it throughout their own lifetime. Therefore they benefit from both batching and caching, and\r\n * the cache gets deleted once the RealityTileTree becomes disused.\r\n *\r\n * Other callers like IModelConnection.spatialToCartographic obtain a new GeoConverter every time they need one, use it to convert a single point(!), and then discard the converter.\r\n * This entirely prevents batching - e.g., calling spatialToCartographic 20 times in one frame results in 20 http requests.\r\n * To address that, we cache each GeoConverter returned by getConverter until it has converted at least one point and has no further outstanding conversion requests.\r\n * In this way, the converter lives for as long as (and no longer than) any caller is awaiting conversion to/from its datum - it and its cache are deleted once it becomes disused.\r\n * This makes the coordinate caching generally less useful, but at least bounded - and maximizes batching of requests.\r\n */\r\n private readonly _cache = new Map<string, GeoConverter>();\r\n\r\n /** @internal */\r\n public constructor(options: GeoServicesOptions) {\r\n this._options = options;\r\n }\r\n\r\n /** @internal */\r\n public static createForIModel(iModel: IModelConnection): GeoServices {\r\n return new GeoServices({\r\n isIModelClosed: () => iModel.isClosed,\r\n toIModelCoords: async (request) => {\r\n const rpc = IModelReadRpcInterface.getClientForRouting(iModel.routingContext.token);\r\n const response = await rpc.getIModelCoordinatesFromGeoCoordinates(iModel.getRpcProps(), request);\r\n return response.iModelCoords;\r\n },\r\n fromIModelCoords: async (request) => {\r\n const rpc = IModelReadRpcInterface.getClientForRouting(iModel.routingContext.token);\r\n const response = await rpc.getGeoCoordinatesFromIModelCoordinates(iModel.getRpcProps(), request);\r\n return response.geoCoords;\r\n },\r\n });\r\n }\r\n\r\n /** Obtain a converter that can convert between a geographic coordinate system and the iModel's own coordinate system.\r\n * @param datumOrGCRS The name or JSON representation of the geographic coordinate system datum - for example, \"WGS84\".\r\n * @returns a converter, or `undefined` if the iModel is not open.\r\n * @note A [[BlankConnection]] has no connection to a backend, so it is never \"open\"; therefore it always returns `undefined`.\r\n */\r\n public getConverter(datumOrGCRS?: string | GeographicCRSProps): GeoConverter | undefined {\r\n if (this._options.isIModelClosed())\r\n return undefined;\r\n\r\n const datum = (typeof datumOrGCRS === \"object\" ? JSON.stringify(datumOrGCRS) : datumOrGCRS) ?? \"\";\r\n\r\n let converter = this._cache.get(datum);\r\n if (!converter) {\r\n converter = new GeoConverter({ ...this._options, datum });\r\n this._cache.set(datum, converter);\r\n\r\n converter.onAllRequestsCompleted.addOnce(() => {\r\n if (converter === this._cache.get(datum))\r\n this._cache.delete(datum);\r\n });\r\n }\r\n\r\n return converter;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"GeoServices.js","sourceRoot":"","sources":["../../src/GeoServices.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module IModelConnection\r\n */\r\n\r\n// cspell:ignore GCRS\r\nimport {\r\n assert, BeEvent, Dictionary, Logger, SortedArray,\r\n} from \"@itwin/core-bentley\";\r\nimport { WritableXYAndZ, XYAndZ, XYZProps } from \"@itwin/core-geometry\";\r\nimport {\r\n GeoCoordinatesRequestProps, GeoCoordinatesResponseProps, GeoCoordStatus, GeographicCRSProps, IModelCoordinatesRequestProps, IModelCoordinatesResponseProps,\r\n IModelReadRpcInterface, PointWithStatus,\r\n} from \"@itwin/core-common\";\r\nimport { IModelConnection } from \"./IModelConnection\";\r\nimport { FrontendLoggerCategory } from \"./common/FrontendLoggerCategory\";\r\n\r\n/** Options used to create a [[CoordinateConverter]].\r\n * @internal exported strictly for tests.\r\n */\r\nexport interface CoordinateConverterOptions {\r\n isIModelClosed: () => boolean;\r\n /** Asynchronously convert each point. The resultant array should have the same number and order of points as the input. */\r\n requestPoints: (points: XYAndZ[]) => Promise<PointWithStatus[]>;\r\n /** Maximum number of points to include in each request. Default: 300. */\r\n maxPointsPerRequest?: number;\r\n}\r\n\r\nfunction compareXYAndZ(lhs: XYAndZ, rhs: XYAndZ): number {\r\n return lhs.x - rhs.x || lhs.y - rhs.y || lhs.z - rhs.z;\r\n}\r\n\r\nfunction cloneXYAndZ(xyz: XYAndZ): XYAndZ {\r\n return { x: xyz.x, y: xyz.y, z: xyz.z };\r\n}\r\n\r\ntype CoordinateConverterState =\r\n // No pending requests.\r\n \"idle\" |\r\n // We have scheduled a requestAnimationFrame to dispatch all pending requests.\r\n \"scheduled\" |\r\n // We have dispatched all requests that were pending at the most recent requestAnimationFrame callback.\r\n \"in-flight\";\r\n\r\n/** Performs conversion of coordinates from one coordinate system to another.\r\n * A [[GeoConverter]] has a pair of these for converting between iModel coordinates and geographic coordinates.\r\n * Uses a cache to avoid repeatedly requesting the same points, and a batching strategy to avoid making frequent small requests.\r\n * The cache stores every point that was ever converted by [[convert]]. It is currently permitted to grow to unbounded size.\r\n * The batching works as follows:\r\n * When a conversion is requested via [[convert]], if all the requested points are in the cache, they are returned immediately.\r\n * Otherwise, any points not in the cache and not in the current in-flight request (if any) are placed onto the queue of pending requests.\r\n * A pending request is scheduled if one hasn't already been scheduled, via requestAnimationFrame.\r\n * In the animation frame callback, the pending requests are split into batches of no more than options.maxPointsPerRequest and dispatched to the backend.\r\n * Once the response is received, the results are loaded into and returned from the cache.\r\n * If more calls to convert occurred while the request was in flight, another request is dispatched.\r\n * @internal exported strictly for tests.\r\n */\r\nexport class CoordinateConverter {\r\n protected readonly _cache: Dictionary<XYAndZ, PointWithStatus>;\r\n protected _state: CoordinateConverterState = \"idle\";\r\n // The accumulated set of points to be converted by the next request.\r\n protected _pending: SortedArray<XYAndZ>;\r\n // The set of points that were included in the current in-flight request, if any.\r\n protected _inflight: SortedArray<XYAndZ>;\r\n // An event fired when the next request completes.\r\n protected _onCompleted = new BeEvent<() => void>();\r\n // Used for creating cache keys (XYAndZ) from XYZProps without having to allocate temporary objects.\r\n protected readonly _scratchXYZ = { x: 0, y: 0, z: 0 };\r\n protected readonly _maxPointsPerRequest: number;\r\n protected readonly _isIModelClosed: () => boolean;\r\n protected readonly _requestPoints: (points: XYAndZ[]) => Promise<PointWithStatus[]>;\r\n // If true, [[dispatch]] will schedule another dispatch after it receives a response.\r\n // This is needed when all the points requested after the most recent dispatch were included in the currently-in-flight request -\r\n // _pending will be empty but new callers will be awaiting the results of the in-flight request.\r\n protected _redispatchOnCompletion = false;\r\n\r\n public get isIdle(): boolean {\r\n return \"idle\" === this._state;\r\n }\r\n\r\n protected toXYAndZ(input: XYZProps, output: WritableXYAndZ): XYAndZ {\r\n if (Array.isArray(input)) {\r\n output.x = input[0] ?? 0;\r\n output.y = input[1] ?? 0;\r\n output.z = input[2] ?? 0;\r\n } else {\r\n output.x = input.x ?? 0;\r\n output.y = input.y ?? 0;\r\n output.z = input.z ?? 0;\r\n }\r\n\r\n return output;\r\n }\r\n\r\n public constructor(opts: CoordinateConverterOptions) {\r\n this._maxPointsPerRequest = Math.max(1, opts.maxPointsPerRequest ?? 300);\r\n this._isIModelClosed = opts.isIModelClosed;\r\n this._requestPoints = opts.requestPoints;\r\n\r\n this._cache = new Dictionary<XYAndZ, PointWithStatus>(compareXYAndZ, cloneXYAndZ);\r\n this._pending = new SortedArray<XYAndZ>(compareXYAndZ, false, cloneXYAndZ);\r\n this._inflight = new SortedArray<XYAndZ>(compareXYAndZ, false, cloneXYAndZ);\r\n }\r\n\r\n protected async dispatch(): Promise<void> {\r\n assert(this._state === \"scheduled\");\r\n if (this._isIModelClosed() || this._pending.isEmpty) {\r\n this._state = \"idle\";\r\n this._onCompleted.raiseEvent();\r\n return;\r\n }\r\n\r\n this._state = \"in-flight\";\r\n\r\n // Ensure subsequently-enqueued requests listen for the *next* response to be received.\r\n const onCompleted = this._onCompleted;\r\n this._onCompleted = new BeEvent<() => void>();\r\n\r\n // Pending requests are now in flight. Start a new list of pending requests. It's cheaper to swap than to allocate new objects.\r\n const inflight = this._pending;\r\n this._pending = this._inflight;\r\n assert(this._pending.isEmpty);\r\n this._inflight = inflight;\r\n\r\n // Split requests if necessary to avoid requesting more than the maximum allowed number of points.\r\n const promises: Array<Promise<void>> = [];\r\n for (let i = 0; i < inflight.length; i += this._maxPointsPerRequest) {\r\n const requests = inflight.slice(i, i + this._maxPointsPerRequest).extractArray();\r\n const promise = this._requestPoints(requests).then((results) => {\r\n if (this._isIModelClosed())\r\n return;\r\n\r\n if (results.length !== requests.length)\r\n Logger.logError(`${FrontendLoggerCategory.Package}.geoservices`, `requested conversion of ${requests.length} points, but received ${results.length} points`);\r\n\r\n for (let j = 0; j < results.length; j++) {\r\n if (j < requests.length)\r\n this._cache.set(requests[j], results[j]);\r\n }\r\n }).catch((err) => {\r\n Logger.logError(`${FrontendLoggerCategory.Package}.geoservices`, err);\r\n });\r\n\r\n promises.push(promise);\r\n }\r\n\r\n await Promise.all(promises);\r\n\r\n assert(this._state === \"in-flight\");\r\n this._state = \"idle\";\r\n this._inflight.clear();\r\n\r\n // If any more pending conversions arrived while awaiting this request, schedule another request.\r\n if (!this._pending.isEmpty || this._redispatchOnCompletion) {\r\n this._redispatchOnCompletion = false;\r\n this.scheduleDispatch(); // eslint-disable-line @typescript-eslint/no-floating-promises\r\n }\r\n\r\n // Resolve promises of all callers who were awaiting this request.\r\n onCompleted.raiseEvent();\r\n }\r\n\r\n // Add any points not present in cache to pending request list.\r\n // Return the number of points present in cache.\r\n protected enqueue(points: XYZProps[]): number {\r\n let numInCache = 0;\r\n for (const point of points) {\r\n const xyz = this.toXYAndZ(point, this._scratchXYZ);\r\n if (this._cache.get(xyz))\r\n ++numInCache;\r\n else if (this._inflight.contains(xyz))\r\n this._redispatchOnCompletion = true;\r\n else\r\n this._pending.insert(xyz);\r\n }\r\n\r\n return numInCache;\r\n }\r\n\r\n // Obtain converted points from the cache. The assumption is that every point in `inputs` is already present in the cache.\r\n // Any point not present will be returned unconverted with an error status.\r\n protected getFromCache(inputs: XYZProps[]): PointWithStatus[] {\r\n const outputs: PointWithStatus[] = [];\r\n for (const input of inputs) {\r\n const xyz = this.toXYAndZ(input, this._scratchXYZ);\r\n let output = this._cache.get(xyz);\r\n if (!output)\r\n output = { p: { ...xyz }, s: GeoCoordStatus.CSMapError };\r\n\r\n outputs.push(output);\r\n }\r\n\r\n return outputs;\r\n }\r\n\r\n protected async scheduleDispatch(): Promise<void> {\r\n if (\"idle\" === this._state) {\r\n this._state = \"scheduled\";\r\n requestAnimationFrame(() => {\r\n this.dispatch(); // eslint-disable-line @typescript-eslint/no-floating-promises\r\n });\r\n }\r\n\r\n return new Promise((resolve) => {\r\n this._onCompleted.addOnce(() => resolve());\r\n });\r\n }\r\n\r\n public async convert(inputs: XYZProps[]): Promise<{ points: PointWithStatus[], fromCache: number }> {\r\n const fromCache = this.enqueue(inputs);\r\n assert(fromCache >= 0);\r\n assert(fromCache <= inputs.length);\r\n\r\n if (fromCache === inputs.length)\r\n return { points: this.getFromCache(inputs), fromCache };\r\n\r\n await this.scheduleDispatch();\r\n\r\n return { points: this.getFromCache(inputs), fromCache };\r\n }\r\n\r\n public findCached(inputs: XYZProps[]): CachedIModelCoordinatesResponseProps {\r\n const result: Array<PointWithStatus | undefined> = [];\r\n let missing: XYZProps[] | undefined;\r\n for (const input of inputs) {\r\n const key = this.toXYAndZ(input, this._scratchXYZ);\r\n const output = this._cache.get(key);\r\n result.push(output);\r\n if (!output) {\r\n if (!missing)\r\n missing = [];\r\n\r\n missing.push(input);\r\n }\r\n }\r\n\r\n return { result, missing };\r\n }\r\n}\r\n\r\n/** Response to a request to obtain imodel coordinates from cache.\r\n * @internal\r\n */\r\nexport interface CachedIModelCoordinatesResponseProps {\r\n /** An array of the same length as the input array, with undefined entries at indices corresponding to points not found in cache. */\r\n result: Array<PointWithStatus | undefined>;\r\n /** An array of points in the input array which were not found in the cache, or undefined if all points were found in the cache. */\r\n missing?: XYZProps[];\r\n}\r\n\r\n/** Options used to create a [[GeoConverter]].\r\n * @internal exported strictly for tests.\r\n */\r\nexport interface GeoConverterOptions {\r\n readonly datum: string;\r\n isIModelClosed: () => boolean;\r\n toIModelCoords: (request: IModelCoordinatesRequestProps) => Promise<PointWithStatus[]>;\r\n fromIModelCoords: (request: GeoCoordinatesRequestProps) => Promise<PointWithStatus[]>;\r\n}\r\n\r\n/** An object capable of communicating with the backend to convert between coordinates in a geographic coordinate system and coordinates in an [[IModelConnection]]'s own coordinate system.\r\n * @see [[GeoServices.getConverter]] to obtain a converter.\r\n * @see [GeographicCRS]($common) for more information about geographic coordinate reference systems.\r\n * @public\r\n */\r\nexport class GeoConverter {\r\n private readonly _geoToIModel: CoordinateConverter;\r\n private readonly _iModelToGeo: CoordinateConverter;\r\n /** Used for removing this converter from GeoServices' cache after all requests are completed.\r\n * @internal\r\n */\r\n public readonly onAllRequestsCompleted = new BeEvent<() => void>();\r\n\r\n /** @internal */\r\n constructor(opts: GeoConverterOptions) {\r\n const isIModelClosed = opts.isIModelClosed;\r\n this._geoToIModel = new CoordinateConverter({\r\n isIModelClosed,\r\n requestPoints: async (geoCoords: XYAndZ[]) => opts.toIModelCoords({ source: opts.datum, geoCoords }),\r\n });\r\n\r\n this._iModelToGeo = new CoordinateConverter({\r\n isIModelClosed,\r\n requestPoints: async (iModelCoords: XYAndZ[]) => opts.fromIModelCoords({ target: opts.datum, iModelCoords }),\r\n });\r\n }\r\n\r\n /** Convert the specified geographic coordinates into iModel coordinates. */\r\n public async convertToIModelCoords(geoPoints: XYZProps[]): Promise<PointWithStatus[]> {\r\n const result = await this.getIModelCoordinatesFromGeoCoordinates(geoPoints);\r\n return result.iModelCoords;\r\n }\r\n\r\n /** Convert the specified iModel coordinates into geographic coordinates. */\r\n public async convertFromIModelCoords(iModelCoords: XYZProps[]): Promise<PointWithStatus[]> {\r\n const result = await this.getGeoCoordinatesFromIModelCoordinates(iModelCoords);\r\n return result.geoCoords;\r\n }\r\n\r\n /** @internal */\r\n public async getIModelCoordinatesFromGeoCoordinates(geoPoints: XYZProps[]): Promise<IModelCoordinatesResponseProps> {\r\n const result = await this._geoToIModel.convert(geoPoints);\r\n this.checkCompletion();\r\n return {\r\n iModelCoords: result.points,\r\n fromCache: result.fromCache,\r\n };\r\n }\r\n\r\n /** @internal */\r\n public async getGeoCoordinatesFromIModelCoordinates(iModelPoints: XYZProps[]): Promise<GeoCoordinatesResponseProps> {\r\n const result = await this._iModelToGeo.convert(iModelPoints);\r\n this.checkCompletion();\r\n return {\r\n geoCoords: result.points,\r\n fromCache: result.fromCache,\r\n };\r\n }\r\n\r\n private checkCompletion(): void {\r\n if (this._geoToIModel.isIdle && this._iModelToGeo.isIdle)\r\n this.onAllRequestsCompleted.raiseEvent();\r\n }\r\n\r\n /** @internal */\r\n public getCachedIModelCoordinatesFromGeoCoordinates(geoPoints: XYZProps[]): CachedIModelCoordinatesResponseProps {\r\n return this._geoToIModel.findCached(geoPoints);\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport type GeoServicesOptions = Omit<GeoConverterOptions, \"datum\">;\r\n\r\n/** The Geographic Services available for an [[IModelConnection]].\r\n * @see [[IModelConnection.geoServices]] to obtain the GeoServices for a specific iModel.\r\n * @public\r\n */\r\nexport class GeoServices {\r\n private readonly _options: GeoServicesOptions;\r\n /** Each GeoConverter has its own independent request queue and cache of previously-converted points.\r\n * Some callers like RealityTileTree obtain a single GeoConverter and reuse it throughout their own lifetime. Therefore they benefit from both batching and caching, and\r\n * the cache gets deleted once the RealityTileTree becomes disused.\r\n *\r\n * Other callers like IModelConnection.spatialToCartographic obtain a new GeoConverter every time they need one, use it to convert a single point(!), and then discard the converter.\r\n * This entirely prevents batching - e.g., calling spatialToCartographic 20 times in one frame results in 20 http requests.\r\n * To address that, we cache each GeoConverter returned by getConverter until it has converted at least one point and has no further outstanding conversion requests.\r\n * In this way, the converter lives for as long as (and no longer than) any caller is awaiting conversion to/from its datum - it and its cache are deleted once it becomes disused.\r\n * This makes the coordinate caching generally less useful, but at least bounded - and maximizes batching of requests.\r\n */\r\n private readonly _cache = new Map<string, GeoConverter>();\r\n\r\n /** @internal */\r\n public constructor(options: GeoServicesOptions) {\r\n this._options = options;\r\n }\r\n\r\n /** @internal */\r\n public static createForIModel(iModel: IModelConnection): GeoServices {\r\n return new GeoServices({\r\n isIModelClosed: () => iModel.isClosed,\r\n toIModelCoords: async (request) => {\r\n const rpc = IModelReadRpcInterface.getClientForRouting(iModel.routingContext.token);\r\n const response = await rpc.getIModelCoordinatesFromGeoCoordinates(iModel.getRpcProps(), request);\r\n return response.iModelCoords;\r\n },\r\n fromIModelCoords: async (request) => {\r\n const rpc = IModelReadRpcInterface.getClientForRouting(iModel.routingContext.token);\r\n const response = await rpc.getGeoCoordinatesFromIModelCoordinates(iModel.getRpcProps(), request);\r\n return response.geoCoords;\r\n },\r\n });\r\n }\r\n\r\n /** Obtain a converter that can convert between a geographic coordinate system and the iModel's own coordinate system.\r\n * @param datumOrGCRS The name or JSON representation of the geographic coordinate system datum - for example, \"WGS84\".\r\n * @returns a converter, or `undefined` if the iModel is not open.\r\n * @note A [[BlankConnection]] has no connection to a backend, so it is never \"open\"; therefore it always returns `undefined`.\r\n */\r\n public getConverter(datumOrGCRS?: string | GeographicCRSProps): GeoConverter | undefined {\r\n if (this._options.isIModelClosed())\r\n return undefined;\r\n\r\n const datum = (typeof datumOrGCRS === \"object\" ? JSON.stringify(datumOrGCRS) : datumOrGCRS) ?? \"\";\r\n\r\n let converter = this._cache.get(datum);\r\n if (!converter) {\r\n converter = new GeoConverter({ ...this._options, datum });\r\n this._cache.set(datum, converter);\r\n\r\n converter.onAllRequestsCompleted.addOnce(() => {\r\n if (converter === this._cache.get(datum))\r\n this._cache.delete(datum);\r\n });\r\n }\r\n\r\n return converter;\r\n }\r\n}\r\n"]}
@@ -274,7 +274,7 @@ class GltfParser {
274
274
  }
275
275
  catch (err) {
276
276
  core_bentley_1.Logger.logWarning(FrontendLoggerCategory_1.FrontendLoggerCategory.Render, "Failed to decode draco-encoded glTF mesh");
277
- core_bentley_1.Logger.logException(FrontendLoggerCategory_1.FrontendLoggerCategory.Render, err);
277
+ core_bentley_1.Logger.logError(FrontendLoggerCategory_1.FrontendLoggerCategory.Render, err);
278
278
  }
279
279
  }
280
280
  async _resolveResources() {
@@ -1 +1 @@
1
- {"version":3,"file":"GltfParser.js","sourceRoot":"","sources":["../../../../src/common/gltf/GltfParser.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Rendering\r\n */\r\n\r\nimport { ByteStream, JsonUtils, Logger, utf8ToString } from \"@itwin/core-bentley\";\r\nimport { Matrix3d, Point3d, Point4d, Transform } from \"@itwin/core-geometry\";\r\nimport { GlbHeader, ImageSource, TileFormat } from \"@itwin/core-common\";\r\nimport type { DracoLoader, DracoMesh } from \"@loaders.gl/draco\";\r\nimport { FrontendLoggerCategory } from \"../FrontendLoggerCategory\";\r\nimport { TextureImageSource } from \"../render/TextureParams\";\r\nimport {\r\n getImageSourceFormatForMimeType, imageBitmapFromImageSource, imageElementFromImageSource, tryImageElementFromUrl,\r\n} from \"../ImageUtil\";\r\nimport {\r\n DracoMeshCompression, getGltfNodeMeshIds, GltfAccessor, GltfBuffer, GltfBufferViewProps, GltfDictionary, gltfDictionaryIterator, GltfDocument, GltfId, GltfImage, GltfMesh, GltfMeshMode, GltfMeshPrimitive, GltfNode, traverseGltfNodes,\r\n} from \"./GltfSchema\";\r\nimport { Gltf } from \"./GltfModel\";\r\n\r\n/** @internal */\r\nexport interface ParseGltfLogger {\r\n log(message: string, type: \"error\" | \"warning\" | \"info\"): void;\r\n}\r\n\r\n/** Arguments supplied to [[parseGltf]].\r\n * @internal\r\n */\r\nexport interface ParseGltfArgs {\r\n logger?: ParseGltfLogger;\r\n gltf: Uint8Array | GltfDocument;\r\n noCreateImageBitmap?: boolean;\r\n baseUrl?: string;\r\n isCanceled?: boolean;\r\n upAxis?: \"y\" | \"z\"; // default \"y\"\r\n}\r\n\r\n/** Parse a [[GltfDocument]] or binary representation thereof to produce a [[Gltf.Model]].\r\n * This implementation is incomplete and not currently used.\r\n * @internal\r\n */\r\nexport async function parseGltf(args: ParseGltfArgs): Promise<Gltf.Model | undefined> {\r\n const source = args.gltf;\r\n let version: number;\r\n let json: GltfDocument;\r\n let binary: Uint8Array | undefined;\r\n\r\n if (source instanceof Uint8Array) {\r\n // It may be JSON - check for magic indicating glb.\r\n const buffer = ByteStream.fromUint8Array(source);\r\n if (TileFormat.Gltf !== buffer.readUint32()) {\r\n try {\r\n const utf8Json = utf8ToString(source);\r\n if (!utf8Json)\r\n return undefined;\r\n\r\n json = JSON.parse(utf8Json);\r\n version = 2;\r\n } catch {\r\n return undefined;\r\n }\r\n } else {\r\n buffer.reset();\r\n const header = new GlbHeader(buffer);\r\n if (!header.isValid)\r\n return undefined;\r\n\r\n version = header.version;\r\n if (header.binaryChunk)\r\n binary = new Uint8Array(source.buffer, source.byteOffset + header.binaryChunk.offset, header.binaryChunk.length);\r\n\r\n try {\r\n const jsonBytes = new Uint8Array(source.buffer, source.byteOffset + header.jsonChunk.offset, header.jsonChunk.length);\r\n const jsonStr = utf8ToString(jsonBytes);\r\n if (undefined === jsonStr)\r\n return undefined;\r\n\r\n json = JSON.parse(jsonStr);\r\n } catch {\r\n return undefined;\r\n }\r\n }\r\n } else {\r\n version = 2; // ###TODO verify against source.asset?.version\r\n json = source;\r\n }\r\n\r\n // asset is required in glTF 2, optional in glTF 1\r\n const asset = JsonUtils.asObject(json.asset);\r\n if (version === 2 && !asset)\r\n return undefined;\r\n\r\n const document: GltfDocument = {\r\n asset,\r\n scene: JsonUtils.asString(json.scene),\r\n extensions: JsonUtils.asObject(json.extensions),\r\n extensionsUsed: JsonUtils.asArray(json.extensionsUsed),\r\n extensionsRequired: JsonUtils.asArray(json.extensionsRequired),\r\n accessors: JsonUtils.asObject(json.accessors),\r\n buffers: JsonUtils.asObject(json.buffers),\r\n bufferViews: JsonUtils.asObject(json.bufferViews),\r\n images: JsonUtils.asObject(json.images),\r\n materials: JsonUtils.asObject(json.materials),\r\n meshes: JsonUtils.asObject(json.meshes),\r\n nodes: JsonUtils.asObject(json.nodes),\r\n samplers: JsonUtils.asObject(json.samplers),\r\n scenes: JsonUtils.asObject(json.scenes),\r\n textures: JsonUtils.asObject(json.textures),\r\n techniques: JsonUtils.asObject(json.techniques),\r\n };\r\n\r\n if (!document.meshes)\r\n return undefined;\r\n\r\n const logger = args.logger ?? {\r\n log: (message: string, type: \"error\" | \"warning\" | \"info\") => {\r\n const category = `${FrontendLoggerCategory.Package}.gltf`;\r\n const fn = type === \"error\" ? \"logError\" : (type === \"warning\" ? \"logWarning\" : \"logInfo\");\r\n Logger[fn](category, message);\r\n },\r\n };\r\n\r\n const parser = new GltfParser({\r\n document,\r\n version,\r\n upAxis: args.upAxis ?? \"y\",\r\n binary,\r\n baseUrl: args.baseUrl,\r\n logger,\r\n isCanceled: () => args.isCanceled ?? false,\r\n imageFromImageSource: (args.noCreateImageBitmap ?\r\n async (imgSrc) => imageElementFromImageSource(imgSrc) :\r\n async (imgSrc) => imageBitmapFromImageSource(imgSrc)),\r\n });\r\n\r\n return parser.parse();\r\n}\r\n\r\ninterface GltfParserOptions {\r\n document: GltfDocument;\r\n version: number;\r\n upAxis: \"y\" | \"z\";\r\n binary?: Uint8Array;\r\n baseUrl?: string;\r\n logger: ParseGltfLogger;\r\n imageFromImageSource: (source: ImageSource) => Promise<TextureImageSource>;\r\n isCanceled: () => boolean;\r\n}\r\n\r\ntype ParserBuffer = GltfBuffer & { resolvedBuffer?: Gltf.Buffer };\r\ntype ParserImage = GltfImage & { resolvedImage?: TextureImageSource };\r\n\r\nclass GltfParser {\r\n private readonly _version: number;\r\n private readonly _upAxis: \"y\" | \"z\";\r\n private readonly _baseUrl?: string;\r\n private readonly _logger: ParseGltfLogger;\r\n private readonly _isCanceled: () => boolean;\r\n private readonly _buffers: GltfDictionary<ParserBuffer>;\r\n private readonly _images: GltfDictionary<ParserImage>;\r\n private readonly _nodes: GltfDictionary<GltfNode>;\r\n private readonly _meshes: GltfDictionary<GltfMesh>;\r\n private readonly _accessors: GltfDictionary<GltfAccessor>;\r\n private readonly _sceneNodes: GltfId[];\r\n private readonly _bufferViews: GltfDictionary<GltfBufferViewProps>;\r\n private readonly _imageFromImageSource: (source: ImageSource) => Promise<TextureImageSource>;\r\n private readonly _dracoMeshes = new Map<DracoMeshCompression, DracoMesh>();\r\n\r\n public constructor(options: GltfParserOptions) {\r\n this._version = options.version;\r\n this._upAxis = options.upAxis;\r\n this._baseUrl = options.baseUrl;\r\n this._logger = options.logger;\r\n this._isCanceled = options.isCanceled;\r\n this._imageFromImageSource = options.imageFromImageSource;\r\n\r\n const emptyDict = { };\r\n const doc = options.document;\r\n this._buffers = doc.buffers ?? emptyDict;\r\n this._images = doc.images ?? emptyDict;\r\n this._nodes = doc.nodes ?? emptyDict;\r\n this._meshes = doc.meshes ?? emptyDict;\r\n this._bufferViews = doc.bufferViews ?? emptyDict;\r\n this._accessors = doc.accessors ?? emptyDict;\r\n\r\n if (options.binary) {\r\n const buffer = this._buffers[this._version === 2 ? 0 : \"binary_glTF\"];\r\n if (buffer && undefined === buffer.uri)\r\n buffer.resolvedBuffer = { data: options.binary };\r\n }\r\n\r\n let sceneNodes;\r\n if (doc.scenes && undefined !== doc.scene)\r\n sceneNodes = doc.scenes[doc.scene]?.nodes;\r\n\r\n this._sceneNodes = sceneNodes ?? Object.keys(this._nodes);\r\n }\r\n\r\n public async parse(): Promise<Gltf.Model | undefined> {\r\n // ###TODO_GLTF RTC_CENTER\r\n // ###TODO_GLTF pseudo-rtc bias (apply translation to each point at read time, for scalable mesh...)\r\n const toWorld = undefined;\r\n\r\n await this.resolveResources();\r\n if (this._isCanceled())\r\n return undefined;\r\n\r\n // ###TODO_GLTF compute content range (maybe do so elsewhere?)\r\n // I think spec says POSITION must specify min and max?\r\n\r\n const nodes: Gltf.Node[] = [];\r\n for (const nodeKey of this._sceneNodes) {\r\n const node = this._nodes[nodeKey];\r\n if (node)\r\n nodes.push(this.parseNode(node));\r\n }\r\n\r\n return {\r\n toWorld,\r\n nodes,\r\n };\r\n }\r\n\r\n private parseNode(node: GltfNode): Gltf.Node {\r\n const primitives = [];\r\n for (const meshId of getGltfNodeMeshIds(node)) {\r\n const mesh = this._meshes[meshId];\r\n if (!mesh)\r\n continue;\r\n\r\n const parsedPrimitives = this.parsePrimitives(mesh);\r\n for (const primitive of parsedPrimitives)\r\n primitives.push(primitive);\r\n }\r\n\r\n let toParent;\r\n if (node.matrix) {\r\n const origin = Point3d.create(node.matrix[12], node.matrix[13], node.matrix[14]);\r\n const matrix = Matrix3d.createRowValues(\r\n node.matrix[0], node.matrix[4], node.matrix[8],\r\n node.matrix[1], node.matrix[5], node.matrix[9],\r\n node.matrix[2], node.matrix[6], node.matrix[10],\r\n );\r\n\r\n toParent = Transform.createOriginAndMatrix(origin, matrix);\r\n } else if (node.rotation || node.scale || node.translation) {\r\n // SPEC: To compose the local transformation matrix, TRS properties MUST be converted to matrices and postmultiplied in the T * R * S order;\r\n // first the scale is applied to the vertices, then the rotation, and then the translation.\r\n const scale = Transform.createRefs(undefined, node.scale ? Matrix3d.createScale(node.scale[0], node.scale[1], node.scale[2]) : Matrix3d.identity);\r\n const rot = Transform.createRefs(undefined, node.rotation ? Matrix3d.createFromQuaternion(Point4d.create(node.rotation[0], node.rotation[1], node.rotation[2], node.rotation[3])) : Matrix3d.identity);\r\n rot.matrix.transposeInPlace(); // See comment on Matrix3d.createFromQuaternion\r\n const trans = Transform.createTranslation(node.translation ? new Point3d(node.translation[0], node.translation[1], node.translation[2]) : Point3d.createZero());\r\n\r\n toParent = scale.multiplyTransformTransform(rot);\r\n trans.multiplyTransformTransform(toParent, toParent);\r\n }\r\n\r\n return {\r\n primitives,\r\n toParent,\r\n };\r\n }\r\n\r\n private parsePrimitives(mesh: GltfMesh): Gltf.AnyPrimitive[] {\r\n const primitives: Gltf.AnyPrimitive[] = [];\r\n if (!mesh.primitives)\r\n return primitives;\r\n\r\n for (const primitive of mesh.primitives) {\r\n const parsedPrimitive = this.parsePrimitive(primitive);\r\n if (parsedPrimitive)\r\n primitives.push(parsedPrimitive);\r\n }\r\n\r\n return primitives;\r\n }\r\n\r\n private parsePrimitive(primitive: GltfMeshPrimitive): Gltf.AnyPrimitive | undefined {\r\n const meshMode = JsonUtils.asInt(primitive.mode, GltfMeshMode.Triangles);\r\n switch (meshMode) {\r\n case GltfMeshMode.TriangleStrip:\r\n return this.parseTrianglesPrimitive(primitive);\r\n default:\r\n // ###TODO_GLTF Make parser support all primitive types. Consumer can choose to do whatever with them.\r\n return undefined;\r\n }\r\n }\r\n\r\n private parseTrianglesPrimitive(primitive: GltfMeshPrimitive): Gltf.TrianglesPrimitive | undefined {\r\n const posId = primitive.attributes.POSITION;\r\n const pos = undefined !== posId ? this._accessors[posId] : undefined;\r\n if (!pos)\r\n return undefined;\r\n\r\n return undefined; // ###TODO_GLTF\r\n }\r\n\r\n private traverseNodes(nodeIds: Iterable<GltfId>): Iterable<GltfNode> {\r\n return traverseGltfNodes(nodeIds, this._nodes, new Set<GltfId>());\r\n }\r\n\r\n private async resolveResources(): Promise<void> {\r\n // Load any external images and buffers.\r\n await this._resolveResources();\r\n\r\n // If any meshes are draco-compressed, dynamically load the decoder module and then decode the meshes.\r\n const dracoMeshes: DracoMeshCompression[] = [];\r\n\r\n for (const node of this.traverseNodes(this._sceneNodes)) {\r\n for (const meshId of getGltfNodeMeshIds(node)) {\r\n const mesh = this._meshes[meshId];\r\n if (mesh?.primitives)\r\n for (const primitive of mesh.primitives)\r\n if (primitive.extensions?.KHR_draco_mesh_compression)\r\n dracoMeshes.push(primitive.extensions.KHR_draco_mesh_compression);\r\n }\r\n }\r\n\r\n if (dracoMeshes.length === 0)\r\n return;\r\n\r\n try {\r\n const dracoLoader = (await import(\"@loaders.gl/draco\")).DracoLoader;\r\n await Promise.all(dracoMeshes.map(async (x) => this.decodeDracoMesh(x, dracoLoader)));\r\n } catch (err) {\r\n Logger.logWarning(FrontendLoggerCategory.Render, \"Failed to decode draco-encoded glTF mesh\");\r\n Logger.logException(FrontendLoggerCategory.Render, err);\r\n }\r\n }\r\n\r\n private async _resolveResources(): Promise<void> {\r\n // ###TODO traverse the scene nodes to find resources referenced by them, instead of resolving everything - some resources may not\r\n // be required for the scene.\r\n const promises: Array<Promise<void>> = [];\r\n try {\r\n for (const buffer of gltfDictionaryIterator(this._buffers))\r\n if (!buffer.resolvedBuffer)\r\n promises.push(this.resolveBuffer(buffer));\r\n\r\n await Promise.all(promises);\r\n if (this._isCanceled())\r\n return;\r\n\r\n promises.length = 0;\r\n for (const image of gltfDictionaryIterator(this._images))\r\n if (!image.resolvedImage)\r\n promises.push(this.resolveImage(image));\r\n\r\n await Promise.all(promises);\r\n } catch {\r\n // ###TODO_GLTF log\r\n }\r\n }\r\n\r\n private resolveUrl(uri: string): string | undefined {\r\n try {\r\n return new URL(uri, this._baseUrl).toString();\r\n } catch {\r\n return undefined;\r\n }\r\n }\r\n\r\n private async resolveBuffer(buffer: ParserBuffer): Promise<void> {\r\n if (buffer.resolvedBuffer || undefined === buffer.uri)\r\n return;\r\n\r\n try {\r\n const url = this.resolveUrl(buffer.uri);\r\n const response = url ? await fetch(url) : undefined;\r\n if (this._isCanceled())\r\n return;\r\n\r\n const data = await response?.arrayBuffer();\r\n if (this._isCanceled())\r\n return;\r\n\r\n if (data)\r\n buffer.resolvedBuffer = { data: new Uint8Array(data) };\r\n } catch {\r\n //\r\n }\r\n }\r\n\r\n private async resolveImage(image: ParserImage): Promise<void> {\r\n if (image.resolvedImage)\r\n return;\r\n\r\n interface BufferViewSource { bufferView?: GltfId, mimeType?: string }\r\n const bvSrc: BufferViewSource | undefined = undefined !== image.bufferView ? image : image.extensions?.KHR_binary_glTF;\r\n if (undefined !== bvSrc?.bufferView) {\r\n const format = undefined !== bvSrc.mimeType ? getImageSourceFormatForMimeType(bvSrc.mimeType) : undefined;\r\n const bufferView = this._bufferViews[bvSrc.bufferView];\r\n if (undefined === format || !bufferView || !bufferView.byteLength || bufferView.byteLength < 0)\r\n return;\r\n\r\n const bufferData = this._buffers[bufferView.buffer]?.resolvedBuffer?.data;\r\n if (!bufferData)\r\n return;\r\n\r\n const offset = bufferView.byteOffset ?? 0;\r\n const bytes = bufferData.subarray(offset, offset + bufferView.byteLength);\r\n try {\r\n const imageSource = new ImageSource(bytes, format);\r\n image.resolvedImage = await this._imageFromImageSource(imageSource);\r\n } catch {\r\n //\r\n }\r\n\r\n return;\r\n }\r\n\r\n const url = undefined !== image.uri ? this.resolveUrl(image.uri) : undefined;\r\n if (undefined !== url)\r\n image.resolvedImage = await tryImageElementFromUrl(url);\r\n }\r\n\r\n private async decodeDracoMesh(ext: DracoMeshCompression, loader: typeof DracoLoader): Promise<void> {\r\n const bv = this._bufferViews[ext.bufferView];\r\n if (!bv || !bv.byteLength)\r\n return;\r\n\r\n let buf = this._buffers[bv.buffer]?.resolvedBuffer?.data;\r\n if (!buf)\r\n return;\r\n\r\n const offset = bv.byteOffset ?? 0;\r\n buf = buf.subarray(offset, offset + bv.byteLength);\r\n const mesh = await loader.parse(buf, { }); // NB: `options` argument declared optional but will produce exception if not supplied.\r\n if (mesh)\r\n this._dracoMeshes.set(ext, mesh);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"GltfParser.js","sourceRoot":"","sources":["../../../../src/common/gltf/GltfParser.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Rendering\r\n */\r\n\r\nimport { ByteStream, JsonUtils, Logger, utf8ToString } from \"@itwin/core-bentley\";\r\nimport { Matrix3d, Point3d, Point4d, Transform } from \"@itwin/core-geometry\";\r\nimport { GlbHeader, ImageSource, TileFormat } from \"@itwin/core-common\";\r\nimport type { DracoLoader, DracoMesh } from \"@loaders.gl/draco\";\r\nimport { FrontendLoggerCategory } from \"../FrontendLoggerCategory\";\r\nimport { TextureImageSource } from \"../render/TextureParams\";\r\nimport {\r\n getImageSourceFormatForMimeType, imageBitmapFromImageSource, imageElementFromImageSource, tryImageElementFromUrl,\r\n} from \"../ImageUtil\";\r\nimport {\r\n DracoMeshCompression, getGltfNodeMeshIds, GltfAccessor, GltfBuffer, GltfBufferViewProps, GltfDictionary, gltfDictionaryIterator, GltfDocument, GltfId, GltfImage, GltfMesh, GltfMeshMode, GltfMeshPrimitive, GltfNode, traverseGltfNodes,\r\n} from \"./GltfSchema\";\r\nimport { Gltf } from \"./GltfModel\";\r\n\r\n/** @internal */\r\nexport interface ParseGltfLogger {\r\n log(message: string, type: \"error\" | \"warning\" | \"info\"): void;\r\n}\r\n\r\n/** Arguments supplied to [[parseGltf]].\r\n * @internal\r\n */\r\nexport interface ParseGltfArgs {\r\n logger?: ParseGltfLogger;\r\n gltf: Uint8Array | GltfDocument;\r\n noCreateImageBitmap?: boolean;\r\n baseUrl?: string;\r\n isCanceled?: boolean;\r\n upAxis?: \"y\" | \"z\"; // default \"y\"\r\n}\r\n\r\n/** Parse a [[GltfDocument]] or binary representation thereof to produce a [[Gltf.Model]].\r\n * This implementation is incomplete and not currently used.\r\n * @internal\r\n */\r\nexport async function parseGltf(args: ParseGltfArgs): Promise<Gltf.Model | undefined> {\r\n const source = args.gltf;\r\n let version: number;\r\n let json: GltfDocument;\r\n let binary: Uint8Array | undefined;\r\n\r\n if (source instanceof Uint8Array) {\r\n // It may be JSON - check for magic indicating glb.\r\n const buffer = ByteStream.fromUint8Array(source);\r\n if (TileFormat.Gltf !== buffer.readUint32()) {\r\n try {\r\n const utf8Json = utf8ToString(source);\r\n if (!utf8Json)\r\n return undefined;\r\n\r\n json = JSON.parse(utf8Json);\r\n version = 2;\r\n } catch {\r\n return undefined;\r\n }\r\n } else {\r\n buffer.reset();\r\n const header = new GlbHeader(buffer);\r\n if (!header.isValid)\r\n return undefined;\r\n\r\n version = header.version;\r\n if (header.binaryChunk)\r\n binary = new Uint8Array(source.buffer, source.byteOffset + header.binaryChunk.offset, header.binaryChunk.length);\r\n\r\n try {\r\n const jsonBytes = new Uint8Array(source.buffer, source.byteOffset + header.jsonChunk.offset, header.jsonChunk.length);\r\n const jsonStr = utf8ToString(jsonBytes);\r\n if (undefined === jsonStr)\r\n return undefined;\r\n\r\n json = JSON.parse(jsonStr);\r\n } catch {\r\n return undefined;\r\n }\r\n }\r\n } else {\r\n version = 2; // ###TODO verify against source.asset?.version\r\n json = source;\r\n }\r\n\r\n // asset is required in glTF 2, optional in glTF 1\r\n const asset = JsonUtils.asObject(json.asset);\r\n if (version === 2 && !asset)\r\n return undefined;\r\n\r\n const document: GltfDocument = {\r\n asset,\r\n scene: JsonUtils.asString(json.scene),\r\n extensions: JsonUtils.asObject(json.extensions),\r\n extensionsUsed: JsonUtils.asArray(json.extensionsUsed),\r\n extensionsRequired: JsonUtils.asArray(json.extensionsRequired),\r\n accessors: JsonUtils.asObject(json.accessors),\r\n buffers: JsonUtils.asObject(json.buffers),\r\n bufferViews: JsonUtils.asObject(json.bufferViews),\r\n images: JsonUtils.asObject(json.images),\r\n materials: JsonUtils.asObject(json.materials),\r\n meshes: JsonUtils.asObject(json.meshes),\r\n nodes: JsonUtils.asObject(json.nodes),\r\n samplers: JsonUtils.asObject(json.samplers),\r\n scenes: JsonUtils.asObject(json.scenes),\r\n textures: JsonUtils.asObject(json.textures),\r\n techniques: JsonUtils.asObject(json.techniques),\r\n };\r\n\r\n if (!document.meshes)\r\n return undefined;\r\n\r\n const logger = args.logger ?? {\r\n log: (message: string, type: \"error\" | \"warning\" | \"info\") => {\r\n const category = `${FrontendLoggerCategory.Package}.gltf`;\r\n const fn = type === \"error\" ? \"logError\" : (type === \"warning\" ? \"logWarning\" : \"logInfo\");\r\n Logger[fn](category, message);\r\n },\r\n };\r\n\r\n const parser = new GltfParser({\r\n document,\r\n version,\r\n upAxis: args.upAxis ?? \"y\",\r\n binary,\r\n baseUrl: args.baseUrl,\r\n logger,\r\n isCanceled: () => args.isCanceled ?? false,\r\n imageFromImageSource: (args.noCreateImageBitmap ?\r\n async (imgSrc) => imageElementFromImageSource(imgSrc) :\r\n async (imgSrc) => imageBitmapFromImageSource(imgSrc)),\r\n });\r\n\r\n return parser.parse();\r\n}\r\n\r\ninterface GltfParserOptions {\r\n document: GltfDocument;\r\n version: number;\r\n upAxis: \"y\" | \"z\";\r\n binary?: Uint8Array;\r\n baseUrl?: string;\r\n logger: ParseGltfLogger;\r\n imageFromImageSource: (source: ImageSource) => Promise<TextureImageSource>;\r\n isCanceled: () => boolean;\r\n}\r\n\r\ntype ParserBuffer = GltfBuffer & { resolvedBuffer?: Gltf.Buffer };\r\ntype ParserImage = GltfImage & { resolvedImage?: TextureImageSource };\r\n\r\nclass GltfParser {\r\n private readonly _version: number;\r\n private readonly _upAxis: \"y\" | \"z\";\r\n private readonly _baseUrl?: string;\r\n private readonly _logger: ParseGltfLogger;\r\n private readonly _isCanceled: () => boolean;\r\n private readonly _buffers: GltfDictionary<ParserBuffer>;\r\n private readonly _images: GltfDictionary<ParserImage>;\r\n private readonly _nodes: GltfDictionary<GltfNode>;\r\n private readonly _meshes: GltfDictionary<GltfMesh>;\r\n private readonly _accessors: GltfDictionary<GltfAccessor>;\r\n private readonly _sceneNodes: GltfId[];\r\n private readonly _bufferViews: GltfDictionary<GltfBufferViewProps>;\r\n private readonly _imageFromImageSource: (source: ImageSource) => Promise<TextureImageSource>;\r\n private readonly _dracoMeshes = new Map<DracoMeshCompression, DracoMesh>();\r\n\r\n public constructor(options: GltfParserOptions) {\r\n this._version = options.version;\r\n this._upAxis = options.upAxis;\r\n this._baseUrl = options.baseUrl;\r\n this._logger = options.logger;\r\n this._isCanceled = options.isCanceled;\r\n this._imageFromImageSource = options.imageFromImageSource;\r\n\r\n const emptyDict = { };\r\n const doc = options.document;\r\n this._buffers = doc.buffers ?? emptyDict;\r\n this._images = doc.images ?? emptyDict;\r\n this._nodes = doc.nodes ?? emptyDict;\r\n this._meshes = doc.meshes ?? emptyDict;\r\n this._bufferViews = doc.bufferViews ?? emptyDict;\r\n this._accessors = doc.accessors ?? emptyDict;\r\n\r\n if (options.binary) {\r\n const buffer = this._buffers[this._version === 2 ? 0 : \"binary_glTF\"];\r\n if (buffer && undefined === buffer.uri)\r\n buffer.resolvedBuffer = { data: options.binary };\r\n }\r\n\r\n let sceneNodes;\r\n if (doc.scenes && undefined !== doc.scene)\r\n sceneNodes = doc.scenes[doc.scene]?.nodes;\r\n\r\n this._sceneNodes = sceneNodes ?? Object.keys(this._nodes);\r\n }\r\n\r\n public async parse(): Promise<Gltf.Model | undefined> {\r\n // ###TODO_GLTF RTC_CENTER\r\n // ###TODO_GLTF pseudo-rtc bias (apply translation to each point at read time, for scalable mesh...)\r\n const toWorld = undefined;\r\n\r\n await this.resolveResources();\r\n if (this._isCanceled())\r\n return undefined;\r\n\r\n // ###TODO_GLTF compute content range (maybe do so elsewhere?)\r\n // I think spec says POSITION must specify min and max?\r\n\r\n const nodes: Gltf.Node[] = [];\r\n for (const nodeKey of this._sceneNodes) {\r\n const node = this._nodes[nodeKey];\r\n if (node)\r\n nodes.push(this.parseNode(node));\r\n }\r\n\r\n return {\r\n toWorld,\r\n nodes,\r\n };\r\n }\r\n\r\n private parseNode(node: GltfNode): Gltf.Node {\r\n const primitives = [];\r\n for (const meshId of getGltfNodeMeshIds(node)) {\r\n const mesh = this._meshes[meshId];\r\n if (!mesh)\r\n continue;\r\n\r\n const parsedPrimitives = this.parsePrimitives(mesh);\r\n for (const primitive of parsedPrimitives)\r\n primitives.push(primitive);\r\n }\r\n\r\n let toParent;\r\n if (node.matrix) {\r\n const origin = Point3d.create(node.matrix[12], node.matrix[13], node.matrix[14]);\r\n const matrix = Matrix3d.createRowValues(\r\n node.matrix[0], node.matrix[4], node.matrix[8],\r\n node.matrix[1], node.matrix[5], node.matrix[9],\r\n node.matrix[2], node.matrix[6], node.matrix[10],\r\n );\r\n\r\n toParent = Transform.createOriginAndMatrix(origin, matrix);\r\n } else if (node.rotation || node.scale || node.translation) {\r\n // SPEC: To compose the local transformation matrix, TRS properties MUST be converted to matrices and postmultiplied in the T * R * S order;\r\n // first the scale is applied to the vertices, then the rotation, and then the translation.\r\n const scale = Transform.createRefs(undefined, node.scale ? Matrix3d.createScale(node.scale[0], node.scale[1], node.scale[2]) : Matrix3d.identity);\r\n const rot = Transform.createRefs(undefined, node.rotation ? Matrix3d.createFromQuaternion(Point4d.create(node.rotation[0], node.rotation[1], node.rotation[2], node.rotation[3])) : Matrix3d.identity);\r\n rot.matrix.transposeInPlace(); // See comment on Matrix3d.createFromQuaternion\r\n const trans = Transform.createTranslation(node.translation ? new Point3d(node.translation[0], node.translation[1], node.translation[2]) : Point3d.createZero());\r\n\r\n toParent = scale.multiplyTransformTransform(rot);\r\n trans.multiplyTransformTransform(toParent, toParent);\r\n }\r\n\r\n return {\r\n primitives,\r\n toParent,\r\n };\r\n }\r\n\r\n private parsePrimitives(mesh: GltfMesh): Gltf.AnyPrimitive[] {\r\n const primitives: Gltf.AnyPrimitive[] = [];\r\n if (!mesh.primitives)\r\n return primitives;\r\n\r\n for (const primitive of mesh.primitives) {\r\n const parsedPrimitive = this.parsePrimitive(primitive);\r\n if (parsedPrimitive)\r\n primitives.push(parsedPrimitive);\r\n }\r\n\r\n return primitives;\r\n }\r\n\r\n private parsePrimitive(primitive: GltfMeshPrimitive): Gltf.AnyPrimitive | undefined {\r\n const meshMode = JsonUtils.asInt(primitive.mode, GltfMeshMode.Triangles);\r\n switch (meshMode) {\r\n case GltfMeshMode.TriangleStrip:\r\n return this.parseTrianglesPrimitive(primitive);\r\n default:\r\n // ###TODO_GLTF Make parser support all primitive types. Consumer can choose to do whatever with them.\r\n return undefined;\r\n }\r\n }\r\n\r\n private parseTrianglesPrimitive(primitive: GltfMeshPrimitive): Gltf.TrianglesPrimitive | undefined {\r\n const posId = primitive.attributes.POSITION;\r\n const pos = undefined !== posId ? this._accessors[posId] : undefined;\r\n if (!pos)\r\n return undefined;\r\n\r\n return undefined; // ###TODO_GLTF\r\n }\r\n\r\n private traverseNodes(nodeIds: Iterable<GltfId>): Iterable<GltfNode> {\r\n return traverseGltfNodes(nodeIds, this._nodes, new Set<GltfId>());\r\n }\r\n\r\n private async resolveResources(): Promise<void> {\r\n // Load any external images and buffers.\r\n await this._resolveResources();\r\n\r\n // If any meshes are draco-compressed, dynamically load the decoder module and then decode the meshes.\r\n const dracoMeshes: DracoMeshCompression[] = [];\r\n\r\n for (const node of this.traverseNodes(this._sceneNodes)) {\r\n for (const meshId of getGltfNodeMeshIds(node)) {\r\n const mesh = this._meshes[meshId];\r\n if (mesh?.primitives)\r\n for (const primitive of mesh.primitives)\r\n if (primitive.extensions?.KHR_draco_mesh_compression)\r\n dracoMeshes.push(primitive.extensions.KHR_draco_mesh_compression);\r\n }\r\n }\r\n\r\n if (dracoMeshes.length === 0)\r\n return;\r\n\r\n try {\r\n const dracoLoader = (await import(\"@loaders.gl/draco\")).DracoLoader;\r\n await Promise.all(dracoMeshes.map(async (x) => this.decodeDracoMesh(x, dracoLoader)));\r\n } catch (err) {\r\n Logger.logWarning(FrontendLoggerCategory.Render, \"Failed to decode draco-encoded glTF mesh\");\r\n Logger.logError(FrontendLoggerCategory.Render, err);\r\n }\r\n }\r\n\r\n private async _resolveResources(): Promise<void> {\r\n // ###TODO traverse the scene nodes to find resources referenced by them, instead of resolving everything - some resources may not\r\n // be required for the scene.\r\n const promises: Array<Promise<void>> = [];\r\n try {\r\n for (const buffer of gltfDictionaryIterator(this._buffers))\r\n if (!buffer.resolvedBuffer)\r\n promises.push(this.resolveBuffer(buffer));\r\n\r\n await Promise.all(promises);\r\n if (this._isCanceled())\r\n return;\r\n\r\n promises.length = 0;\r\n for (const image of gltfDictionaryIterator(this._images))\r\n if (!image.resolvedImage)\r\n promises.push(this.resolveImage(image));\r\n\r\n await Promise.all(promises);\r\n } catch {\r\n // ###TODO_GLTF log\r\n }\r\n }\r\n\r\n private resolveUrl(uri: string): string | undefined {\r\n try {\r\n return new URL(uri, this._baseUrl).toString();\r\n } catch {\r\n return undefined;\r\n }\r\n }\r\n\r\n private async resolveBuffer(buffer: ParserBuffer): Promise<void> {\r\n if (buffer.resolvedBuffer || undefined === buffer.uri)\r\n return;\r\n\r\n try {\r\n const url = this.resolveUrl(buffer.uri);\r\n const response = url ? await fetch(url) : undefined;\r\n if (this._isCanceled())\r\n return;\r\n\r\n const data = await response?.arrayBuffer();\r\n if (this._isCanceled())\r\n return;\r\n\r\n if (data)\r\n buffer.resolvedBuffer = { data: new Uint8Array(data) };\r\n } catch {\r\n //\r\n }\r\n }\r\n\r\n private async resolveImage(image: ParserImage): Promise<void> {\r\n if (image.resolvedImage)\r\n return;\r\n\r\n interface BufferViewSource { bufferView?: GltfId, mimeType?: string }\r\n const bvSrc: BufferViewSource | undefined = undefined !== image.bufferView ? image : image.extensions?.KHR_binary_glTF;\r\n if (undefined !== bvSrc?.bufferView) {\r\n const format = undefined !== bvSrc.mimeType ? getImageSourceFormatForMimeType(bvSrc.mimeType) : undefined;\r\n const bufferView = this._bufferViews[bvSrc.bufferView];\r\n if (undefined === format || !bufferView || !bufferView.byteLength || bufferView.byteLength < 0)\r\n return;\r\n\r\n const bufferData = this._buffers[bufferView.buffer]?.resolvedBuffer?.data;\r\n if (!bufferData)\r\n return;\r\n\r\n const offset = bufferView.byteOffset ?? 0;\r\n const bytes = bufferData.subarray(offset, offset + bufferView.byteLength);\r\n try {\r\n const imageSource = new ImageSource(bytes, format);\r\n image.resolvedImage = await this._imageFromImageSource(imageSource);\r\n } catch {\r\n //\r\n }\r\n\r\n return;\r\n }\r\n\r\n const url = undefined !== image.uri ? this.resolveUrl(image.uri) : undefined;\r\n if (undefined !== url)\r\n image.resolvedImage = await tryImageElementFromUrl(url);\r\n }\r\n\r\n private async decodeDracoMesh(ext: DracoMeshCompression, loader: typeof DracoLoader): Promise<void> {\r\n const bv = this._bufferViews[ext.bufferView];\r\n if (!bv || !bv.byteLength)\r\n return;\r\n\r\n let buf = this._buffers[bv.buffer]?.resolvedBuffer?.data;\r\n if (!buf)\r\n return;\r\n\r\n const offset = bv.byteOffset ?? 0;\r\n buf = buf.subarray(offset, offset + bv.byteLength);\r\n const mesh = await loader.parse(buf, { }); // NB: `options` argument declared optional but will produce exception if not supplied.\r\n if (mesh)\r\n this._dracoMeshes.set(ext, mesh);\r\n }\r\n}\r\n"]}
@@ -34,7 +34,7 @@ async function getDecoder() {
34
34
  instance.exports.__wasm_call_ctors();
35
35
  }
36
36
  catch (err) {
37
- core_bentley_1.Logger.logException(FrontendLoggerCategory_1.FrontendLoggerCategory.Render, err);
37
+ core_bentley_1.Logger.logError(FrontendLoggerCategory_1.FrontendLoggerCategory.Render, err);
38
38
  return undefined;
39
39
  }
40
40
  function unpack(data) {
@@ -1 +1 @@
1
- {"version":3,"file":"MeshoptCompression.js","sourceRoot":"","sources":["../../../../src/internal/tile/MeshoptCompression.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Tiles\r\n */\r\n\r\nimport { Logger } from \"@itwin/core-bentley\";\r\nimport type { ExtMeshoptCompressionFilter, ExtMeshoptCompressionMode } from \"../../common/gltf/GltfSchema\";\r\nimport { FrontendLoggerCategory } from \"../../common/FrontendLoggerCategory\";\r\n\r\nexport interface MeshoptDecoder {\r\n decodeVertexBuffer: (target: Uint8Array, count: number, size: number, source: Uint8Array, filter?: string) => void;\r\n decodeIndexBuffer: (target: Uint8Array, count: number, size: number, source: Uint8Array) => void;\r\n decodeIndexSequence: (target: Uint8Array, count: number, size: number, source: Uint8Array) => void;\r\n decodeGltfBuffer(target: Uint8Array, count: number, size: number, source: Uint8Array, mode: string, filter?: string): void;\r\n};\r\n\r\n// This is a modified version of https://github.com/zeux/meshoptimizer/blob/master/js/meshopt_decoder.js.\r\n// The orginial code will load wasm when the module is imported, which seems to upset vitest somehow.\r\n// This version loads wasm only when a decoder is requested, which only occurs when parsing a compressed tile.\r\nasync function getDecoder(): Promise<MeshoptDecoder | undefined> {\r\n // Built with clang version 16.0.0\r\n // Built from meshoptimizer 0.20\r\n const wasmBase = \"b9H79Tebbbe8Fv9Gbb9Gvuuuuueu9Giuuub9Geueu9Giuuueuikqbeeedddillviebeoweuec:q;iekr;leDo9TW9T9VV95dbH9F9F939H79T9F9J9H229F9Jt9VV7bb8A9TW79O9V9Wt9F9KW9J9V9KW9wWVtW949c919M9MWVbeY9TW79O9V9Wt9F9KW9J9V9KW69U9KW949c919M9MWVbdE9TW79O9V9Wt9F9KW9J9V9KW69U9KW949tWG91W9U9JWbiL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9p9JtblK9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9r919HtbvL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWVT949Wbol79IV9Rbrq;d8Yqdbk:yzeHu8Jjjjjbcj;eb9Rgv8Kjjjjbc9:hodnadcefal0mbcuhoaiRbbc:Ge9hmbavaialfgrad9Radz1jjjbhwcj;abad9UhlaicefhodnadTmbalc;WFbGglcjdalcjd6EhDcbhqinaqae9pmeaDaeaq9RaqaDfae6Egkcsfglcl4cifcd4hxdndndndnalc9WGgmTmbcbhPcehsawcjdfhzaohHinaraH9Rax6midnaraHaxfgo9RcK6mbczhlcbhOinalgic9WfgAawcj;cbffhldndndndndnaHaAco4fRbbaOcoG4ciGPlbedibkal9cb83ibalcwf9cb83ibxikalaoRblaoRbbgAco4gCaCciSgCE86bbawcj;cbfaifglcGfaoclfaCfgCRbbaAcl4ciGgXaXciSgXE86bbalcVfaCaXfgCRbbaAcd4ciGgXaXciSgXE86bbalc7faCaXfgCRbbaAciGgAaAciSgAE86bbalctfaCaAfgCRbbaoRbegAco4gXaXciSgXE86bbalc91faCaXfgCRbbaAcl4ciGgXaXciSgXE86bbalc4faCaXfgCRbbaAcd4ciGgXaXciSgXE86bbalc93faCaXfgCRbbaAciGgAaAciSgAE86bbalc94faCaAfgCRbbaoRbdgAco4gXaXciSgXE86bbalc95faCaXfgCRbbaAcl4ciGgXaXciSgXE86bbalc96faCaXfgCRbbaAcd4ciGgXaXciSgXE86bbalc97faCaXfgCRbbaAciGgAaAciSgAE86bbalc98faCaAfgARbbaoRbigoco4gCaCciSgCE86bbalc99faAaCfgARbbaocl4ciGgCaCciSgCE86bbalc9:faAaCfgARbbaocd4ciGgCaCciSgCE86bbalcufaAaCfglRbbaociGgoaociSgoE86bbalaofhoxdkalaoRbwaoRbbgAcl4gCaCcsSgCE86bbawcj;cbfaifglcGfaocwfaCfgCRbbaAcsGgAaAcsSgAE86bbalcVfaCaAfgARbbaoRbegCcl4gXaXcsSgXE86bbalc7faAaXfgARbbaCcsGgCaCcsSgCE86bbalctfaAaCfgARbbaoRbdgCcl4gXaXcsSgXE86bbalc91faAaXfgARbbaCcsGgCaCcsSgCE86bbalc4faAaCfgARbbaoRbigCcl4gXaXcsSgXE86bbalc93faAaXfgARbbaCcsGgCaCcsSgCE86bbalc94faAaCfgARbbaoRblgCcl4gXaXcsSgXE86bbalc95faAaXfgARbbaCcsGgCaCcsSgCE86bbalc96faAaCfgARbbaoRbvgCcl4gXaXcsSgXE86bbalc97faAaXfgARbbaCcsGgCaCcsSgCE86bbalc98faAaCfgARbbaoRbogCcl4gXaXcsSgXE86bbalc99faAaXfgARbbaCcsGgCaCcsSgCE86bbalc9:faAaCfgARbbaoRbrgocl4gCaCcsSgCE86bbalcufaAaCfglRbbaocsGgoaocsSgoE86bbalaofhoxekalao8Pbb83bbalcwfaocwf8Pbb83bbaoczfhokdnaiam9pmbaOcdfhOaiczfhlarao9RcL0mekkaiam6miaoTmidnakTmbawaPfRbbhOawcj;cbfhlazhiakhAinaialRbbgHce4cbaHceG9R7aOfgO86bbaiadfhialcefhlaAcufgAmbkkazcefhzaPcefgPad6hsaohHaPad9hmexvkkcbhoasceGmdxikaoaxad2fhXdnakTmbcbhmcehsawcjdfhCinarao9Rax6miaoTmdaoaxfhoawamfRbbhOawcj;cbfhlaChiakhAinaialRbbgHce4cbaHceG9R7aOfgO86bbaiadfhialcefhlaAcufgAmbkaCcefhCamcefgmad6hsamad9hmbkaXhoxikcbhlcehsinarao9Rax6mdaoTmeaoaxfhoalcefglad6hsadal9hmbkaXhoxdkcbhoasceGTmekc9:hoxikabaqad2fawcjdfakad2z1jjjb8Aawawcjdfakcufad2fadz1jjjb8Aakaqfhqaombkc9:hoxekcbc99arao9Radcaadca0ESEhokavcj;ebf8Kjjjjbaok;xzeHu8Jjjjjbc;ae9Rgv8Kjjjjbc9:hodnaeci9UgrcHfal0mbcuhoaiRbbgwc;WeGc;Ge9hmbawcsGgDce0mbavc;abfcFecjez:jjjjb8AavcUf9cu83ibavc8Wf9cu83ibavcyf9cu83ibavcaf9cu83ibavcKf9cu83ibavczf9cu83ibav9cu83iwav9cu83ibaialfc9WfhqaicefgwarfhodnaeTmbcmcsaDceSEhkcbhxcbhmcbhrcbhicbhlindnaoaq9nmbc9:hoxikdndnawRbbgDc;Ve0mbavc;abfalaDcu7gPcl4fcsGcitfgsydlhzasydbhHdnaDcsGgDak9pmbavaiaPfcsGcdtfydbaxaDEhsaDThDdndnadcd9hmbabarcetfgPaH87ebaPcdfaz87ebaPclfas87ebxekabarcdtfgPaHBdbaPclfazBdbaPcwfasBdbkaxaDfhxavc;abfalcitfgPasBdbaPazBdlavaicdtfasBdbavc;abfalcefcsGglcitfgPaHBdbaPasBdlaiaDfhialcefhlxdkdndnaDcsSmbamaDfaDc987fcefhmxekaocefhDao8SbbgscFeGhPdndnascu9mmbaDhoxekaocvfhoaPcFbGhPcrhsdninaD8SbbgOcFbGastaPVhPaOcu9kmeaDcefhDascrfgsc8J9hmbxdkkaDcefhokaPce4cbaPceG9R7amfhmkdndnadcd9hmbabarcetfgDaH87ebaDcdfaz87ebaDclfam87ebxekabarcdtfgDaHBdbaDclfazBdbaDcwfamBdbkavc;abfalcitfgDamBdbaDazBdlavaicdtfamBdbavc;abfalcefcsGglcitfgDaHBdbaDamBdlaicefhialcefhlxekdnaDcpe0mbaxcefgOavaiaqaDcsGfRbbgscl49RcsGcdtfydbascz6gPEhDavaias9RcsGcdtfydbaOaPfgzascsGgOEhsaOThOdndnadcd9hmbabarcetfgHax87ebaHcdfaD87ebaHclfas87ebxekabarcdtfgHaxBdbaHclfaDBdbaHcwfasBdbkavaicdtfaxBdbavc;abfalcitfgHaDBdbaHaxBdlavaicefgicsGcdtfaDBdbavc;abfalcefcsGcitfgHasBdbaHaDBdlavaiaPfcsGgicdtfasBdbavc;abfalcdfcsGglcitfgDaxBdbaDasBdlalcefhlaiaOfhiazaOfhxxekaxcbaoRbbgHEgAaDc;:eSgDfhzaHcsGhCaHcl4hXdndnaHcs0mbazcefhOxekazhOavaiaX9RcsGcdtfydbhzkdndnaCmbaOcefhxxekaOhxavaiaH9RcsGcdtfydbhOkdndnaDTmbaocefhDxekaocdfhDao8SbegPcFeGhsdnaPcu9kmbaocofhAascFbGhscrhodninaD8SbbgPcFbGaotasVhsaPcu9kmeaDcefhDaocrfgoc8J9hmbkaAhDxekaDcefhDkasce4cbasceG9R7amfgmhAkdndnaXcsSmbaDhsxekaDcefhsaD8SbbgocFeGhPdnaocu9kmbaDcvfhzaPcFbGhPcrhodninas8SbbgDcFbGaotaPVhPaDcu9kmeascefhsaocrfgoc8J9hmbkazhsxekascefhskaPce4cbaPceG9R7amfgmhzkdndnaCcsSmbashoxekascefhoas8SbbgDcFeGhPdnaDcu9kmbascvfhOaPcFbGhPcrhDdninao8SbbgscFbGaDtaPVhPascu9kmeaocefhoaDcrfgDc8J9hmbkaOhoxekaocefhokaPce4cbaPceG9R7amfgmhOkdndnadcd9hmbabarcetfgDaA87ebaDcdfaz87ebaDclfaO87ebxekabarcdtfgDaABdbaDclfazBdbaDcwfaOBdbkavc;abfalcitfgDazBdbaDaABdlavaicdtfaABdbavc;abfalcefcsGcitfgDaOBdbaDazBdlavaicefgicsGcdtfazBdbavc;abfalcdfcsGcitfgDaABdbaDaOBdlavaiaHcz6aXcsSVfgicsGcdtfaOBdbaiaCTaCcsSVfhialcifhlkawcefhwalcsGhlaicsGhiarcifgrae6mbkkcbc99aoaqSEhokavc;aef8Kjjjjbaok:flevu8Jjjjjbcz9Rhvc9:hodnaecvfal0mbcuhoaiRbbc;:eGc;qe9hmbav9cb83iwaicefhraialfc98fhwdnaeTmbdnadcdSmbcbhDindnaraw6mbc9:skarcefhoar8SbbglcFeGhidndnalcu9mmbaohrxekarcvfhraicFbGhicrhldninao8SbbgdcFbGaltaiVhiadcu9kmeaocefhoalcrfglc8J9hmbxdkkaocefhrkabaDcdtfaic8Etc8F91aicd47avcwfaiceGcdtVgoydbfglBdbaoalBdbaDcefgDae9hmbxdkkcbhDindnaraw6mbc9:skarcefhoar8SbbglcFeGhidndnalcu9mmbaohrxekarcvfhraicFbGhicrhldninao8SbbgdcFbGaltaiVhiadcu9kmeaocefhoalcrfglc8J9hmbxdkkaocefhrkabaDcetfaic8Etc8F91aicd47avcwfaiceGcdtVgoydbfgl87ebaoalBdbaDcefgDae9hmbkkcbc99arawSEhokaok:Lvoeue99dud99eud99dndnadcl9hmbaeTmeindndnabcdfgd8Sbb:Yab8Sbbgi:Ygl:l:tabcefgv8Sbbgo:Ygr:l:tgwJbb;:9cawawNJbbbbawawJbbbb9GgDEgq:mgkaqaicb9iEalMgwawNakaqaocb9iEarMgqaqNMM:r:vglNJbbbZJbbb:;aDEMgr:lJbbb9p9DTmbar:Ohixekcjjjj94hikadai86bbdndnaqalNJbbbZJbbb:;aqJbbbb9GEMgq:lJbbb9p9DTmbaq:Ohdxekcjjjj94hdkavad86bbdndnawalNJbbbZJbbb:;awJbbbb9GEMgw:lJbbb9p9DTmbaw:Ohdxekcjjjj94hdkabad86bbabclfhbaecufgembxdkkaeTmbindndnabclfgd8Ueb:Yab8Uebgi:Ygl:l:tabcdfgv8Uebgo:Ygr:l:tgwJb;:FSawawNJbbbbawawJbbbb9GgDEgq:mgkaqaicb9iEalMgwawNakaqaocb9iEarMgqaqNMM:r:vglNJbbbZJbbb:;aDEMgr:lJbbb9p9DTmbar:Ohixekcjjjj94hikadai87ebdndnaqalNJbbbZJbbb:;aqJbbbb9GEMgq:lJbbb9p9DTmbaq:Ohdxekcjjjj94hdkavad87ebdndnawalNJbbbZJbbb:;awJbbbb9GEMgw:lJbbb9p9DTmbaw:Ohdxekcjjjj94hdkabad87ebabcwfhbaecufgembkkk;siliui99iue99dnaeTmbcbhiabhlindndnJ;Zl81Zalcof8UebgvciV:Y:vgoal8Ueb:YNgrJb;:FSNJbbbZJbbb:;arJbbbb9GEMgw:lJbbb9p9DTmbaw:OhDxekcjjjj94hDkalclf8Uebhqalcdf8UebhkabaiavcefciGfcetfaD87ebdndnaoak:YNgwJb;:FSNJbbbZJbbb:;awJbbbb9GEMgx:lJbbb9p9DTmbax:Ohkxekcjjjj94hkkabaiavcdfciGfcetfak87ebdndnaoaq:YNgoJb;:FSNJbbbZJbbb:;aoJbbbb9GEMgx:lJbbb9p9DTmbax:Ohqxekcjjjj94hqkabaiavcufciGfcetfaq87ebdndnJbbjZararN:tawawN:taoaoN:tgrJbbbbarJbbbb9GE:rJb;:FSNJbbbZMgr:lJbbb9p9DTmbar:Ohqxekcjjjj94hqkabaiavciGfcetfaq87ebalcwfhlaiclfhiaecufgembkkk9mbdnadcd4ae2gdTmbinababydbgecwtcw91:Yaece91cjjj98Gcjjj;8if::NUdbabclfhbadcufgdmbkkk9teiucbcbydj1jjbgeabcifc98GfgbBdj1jjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaik;LeeeudndnaeabVciGTmbabhixekdndnadcz9pmbabhixekabhiinaiaeydbBdbaiclfaeclfydbBdbaicwfaecwfydbBdbaicxfaecxfydbBdbaeczfheaiczfhiadc9Wfgdcs0mbkkadcl6mbinaiaeydbBdbaeclfheaiclfhiadc98fgdci0mbkkdnadTmbinaiaeRbb86bbaicefhiaecefheadcufgdmbkkabk;aeedudndnabciGTmbabhixekaecFeGc:b:c:ew2hldndnadcz9pmbabhixekabhiinaialBdbaicxfalBdbaicwfalBdbaiclfalBdbaiczfhiadc9Wfgdcs0mbkkadcl6mbinaialBdbaiclfhiadc98fgdci0mbkkdnadTmbinaiae86bbaicefhiadcufgdmbkkabkkkebcjwklz9Kbb\";\r\n const wasmSimd = \"b9H79TebbbeKl9Gbb9Gvuuuuueu9Giuuub9Geueuikqbbebeedddilve9Weeeviebeoweuec:q;Aekr;leDo9TW9T9VV95dbH9F9F939H79T9F9J9H229F9Jt9VV7bb8A9TW79O9V9Wt9F9KW9J9V9KW9wWVtW949c919M9MWVbdY9TW79O9V9Wt9F9KW9J9V9KW69U9KW949c919M9MWVblE9TW79O9V9Wt9F9KW9J9V9KW69U9KW949tWG91W9U9JWbvL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9p9JtboK9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9r919HtbrL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWVT949Wbwl79IV9RbDq;b9tqlbzik9:evu8Jjjjjbcz9Rhbcbheincbhdcbhiinabcwfadfaicjuaead4ceGglE86bbaialfhiadcefgdcw9hmbkaec:q:yjjbfai86bbaecitc:q1jjbfab8Piw83ibaecefgecjd9hmbkk;e8JlHud97euo978Jjjjjbcj;kb9Rgv8Kjjjjbc9:hodnadcefal0mbcuhoaiRbbc:Ge9hmbavaialfgrad9Rad;8qbbcj;abad9UhoaicefhldnadTmbaoc;WFbGgocjdaocjd6EhwcbhDinaDae9pmeawaeaD9RaDawfae6Egqcsfgoc9WGgkci2hxakcethmaocl4cifcd4hPabaDad2fhscbhzdnincbhHalhOcbhAdninaraO9RaP6miavcj;cbfaAak2fhCaOaPfhlcbhidnakc;ab6mbaral9Rc;Gb6mbcbhoinaCaofhidndndndndnaOaoco4fRbbgXciGPlbedibkaipxbbbbbbbbbbbbbbbbpklbxikaialpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklbalclfaYpQbfaKc:q:yjjbfRbbfhlxdkaialpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklbalcwfaYpQbfaKc:q:yjjbfRbbfhlxekaialpbbbpklbalczfhlkdndndndndnaXcd4ciGPlbedibkaipxbbbbbbbbbbbbbbbbpklzxikaialpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklzalclfaYpQbfaKc:q:yjjbfRbbfhlxdkaialpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklzalcwfaYpQbfaKc:q:yjjbfRbbfhlxekaialpbbbpklzalczfhlkdndndndndnaXcl4ciGPlbedibkaipxbbbbbbbbbbbbbbbbpklaxikaialpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklaalclfaYpQbfaKc:q:yjjbfRbbfhlxdkaialpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklaalcwfaYpQbfaKc:q:yjjbfRbbfhlxekaialpbbbpklaalczfhlkdndndndndnaXco4Plbedibkaipxbbbbbbbbbbbbbbbbpkl8WxikaialpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgXcitc:q1jjbfpbibaXc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgXcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spkl8WalclfaYpQbfaXc:q:yjjbfRbbfhlxdkaialpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgXcitc:q1jjbfpbibaXc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgXcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spkl8WalcwfaYpQbfaXc:q:yjjbfRbbfhlxekaialpbbbpkl8Walczfhlkaoc;abfhiaocjefak0meaihoaral9Rc;Fb0mbkkdndnaiak9pmbaici4hoinaral9RcK6mdaCaifhXdndndndndnaOaico4fRbbaocoG4ciGPlbedibkaXpxbbbbbbbbbbbbbbbbpklbxikaXalpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklbalclfaYpQbfaKc:q:yjjbfRbbfhlxdkaXalpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklbalcwfaYpQbfaKc:q:yjjbfRbbfhlxekaXalpbbbpklbalczfhlkaocdfhoaiczfgiak6mbkkalTmbaAcd0hHalhOaAcefgAclSmdxekkcbhlaHceGTmdkdnakTmbavcjdfazfhiavazfpbdbhYcbhXinaiavcj;cbfaXfgopblbgLcep9TaLpxeeeeeeeeeeeeeeeegQp9op9Hp9rgLaoakfpblbg8Acep9Ta8AaQp9op9Hp9rg8ApmbzeHdOiAlCvXoQrLgEaoamfpblbg3cep9Ta3aQp9op9Hp9rg3aoaxfpblbg5cep9Ta5aQp9op9Hp9rg5pmbzeHdOiAlCvXoQrLg8EpmbezHdiOAlvCXorQLgQaQpmbedibedibedibediaYp9UgYp9AdbbaiadfgoaYaQaQpmlvorlvorlvorlvorp9UgYp9AdbbaoadfgoaYaQaQpmwDqkwDqkwDqkwDqkp9UgYp9AdbbaoadfgoaYaQaQpmxmPsxmPsxmPsxmPsp9UgYp9AdbbaoadfgoaYaEa8EpmwDKYqk8AExm35Ps8E8FgQaQpmbedibedibedibedip9UgYp9AdbbaoadfgoaYaQaQpmlvorlvorlvorlvorp9UgYp9AdbbaoadfgoaYaQaQpmwDqkwDqkwDqkwDqkp9UgYp9AdbbaoadfgoaYaQaQpmxmPsxmPsxmPsxmPsp9UgYp9AdbbaoadfgoaYaLa8ApmwKDYq8AkEx3m5P8Es8FgLa3a5pmwKDYq8AkEx3m5P8Es8Fg8ApmbezHdiOAlvCXorQLgQaQpmbedibedibedibedip9UgYp9AdbbaoadfgoaYaQaQpmlvorlvorlvorlvorp9UgYp9AdbbaoadfgoaYaQaQpmwDqkwDqkwDqkwDqkp9UgYp9AdbbaoadfgoaYaQaQpmxmPsxmPsxmPsxmPsp9UgYp9AdbbaoadfgoaYaLa8ApmwDKYqk8AExm35Ps8E8FgQaQpmbedibedibedibedip9UgYp9AdbbaoadfgoaYaQaQpmlvorlvorlvorlvorp9UgYp9AdbbaoadfgoaYaQaQpmwDqkwDqkwDqkwDqkp9UgYp9AdbbaoadfgoaYaQaQpmxmPsxmPsxmPsxmPsp9UgYp9AdbbaoadfhiaXczfgXak6mbkkazclfgzad6mbkasavcjdfaqad2;8qbbavavcjdfaqcufad2fad;8qbbaqaDfhDc9:hoalmexikkc9:hoxekcbc99aral9Radcaadca0ESEhokavcj;kbf8Kjjjjbaokwbz:bjjjbk;tzeHu8Jjjjjbc;ae9Rgv8Kjjjjbc9:hodnaeci9UgrcHfal0mbcuhoaiRbbgwc;WeGc;Ge9hmbawcsGgDce0mbavc;abfcFecje;8kbavcUf9cu83ibavc8Wf9cu83ibavcyf9cu83ibavcaf9cu83ibavcKf9cu83ibavczf9cu83ibav9cu83iwav9cu83ibaialfc9WfhqaicefgwarfhodnaeTmbcmcsaDceSEhkcbhxcbhmcbhrcbhicbhlindnaoaq9nmbc9:hoxikdndnawRbbgDc;Ve0mbavc;abfalaDcu7gPcl4fcsGcitfgsydlhzasydbhHdnaDcsGgDak9pmbavaiaPfcsGcdtfydbaxaDEhsaDThDdndnadcd9hmbabarcetfgPaH87ebaPcdfaz87ebaPclfas87ebxekabarcdtfgPaHBdbaPclfazBdbaPcwfasBdbkaxaDfhxavc;abfalcitfgPasBdbaPazBdlavaicdtfasBdbavc;abfalcefcsGglcitfgPaHBdbaPasBdlaiaDfhialcefhlxdkdndnaDcsSmbamaDfaDc987fcefhmxekaocefhDao8SbbgscFeGhPdndnascu9mmbaDhoxekaocvfhoaPcFbGhPcrhsdninaD8SbbgOcFbGastaPVhPaOcu9kmeaDcefhDascrfgsc8J9hmbxdkkaDcefhokaPce4cbaPceG9R7amfhmkdndnadcd9hmbabarcetfgDaH87ebaDcdfaz87ebaDclfam87ebxekabarcdtfgDaHBdbaDclfazBdbaDcwfamBdbkavc;abfalcitfgDamBdbaDazBdlavaicdtfamBdbavc;abfalcefcsGglcitfgDaHBdbaDamBdlaicefhialcefhlxekdnaDcpe0mbaxcefgOavaiaqaDcsGfRbbgscl49RcsGcdtfydbascz6gPEhDavaias9RcsGcdtfydbaOaPfgzascsGgOEhsaOThOdndnadcd9hmbabarcetfgHax87ebaHcdfaD87ebaHclfas87ebxekabarcdtfgHaxBdbaHclfaDBdbaHcwfasBdbkavaicdtfaxBdbavc;abfalcitfgHaDBdbaHaxBdlavaicefgicsGcdtfaDBdbavc;abfalcefcsGcitfgHasBdbaHaDBdlavaiaPfcsGgicdtfasBdbavc;abfalcdfcsGglcitfgDaxBdbaDasBdlalcefhlaiaOfhiazaOfhxxekaxcbaoRbbgHEgAaDc;:eSgDfhzaHcsGhCaHcl4hXdndnaHcs0mbazcefhOxekazhOavaiaX9RcsGcdtfydbhzkdndnaCmbaOcefhxxekaOhxavaiaH9RcsGcdtfydbhOkdndnaDTmbaocefhDxekaocdfhDao8SbegPcFeGhsdnaPcu9kmbaocofhAascFbGhscrhodninaD8SbbgPcFbGaotasVhsaPcu9kmeaDcefhDaocrfgoc8J9hmbkaAhDxekaDcefhDkasce4cbasceG9R7amfgmhAkdndnaXcsSmbaDhsxekaDcefhsaD8SbbgocFeGhPdnaocu9kmbaDcvfhzaPcFbGhPcrhodninas8SbbgDcFbGaotaPVhPaDcu9kmeascefhsaocrfgoc8J9hmbkazhsxekascefhskaPce4cbaPceG9R7amfgmhzkdndnaCcsSmbashoxekascefhoas8SbbgDcFeGhPdnaDcu9kmbascvfhOaPcFbGhPcrhDdninao8SbbgscFbGaDtaPVhPascu9kmeaocefhoaDcrfgDc8J9hmbkaOhoxekaocefhokaPce4cbaPceG9R7amfgmhOkdndnadcd9hmbabarcetfgDaA87ebaDcdfaz87ebaDclfaO87ebxekabarcdtfgDaABdbaDclfazBdbaDcwfaOBdbkavc;abfalcitfgDazBdbaDaABdlavaicdtfaABdbavc;abfalcefcsGcitfgDaOBdbaDazBdlavaicefgicsGcdtfazBdbavc;abfalcdfcsGcitfgDaABdbaDaOBdlavaiaHcz6aXcsSVfgicsGcdtfaOBdbaiaCTaCcsSVfhialcifhlkawcefhwalcsGhlaicsGhiarcifgrae6mbkkcbc99aoaqSEhokavc;aef8Kjjjjbaok:flevu8Jjjjjbcz9Rhvc9:hodnaecvfal0mbcuhoaiRbbc;:eGc;qe9hmbav9cb83iwaicefhraialfc98fhwdnaeTmbdnadcdSmbcbhDindnaraw6mbc9:skarcefhoar8SbbglcFeGhidndnalcu9mmbaohrxekarcvfhraicFbGhicrhldninao8SbbgdcFbGaltaiVhiadcu9kmeaocefhoalcrfglc8J9hmbxdkkaocefhrkabaDcdtfaic8Etc8F91aicd47avcwfaiceGcdtVgoydbfglBdbaoalBdbaDcefgDae9hmbxdkkcbhDindnaraw6mbc9:skarcefhoar8SbbglcFeGhidndnalcu9mmbaohrxekarcvfhraicFbGhicrhldninao8SbbgdcFbGaltaiVhiadcu9kmeaocefhoalcrfglc8J9hmbxdkkaocefhrkabaDcetfaic8Etc8F91aicd47avcwfaiceGcdtVgoydbfgl87ebaoalBdbaDcefgDae9hmbkkcbc99arawSEhokaok:wPliuo97eue978Jjjjjbca9Rhiaec98Ghldndnadcl9hmbdnalTmbcbhvabhdinadadpbbbgocKp:RecKp:Sep;6egraocwp:RecKp:Sep;6earp;Geaoczp:RecKp:Sep;6egwp;Gep;Kep;LegDpxbbbbbbbbbbbbbbbbp:2egqarpxbbbjbbbjbbbjbbbjgkp9op9rp;Kegrpxbb;:9cbb;:9cbb;:9cbb;:9cararp;MeaDaDp;Meawaqawakp9op9rp;Kegrarp;Mep;Kep;Kep;Jep;Negwp;Mepxbbn0bbn0bbn0bbn0gqp;KepxFbbbFbbbFbbbFbbbp9oaopxbbbFbbbFbbbFbbbFp9op9qarawp;Meaqp;Kecwp:RepxbFbbbFbbbFbbbFbbp9op9qaDawp;Meaqp;Keczp:RepxbbFbbbFbbbFbbbFbp9op9qpkbbadczfhdavclfgval6mbkkalae9pmeaipxbbbbbbbbbbbbbbbbgqpklbaiabalcdtfgdaeciGglcdtgv;8qbbdnalTmbaiaipblbgocKp:RecKp:Sep;6egraocwp:RecKp:Sep;6earp;Geaoczp:RecKp:Sep;6egwp;Gep;Kep;LegDaqp:2egqarpxbbbjbbbjbbbjbbbjgkp9op9rp;Kegrpxbb;:9cbb;:9cbb;:9cbb;:9cararp;MeaDaDp;Meawaqawakp9op9rp;Kegrarp;Mep;Kep;Kep;Jep;Negwp;Mepxbbn0bbn0bbn0bbn0gqp;KepxFbbbFbbbFbbbFbbbp9oaopxbbbFbbbFbbbFbbbFp9op9qarawp;Meaqp;Kecwp:RepxbFbbbFbbbFbbbFbbp9op9qaDawp;Meaqp;Keczp:RepxbbFbbbFbbbFbbbFbp9op9qpklbkadaiav;8qbbskdnalTmbcbhvabhdinadczfgxaxpbbbgopxbbbbbbFFbbbbbbFFgkp9oadpbbbgDaopmlvorxmPsCXQL358E8FpxFubbFubbFubbFubbp9op;6eaDaopmbediwDqkzHOAKY8AEgoczp:Sep;6egrp;Geaoczp:Reczp:Sep;6egwp;Gep;Kep;Legopxb;:FSb;:FSb;:FSb;:FSawaopxbbbbbbbbbbbbbbbbp:2egqawpxbbbjbbbjbbbjbbbjgmp9op9rp;Kegwawp;Meaoaop;Mearaqaramp9op9rp;Kegoaop;Mep;Kep;Kep;Jep;Negrp;Mepxbbn0bbn0bbn0bbn0gqp;Keczp:Reawarp;Meaqp;KepxFFbbFFbbFFbbFFbbp9op9qgwaoarp;Meaqp;KepxFFbbFFbbFFbbFFbbp9ogopmwDKYqk8AExm35Ps8E8Fp9qpkbbadaDakp9oawaopmbezHdiOAlvCXorQLp9qpkbbadcafhdavclfgval6mbkkalae9pmbaiaeciGgvcitgdfcbcaad9R;8kbaiabalcitfglad;8qbbdnavTmbaiaipblzgopxbbbbbbFFbbbbbbFFgkp9oaipblbgDaopmlvorxmPsCXQL358E8FpxFubbFubbFubbFubbp9op;6eaDaopmbediwDqkzHOAKY8AEgoczp:Sep;6egrp;Geaoczp:Reczp:Sep;6egwp;Gep;Kep;Legopxb;:FSb;:FSb;:FSb;:FSawaopxbbbbbbbbbbbbbbbbp:2egqawpxbbbjbbbjbbbjbbbjgmp9op9rp;Kegwawp;Meaoaop;Mearaqaramp9op9rp;Kegoaop;Mep;Kep;Kep;Jep;Negrp;Mepxbbn0bbn0bbn0bbn0gqp;Keczp:Reawarp;Meaqp;KepxFFbbFFbbFFbbFFbbp9op9qgwaoarp;Meaqp;KepxFFbbFFbbFFbbFFbbp9ogopmwDKYqk8AExm35Ps8E8Fp9qpklzaiaDakp9oawaopmbezHdiOAlvCXorQLp9qpklbkalaiad;8qbbkk;4wllue97euv978Jjjjjbc8W9Rhidnaec98GglTmbcbhvabhoinaiaopbbbgraoczfgwpbbbgDpmlvorxmPsCXQL358E8Fgqczp:Segkclp:RepklbaopxbbjZbbjZbbjZbbjZpx;Zl81Z;Zl81Z;Zl81Z;Zl81Zakpxibbbibbbibbbibbbp9qp;6ep;NegkaraDpmbediwDqkzHOAKY8AEgrczp:Reczp:Sep;6ep;MegDaDp;Meakarczp:Sep;6ep;Megxaxp;Meakaqczp:Reczp:Sep;6ep;Megqaqp;Mep;Kep;Kep;Lepxbbbbbbbbbbbbbbbbp:4ep;Jepxb;:FSb;:FSb;:FSb;:FSgkp;Mepxbbn0bbn0bbn0bbn0grp;KepxFFbbFFbbFFbbFFbbgmp9oaxakp;Mearp;Keczp:Rep9qgxaqakp;Mearp;Keczp:ReaDakp;Mearp;Keamp9op9qgkpmbezHdiOAlvCXorQLgrp5baipblbpEb:T:j83ibaocwfarp5eaipblbpEe:T:j83ibawaxakpmwDKYqk8AExm35Ps8E8Fgkp5baipblbpEd:T:j83ibaocKfakp5eaipblbpEi:T:j83ibaocafhoavclfgval6mbkkdnalae9pmbaiaeciGgvcitgofcbcaao9R;8kbaiabalcitfgwao;8qbbdnavTmbaiaipblbgraipblzgDpmlvorxmPsCXQL358E8Fgqczp:Segkclp:RepklaaipxbbjZbbjZbbjZbbjZpx;Zl81Z;Zl81Z;Zl81Z;Zl81Zakpxibbbibbbibbbibbbp9qp;6ep;NegkaraDpmbediwDqkzHOAKY8AEgrczp:Reczp:Sep;6ep;MegDaDp;Meakarczp:Sep;6ep;Megxaxp;Meakaqczp:Reczp:Sep;6ep;Megqaqp;Mep;Kep;Kep;Lepxbbbbbbbbbbbbbbbbp:4ep;Jepxb;:FSb;:FSb;:FSb;:FSgkp;Mepxbbn0bbn0bbn0bbn0grp;KepxFFbbFFbbFFbbFFbbgmp9oaxakp;Mearp;Keczp:Rep9qgxaqakp;Mearp;Keczp:ReaDakp;Mearp;Keamp9op9qgkpmbezHdiOAlvCXorQLgrp5baipblapEb:T:j83ibaiarp5eaipblapEe:T:j83iwaiaxakpmwDKYqk8AExm35Ps8E8Fgkp5baipblapEd:T:j83izaiakp5eaipblapEi:T:j83iKkawaiao;8qbbkk:Pddiue978Jjjjjbc;ab9Rhidnadcd4ae2glc98GgvTmbcbheabhdinadadpbbbgocwp:Recwp:Sep;6eaocep:SepxbbjFbbjFbbjFbbjFp9opxbbjZbbjZbbjZbbjZp:Uep;Mepkbbadczfhdaeclfgeav6mbkkdnaval9pmbaialciGgecdtgdVcbc;abad9R;8kbaiabavcdtfgvad;8qbbdnaeTmbaiaipblbgocwp:Recwp:Sep;6eaocep:SepxbbjFbbjFbbjFbbjFp9opxbbjZbbjZbbjZbbjZp:Uep;Mepklbkavaiad;8qbbkk9teiucbcbydj1jjbgeabcifc98GfgbBdj1jjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaikkkebcjwklz9Tbb\";\r\n\r\n const detector = new Uint8Array([0, 97, 115, 109, 1, 0, 0, 0, 1, 4, 1, 96, 0, 0, 3, 3, 2, 0, 0, 5, 3, 1, 0, 1, 12, 1, 0, 10, 22, 2, 12, 0, 65, 0, 65, 0, 65, 0, 252, 10, 0, 0, 11, 7, 0, 65, 0, 253, 15, 26, 11]);\r\n const wasmpack = new Uint8Array([32, 0, 65, 2, 1, 106, 34, 33, 3, 128, 11, 4, 13, 64, 6, 253, 10, 7, 15, 116, 127, 5, 8, 12, 40, 16, 19, 54, 20, 9, 27, 255, 113, 17, 42, 67, 24, 23, 146, 148, 18, 14, 22, 45, 70, 69, 56, 114, 101, 21, 25, 63, 75, 136, 108, 28, 118, 29, 73, 115]);\r\n\r\n if (typeof WebAssembly !== 'object') {\r\n Logger.logError(FrontendLoggerCategory.Render, \"WebAssembly is not supported in this environment\");\r\n return undefined;\r\n }\r\n\r\n const wasm = WebAssembly.validate(detector) ? unpack(wasmSimd) : unpack(wasmBase);\r\n\r\n let instance: any;\r\n\r\n try {\r\n const result = await WebAssembly.instantiate(wasm, {});\r\n instance = result.instance;\r\n instance.exports.__wasm_call_ctors();\r\n }\r\n catch (err) {\r\n Logger.logException(FrontendLoggerCategory.Render, err);\r\n return undefined;\r\n }\r\n\r\n function unpack(data: string) {\r\n const result = new Uint8Array(data.length);\r\n for (let i = 0; i < data.length; ++i) {\r\n const ch = data.charCodeAt(i);\r\n result[i] = ch > 96 ? ch - 97 : ch > 64 ? ch - 39 : ch + 4;\r\n }\r\n let write = 0;\r\n for (let i = 0; i < data.length; ++i) {\r\n result[write++] = (result[i] < 60) ? wasmpack[result[i]] : (result[i] - 60) * 64 + result[++i];\r\n }\r\n return result.buffer.slice(0, write);\r\n }\r\n\r\n function decode(decoder: string, target: Uint8Array, count: number, size: number, source: Uint8Array, filter?: any) {\r\n const fun = instance.exports[decoder];\r\n const sbrk = instance.exports.sbrk;\r\n const count4 = (count + 3) & ~3;\r\n const tp = sbrk(count4 * size);\r\n const sp = sbrk(source.length);\r\n const heap = new Uint8Array(instance.exports.memory.buffer);\r\n heap.set(source, sp);\r\n const res = fun(tp, count, size, sp, source.length);\r\n if (res === 0 && filter) {\r\n filter(tp, count4, size);\r\n }\r\n target.set(heap.subarray(tp, tp + count * size));\r\n sbrk(tp - sbrk(0));\r\n if (res !== 0) {\r\n throw new Error(`Malformed buffer data: ${res}`);\r\n }\r\n }\r\n\r\n const decoders: any = {\r\n //eslint-disable-next-line @typescript-eslint/naming-convention\r\n ATTRIBUTES: 'meshopt_decodeVertexBuffer',\r\n //eslint-disable-next-line @typescript-eslint/naming-convention\r\n TRIANGLES: 'meshopt_decodeIndexBuffer',\r\n //eslint-disable-next-line @typescript-eslint/naming-convention\r\n INDICES: 'meshopt_decodeIndexSequence',\r\n };\r\n\r\n const filters: any = {\r\n //eslint-disable-next-line @typescript-eslint/naming-convention\r\n NONE: '',\r\n //eslint-disable-next-line @typescript-eslint/naming-convention\r\n OCTAHEDRAL: 'meshopt_decodeFilterOct',\r\n //eslint-disable-next-line @typescript-eslint/naming-convention\r\n QUATERNION: 'meshopt_decodeFilterQuat',\r\n //eslint-disable-next-line @typescript-eslint/naming-convention\r\n EXPONENTIAL: 'meshopt_decodeFilterExp',\r\n };\r\n\r\n return {\r\n decodeVertexBuffer(target: Uint8Array, count: number, size: number, source: Uint8Array, filter?: string) {\r\n decode(decoders.ATTRIBUTES, target, count, size, source, filter ? instance.exports[filters[filter]] : undefined);\r\n },\r\n decodeIndexBuffer(target: Uint8Array, count: number, size: number, source: Uint8Array) {\r\n decode(decoders.TRIANGLES, target, count, size, source);\r\n },\r\n decodeIndexSequence(target: Uint8Array, count: number, size: number, source: Uint8Array) {\r\n decode(decoders.INDICES, target, count, size, source);\r\n },\r\n decodeGltfBuffer(target: Uint8Array, count: number, size: number, source: Uint8Array, mode: string, filter?: string) {\r\n decode(decoders[mode], target, count, size, source, filter ? instance.exports[filters[filter]] : undefined);\r\n },\r\n };\r\n};\r\n\r\nlet meshoptDecoderLoaded: boolean = false;\r\nlet meshoptDecoder: MeshoptDecoder | undefined;\r\n\r\nexport async function getMeshoptDecoder(): Promise<MeshoptDecoder | undefined> {\r\n if (!meshoptDecoderLoaded) {\r\n meshoptDecoder = await getDecoder();\r\n meshoptDecoderLoaded = true;\r\n }\r\n return meshoptDecoder;\r\n}\r\n\r\n/** Arguments supplied to decodeMeshoptBuffer.\r\n */\r\nexport interface DecodeMeshoptBufferArgs {\r\n byteStride: number;\r\n count: number;\r\n mode: ExtMeshoptCompressionMode;\r\n filter?: ExtMeshoptCompressionFilter;\r\n}\r\n\r\nexport async function decodeMeshoptBuffer(source: Uint8Array, args: DecodeMeshoptBufferArgs): Promise<Uint8Array | undefined> {\r\n const decoder = await getMeshoptDecoder();\r\n if (!decoder) {\r\n return undefined;\r\n }\r\n\r\n const target = new Uint8Array(args.count * args.byteStride);\r\n decoder.decodeGltfBuffer(target, args.count, args.byteStride, source, args.mode, args.filter);\r\n return target;\r\n}\r\n"]}
1
+ {"version":3,"file":"MeshoptCompression.js","sourceRoot":"","sources":["../../../../src/internal/tile/MeshoptCompression.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Tiles\r\n */\r\n\r\nimport { Logger } from \"@itwin/core-bentley\";\r\nimport type { ExtMeshoptCompressionFilter, ExtMeshoptCompressionMode } from \"../../common/gltf/GltfSchema\";\r\nimport { FrontendLoggerCategory } from \"../../common/FrontendLoggerCategory\";\r\n\r\nexport interface MeshoptDecoder {\r\n decodeVertexBuffer: (target: Uint8Array, count: number, size: number, source: Uint8Array, filter?: string) => void;\r\n decodeIndexBuffer: (target: Uint8Array, count: number, size: number, source: Uint8Array) => void;\r\n decodeIndexSequence: (target: Uint8Array, count: number, size: number, source: Uint8Array) => void;\r\n decodeGltfBuffer(target: Uint8Array, count: number, size: number, source: Uint8Array, mode: string, filter?: string): void;\r\n};\r\n\r\n// This is a modified version of https://github.com/zeux/meshoptimizer/blob/master/js/meshopt_decoder.js.\r\n// The orginial code will load wasm when the module is imported, which seems to upset vitest somehow.\r\n// This version loads wasm only when a decoder is requested, which only occurs when parsing a compressed tile.\r\nasync function getDecoder(): Promise<MeshoptDecoder | undefined> {\r\n // Built with clang version 16.0.0\r\n // Built from meshoptimizer 0.20\r\n const wasmBase = \"b9H79Tebbbe8Fv9Gbb9Gvuuuuueu9Giuuub9Geueu9Giuuueuikqbeeedddillviebeoweuec:q;iekr;leDo9TW9T9VV95dbH9F9F939H79T9F9J9H229F9Jt9VV7bb8A9TW79O9V9Wt9F9KW9J9V9KW9wWVtW949c919M9MWVbeY9TW79O9V9Wt9F9KW9J9V9KW69U9KW949c919M9MWVbdE9TW79O9V9Wt9F9KW9J9V9KW69U9KW949tWG91W9U9JWbiL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9p9JtblK9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9r919HtbvL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWVT949Wbol79IV9Rbrq;d8Yqdbk:yzeHu8Jjjjjbcj;eb9Rgv8Kjjjjbc9:hodnadcefal0mbcuhoaiRbbc:Ge9hmbavaialfgrad9Radz1jjjbhwcj;abad9UhlaicefhodnadTmbalc;WFbGglcjdalcjd6EhDcbhqinaqae9pmeaDaeaq9RaqaDfae6Egkcsfglcl4cifcd4hxdndndndnalc9WGgmTmbcbhPcehsawcjdfhzaohHinaraH9Rax6midnaraHaxfgo9RcK6mbczhlcbhOinalgic9WfgAawcj;cbffhldndndndndnaHaAco4fRbbaOcoG4ciGPlbedibkal9cb83ibalcwf9cb83ibxikalaoRblaoRbbgAco4gCaCciSgCE86bbawcj;cbfaifglcGfaoclfaCfgCRbbaAcl4ciGgXaXciSgXE86bbalcVfaCaXfgCRbbaAcd4ciGgXaXciSgXE86bbalc7faCaXfgCRbbaAciGgAaAciSgAE86bbalctfaCaAfgCRbbaoRbegAco4gXaXciSgXE86bbalc91faCaXfgCRbbaAcl4ciGgXaXciSgXE86bbalc4faCaXfgCRbbaAcd4ciGgXaXciSgXE86bbalc93faCaXfgCRbbaAciGgAaAciSgAE86bbalc94faCaAfgCRbbaoRbdgAco4gXaXciSgXE86bbalc95faCaXfgCRbbaAcl4ciGgXaXciSgXE86bbalc96faCaXfgCRbbaAcd4ciGgXaXciSgXE86bbalc97faCaXfgCRbbaAciGgAaAciSgAE86bbalc98faCaAfgARbbaoRbigoco4gCaCciSgCE86bbalc99faAaCfgARbbaocl4ciGgCaCciSgCE86bbalc9:faAaCfgARbbaocd4ciGgCaCciSgCE86bbalcufaAaCfglRbbaociGgoaociSgoE86bbalaofhoxdkalaoRbwaoRbbgAcl4gCaCcsSgCE86bbawcj;cbfaifglcGfaocwfaCfgCRbbaAcsGgAaAcsSgAE86bbalcVfaCaAfgARbbaoRbegCcl4gXaXcsSgXE86bbalc7faAaXfgARbbaCcsGgCaCcsSgCE86bbalctfaAaCfgARbbaoRbdgCcl4gXaXcsSgXE86bbalc91faAaXfgARbbaCcsGgCaCcsSgCE86bbalc4faAaCfgARbbaoRbigCcl4gXaXcsSgXE86bbalc93faAaXfgARbbaCcsGgCaCcsSgCE86bbalc94faAaCfgARbbaoRblgCcl4gXaXcsSgXE86bbalc95faAaXfgARbbaCcsGgCaCcsSgCE86bbalc96faAaCfgARbbaoRbvgCcl4gXaXcsSgXE86bbalc97faAaXfgARbbaCcsGgCaCcsSgCE86bbalc98faAaCfgARbbaoRbogCcl4gXaXcsSgXE86bbalc99faAaXfgARbbaCcsGgCaCcsSgCE86bbalc9:faAaCfgARbbaoRbrgocl4gCaCcsSgCE86bbalcufaAaCfglRbbaocsGgoaocsSgoE86bbalaofhoxekalao8Pbb83bbalcwfaocwf8Pbb83bbaoczfhokdnaiam9pmbaOcdfhOaiczfhlarao9RcL0mekkaiam6miaoTmidnakTmbawaPfRbbhOawcj;cbfhlazhiakhAinaialRbbgHce4cbaHceG9R7aOfgO86bbaiadfhialcefhlaAcufgAmbkkazcefhzaPcefgPad6hsaohHaPad9hmexvkkcbhoasceGmdxikaoaxad2fhXdnakTmbcbhmcehsawcjdfhCinarao9Rax6miaoTmdaoaxfhoawamfRbbhOawcj;cbfhlaChiakhAinaialRbbgHce4cbaHceG9R7aOfgO86bbaiadfhialcefhlaAcufgAmbkaCcefhCamcefgmad6hsamad9hmbkaXhoxikcbhlcehsinarao9Rax6mdaoTmeaoaxfhoalcefglad6hsadal9hmbkaXhoxdkcbhoasceGTmekc9:hoxikabaqad2fawcjdfakad2z1jjjb8Aawawcjdfakcufad2fadz1jjjb8Aakaqfhqaombkc9:hoxekcbc99arao9Radcaadca0ESEhokavcj;ebf8Kjjjjbaok;xzeHu8Jjjjjbc;ae9Rgv8Kjjjjbc9:hodnaeci9UgrcHfal0mbcuhoaiRbbgwc;WeGc;Ge9hmbawcsGgDce0mbavc;abfcFecjez:jjjjb8AavcUf9cu83ibavc8Wf9cu83ibavcyf9cu83ibavcaf9cu83ibavcKf9cu83ibavczf9cu83ibav9cu83iwav9cu83ibaialfc9WfhqaicefgwarfhodnaeTmbcmcsaDceSEhkcbhxcbhmcbhrcbhicbhlindnaoaq9nmbc9:hoxikdndnawRbbgDc;Ve0mbavc;abfalaDcu7gPcl4fcsGcitfgsydlhzasydbhHdnaDcsGgDak9pmbavaiaPfcsGcdtfydbaxaDEhsaDThDdndnadcd9hmbabarcetfgPaH87ebaPcdfaz87ebaPclfas87ebxekabarcdtfgPaHBdbaPclfazBdbaPcwfasBdbkaxaDfhxavc;abfalcitfgPasBdbaPazBdlavaicdtfasBdbavc;abfalcefcsGglcitfgPaHBdbaPasBdlaiaDfhialcefhlxdkdndnaDcsSmbamaDfaDc987fcefhmxekaocefhDao8SbbgscFeGhPdndnascu9mmbaDhoxekaocvfhoaPcFbGhPcrhsdninaD8SbbgOcFbGastaPVhPaOcu9kmeaDcefhDascrfgsc8J9hmbxdkkaDcefhokaPce4cbaPceG9R7amfhmkdndnadcd9hmbabarcetfgDaH87ebaDcdfaz87ebaDclfam87ebxekabarcdtfgDaHBdbaDclfazBdbaDcwfamBdbkavc;abfalcitfgDamBdbaDazBdlavaicdtfamBdbavc;abfalcefcsGglcitfgDaHBdbaDamBdlaicefhialcefhlxekdnaDcpe0mbaxcefgOavaiaqaDcsGfRbbgscl49RcsGcdtfydbascz6gPEhDavaias9RcsGcdtfydbaOaPfgzascsGgOEhsaOThOdndnadcd9hmbabarcetfgHax87ebaHcdfaD87ebaHclfas87ebxekabarcdtfgHaxBdbaHclfaDBdbaHcwfasBdbkavaicdtfaxBdbavc;abfalcitfgHaDBdbaHaxBdlavaicefgicsGcdtfaDBdbavc;abfalcefcsGcitfgHasBdbaHaDBdlavaiaPfcsGgicdtfasBdbavc;abfalcdfcsGglcitfgDaxBdbaDasBdlalcefhlaiaOfhiazaOfhxxekaxcbaoRbbgHEgAaDc;:eSgDfhzaHcsGhCaHcl4hXdndnaHcs0mbazcefhOxekazhOavaiaX9RcsGcdtfydbhzkdndnaCmbaOcefhxxekaOhxavaiaH9RcsGcdtfydbhOkdndnaDTmbaocefhDxekaocdfhDao8SbegPcFeGhsdnaPcu9kmbaocofhAascFbGhscrhodninaD8SbbgPcFbGaotasVhsaPcu9kmeaDcefhDaocrfgoc8J9hmbkaAhDxekaDcefhDkasce4cbasceG9R7amfgmhAkdndnaXcsSmbaDhsxekaDcefhsaD8SbbgocFeGhPdnaocu9kmbaDcvfhzaPcFbGhPcrhodninas8SbbgDcFbGaotaPVhPaDcu9kmeascefhsaocrfgoc8J9hmbkazhsxekascefhskaPce4cbaPceG9R7amfgmhzkdndnaCcsSmbashoxekascefhoas8SbbgDcFeGhPdnaDcu9kmbascvfhOaPcFbGhPcrhDdninao8SbbgscFbGaDtaPVhPascu9kmeaocefhoaDcrfgDc8J9hmbkaOhoxekaocefhokaPce4cbaPceG9R7amfgmhOkdndnadcd9hmbabarcetfgDaA87ebaDcdfaz87ebaDclfaO87ebxekabarcdtfgDaABdbaDclfazBdbaDcwfaOBdbkavc;abfalcitfgDazBdbaDaABdlavaicdtfaABdbavc;abfalcefcsGcitfgDaOBdbaDazBdlavaicefgicsGcdtfazBdbavc;abfalcdfcsGcitfgDaABdbaDaOBdlavaiaHcz6aXcsSVfgicsGcdtfaOBdbaiaCTaCcsSVfhialcifhlkawcefhwalcsGhlaicsGhiarcifgrae6mbkkcbc99aoaqSEhokavc;aef8Kjjjjbaok:flevu8Jjjjjbcz9Rhvc9:hodnaecvfal0mbcuhoaiRbbc;:eGc;qe9hmbav9cb83iwaicefhraialfc98fhwdnaeTmbdnadcdSmbcbhDindnaraw6mbc9:skarcefhoar8SbbglcFeGhidndnalcu9mmbaohrxekarcvfhraicFbGhicrhldninao8SbbgdcFbGaltaiVhiadcu9kmeaocefhoalcrfglc8J9hmbxdkkaocefhrkabaDcdtfaic8Etc8F91aicd47avcwfaiceGcdtVgoydbfglBdbaoalBdbaDcefgDae9hmbxdkkcbhDindnaraw6mbc9:skarcefhoar8SbbglcFeGhidndnalcu9mmbaohrxekarcvfhraicFbGhicrhldninao8SbbgdcFbGaltaiVhiadcu9kmeaocefhoalcrfglc8J9hmbxdkkaocefhrkabaDcetfaic8Etc8F91aicd47avcwfaiceGcdtVgoydbfgl87ebaoalBdbaDcefgDae9hmbkkcbc99arawSEhokaok:Lvoeue99dud99eud99dndnadcl9hmbaeTmeindndnabcdfgd8Sbb:Yab8Sbbgi:Ygl:l:tabcefgv8Sbbgo:Ygr:l:tgwJbb;:9cawawNJbbbbawawJbbbb9GgDEgq:mgkaqaicb9iEalMgwawNakaqaocb9iEarMgqaqNMM:r:vglNJbbbZJbbb:;aDEMgr:lJbbb9p9DTmbar:Ohixekcjjjj94hikadai86bbdndnaqalNJbbbZJbbb:;aqJbbbb9GEMgq:lJbbb9p9DTmbaq:Ohdxekcjjjj94hdkavad86bbdndnawalNJbbbZJbbb:;awJbbbb9GEMgw:lJbbb9p9DTmbaw:Ohdxekcjjjj94hdkabad86bbabclfhbaecufgembxdkkaeTmbindndnabclfgd8Ueb:Yab8Uebgi:Ygl:l:tabcdfgv8Uebgo:Ygr:l:tgwJb;:FSawawNJbbbbawawJbbbb9GgDEgq:mgkaqaicb9iEalMgwawNakaqaocb9iEarMgqaqNMM:r:vglNJbbbZJbbb:;aDEMgr:lJbbb9p9DTmbar:Ohixekcjjjj94hikadai87ebdndnaqalNJbbbZJbbb:;aqJbbbb9GEMgq:lJbbb9p9DTmbaq:Ohdxekcjjjj94hdkavad87ebdndnawalNJbbbZJbbb:;awJbbbb9GEMgw:lJbbb9p9DTmbaw:Ohdxekcjjjj94hdkabad87ebabcwfhbaecufgembkkk;siliui99iue99dnaeTmbcbhiabhlindndnJ;Zl81Zalcof8UebgvciV:Y:vgoal8Ueb:YNgrJb;:FSNJbbbZJbbb:;arJbbbb9GEMgw:lJbbb9p9DTmbaw:OhDxekcjjjj94hDkalclf8Uebhqalcdf8UebhkabaiavcefciGfcetfaD87ebdndnaoak:YNgwJb;:FSNJbbbZJbbb:;awJbbbb9GEMgx:lJbbb9p9DTmbax:Ohkxekcjjjj94hkkabaiavcdfciGfcetfak87ebdndnaoaq:YNgoJb;:FSNJbbbZJbbb:;aoJbbbb9GEMgx:lJbbb9p9DTmbax:Ohqxekcjjjj94hqkabaiavcufciGfcetfaq87ebdndnJbbjZararN:tawawN:taoaoN:tgrJbbbbarJbbbb9GE:rJb;:FSNJbbbZMgr:lJbbb9p9DTmbar:Ohqxekcjjjj94hqkabaiavciGfcetfaq87ebalcwfhlaiclfhiaecufgembkkk9mbdnadcd4ae2gdTmbinababydbgecwtcw91:Yaece91cjjj98Gcjjj;8if::NUdbabclfhbadcufgdmbkkk9teiucbcbydj1jjbgeabcifc98GfgbBdj1jjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaik;LeeeudndnaeabVciGTmbabhixekdndnadcz9pmbabhixekabhiinaiaeydbBdbaiclfaeclfydbBdbaicwfaecwfydbBdbaicxfaecxfydbBdbaeczfheaiczfhiadc9Wfgdcs0mbkkadcl6mbinaiaeydbBdbaeclfheaiclfhiadc98fgdci0mbkkdnadTmbinaiaeRbb86bbaicefhiaecefheadcufgdmbkkabk;aeedudndnabciGTmbabhixekaecFeGc:b:c:ew2hldndnadcz9pmbabhixekabhiinaialBdbaicxfalBdbaicwfalBdbaiclfalBdbaiczfhiadc9Wfgdcs0mbkkadcl6mbinaialBdbaiclfhiadc98fgdci0mbkkdnadTmbinaiae86bbaicefhiadcufgdmbkkabkkkebcjwklz9Kbb\";\r\n const wasmSimd = \"b9H79TebbbeKl9Gbb9Gvuuuuueu9Giuuub9Geueuikqbbebeedddilve9Weeeviebeoweuec:q;Aekr;leDo9TW9T9VV95dbH9F9F939H79T9F9J9H229F9Jt9VV7bb8A9TW79O9V9Wt9F9KW9J9V9KW9wWVtW949c919M9MWVbdY9TW79O9V9Wt9F9KW9J9V9KW69U9KW949c919M9MWVblE9TW79O9V9Wt9F9KW9J9V9KW69U9KW949tWG91W9U9JWbvL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9p9JtboK9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9r919HtbrL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWVT949Wbwl79IV9RbDq;b9tqlbzik9:evu8Jjjjjbcz9Rhbcbheincbhdcbhiinabcwfadfaicjuaead4ceGglE86bbaialfhiadcefgdcw9hmbkaec:q:yjjbfai86bbaecitc:q1jjbfab8Piw83ibaecefgecjd9hmbkk;e8JlHud97euo978Jjjjjbcj;kb9Rgv8Kjjjjbc9:hodnadcefal0mbcuhoaiRbbc:Ge9hmbavaialfgrad9Rad;8qbbcj;abad9UhoaicefhldnadTmbaoc;WFbGgocjdaocjd6EhwcbhDinaDae9pmeawaeaD9RaDawfae6Egqcsfgoc9WGgkci2hxakcethmaocl4cifcd4hPabaDad2fhscbhzdnincbhHalhOcbhAdninaraO9RaP6miavcj;cbfaAak2fhCaOaPfhlcbhidnakc;ab6mbaral9Rc;Gb6mbcbhoinaCaofhidndndndndnaOaoco4fRbbgXciGPlbedibkaipxbbbbbbbbbbbbbbbbpklbxikaialpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklbalclfaYpQbfaKc:q:yjjbfRbbfhlxdkaialpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklbalcwfaYpQbfaKc:q:yjjbfRbbfhlxekaialpbbbpklbalczfhlkdndndndndnaXcd4ciGPlbedibkaipxbbbbbbbbbbbbbbbbpklzxikaialpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklzalclfaYpQbfaKc:q:yjjbfRbbfhlxdkaialpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklzalcwfaYpQbfaKc:q:yjjbfRbbfhlxekaialpbbbpklzalczfhlkdndndndndnaXcl4ciGPlbedibkaipxbbbbbbbbbbbbbbbbpklaxikaialpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklaalclfaYpQbfaKc:q:yjjbfRbbfhlxdkaialpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklaalcwfaYpQbfaKc:q:yjjbfRbbfhlxekaialpbbbpklaalczfhlkdndndndndnaXco4Plbedibkaipxbbbbbbbbbbbbbbbbpkl8WxikaialpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgXcitc:q1jjbfpbibaXc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgXcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spkl8WalclfaYpQbfaXc:q:yjjbfRbbfhlxdkaialpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgXcitc:q1jjbfpbibaXc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgXcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spkl8WalcwfaYpQbfaXc:q:yjjbfRbbfhlxekaialpbbbpkl8Walczfhlkaoc;abfhiaocjefak0meaihoaral9Rc;Fb0mbkkdndnaiak9pmbaici4hoinaral9RcK6mdaCaifhXdndndndndnaOaico4fRbbaocoG4ciGPlbedibkaXpxbbbbbbbbbbbbbbbbpklbxikaXalpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklbalclfaYpQbfaKc:q:yjjbfRbbfhlxdkaXalpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklbalcwfaYpQbfaKc:q:yjjbfRbbfhlxekaXalpbbbpklbalczfhlkaocdfhoaiczfgiak6mbkkalTmbaAcd0hHalhOaAcefgAclSmdxekkcbhlaHceGTmdkdnakTmbavcjdfazfhiavazfpbdbhYcbhXinaiavcj;cbfaXfgopblbgLcep9TaLpxeeeeeeeeeeeeeeeegQp9op9Hp9rgLaoakfpblbg8Acep9Ta8AaQp9op9Hp9rg8ApmbzeHdOiAlCvXoQrLgEaoamfpblbg3cep9Ta3aQp9op9Hp9rg3aoaxfpblbg5cep9Ta5aQp9op9Hp9rg5pmbzeHdOiAlCvXoQrLg8EpmbezHdiOAlvCXorQLgQaQpmbedibedibedibediaYp9UgYp9AdbbaiadfgoaYaQaQpmlvorlvorlvorlvorp9UgYp9AdbbaoadfgoaYaQaQpmwDqkwDqkwDqkwDqkp9UgYp9AdbbaoadfgoaYaQaQpmxmPsxmPsxmPsxmPsp9UgYp9AdbbaoadfgoaYaEa8EpmwDKYqk8AExm35Ps8E8FgQaQpmbedibedibedibedip9UgYp9AdbbaoadfgoaYaQaQpmlvorlvorlvorlvorp9UgYp9AdbbaoadfgoaYaQaQpmwDqkwDqkwDqkwDqkp9UgYp9AdbbaoadfgoaYaQaQpmxmPsxmPsxmPsxmPsp9UgYp9AdbbaoadfgoaYaLa8ApmwKDYq8AkEx3m5P8Es8FgLa3a5pmwKDYq8AkEx3m5P8Es8Fg8ApmbezHdiOAlvCXorQLgQaQpmbedibedibedibedip9UgYp9AdbbaoadfgoaYaQaQpmlvorlvorlvorlvorp9UgYp9AdbbaoadfgoaYaQaQpmwDqkwDqkwDqkwDqkp9UgYp9AdbbaoadfgoaYaQaQpmxmPsxmPsxmPsxmPsp9UgYp9AdbbaoadfgoaYaLa8ApmwDKYqk8AExm35Ps8E8FgQaQpmbedibedibedibedip9UgYp9AdbbaoadfgoaYaQaQpmlvorlvorlvorlvorp9UgYp9AdbbaoadfgoaYaQaQpmwDqkwDqkwDqkwDqkp9UgYp9AdbbaoadfgoaYaQaQpmxmPsxmPsxmPsxmPsp9UgYp9AdbbaoadfhiaXczfgXak6mbkkazclfgzad6mbkasavcjdfaqad2;8qbbavavcjdfaqcufad2fad;8qbbaqaDfhDc9:hoalmexikkc9:hoxekcbc99aral9Radcaadca0ESEhokavcj;kbf8Kjjjjbaokwbz:bjjjbk;tzeHu8Jjjjjbc;ae9Rgv8Kjjjjbc9:hodnaeci9UgrcHfal0mbcuhoaiRbbgwc;WeGc;Ge9hmbawcsGgDce0mbavc;abfcFecje;8kbavcUf9cu83ibavc8Wf9cu83ibavcyf9cu83ibavcaf9cu83ibavcKf9cu83ibavczf9cu83ibav9cu83iwav9cu83ibaialfc9WfhqaicefgwarfhodnaeTmbcmcsaDceSEhkcbhxcbhmcbhrcbhicbhlindnaoaq9nmbc9:hoxikdndnawRbbgDc;Ve0mbavc;abfalaDcu7gPcl4fcsGcitfgsydlhzasydbhHdnaDcsGgDak9pmbavaiaPfcsGcdtfydbaxaDEhsaDThDdndnadcd9hmbabarcetfgPaH87ebaPcdfaz87ebaPclfas87ebxekabarcdtfgPaHBdbaPclfazBdbaPcwfasBdbkaxaDfhxavc;abfalcitfgPasBdbaPazBdlavaicdtfasBdbavc;abfalcefcsGglcitfgPaHBdbaPasBdlaiaDfhialcefhlxdkdndnaDcsSmbamaDfaDc987fcefhmxekaocefhDao8SbbgscFeGhPdndnascu9mmbaDhoxekaocvfhoaPcFbGhPcrhsdninaD8SbbgOcFbGastaPVhPaOcu9kmeaDcefhDascrfgsc8J9hmbxdkkaDcefhokaPce4cbaPceG9R7amfhmkdndnadcd9hmbabarcetfgDaH87ebaDcdfaz87ebaDclfam87ebxekabarcdtfgDaHBdbaDclfazBdbaDcwfamBdbkavc;abfalcitfgDamBdbaDazBdlavaicdtfamBdbavc;abfalcefcsGglcitfgDaHBdbaDamBdlaicefhialcefhlxekdnaDcpe0mbaxcefgOavaiaqaDcsGfRbbgscl49RcsGcdtfydbascz6gPEhDavaias9RcsGcdtfydbaOaPfgzascsGgOEhsaOThOdndnadcd9hmbabarcetfgHax87ebaHcdfaD87ebaHclfas87ebxekabarcdtfgHaxBdbaHclfaDBdbaHcwfasBdbkavaicdtfaxBdbavc;abfalcitfgHaDBdbaHaxBdlavaicefgicsGcdtfaDBdbavc;abfalcefcsGcitfgHasBdbaHaDBdlavaiaPfcsGgicdtfasBdbavc;abfalcdfcsGglcitfgDaxBdbaDasBdlalcefhlaiaOfhiazaOfhxxekaxcbaoRbbgHEgAaDc;:eSgDfhzaHcsGhCaHcl4hXdndnaHcs0mbazcefhOxekazhOavaiaX9RcsGcdtfydbhzkdndnaCmbaOcefhxxekaOhxavaiaH9RcsGcdtfydbhOkdndnaDTmbaocefhDxekaocdfhDao8SbegPcFeGhsdnaPcu9kmbaocofhAascFbGhscrhodninaD8SbbgPcFbGaotasVhsaPcu9kmeaDcefhDaocrfgoc8J9hmbkaAhDxekaDcefhDkasce4cbasceG9R7amfgmhAkdndnaXcsSmbaDhsxekaDcefhsaD8SbbgocFeGhPdnaocu9kmbaDcvfhzaPcFbGhPcrhodninas8SbbgDcFbGaotaPVhPaDcu9kmeascefhsaocrfgoc8J9hmbkazhsxekascefhskaPce4cbaPceG9R7amfgmhzkdndnaCcsSmbashoxekascefhoas8SbbgDcFeGhPdnaDcu9kmbascvfhOaPcFbGhPcrhDdninao8SbbgscFbGaDtaPVhPascu9kmeaocefhoaDcrfgDc8J9hmbkaOhoxekaocefhokaPce4cbaPceG9R7amfgmhOkdndnadcd9hmbabarcetfgDaA87ebaDcdfaz87ebaDclfaO87ebxekabarcdtfgDaABdbaDclfazBdbaDcwfaOBdbkavc;abfalcitfgDazBdbaDaABdlavaicdtfaABdbavc;abfalcefcsGcitfgDaOBdbaDazBdlavaicefgicsGcdtfazBdbavc;abfalcdfcsGcitfgDaABdbaDaOBdlavaiaHcz6aXcsSVfgicsGcdtfaOBdbaiaCTaCcsSVfhialcifhlkawcefhwalcsGhlaicsGhiarcifgrae6mbkkcbc99aoaqSEhokavc;aef8Kjjjjbaok:flevu8Jjjjjbcz9Rhvc9:hodnaecvfal0mbcuhoaiRbbc;:eGc;qe9hmbav9cb83iwaicefhraialfc98fhwdnaeTmbdnadcdSmbcbhDindnaraw6mbc9:skarcefhoar8SbbglcFeGhidndnalcu9mmbaohrxekarcvfhraicFbGhicrhldninao8SbbgdcFbGaltaiVhiadcu9kmeaocefhoalcrfglc8J9hmbxdkkaocefhrkabaDcdtfaic8Etc8F91aicd47avcwfaiceGcdtVgoydbfglBdbaoalBdbaDcefgDae9hmbxdkkcbhDindnaraw6mbc9:skarcefhoar8SbbglcFeGhidndnalcu9mmbaohrxekarcvfhraicFbGhicrhldninao8SbbgdcFbGaltaiVhiadcu9kmeaocefhoalcrfglc8J9hmbxdkkaocefhrkabaDcetfaic8Etc8F91aicd47avcwfaiceGcdtVgoydbfgl87ebaoalBdbaDcefgDae9hmbkkcbc99arawSEhokaok:wPliuo97eue978Jjjjjbca9Rhiaec98Ghldndnadcl9hmbdnalTmbcbhvabhdinadadpbbbgocKp:RecKp:Sep;6egraocwp:RecKp:Sep;6earp;Geaoczp:RecKp:Sep;6egwp;Gep;Kep;LegDpxbbbbbbbbbbbbbbbbp:2egqarpxbbbjbbbjbbbjbbbjgkp9op9rp;Kegrpxbb;:9cbb;:9cbb;:9cbb;:9cararp;MeaDaDp;Meawaqawakp9op9rp;Kegrarp;Mep;Kep;Kep;Jep;Negwp;Mepxbbn0bbn0bbn0bbn0gqp;KepxFbbbFbbbFbbbFbbbp9oaopxbbbFbbbFbbbFbbbFp9op9qarawp;Meaqp;Kecwp:RepxbFbbbFbbbFbbbFbbp9op9qaDawp;Meaqp;Keczp:RepxbbFbbbFbbbFbbbFbp9op9qpkbbadczfhdavclfgval6mbkkalae9pmeaipxbbbbbbbbbbbbbbbbgqpklbaiabalcdtfgdaeciGglcdtgv;8qbbdnalTmbaiaipblbgocKp:RecKp:Sep;6egraocwp:RecKp:Sep;6earp;Geaoczp:RecKp:Sep;6egwp;Gep;Kep;LegDaqp:2egqarpxbbbjbbbjbbbjbbbjgkp9op9rp;Kegrpxbb;:9cbb;:9cbb;:9cbb;:9cararp;MeaDaDp;Meawaqawakp9op9rp;Kegrarp;Mep;Kep;Kep;Jep;Negwp;Mepxbbn0bbn0bbn0bbn0gqp;KepxFbbbFbbbFbbbFbbbp9oaopxbbbFbbbFbbbFbbbFp9op9qarawp;Meaqp;Kecwp:RepxbFbbbFbbbFbbbFbbp9op9qaDawp;Meaqp;Keczp:RepxbbFbbbFbbbFbbbFbp9op9qpklbkadaiav;8qbbskdnalTmbcbhvabhdinadczfgxaxpbbbgopxbbbbbbFFbbbbbbFFgkp9oadpbbbgDaopmlvorxmPsCXQL358E8FpxFubbFubbFubbFubbp9op;6eaDaopmbediwDqkzHOAKY8AEgoczp:Sep;6egrp;Geaoczp:Reczp:Sep;6egwp;Gep;Kep;Legopxb;:FSb;:FSb;:FSb;:FSawaopxbbbbbbbbbbbbbbbbp:2egqawpxbbbjbbbjbbbjbbbjgmp9op9rp;Kegwawp;Meaoaop;Mearaqaramp9op9rp;Kegoaop;Mep;Kep;Kep;Jep;Negrp;Mepxbbn0bbn0bbn0bbn0gqp;Keczp:Reawarp;Meaqp;KepxFFbbFFbbFFbbFFbbp9op9qgwaoarp;Meaqp;KepxFFbbFFbbFFbbFFbbp9ogopmwDKYqk8AExm35Ps8E8Fp9qpkbbadaDakp9oawaopmbezHdiOAlvCXorQLp9qpkbbadcafhdavclfgval6mbkkalae9pmbaiaeciGgvcitgdfcbcaad9R;8kbaiabalcitfglad;8qbbdnavTmbaiaipblzgopxbbbbbbFFbbbbbbFFgkp9oaipblbgDaopmlvorxmPsCXQL358E8FpxFubbFubbFubbFubbp9op;6eaDaopmbediwDqkzHOAKY8AEgoczp:Sep;6egrp;Geaoczp:Reczp:Sep;6egwp;Gep;Kep;Legopxb;:FSb;:FSb;:FSb;:FSawaopxbbbbbbbbbbbbbbbbp:2egqawpxbbbjbbbjbbbjbbbjgmp9op9rp;Kegwawp;Meaoaop;Mearaqaramp9op9rp;Kegoaop;Mep;Kep;Kep;Jep;Negrp;Mepxbbn0bbn0bbn0bbn0gqp;Keczp:Reawarp;Meaqp;KepxFFbbFFbbFFbbFFbbp9op9qgwaoarp;Meaqp;KepxFFbbFFbbFFbbFFbbp9ogopmwDKYqk8AExm35Ps8E8Fp9qpklzaiaDakp9oawaopmbezHdiOAlvCXorQLp9qpklbkalaiad;8qbbkk;4wllue97euv978Jjjjjbc8W9Rhidnaec98GglTmbcbhvabhoinaiaopbbbgraoczfgwpbbbgDpmlvorxmPsCXQL358E8Fgqczp:Segkclp:RepklbaopxbbjZbbjZbbjZbbjZpx;Zl81Z;Zl81Z;Zl81Z;Zl81Zakpxibbbibbbibbbibbbp9qp;6ep;NegkaraDpmbediwDqkzHOAKY8AEgrczp:Reczp:Sep;6ep;MegDaDp;Meakarczp:Sep;6ep;Megxaxp;Meakaqczp:Reczp:Sep;6ep;Megqaqp;Mep;Kep;Kep;Lepxbbbbbbbbbbbbbbbbp:4ep;Jepxb;:FSb;:FSb;:FSb;:FSgkp;Mepxbbn0bbn0bbn0bbn0grp;KepxFFbbFFbbFFbbFFbbgmp9oaxakp;Mearp;Keczp:Rep9qgxaqakp;Mearp;Keczp:ReaDakp;Mearp;Keamp9op9qgkpmbezHdiOAlvCXorQLgrp5baipblbpEb:T:j83ibaocwfarp5eaipblbpEe:T:j83ibawaxakpmwDKYqk8AExm35Ps8E8Fgkp5baipblbpEd:T:j83ibaocKfakp5eaipblbpEi:T:j83ibaocafhoavclfgval6mbkkdnalae9pmbaiaeciGgvcitgofcbcaao9R;8kbaiabalcitfgwao;8qbbdnavTmbaiaipblbgraipblzgDpmlvorxmPsCXQL358E8Fgqczp:Segkclp:RepklaaipxbbjZbbjZbbjZbbjZpx;Zl81Z;Zl81Z;Zl81Z;Zl81Zakpxibbbibbbibbbibbbp9qp;6ep;NegkaraDpmbediwDqkzHOAKY8AEgrczp:Reczp:Sep;6ep;MegDaDp;Meakarczp:Sep;6ep;Megxaxp;Meakaqczp:Reczp:Sep;6ep;Megqaqp;Mep;Kep;Kep;Lepxbbbbbbbbbbbbbbbbp:4ep;Jepxb;:FSb;:FSb;:FSb;:FSgkp;Mepxbbn0bbn0bbn0bbn0grp;KepxFFbbFFbbFFbbFFbbgmp9oaxakp;Mearp;Keczp:Rep9qgxaqakp;Mearp;Keczp:ReaDakp;Mearp;Keamp9op9qgkpmbezHdiOAlvCXorQLgrp5baipblapEb:T:j83ibaiarp5eaipblapEe:T:j83iwaiaxakpmwDKYqk8AExm35Ps8E8Fgkp5baipblapEd:T:j83izaiakp5eaipblapEi:T:j83iKkawaiao;8qbbkk:Pddiue978Jjjjjbc;ab9Rhidnadcd4ae2glc98GgvTmbcbheabhdinadadpbbbgocwp:Recwp:Sep;6eaocep:SepxbbjFbbjFbbjFbbjFp9opxbbjZbbjZbbjZbbjZp:Uep;Mepkbbadczfhdaeclfgeav6mbkkdnaval9pmbaialciGgecdtgdVcbc;abad9R;8kbaiabavcdtfgvad;8qbbdnaeTmbaiaipblbgocwp:Recwp:Sep;6eaocep:SepxbbjFbbjFbbjFbbjFp9opxbbjZbbjZbbjZbbjZp:Uep;Mepklbkavaiad;8qbbkk9teiucbcbydj1jjbgeabcifc98GfgbBdj1jjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaikkkebcjwklz9Tbb\";\r\n\r\n const detector = new Uint8Array([0, 97, 115, 109, 1, 0, 0, 0, 1, 4, 1, 96, 0, 0, 3, 3, 2, 0, 0, 5, 3, 1, 0, 1, 12, 1, 0, 10, 22, 2, 12, 0, 65, 0, 65, 0, 65, 0, 252, 10, 0, 0, 11, 7, 0, 65, 0, 253, 15, 26, 11]);\r\n const wasmpack = new Uint8Array([32, 0, 65, 2, 1, 106, 34, 33, 3, 128, 11, 4, 13, 64, 6, 253, 10, 7, 15, 116, 127, 5, 8, 12, 40, 16, 19, 54, 20, 9, 27, 255, 113, 17, 42, 67, 24, 23, 146, 148, 18, 14, 22, 45, 70, 69, 56, 114, 101, 21, 25, 63, 75, 136, 108, 28, 118, 29, 73, 115]);\r\n\r\n if (typeof WebAssembly !== 'object') {\r\n Logger.logError(FrontendLoggerCategory.Render, \"WebAssembly is not supported in this environment\");\r\n return undefined;\r\n }\r\n\r\n const wasm = WebAssembly.validate(detector) ? unpack(wasmSimd) : unpack(wasmBase);\r\n\r\n let instance: any;\r\n\r\n try {\r\n const result = await WebAssembly.instantiate(wasm, {});\r\n instance = result.instance;\r\n instance.exports.__wasm_call_ctors();\r\n }\r\n catch (err) {\r\n Logger.logError(FrontendLoggerCategory.Render, err);\r\n return undefined;\r\n }\r\n\r\n function unpack(data: string) {\r\n const result = new Uint8Array(data.length);\r\n for (let i = 0; i < data.length; ++i) {\r\n const ch = data.charCodeAt(i);\r\n result[i] = ch > 96 ? ch - 97 : ch > 64 ? ch - 39 : ch + 4;\r\n }\r\n let write = 0;\r\n for (let i = 0; i < data.length; ++i) {\r\n result[write++] = (result[i] < 60) ? wasmpack[result[i]] : (result[i] - 60) * 64 + result[++i];\r\n }\r\n return result.buffer.slice(0, write);\r\n }\r\n\r\n function decode(decoder: string, target: Uint8Array, count: number, size: number, source: Uint8Array, filter?: any) {\r\n const fun = instance.exports[decoder];\r\n const sbrk = instance.exports.sbrk;\r\n const count4 = (count + 3) & ~3;\r\n const tp = sbrk(count4 * size);\r\n const sp = sbrk(source.length);\r\n const heap = new Uint8Array(instance.exports.memory.buffer);\r\n heap.set(source, sp);\r\n const res = fun(tp, count, size, sp, source.length);\r\n if (res === 0 && filter) {\r\n filter(tp, count4, size);\r\n }\r\n target.set(heap.subarray(tp, tp + count * size));\r\n sbrk(tp - sbrk(0));\r\n if (res !== 0) {\r\n throw new Error(`Malformed buffer data: ${res}`);\r\n }\r\n }\r\n\r\n const decoders: any = {\r\n //eslint-disable-next-line @typescript-eslint/naming-convention\r\n ATTRIBUTES: 'meshopt_decodeVertexBuffer',\r\n //eslint-disable-next-line @typescript-eslint/naming-convention\r\n TRIANGLES: 'meshopt_decodeIndexBuffer',\r\n //eslint-disable-next-line @typescript-eslint/naming-convention\r\n INDICES: 'meshopt_decodeIndexSequence',\r\n };\r\n\r\n const filters: any = {\r\n //eslint-disable-next-line @typescript-eslint/naming-convention\r\n NONE: '',\r\n //eslint-disable-next-line @typescript-eslint/naming-convention\r\n OCTAHEDRAL: 'meshopt_decodeFilterOct',\r\n //eslint-disable-next-line @typescript-eslint/naming-convention\r\n QUATERNION: 'meshopt_decodeFilterQuat',\r\n //eslint-disable-next-line @typescript-eslint/naming-convention\r\n EXPONENTIAL: 'meshopt_decodeFilterExp',\r\n };\r\n\r\n return {\r\n decodeVertexBuffer(target: Uint8Array, count: number, size: number, source: Uint8Array, filter?: string) {\r\n decode(decoders.ATTRIBUTES, target, count, size, source, filter ? instance.exports[filters[filter]] : undefined);\r\n },\r\n decodeIndexBuffer(target: Uint8Array, count: number, size: number, source: Uint8Array) {\r\n decode(decoders.TRIANGLES, target, count, size, source);\r\n },\r\n decodeIndexSequence(target: Uint8Array, count: number, size: number, source: Uint8Array) {\r\n decode(decoders.INDICES, target, count, size, source);\r\n },\r\n decodeGltfBuffer(target: Uint8Array, count: number, size: number, source: Uint8Array, mode: string, filter?: string) {\r\n decode(decoders[mode], target, count, size, source, filter ? instance.exports[filters[filter]] : undefined);\r\n },\r\n };\r\n};\r\n\r\nlet meshoptDecoderLoaded: boolean = false;\r\nlet meshoptDecoder: MeshoptDecoder | undefined;\r\n\r\nexport async function getMeshoptDecoder(): Promise<MeshoptDecoder | undefined> {\r\n if (!meshoptDecoderLoaded) {\r\n meshoptDecoder = await getDecoder();\r\n meshoptDecoderLoaded = true;\r\n }\r\n return meshoptDecoder;\r\n}\r\n\r\n/** Arguments supplied to decodeMeshoptBuffer.\r\n */\r\nexport interface DecodeMeshoptBufferArgs {\r\n byteStride: number;\r\n count: number;\r\n mode: ExtMeshoptCompressionMode;\r\n filter?: ExtMeshoptCompressionFilter;\r\n}\r\n\r\nexport async function decodeMeshoptBuffer(source: Uint8Array, args: DecodeMeshoptBufferArgs): Promise<Uint8Array | undefined> {\r\n const decoder = await getMeshoptDecoder();\r\n if (!decoder) {\r\n return undefined;\r\n }\r\n\r\n const target = new Uint8Array(args.count * args.byteStride);\r\n decoder.decodeGltfBuffer(target, args.count, args.byteStride, source, args.mode, args.filter);\r\n return target;\r\n}\r\n"]}
@@ -138,7 +138,7 @@ async function decodeDracoPointCloud(buf) {
138
138
  }
139
139
  catch (err) {
140
140
  core_bentley_1.Logger.logWarning(FrontendLoggerCategory_1.FrontendLoggerCategory.Render, "Failed to decode draco-encoded point cloud");
141
- core_bentley_1.Logger.logException(FrontendLoggerCategory_1.FrontendLoggerCategory.Render, err);
141
+ core_bentley_1.Logger.logError(FrontendLoggerCategory_1.FrontendLoggerCategory.Render, err);
142
142
  return undefined;
143
143
  }
144
144
  }