main 7fa62c5f7920 cached
1189 files
3.9 MB
1.1M tokens
762 symbols
1 requests
Download .txt
Showing preview only (4,351K chars total). Download the full file or copy to clipboard to get everything.
Repository: AnalyticalGraphicsInc/3d-tiles-tools
Branch: main
Commit: 7fa62c5f7920
Files: 1189
Total size: 3.9 MB

Directory structure:
gitextract_nrezpdnq/

├── .eslintignore
├── .eslintrc.json
├── .github/
│   └── workflows/
│       └── ci.yml
├── .gitignore
├── .npmignore
├── .nycrc
├── .prettierignore
├── .prettierrc.json
├── CHANGES.md
├── IMPLEMENTATION.md
├── LICENSE.md
├── README.md
├── ThirdParty.json
├── api-extractor.jsonc
├── bin/
│   ├── README.md
│   └── main
├── demos/
│   ├── README.md
│   ├── validationOptionsDemo.ts
│   └── validationResultDemos.ts
├── etc/
│   └── 3d-tiles-validator.api.md
├── generateThirdParty.js
├── package.json
├── specs/
│   ├── BasicValidatorSpec.ts
│   ├── BinaryBufferStructureSpec.ts
│   ├── ExternalTilesetExtensionsValidationSpec.ts
│   ├── MetadataSchemaValidationSpec.ts
│   ├── SubtreeValidationSpec.ts
│   ├── TilesetPackageValidationSpec.ts
│   ├── TilesetValidationSpec.ts
│   ├── data/
│   │   ├── Samples/
│   │   │   ├── ImplicitTileMetadata/
│   │   │   │   ├── content/
│   │   │   │   │   ├── 0/
│   │   │   │   │   │   └── 0/
│   │   │   │   │   │       └── 0.b3dm
│   │   │   │   │   └── 1/
│   │   │   │   │       ├── 0/
│   │   │   │   │       │   ├── 0.b3dm
│   │   │   │   │       │   └── 1.b3dm
│   │   │   │   │       └── 1/
│   │   │   │   │           └── 1.b3dm
│   │   │   │   ├── subtrees/
│   │   │   │   │   └── 1.1/
│   │   │   │   │       └── 0.0.0.json
│   │   │   │   └── tileset_1.1.json
│   │   │   ├── PaddingIssues/
│   │   │   │   ├── README.md
│   │   │   │   ├── llA.b3dm
│   │   │   │   ├── llB.b3dm
│   │   │   │   ├── llC.b3dm
│   │   │   │   ├── llD.b3dm
│   │   │   │   ├── llE.b3dm
│   │   │   │   ├── tilesetA.json
│   │   │   │   ├── tilesetB.json
│   │   │   │   ├── tilesetC.json
│   │   │   │   ├── tilesetD.json
│   │   │   │   └── tilesetE.json
│   │   │   ├── README.md
│   │   │   ├── SparseImplicitQuadtree/
│   │   │   │   ├── content/
│   │   │   │   │   ├── content_5__0_21.glb
│   │   │   │   │   ├── content_5__10_31.glb
│   │   │   │   │   ├── content_5__11_30.glb
│   │   │   │   │   ├── content_5__12_25.glb
│   │   │   │   │   ├── content_5__13_24.glb
│   │   │   │   │   ├── content_5__14_27.glb
│   │   │   │   │   ├── content_5__15_26.glb
│   │   │   │   │   ├── content_5__16_5.glb
│   │   │   │   │   ├── content_5__17_4.glb
│   │   │   │   │   ├── content_5__18_7.glb
│   │   │   │   │   ├── content_5__19_6.glb
│   │   │   │   │   ├── content_5__1_20.glb
│   │   │   │   │   ├── content_5__20_1.glb
│   │   │   │   │   ├── content_5__21_0.glb
│   │   │   │   │   ├── content_5__22_3.glb
│   │   │   │   │   ├── content_5__23_2.glb
│   │   │   │   │   ├── content_5__24_13.glb
│   │   │   │   │   ├── content_5__25_12.glb
│   │   │   │   │   ├── content_5__26_15.glb
│   │   │   │   │   ├── content_5__27_14.glb
│   │   │   │   │   ├── content_5__28_9.glb
│   │   │   │   │   ├── content_5__29_8.glb
│   │   │   │   │   ├── content_5__2_23.glb
│   │   │   │   │   ├── content_5__30_11.glb
│   │   │   │   │   ├── content_5__31_10.glb
│   │   │   │   │   ├── content_5__3_22.glb
│   │   │   │   │   ├── content_5__4_17.glb
│   │   │   │   │   ├── content_5__5_16.glb
│   │   │   │   │   ├── content_5__6_19.glb
│   │   │   │   │   ├── content_5__7_18.glb
│   │   │   │   │   ├── content_5__8_29.glb
│   │   │   │   │   └── content_5__9_28.glb
│   │   │   │   ├── subtrees/
│   │   │   │   │   ├── 0.0.0.subtree
│   │   │   │   │   ├── 3.0.5.subtree
│   │   │   │   │   ├── 3.1.4.subtree
│   │   │   │   │   ├── 3.2.7.subtree
│   │   │   │   │   ├── 3.3.6.subtree
│   │   │   │   │   ├── 3.4.1.subtree
│   │   │   │   │   ├── 3.5.0.subtree
│   │   │   │   │   ├── 3.6.3.subtree
│   │   │   │   │   └── 3.7.2.subtree
│   │   │   │   └── tileset.json
│   │   │   ├── TilesetGzipped/
│   │   │   │   ├── ll.b3dm
│   │   │   │   ├── lr.b3dm
│   │   │   │   ├── parent.b3dm
│   │   │   │   ├── tileset.json
│   │   │   │   ├── ul.b3dm
│   │   │   │   └── ur.b3dm
│   │   │   ├── TilesetOfTilesets/
│   │   │   │   ├── lr.b3dm
│   │   │   │   ├── parent.b3dm
│   │   │   │   ├── tileset.json
│   │   │   │   ├── tileset2.json
│   │   │   │   ├── tileset3/
│   │   │   │   │   ├── ll.b3dm
│   │   │   │   │   └── tileset3.json
│   │   │   │   ├── ul.b3dm
│   │   │   │   └── ur.b3dm
│   │   │   ├── TilesetOfTilesetsWithError/
│   │   │   │   ├── lr.b3dm
│   │   │   │   ├── parent.b3dm
│   │   │   │   ├── tileset.json
│   │   │   │   ├── tileset2.json
│   │   │   │   ├── tileset3/
│   │   │   │   │   ├── ll.b3dm
│   │   │   │   │   └── tileset3.json
│   │   │   │   ├── ul.b3dm
│   │   │   │   └── ur.b3dm
│   │   │   └── TilesetWithFullMetadata/
│   │   │       └── tileset.json
│   │   ├── buffers/
│   │   │   ├── bufferViewsElementBufferInvalidType.json
│   │   │   ├── bufferViewsElementBufferInvalidValueA.json
│   │   │   ├── bufferViewsElementBufferInvalidValueB.json
│   │   │   ├── bufferViewsElementBufferInvalidValueC.json
│   │   │   ├── bufferViewsElementByteLengthInvalidType.json
│   │   │   ├── bufferViewsElementByteLengthInvalidValueA.json
│   │   │   ├── bufferViewsElementByteLengthInvalidValueB.json
│   │   │   ├── bufferViewsElementByteOffsetInvalidType.json
│   │   │   ├── bufferViewsElementByteOffsetInvalidValueA.json
│   │   │   ├── bufferViewsElementByteOffsetInvalidValueB.json
│   │   │   ├── bufferViewsElementExceedsBufferLength.json
│   │   │   ├── bufferViewsElementInvalidType.json
│   │   │   ├── bufferViewsInvalidLength.json
│   │   │   ├── bufferViewsInvalidType.json
│   │   │   ├── buffersElementByteLengthInvalidType.json
│   │   │   ├── buffersElementByteLengthInvalidValueA.json
│   │   │   ├── buffersElementByteLengthInvalidValueB.json
│   │   │   ├── buffersElementByteLengthMissing.json
│   │   │   ├── buffersElementInvalidType.json
│   │   │   ├── buffersElementNameInvalidLength.json
│   │   │   ├── buffersElementNameInvalidType.json
│   │   │   ├── buffersElementUriInvalidType.json
│   │   │   ├── buffersElementUriMissing.json
│   │   │   ├── buffersInvalidLength.json
│   │   │   └── buffersInvalidType.json
│   │   ├── extensions/
│   │   │   ├── boundingVolumeS2/
│   │   │   │   ├── s2AndInvalidBox.json
│   │   │   │   ├── s2MaximumHeightInvalidType.json
│   │   │   │   ├── s2MinimumHeightGreaterThanMaximumHeight.json
│   │   │   │   ├── s2MinimumHeightInvalidType.json
│   │   │   │   ├── s2TokenInvalidType.json
│   │   │   │   ├── s2TokenInvalidValue.json
│   │   │   │   ├── s2TokenMissing.json
│   │   │   │   └── validTilesetWithS2.json
│   │   │   ├── contentGltf/
│   │   │   │   ├── contentGltfExtensionRequiredButNotUsed.json
│   │   │   │   ├── contentGltfExtensionsRequiredDuplicateElement.json
│   │   │   │   ├── contentGltfExtensionsRequiredInvalidArrayLength.json
│   │   │   │   ├── contentGltfExtensionsRequiredInvalidElementType.json
│   │   │   │   ├── contentGltfExtensionsRequiredInvalidType.json
│   │   │   │   ├── contentGltfExtensionsUsedDuplicateElement.json
│   │   │   │   ├── contentGltfExtensionsUsedInvalidArrayLength.json
│   │   │   │   ├── contentGltfExtensionsUsedInvalidElementType.json
│   │   │   │   ├── contentGltfExtensionsUsedInvalidType.json
│   │   │   │   ├── tileset_1_0_withContentGltfRequiredButNotUsed.json
│   │   │   │   ├── tileset_1_0_withContentGltfUsedButNotFound.json
│   │   │   │   ├── tileset_1_0_withContentGltfUsedButNotRequired.json
│   │   │   │   ├── tileset_1_1_withContentGltfUsedButNotFound.json
│   │   │   │   ├── validTileset_1_0_withExtensionObject.json
│   │   │   │   ├── validTileset_1_0_withGltf.json
│   │   │   │   ├── validTileset_1_1_withContentGltfUsedAndFound.json
│   │   │   │   └── validTileset_1_1_withGltf.json
│   │   │   ├── gpm/
│   │   │   │   ├── anchorPointMetadataContentIndexInvalidType.json
│   │   │   │   ├── anchorPointMetadataContentIndexInvalidValue.json
│   │   │   │   ├── anchorPointMetadataContentIndexMissing.json
│   │   │   │   ├── anchorPointMetadataPlacementTypeInvalidValue.json
│   │   │   │   ├── anchorPointMetadataPlacementTypeMeshContentWithContentIndex.json
│   │   │   │   ├── anchorPointMetadataPlacementTypeMissing.json
│   │   │   │   ├── collectionRecordCollectionIdInvalidType.json
│   │   │   │   ├── collectionRecordCollectionIdMissing.json
│   │   │   │   ├── collectionRecordPlatformIdInvalidType.json
│   │   │   │   ├── collectionRecordPlatformIdMissing.json
│   │   │   │   ├── collectionRecordSensorRecordsElementInvalidType.json
│   │   │   │   ├── collectionRecordSensorRecordsInvalidLength.json
│   │   │   │   ├── collectionRecordSensorRecordsInvalidType.json
│   │   │   │   ├── collectionRecordSensorRecordsMissing.json
│   │   │   │   ├── collectionUnitRecordCollectionUnitIdInvalidType.json
│   │   │   │   ├── collectionUnitRecordCollectionUnitIdMissing.json
│   │   │   │   ├── collectionUnitRecordExtentInformationInvalidType.json
│   │   │   │   ├── collectionUnitRecordExtentInformationMissing.json
│   │   │   │   ├── collectionUnitRecordPointSourceIdInvalidType.json
│   │   │   │   ├── collectionUnitRecordPointSourceIdInvalidValue.json
│   │   │   │   ├── collectionUnitRecordPointSourceIdMissing.json
│   │   │   │   ├── collectionUnitRecordReferenceDateTimeInvalidType.json
│   │   │   │   ├── collectionUnitRecordReferenceDateTimeMissing.json
│   │   │   │   ├── correlationGroupGroupFlagsElementInvalidType.json
│   │   │   │   ├── correlationGroupGroupFlagsInvalidLengthA.json
│   │   │   │   ├── correlationGroupGroupFlagsInvalidLengthB.json
│   │   │   │   ├── correlationGroupGroupFlagsMissing.json
│   │   │   │   ├── correlationGroupGroupsGroupFlagsInvalidType.json
│   │   │   │   ├── correlationGroupGroupsParamsInvalidType.json
│   │   │   │   ├── correlationGroupGroupsParamsMissing.json
│   │   │   │   ├── correlationGroupParamsElementInvalidType.json
│   │   │   │   ├── correlationGroupParamsInvalidLengthA.json
│   │   │   │   ├── correlationGroupParamsInvalidLengthB.json
│   │   │   │   ├── correlationGroupRotationThetasInvalidType.json
│   │   │   │   ├── correlationGroupRotationThetasMissing.json
│   │   │   │   ├── covarUpperTriangleElementInvalidType.json
│   │   │   │   ├── covarUpperTriangleInvalidLengthA.json
│   │   │   │   ├── covarUpperTriangleInvalidLengthB.json
│   │   │   │   ├── extentInformationLsrAxisUnitVectorsElementInvalidType.json
│   │   │   │   ├── extentInformationLsrAxisUnitVectorsInvalidLengthA.json
│   │   │   │   ├── extentInformationLsrAxisUnitVectorsInvalidLengthB.json
│   │   │   │   ├── extentInformationLsrAxisUnitVectorsInvalidType.json
│   │   │   │   ├── extentInformationLsrAxisUnitVectorsMissing.json
│   │   │   │   ├── extentInformationLsrLengthsElementInvalidType.json
│   │   │   │   ├── extentInformationLsrLengthsInvalidLengthA.json
│   │   │   │   ├── extentInformationLsrLengthsInvalidLengthB.json
│   │   │   │   ├── extentInformationLsrLengthsInvalidType.json
│   │   │   │   ├── extentInformationLsrLengthsMissing.json
│   │   │   │   ├── extentInformationOriginInvalidType.json
│   │   │   │   ├── extentInformationOriginMissing.json
│   │   │   │   ├── idInformationDatasetIdInvalidType.json
│   │   │   │   ├── idInformationDatasetIdMissing.json
│   │   │   │   ├── idInformationReferenceDateTimeInvalidType.json
│   │   │   │   ├── idInformationReferenceDateTimeMissing.json
│   │   │   │   ├── interpolationParamsDampeningParamInvalidType.json
│   │   │   │   ├── interpolationParamsDampeningParamMissing.json
│   │   │   │   ├── interpolationParamsInterpNumPostsInvalidType.json
│   │   │   │   ├── interpolationParamsInterpNumPostsInvalidValueA.json
│   │   │   │   ├── interpolationParamsInterpNumPostsInvalidValueB.json
│   │   │   │   ├── interpolationParamsInterpNumPostsMissing.json
│   │   │   │   ├── interpolationParamsInterpolationModeInvalidType.json
│   │   │   │   ├── interpolationParamsInterpolationModeInvalidValue.json
│   │   │   │   ├── interpolationParamsInterpolationModeMissing.json
│   │   │   │   ├── interpolationParamsInterpolationModeNearestNeighborWithDampeningParam.json
│   │   │   │   ├── interpolationParamsInterpolationModeNearestNeighborWithInterpNumPoints.json
│   │   │   │   ├── lsrAxisUnitVectorsNotOrthogonalA.json
│   │   │   │   ├── lsrAxisUnitVectorsNotOrthogonalB.json
│   │   │   │   ├── lsrAxisUnitVectorsNotOrthogonalC.json
│   │   │   │   ├── masterRecordCollectionRecordListElementInvalidType.json
│   │   │   │   ├── masterRecordCollectionRecordListInvalidLength.json
│   │   │   │   ├── masterRecordCollectionRecordListInvalidType.json
│   │   │   │   ├── masterRecordDatasetExtentInformationInvalidType.json
│   │   │   │   ├── masterRecordIdInformationInvalidType.json
│   │   │   │   ├── masterRecordIdInformationMissing.json
│   │   │   │   ├── masterRecordImplementationInvalidType.json
│   │   │   │   ├── masterRecordImplementationMissing.json
│   │   │   │   ├── masterRecordModelCoordSystemInvalidType.json
│   │   │   │   ├── masterRecordModelCoordSystemMissing.json
│   │   │   │   ├── masterRecordVersionInvalidType.json
│   │   │   │   ├── masterRecordVersionMissing.json
│   │   │   │   ├── modelCoordSystemCrsEcefInvalidType.json
│   │   │   │   ├── modelCoordSystemCrsEcefMissing.json
│   │   │   │   ├── modelCoordSystemMcsTypeEcefCrsEcefInvalidType.json
│   │   │   │   ├── modelCoordSystemMcsTypeEcefCrsEcefMissing.json
│   │   │   │   ├── modelCoordSystemMcsTypeEcefWithAxisUnitVectors.json
│   │   │   │   ├── modelCoordSystemMcsTypeEcefWithCrsHorizontalUtm.json
│   │   │   │   ├── modelCoordSystemMcsTypeEcefWithCrsVertical.json
│   │   │   │   ├── modelCoordSystemMcsTypeEcefWithOrigin.json
│   │   │   │   ├── modelCoordSystemMcsTypeInvalidType.json
│   │   │   │   ├── modelCoordSystemMcsTypeInvalidValue.json
│   │   │   │   ├── modelCoordSystemMcsTypeLsrAxisUnitVectorsInvalidType.json
│   │   │   │   ├── modelCoordSystemMcsTypeLsrAxisUnitVectorsMissing.json
│   │   │   │   ├── modelCoordSystemMcsTypeLsrOriginInvalidType.json
│   │   │   │   ├── modelCoordSystemMcsTypeLsrOriginMissing.json
│   │   │   │   ├── modelCoordSystemMcsTypeLsrWithCrsEcef.json
│   │   │   │   ├── modelCoordSystemMcsTypeLsrWithCrsHorizontalUtm.json
│   │   │   │   ├── modelCoordSystemMcsTypeLsrWithCrsVertical.json
│   │   │   │   ├── modelCoordSystemMcsTypeMissing.json
│   │   │   │   ├── modelCoordSystemMcsTypeUtmCrsHorizontalUtmInvalidType.json
│   │   │   │   ├── modelCoordSystemMcsTypeUtmCrsHorizontalUtmMissing.json
│   │   │   │   ├── modelCoordSystemMcsTypeUtmCrsVerticalInvalidType.json
│   │   │   │   ├── modelCoordSystemMcsTypeUtmCrsVerticalMissing.json
│   │   │   │   ├── modelCoordSystemMcsTypeUtmWithAxisUnitVectors.json
│   │   │   │   ├── modelCoordSystemMcsTypeUtmWithCrsEcef.json
│   │   │   │   ├── modelCoordSystemMcsTypeUtmWithOrigin.json
│   │   │   │   ├── ngaGpmAnchorPointMetadataInvalidType.json
│   │   │   │   ├── ngaGpmInterTileCorrelationGroupsElementInvalidType.json
│   │   │   │   ├── ngaGpmInterTileCorrelationGroupsInvalidLength.json
│   │   │   │   ├── ngaGpmInterTileCorrelationGroupsInvalidType.json
│   │   │   │   ├── ngaGpmInterTileCorrelationGroupsMissing.json
│   │   │   │   ├── ngaGpmInterpolationParamsInvalidType.json
│   │   │   │   ├── ngaGpmInterpolationParamsMissing.json
│   │   │   │   ├── ngaGpmInvalidType.json
│   │   │   │   ├── ngaGpmMasterRecordInvalidType.json
│   │   │   │   ├── ngaGpmMasterRecordMissing.json
│   │   │   │   ├── ngaGpmPpeManifestInvalidType.json
│   │   │   │   ├── ngaGpmThreeDimConformalParamsInvalidType.json
│   │   │   │   ├── ngaGpmUnmodeledErrorRecordInvalidType.json
│   │   │   │   ├── ngaGpmUnmodeledErrorRecordMissing.json
│   │   │   │   ├── organizationSystemIdPairOrganizationInvalidType.json
│   │   │   │   ├── organizationSystemIdPairOrganizationMissing.json
│   │   │   │   ├── organizationSystemIdPairSystemIdInvalidType.json
│   │   │   │   ├── organizationSystemIdPairSystemIdMissing.json
│   │   │   │   ├── point3dElementInvalidType.json
│   │   │   │   ├── point3dInvalidLengthA.json
│   │   │   │   ├── point3dInvalidLengthB.json
│   │   │   │   ├── ppeManifestElementInvalidType.json
│   │   │   │   ├── ppeManifestInvalidLengthA.json
│   │   │   │   ├── ppeManifestInvalidLengthB.json
│   │   │   │   ├── ppeMetadataMaxInvalidType.json
│   │   │   │   ├── ppeMetadataMinInvalidType.json
│   │   │   │   ├── ppeMetadataSourceInvalidType.json
│   │   │   │   ├── ppeMetadataSourceMissing.json
│   │   │   │   ├── ppeMetadataSourceValuesNotUnique.json
│   │   │   │   ├── referenceDateTimeNotIso8601A.json
│   │   │   │   ├── referenceDateTimeNotIso8601B.json
│   │   │   │   ├── referenceDateTimeNotIso8601C.json
│   │   │   │   ├── referenceDateTimeNotIso8601D.json
│   │   │   │   ├── referenceSystemDefinitionMissing.json
│   │   │   │   ├── referenceSystemDescriptionInvalidType.json
│   │   │   │   ├── referenceSystemEpochInvalidType.json
│   │   │   │   ├── referenceSystemEpochMissing.json
│   │   │   │   ├── referenceSystemNameInvalidType.json
│   │   │   │   ├── referenceSystemNameMissing.json
│   │   │   │   ├── referenceSystemOrgWithIdInvalidType.json
│   │   │   │   ├── referenceSystemOrgWithIdMissing.json
│   │   │   │   ├── referenceSystemWithDefinitionAndEpoch.json
│   │   │   │   ├── referenceSystemWithDefinitionAndOrgWithId.json
│   │   │   │   ├── rotationThetasElementInvalidType.json
│   │   │   │   ├── rotationThetasInvalidLengthA.json
│   │   │   │   ├── rotationThetasInvalidLengthB.json
│   │   │   │   ├── sensorRecordCollectionUnitRecordsElementInvalidType.json
│   │   │   │   ├── sensorRecordCollectionUnitRecordsInvalidLength.json
│   │   │   │   ├── sensorRecordCollectionUnitRecordsInvalidType.json
│   │   │   │   ├── sensorRecordCollectionUnitRecordsMissing.json
│   │   │   │   ├── sensorRecordSensorIdInvalidType.json
│   │   │   │   ├── sensorRecordSensorIdMissing.json
│   │   │   │   ├── sensorRecordSensorModeInvalidType.json
│   │   │   │   ├── sensorRecordSensorModeMissing.json
│   │   │   │   ├── sensorRecordSensorTypeInvalidType.json
│   │   │   │   ├── sensorRecordSensorTypeMissing.json
│   │   │   │   ├── sensorRecordsSensorModeMissing.json
│   │   │   │   ├── sensorRecordsSensorTypeInvalidType.json
│   │   │   │   ├── sensorRecordsSensorTypeMissing.json
│   │   │   │   ├── spdcfAInvalidType.json
│   │   │   │   ├── spdcfAInvalidValueA.json
│   │   │   │   ├── spdcfAInvalidValueB.json
│   │   │   │   ├── spdcfAMissing.json
│   │   │   │   ├── spdcfAlphaInvalidType.json
│   │   │   │   ├── spdcfAlphaInvalidValueA.json
│   │   │   │   ├── spdcfAlphaInvalidValueB.json
│   │   │   │   ├── spdcfAlphaMissing.json
│   │   │   │   ├── spdcfBetaInvalidType.json
│   │   │   │   ├── spdcfBetaInvalidValueA.json
│   │   │   │   ├── spdcfBetaInvalidValueB.json
│   │   │   │   ├── spdcfBetaMissing.json
│   │   │   │   ├── spdcfTInvalidType.json
│   │   │   │   ├── spdcfTInvalidValue.json
│   │   │   │   ├── spdcfTMissing.json
│   │   │   │   ├── threeDimConformalParamsCovarianceElementInvalidType.json
│   │   │   │   ├── threeDimConformalParamsCovarianceInvalidLengthFor4A.json
│   │   │   │   ├── threeDimConformalParamsCovarianceInvalidLengthFor4B.json
│   │   │   │   ├── threeDimConformalParamsCovarianceInvalidType.json
│   │   │   │   ├── threeDimConformalParamsCovarianceMissing.json
│   │   │   │   ├── threeDimConformalParamsFlagsElementInvalidType.json
│   │   │   │   ├── threeDimConformalParamsFlagsInvalidLengthA.json
│   │   │   │   ├── threeDimConformalParamsFlagsInvalidLengthB.json
│   │   │   │   ├── threeDimConformalParamsFlagsInvalidType.json
│   │   │   │   ├── threeDimConformalParamsFlagsInvalidValues.json
│   │   │   │   ├── threeDimConformalParamsFlagsMissing.json
│   │   │   │   ├── threeDimConformalParamsNormalizingScaleFactorInvalidType.json
│   │   │   │   ├── threeDimConformalParamsNormalizingScaleFactorMissing.json
│   │   │   │   ├── threeDimConformalParamsParametersElementInvalidType.json
│   │   │   │   ├── threeDimConformalParamsParametersInvalidLengthFor4A.json
│   │   │   │   ├── threeDimConformalParamsParametersInvalidLengthFor4B.json
│   │   │   │   ├── threeDimConformalParamsParametersInvalidType.json
│   │   │   │   ├── threeDimConformalParamsParametersMissing.json
│   │   │   │   ├── threeDimConformalParamsRecenteringElementInvalidType.json
│   │   │   │   ├── threeDimConformalParamsRecenteringInvalidLengthA.json
│   │   │   │   ├── threeDimConformalParamsRecenteringInvalidLengthB.json
│   │   │   │   ├── threeDimConformalParamsRecenteringInvalidType.json
│   │   │   │   ├── threeDimConformalParamsRecenteringMissing.json
│   │   │   │   ├── unitVectorInvalidElementValueA.json
│   │   │   │   ├── unitVectorInvalidElementValueB.json
│   │   │   │   ├── unitVectorInvalidLength.json
│   │   │   │   ├── unitVectorNotUnitLengthA.json
│   │   │   │   ├── unitVectorNotUnitLengthB.json
│   │   │   │   ├── unmodeledErrorCorrParamsInvalidElementType.json
│   │   │   │   ├── unmodeledErrorCorrParamsInvalidLengthA.json
│   │   │   │   ├── unmodeledErrorCorrParamsInvalidLengthB.json
│   │   │   │   ├── unmodeledErrorCorrParamsInvalidType.json
│   │   │   │   ├── unmodeledErrorCorrParamsMissing.json
│   │   │   │   ├── unmodeledErrorCorrRotationThetasInvalidType.json
│   │   │   │   ├── unmodeledErrorCorrRotationThetasMissing.json
│   │   │   │   ├── unmodeledErrorPostCovarianceInvalidType.json
│   │   │   │   ├── unmodeledErrorPostCovarianceMissing.json
│   │   │   │   ├── unmodeledErrorPostPositionInvalidType.json
│   │   │   │   ├── unmodeledErrorPostPositionMissing.json
│   │   │   │   ├── unmodeledErrorPostsElementInvalidType.json
│   │   │   │   ├── unmodeledErrorPostsInvalidType.json
│   │   │   │   ├── unmodeledErrorPostsMissing.json
│   │   │   │   ├── unmodeledErrorUniqueIdInvalidType.json
│   │   │   │   ├── unmodeledErrorUniqueIdMissing.json
│   │   │   │   └── validTileset.json
│   │   │   ├── maxarContentGeojson/
│   │   │   │   ├── bareGeometryTileset.json
│   │   │   │   ├── bare_geometry.geojson
│   │   │   │   ├── content_schema.json
│   │   │   │   ├── duplicatePropertyIdsTileset.json
│   │   │   │   ├── duplicate_property_ids_schema.json
│   │   │   │   ├── extensionsUsedButNotRequiredTileset.json
│   │   │   │   ├── geometryCollection.geojson
│   │   │   │   ├── geometryCollectionTileset.json
│   │   │   │   ├── invalid.geojson
│   │   │   │   ├── invalidDefaultTypesTileset.json
│   │   │   │   ├── invalidExtensionObject.json
│   │   │   │   ├── invalidGeojsonTileset.json
│   │   │   │   ├── invalidMinMaxOnNonNumericType.json
│   │   │   │   ├── invalidMinMaxTileset.json
│   │   │   │   ├── invalidPropertiesSchemaUri.json
│   │   │   │   ├── invalidRequiredWithDefaultTileset.json
│   │   │   │   ├── invalidSchemaContent.json
│   │   │   │   ├── invalidTilesetWithGeojson.json
│   │   │   │   ├── invalidUriFormat.json
│   │   │   │   ├── invalid_content_schema.json
│   │   │   │   ├── invalid_default_types_schema.json
│   │   │   │   ├── invalid_min_max_schema.json
│   │   │   │   ├── invalid_minmax_schema.json
│   │   │   │   ├── invalid_required_with_default_schema.json
│   │   │   │   ├── lineString.geojson
│   │   │   │   ├── nonExistentSchema.json
│   │   │   │   ├── test_schema.json
│   │   │   │   ├── validOptionalWithoutDefaultsTileset.json
│   │   │   │   ├── validTilesetWithMaxarContentGeojson.json
│   │   │   │   ├── validWithPropertiesSchemaUri.json
│   │   │   │   ├── valid_optional_without_defaults_schema.json
│   │   │   │   └── vegetation_schema.json
│   │   │   ├── maxarExtent/
│   │   │   │   ├── collinearOverlap.geojson
│   │   │   │   ├── collinearOverlapTileset.json
│   │   │   │   ├── extent.geojson
│   │   │   │   ├── extentOverflowingTileTileset.json
│   │   │   │   ├── extent_overflowing_tile.geojson
│   │   │   │   ├── insufficientCoordinates.geojson
│   │   │   │   ├── insufficientCoordinatesTileset.json
│   │   │   │   ├── internalTouchRing.geojson
│   │   │   │   ├── internalTouchRingTileset.json
│   │   │   │   ├── invalidEmptyUri.json
│   │   │   │   ├── invalidGeojsonContent.json
│   │   │   │   ├── invalidGeometryTypes.geojson
│   │   │   │   ├── invalidGeometryTypesTileset.json
│   │   │   │   ├── invalidMissingUri.json
│   │   │   │   ├── invalidNonResolvableUri.json
│   │   │   │   ├── invalidSpatialExtent.json
│   │   │   │   ├── invalidUriType.json
│   │   │   │   ├── invalid_extent.geojson
│   │   │   │   ├── large_extent.geojson
│   │   │   │   ├── nearMiss.geojson
│   │   │   │   ├── nearMissTileset.json
│   │   │   │   ├── nearVertexOnOtherSideFail.geojson
│   │   │   │   ├── nearVertexOnOtherSideFailTileset.json
│   │   │   │   ├── nearVertexOnOtherSideOk.geojson
│   │   │   │   ├── nearVertexOnOtherSideOkTileset.json
│   │   │   │   ├── overlappingRings.geojson
│   │   │   │   ├── overlappingRingsTileset.json
│   │   │   │   ├── selfIntersecting.geojson
│   │   │   │   ├── selfIntersectingTileset.json
│   │   │   │   ├── small_extent.geojson
│   │   │   │   ├── trueCrossing.geojson
│   │   │   │   ├── trueCrossingTileset.json
│   │   │   │   ├── validPolygonsOnly.geojson
│   │   │   │   ├── validPolygonsOnlyTileset.json
│   │   │   │   ├── validTilesetWithMaxarExtent.json
│   │   │   │   └── validTilesetWithSpatialExtent.json
│   │   │   ├── maxarGrid/
│   │   │   │   ├── invalidBoundingBoxLength.json
│   │   │   │   ├── invalidBoundingBoxSemantics.json
│   │   │   │   ├── invalidCenterLength.json
│   │   │   │   ├── invalidCoordinateSystemType.json
│   │   │   │   ├── invalidCoordinateSystemValue.json
│   │   │   │   ├── invalidElevation.json
│   │   │   │   ├── invalidGridType.json
│   │   │   │   ├── invalidIndexLength.json
│   │   │   │   ├── invalidS2GridWithCenter.json
│   │   │   │   ├── invalidS2GridWithSize.json
│   │   │   │   ├── invalidS2GridWithSrs.json
│   │   │   │   ├── invalidSizeLength.json
│   │   │   │   ├── invalidSrsReferenceSystem.json
│   │   │   │   ├── invalidTileLevel.json
│   │   │   │   ├── validS2Grid.json
│   │   │   │   ├── validTilesetWithMaxarGrid.json
│   │   │   │   └── validTilesetWithVriconGrid.json
│   │   │   └── vriconClass/
│   │   │       └── validTilesetWithVriconClass.json
│   │   ├── gltfExtensions/
│   │   │   ├── FeatureIdAttributeAndPropertyTableFeatureIdNotInRange.gltf
│   │   │   ├── FeatureIdAttributeAndPropertyTableWithValueNotInRange.gltf
│   │   │   ├── FeatureIdAttributePropertyTableInvalidValue.gltf
│   │   │   ├── FeatureIdAttributePropertyTableWithoutPropertyTables.gltf
│   │   │   ├── FeatureIdAttributePropertyTableWithoutStructuralMetadata.gltf
│   │   │   ├── FeatureIdTextureAndPropertyTableFeatureIdNotInRange.gltf
│   │   │   ├── ValidFeatureIdAttributeAndPropertyTable.gltf
│   │   │   ├── ValidFeatureIdTextureAndPropertyTable.gltf
│   │   │   ├── gpmLocal/
│   │   │   │   ├── ValidGltfGpmLocal.gltf
│   │   │   │   ├── ValidMeshPrimitiveGpmLocal.gltf
│   │   │   │   ├── anchorPointDirectAdjustmentParamsInvalidElementType.gltf
│   │   │   │   ├── anchorPointDirectAdjustmentParamsInvalidLength.gltf
│   │   │   │   ├── anchorPointDirectAdjustmentParamsInvalidType.gltf
│   │   │   │   ├── anchorPointDirectAdjustmentParamsMissing.gltf
│   │   │   │   ├── anchorPointDirectPositionInvalidLength.gltf
│   │   │   │   ├── anchorPointDirectPositionInvalidType.gltf
│   │   │   │   ├── anchorPointDirectPositionMissing.gltf
│   │   │   │   ├── anchorPointIndirectAdjustmentParamsInvalidElementType.gltf
│   │   │   │   ├── anchorPointIndirectAdjustmentParamsInvalidLength.gltf
│   │   │   │   ├── anchorPointIndirectAdjustmentParamsInvalidType.gltf
│   │   │   │   ├── anchorPointIndirectAdjustmentParamsMissing.gltf
│   │   │   │   ├── anchorPointIndirectCovarianceInvalidLength.gltf
│   │   │   │   ├── anchorPointIndirectCovarianceMatrixInvalidElementType.gltf
│   │   │   │   ├── anchorPointIndirectCovarianceMatrixInvalidType.gltf
│   │   │   │   ├── anchorPointIndirectCovarianceMatrixMissing.gltf
│   │   │   │   ├── anchorPointIndirectPositionInvalidElementType.gltf
│   │   │   │   ├── anchorPointIndirectPositionInvalidLength.gltf
│   │   │   │   ├── anchorPointIndirectPositionInvalidType.gltf
│   │   │   │   ├── anchorPointIndirectPositionMissing.gltf
│   │   │   │   ├── anchorPointsDirectInvalidElementType.gltf
│   │   │   │   ├── anchorPointsDirectInvalidLength.gltf
│   │   │   │   ├── anchorPointsDirectInvalidType.gltf
│   │   │   │   ├── anchorPointsIndirectInvalidElementType.gltf
│   │   │   │   ├── anchorPointsIndirectInvalidLength.gltf
│   │   │   │   ├── anchorPointsIndirectInvalidType.gltf
│   │   │   │   ├── correlationGroupGroupFlagsElementInvalidType.gltf
│   │   │   │   ├── correlationGroupGroupFlagsInvalidLength.gltf
│   │   │   │   ├── correlationGroupGroupFlagsInvalidType.gltf
│   │   │   │   ├── correlationGroupGroupFlagsMissing.gltf
│   │   │   │   ├── correlationGroupParamsInvalidElementType.gltf
│   │   │   │   ├── correlationGroupParamsInvalidLength.gltf
│   │   │   │   ├── correlationGroupParamsInvalidType.gltf
│   │   │   │   ├── correlationGroupParamsMissing.gltf
│   │   │   │   ├── correlationGroupRotationThetasInvalidElementType.gltf
│   │   │   │   ├── correlationGroupRotationThetasInvalidLength.gltf
│   │   │   │   ├── correlationGroupRotationThetasInvalidType.gltf
│   │   │   │   ├── correlationGroupRotationThetasMissing.gltf
│   │   │   │   ├── covarianceDirectUpperTriangleElementInvalidType.gltf
│   │   │   │   ├── covarianceDirectUpperTriangleInconsistentLength.gltf
│   │   │   │   ├── covarianceDirectUpperTriangleInvalidLength.gltf
│   │   │   │   ├── directAnchorPointsDirectMissing.gltf
│   │   │   │   ├── directCovarianceDirectUpperTriangleMissing.gltf
│   │   │   │   ├── directWithAnchorPointsIndirect.gltf
│   │   │   │   ├── directWithIntraTileCorrelationGroups.gltf
│   │   │   │   ├── indirectAnchorPointsIndirectMissing.gltf
│   │   │   │   ├── indirectIntraTileCorrelationGroupsMissing.gltf
│   │   │   │   ├── indirectWithAnchorPointsDirect.gltf
│   │   │   │   ├── indirectWithCovarianceDirectUpperTriangle.gltf
│   │   │   │   ├── intraTileCorrelationGroupsInvalidElementType.gltf
│   │   │   │   ├── intraTileCorrelationGroupsInvalidLength.gltf
│   │   │   │   ├── intraTileCorrelationGroupsInvalidType.gltf
│   │   │   │   ├── ppeMetadataMaxInvalidType.gltf
│   │   │   │   ├── ppeMetadataMinInvalidType.gltf
│   │   │   │   ├── ppeMetadataSourceInvalidType.gltf
│   │   │   │   ├── ppeMetadataSourceInvalidValue.gltf
│   │   │   │   ├── ppeTextureIndexInvalidType.gltf
│   │   │   │   ├── ppeTextureIndexInvalidValue.gltf
│   │   │   │   ├── ppeTextureNoDataInvalidType.gltf
│   │   │   │   ├── ppeTextureNoDataInvalidValue.gltf
│   │   │   │   ├── ppeTextureOffsetInvalidType.gltf
│   │   │   │   ├── ppeTextureScaleInvalidType.gltf
│   │   │   │   ├── ppeTextureTexCoordInvalidType.gltf
│   │   │   │   ├── ppeTextureTexCoordInvalidValue.gltf
│   │   │   │   ├── ppeTextureTraitsInvalidType.gltf
│   │   │   │   ├── ppeTextureTraitsMissing.gltf
│   │   │   │   ├── ppeTexturesInvalidElementType.gltf
│   │   │   │   ├── ppeTexturesInvalidLength.gltf
│   │   │   │   ├── ppeTexturesInvalidType.gltf
│   │   │   │   ├── spdcfAInvalidType.gltf
│   │   │   │   ├── spdcfAInvalidValueA.gltf
│   │   │   │   ├── spdcfAInvalidValueB.gltf
│   │   │   │   ├── spdcfAMissing.gltf
│   │   │   │   ├── spdcfAlphaInvalidType.gltf
│   │   │   │   ├── spdcfAlphaInvalidValueA.gltf
│   │   │   │   ├── spdcfAlphaInvalidValueB.gltf
│   │   │   │   ├── spdcfAlphaMissing.gltf
│   │   │   │   ├── spdcfBetaInvalidType.gltf
│   │   │   │   ├── spdcfBetaInvalidValueA.gltf
│   │   │   │   ├── spdcfBetaInvalidValueB.gltf
│   │   │   │   ├── spdcfBetaMissing.gltf
│   │   │   │   ├── spdcfTInvalidType.gltf
│   │   │   │   ├── spdcfTInvalidValue.gltf
│   │   │   │   ├── spdcfTMissing.gltf
│   │   │   │   ├── storageTypeInvalidValue.gltf
│   │   │   │   └── storageTypeMissing.gltf
│   │   │   ├── instanceFeatures/
│   │   │   │   ├── InstanceFeaturesFeatureIdAttributeInvalidValue.gltf
│   │   │   │   ├── InstanceFeaturesWithoutMeshGpuInstancing.gltf
│   │   │   │   └── ValidInstanceFeatures.gltf
│   │   │   ├── khrLightsPunctual/
│   │   │   │   ├── maxarTemporalLightTraits/
│   │   │   │   │   ├── invalidDutyWithSineWaveform.gltf
│   │   │   │   │   ├── invalidDutyWithTriangleWaveform.gltf
│   │   │   │   │   ├── invalidMissingWaveform.gltf
│   │   │   │   │   ├── invalidUndeclaredExtension.gltf
│   │   │   │   │   ├── invalidWaveform.gltf
│   │   │   │   │   ├── validDutyWithSquareWaveform.gltf
│   │   │   │   │   └── validTemporalLightTraits.gltf
│   │   │   │   ├── validKhrLightsPunctual.gltf
│   │   │   │   ├── validTilesetWithInvalidKhrLightsPunctual.json
│   │   │   │   └── validTilesetWithKhrLightsPunctual.json
│   │   │   ├── maxarImageOrtho/
│   │   │   │   ├── invalidCoordinateSystem.gltf
│   │   │   │   ├── invalidMissingSrs.gltf
│   │   │   │   ├── invalidTransformLength.gltf
│   │   │   │   └── validMaxarImageOrtho.gltf
│   │   │   ├── maxarNonvisualGeometry/
│   │   │   │   ├── NodeExtensionMeshInvalidType.gltf
│   │   │   │   ├── NodeExtensionMeshInvalidValue.gltf
│   │   │   │   ├── NodeExtensionMeshMissing.gltf
│   │   │   │   ├── NodeExtensionMeshNotFound.gltf
│   │   │   │   ├── PrimitiveExtensionShapeInvalidType.gltf
│   │   │   │   ├── PrimitiveExtensionShapeInvalidValue.gltf
│   │   │   │   ├── PrimitiveExtensionShapeMissing.gltf
│   │   │   │   ├── PrimitiveExtensionTypeEmpty.gltf
│   │   │   │   ├── PrimitiveExtensionTypeInvalidType.gltf
│   │   │   │   ├── PrimitiveExtensionTypeMissing.gltf
│   │   │   │   ├── ShapePathIncompatibleMode.gltf
│   │   │   │   ├── ShapePointsIncompatibleMode.gltf
│   │   │   │   ├── ShapeSurfaceIncompatibleMode.gltf
│   │   │   │   ├── ShapeVolumeIncompatibleMode.gltf
│   │   │   │   ├── ValidComplexExample.gltf
│   │   │   │   ├── ValidNodeExtension.gltf
│   │   │   │   ├── ValidPrimitiveExtensionPath.gltf
│   │   │   │   ├── ValidPrimitiveExtensionPoints.gltf
│   │   │   │   ├── ValidPrimitiveExtensionSurface.gltf
│   │   │   │   └── ValidPrimitiveExtensionVolume.gltf
│   │   │   ├── meshFeatures/
│   │   │   │   ├── FeatureIdAttributeAccessorNormalized.gltf
│   │   │   │   ├── FeatureIdAttributeAccessorNotScalar.gltf
│   │   │   │   ├── FeatureIdAttributeAttributeInvalidType.gltf
│   │   │   │   ├── FeatureIdAttributeAttributeInvalidValue.gltf
│   │   │   │   ├── FeatureIdAttributeFeatureCountInvalidType.gltf
│   │   │   │   ├── FeatureIdAttributeFeatureCountInvalidValue.gltf
│   │   │   │   ├── FeatureIdAttributeFeatureCountMismatch.gltf
│   │   │   │   ├── FeatureIdAttributeFeatureCountMismatchForNullFeatureId.gltf
│   │   │   │   ├── FeatureIdAttributeFeatureCountMissing.gltf
│   │   │   │   ├── FeatureIdAttributeLabelInvalidType.gltf
│   │   │   │   ├── FeatureIdAttributeLabelInvalidValue.gltf
│   │   │   │   ├── FeatureIdAttributeNullFeatureIdInvalidType.gltf
│   │   │   │   ├── FeatureIdAttributeNullFeatureIdInvalidValue.gltf
│   │   │   │   ├── FeatureIdTextureFeatureCountMismatch.gltf
│   │   │   │   ├── FeatureIdTextureSamplerInvalidFilterMode.gltf
│   │   │   │   ├── FeatureIdTextureTextureChannelsInvalidElementType.gltf
│   │   │   │   ├── FeatureIdTextureTextureChannelsInvalidType.gltf
│   │   │   │   ├── FeatureIdTextureTextureChannelsTooManyChannels.gltf
│   │   │   │   ├── FeatureIdTextureTextureChannelsTooManyElements.gltf
│   │   │   │   ├── FeatureIdTextureTextureImageDataInvalid.gltf
│   │   │   │   ├── FeatureIdTextureTextureIndexInvalidType.gltf
│   │   │   │   ├── FeatureIdTextureTextureIndexInvalidValue.gltf
│   │   │   │   ├── FeatureIdTextureTextureInvalidType.gltf
│   │   │   │   ├── FeatureIdTextureTextureTexCoordInvalidType.gltf
│   │   │   │   ├── FeatureIdTextureTextureTexCoordInvalidValue.gltf
│   │   │   │   ├── README.md
│   │   │   │   ├── ValidFeatureIdAttribute.gltf
│   │   │   │   ├── ValidFeatureIdAttributeDefault/
│   │   │   │   │   └── ValidFeatureIdAttributeDefault.gltf
│   │   │   │   ├── ValidFeatureIdAttributeWithByteStride.glb
│   │   │   │   ├── ValidFeatureIdAttributeWithLargerFeatureCount.gltf
│   │   │   │   ├── ValidFeatureIdAttributeWithNullFeatureId.gltf
│   │   │   │   ├── ValidFeatureIdTexture.glb
│   │   │   │   ├── ValidFeatureIdTexture.gltf
│   │   │   │   └── ValidFeatureIdTextureUsingDefaultChannels.gltf
│   │   │   └── structuralMetadata/
│   │   │       ├── ExtensionInMeshPrimitiveWithoutTopLevelObject.gltf
│   │   │       ├── PropertyAttributesClassPropertyArray.gltf
│   │   │       ├── PropertyAttributesClassPropertyInvalidComponentType.gltf
│   │   │       ├── PropertyAttributesClassPropertyInvalidEnumValueType.gltf
│   │   │       ├── PropertyAttributesClassPropertyMaxNotInRange.gltf
│   │   │       ├── PropertyAttributesClassPropertyMinNotInRange.gltf
│   │   │       ├── PropertyAttributesClassPropertyString.gltf
│   │   │       ├── PropertyAttributesMeshPrimitivePropertyAttributesInvalidElementType.gltf
│   │   │       ├── PropertyAttributesMeshPrimitivePropertyAttributesInvalidElementValue.gltf
│   │   │       ├── PropertyAttributesMeshPrimitivePropertyAttributesInvalidLength.gltf
│   │   │       ├── PropertyAttributesMeshPrimitivePropertyAttributesInvalidType.gltf
│   │   │       ├── PropertyAttributesPropertyAttributePropertyInvalidAttribute.gltf
│   │   │       ├── PropertyAttributesPropertyAttributePropertyMaxMismatch.gltf
│   │   │       ├── PropertyAttributesPropertyAttributePropertyMaxNotInRange.gltf
│   │   │       ├── PropertyAttributesPropertyAttributePropertyMinMismatch.gltf
│   │   │       ├── PropertyAttributesPropertyAttributePropertyMinNotInRange.gltf
│   │   │       ├── PropertyTextureClassPropertyMaxNotInRange.gltf
│   │   │       ├── PropertyTextureClassPropertyMinNotInRange.gltf
│   │   │       ├── PropertyTextureClassPropertyWithOffsetScaleMinNotInRange.gltf
│   │   │       ├── PropertyTextureEnumsInvalidEnumValue.gltf
│   │   │       ├── PropertyTextureInvalidPropertyTypeA.gltf
│   │   │       ├── PropertyTextureInvalidPropertyTypeB.gltf
│   │   │       ├── PropertyTextureMeshPrimitivePropertyTextureTexCoordInvalidValue.gltf
│   │   │       ├── PropertyTextureMeshPrimitivePropertyTexturesInvalidElementType.gltf
│   │   │       ├── PropertyTextureMeshPrimitivePropertyTexturesInvalidElementValue.gltf
│   │   │       ├── PropertyTextureMeshPrimitivePropertyTexturesInvalidLength.gltf
│   │   │       ├── PropertyTextureMeshPrimitivePropertyTexturesInvalidType.gltf
│   │   │       ├── PropertyTexturePropertyChannelsSizeMismatch.gltf
│   │   │       ├── PropertyTexturePropertyIndexInvalidType.gltf
│   │   │       ├── PropertyTexturePropertyIndexInvalidValue.gltf
│   │   │       ├── PropertyTexturePropertyTexCoordDefault.gltf
│   │   │       ├── PropertyTexturePropertyTexCoordInvalidValue.gltf
│   │   │       ├── PropertyTexturePropertyTexturePropertyMaxMismatch.gltf
│   │   │       ├── PropertyTexturePropertyTexturePropertyMaxNotInRange.gltf
│   │   │       ├── PropertyTexturePropertyTexturePropertyMinMismatch.gltf
│   │   │       ├── PropertyTexturePropertyTexturePropertyMinNotInRange.gltf
│   │   │       ├── README.md
│   │   │       ├── StructuralMetadataMissingSchema.gltf
│   │   │       ├── StructuralMetadataSchemaAndSchemaUri.gltf
│   │   │       ├── ValidMultipleClasses.gltf
│   │   │       ├── ValidPropertyAttributes.gltf
│   │   │       ├── ValidPropertyTexture.gltf
│   │   │       └── ValidPropertyTextureEnums.gltf
│   │   ├── propertyTables/
│   │   │   ├── propertiesInvalidType.json
│   │   │   ├── propertiesMinPropertiesMismatch.json
│   │   │   ├── propertyArrayOffsetTypeInvalidType.json
│   │   │   ├── propertyArrayOffsetTypeInvalidValue.json
│   │   │   ├── propertyArrayOffsetsInvalidType.json
│   │   │   ├── propertyArrayOffsetsInvalidValue.json
│   │   │   ├── propertyClassInvalidType.json
│   │   │   ├── propertyClassInvalidValue.json
│   │   │   ├── propertyCountInvalidType.json
│   │   │   ├── propertyCountInvalidValue.json
│   │   │   ├── propertyIdInvalid.json
│   │   │   ├── propertyStringOffsetTypeInvalidType.json
│   │   │   ├── propertyStringOffsetTypeInvalidValue.json
│   │   │   ├── propertyStringOffsetsInvalidType.json
│   │   │   ├── propertyStringOffsetsInvalidValue.json
│   │   │   ├── propertyStringWithoutStringOffsets.json
│   │   │   ├── propertyValueMissing.json
│   │   │   ├── propertyValuesInvalidType.json
│   │   │   ├── propertyVariableLengthArrayWithMin.json
│   │   │   ├── propertyVariableLengthArrayWithOffset.json
│   │   │   └── propertyVariableLengthArrayWithoutArrayOffsets.json
│   │   ├── schemas/
│   │   │   ├── FullMetadataSchema.json
│   │   │   ├── metadataClassDescriptionInvalidType.json
│   │   │   ├── metadataClassNameInvalidType.json
│   │   │   ├── metadataClassPropertiesDuplicateSemantics.json
│   │   │   ├── metadataClassPropertiesEmpty.json
│   │   │   ├── metadataClassPropertiesNameInvalid.json
│   │   │   ├── metadataClassPropertyArrayInvalidType.json
│   │   │   ├── metadataClassPropertyComponentTypeForTypeWithoutComponents.json
│   │   │   ├── metadataClassPropertyComponentTypeInvalidType.json
│   │   │   ├── metadataClassPropertyComponentTypeInvalidValue.json
│   │   │   ├── metadataClassPropertyComponentTypeMissing.json
│   │   │   ├── metadataClassPropertyCountInvalidType.json
│   │   │   ├── metadataClassPropertyCountInvalidValue.json
│   │   │   ├── metadataClassPropertyCountWithoutArray.json
│   │   │   ├── metadataClassPropertyDefaultWithRequired.json
│   │   │   ├── metadataClassPropertyDescriptionInvalidType.json
│   │   │   ├── metadataClassPropertyEnumTypeForNonEnumType.json
│   │   │   ├── metadataClassPropertyEnumTypeInvalidType.json
│   │   │   ├── metadataClassPropertyEnumTypeMissingForEnumType.json
│   │   │   ├── metadataClassPropertyEnumTypeNotFound.json
│   │   │   ├── metadataClassPropertyEnumTypeWithoutEnums.json
│   │   │   ├── metadataClassPropertyMaxForNonNumericType.json
│   │   │   ├── metadataClassPropertyMinForNonNumericType.json
│   │   │   ├── metadataClassPropertyMinForVariableLengthArray.json
│   │   │   ├── metadataClassPropertyNameInvalidType.json
│   │   │   ├── metadataClassPropertyNoDataForBoolean.json
│   │   │   ├── metadataClassPropertyNoDataInvalidEnumValueName.json
│   │   │   ├── metadataClassPropertyNoDataInvalidEnumValueNames.json
│   │   │   ├── metadataClassPropertyNoDataTypeMismatchA.json
│   │   │   ├── metadataClassPropertyNoDataTypeMismatchB.json
│   │   │   ├── metadataClassPropertyNoDataTypeMismatchC.json
│   │   │   ├── metadataClassPropertyNoDataWithRequired.json
│   │   │   ├── metadataClassPropertyNormalizedForNonIntegerComponentType.json
│   │   │   ├── metadataClassPropertyNormalizedForUnnormalizableType.json
│   │   │   ├── metadataClassPropertyNormalizedInvalidType.json
│   │   │   ├── metadataClassPropertyOffsetForNonFloatingPointTypeA.json
│   │   │   ├── metadataClassPropertyOffsetForNonFloatingPointTypeB.json
│   │   │   ├── metadataClassPropertyOffsetForVariableLengthArray.json
│   │   │   ├── metadataClassPropertyOffsetTypeMismatchA.json
│   │   │   ├── metadataClassPropertyOffsetTypeMismatchB.json
│   │   │   ├── metadataClassPropertyOffsetTypeMismatchC.json
│   │   │   ├── metadataClassPropertyOffsetTypeMismatchD.json
│   │   │   ├── metadataClassPropertyOffsetTypeMismatchE.json
│   │   │   ├── metadataClassPropertyOffsetTypeMismatchF.json
│   │   │   ├── metadataClassPropertyOffsetTypeMismatchG.json
│   │   │   ├── metadataClassPropertyRequiredInvalidType.json
│   │   │   ├── metadataClassPropertyScaleForNonFloatingPointType.json
│   │   │   ├── metadataClassPropertyScaleForNonFloatingPointTypeB.json
│   │   │   ├── metadataClassPropertySemanticArrayMismatchA.json
│   │   │   ├── metadataClassPropertySemanticArrayMismatchB.json
│   │   │   ├── metadataClassPropertySemanticComponentTypeMismatchA.json
│   │   │   ├── metadataClassPropertySemanticComponentTypeMismatchB.json
│   │   │   ├── metadataClassPropertySemanticCountMismatch.json
│   │   │   ├── metadataClassPropertySemanticGeneric.json
│   │   │   ├── metadataClassPropertySemanticInvalidType.json
│   │   │   ├── metadataClassPropertySemanticNormalizedMismatch.json
│   │   │   ├── metadataClassPropertySemanticTypeMismatch.json
│   │   │   ├── metadataClassPropertySemanticUnknown.json
│   │   │   ├── metadataClassPropertyTypeInvalidType.json
│   │   │   ├── metadataClassPropertyTypeInvalidValue.json
│   │   │   ├── metadataClassPropertyTypeMissing.json
│   │   │   ├── metadataClassesInvalidType.json
│   │   │   ├── metadataClassesNameInvalid.json
│   │   │   ├── metadataEnumDescriptionInvalidType.json
│   │   │   ├── metadataEnumNameInvalidType.json
│   │   │   ├── metadataEnumValueDescriptionInvalidType.json
│   │   │   ├── metadataEnumValueNameInvalidType.json
│   │   │   ├── metadataEnumValueNotInDefaultValueTypeRange.json
│   │   │   ├── metadataEnumValueNotInValueTypeRange.json
│   │   │   ├── metadataEnumValueTypeInvalid.json
│   │   │   ├── metadataEnumValueTypeInvalidType.json
│   │   │   ├── metadataEnumValueTypeInvalidValue.json
│   │   │   ├── metadataEnumValueValueInvalidType.json
│   │   │   ├── metadataEnumValuesDuplicateName.json
│   │   │   ├── metadataEnumValuesDuplicateValue.json
│   │   │   ├── metadataEnumValuesEmpty.json
│   │   │   ├── metadataEnumValuesMissing.json
│   │   │   ├── metadataEnumsInvalidName.json
│   │   │   ├── metadataEnumsInvalidType.json
│   │   │   ├── schemaIdInvalidType.json
│   │   │   ├── schemaIdInvalidValue.json
│   │   │   ├── schemaIdMissing.json
│   │   │   ├── validSchema.json
│   │   │   └── validSchemaWithMinMax.json
│   │   ├── subtrees/
│   │   │   ├── binarySubtreeComputedLengthInvalid.subtree
│   │   │   ├── binarySubtreeInvalidBinaryByteLengthAlignment.subtree
│   │   │   ├── binarySubtreeInvalidJsonByteLengthAlignment.subtree
│   │   │   ├── binarySubtreeInvalidMagic.subtree
│   │   │   ├── binarySubtreeInvalidVersion.subtree
│   │   │   ├── binarySubtreeJsonInvalid.subtree
│   │   │   ├── binarySubtreeValid.subtree
│   │   │   ├── subtreeBufferViewsWithoutBuffers.json
│   │   │   ├── subtreeChildSubtreeAvailabilityInvalidType.json
│   │   │   ├── subtreeChildSubtreeAvailabilityMissing.json
│   │   │   ├── subtreeContentAvailabilityInvalidLength.json
│   │   │   ├── subtreeContentAvailabilityInvalidType.json
│   │   │   ├── subtreeContentMetadataArrayElementInvalidType.json
│   │   │   ├── subtreeContentMetadataArrayElementInvalidValueA.json
│   │   │   ├── subtreeContentMetadataArrayElementInvalidValueB.json
│   │   │   ├── subtreeContentMetadataInvalidLength.json
│   │   │   ├── subtreeContentMetadataInvalidType.json
│   │   │   ├── subtreeContentMetadataWithoutPropertyTables.json
│   │   │   ├── subtreePropertyTablesElementInvalidType.json
│   │   │   ├── subtreePropertyTablesInvalidLength.json
│   │   │   ├── subtreePropertyTablesInvalidType.json
│   │   │   ├── subtreeTileAvailabilityAvailableCountInvalid.json
│   │   │   ├── subtreeTileAvailabilityAvailableCountMismatch.json
│   │   │   ├── subtreeTileAvailabilityBitstreamAndConstant.json
│   │   │   ├── subtreeTileAvailabilityBitstreamInvalidType.json
│   │   │   ├── subtreeTileAvailabilityBitstreamInvalidValueA.json
│   │   │   ├── subtreeTileAvailabilityBitstreamInvalidValueB.json
│   │   │   ├── subtreeTileAvailabilityBitstreamInvalidValueC.json
│   │   │   ├── subtreeTileAvailabilityBitstreamLengthTooLarge.json
│   │   │   ├── subtreeTileAvailabilityBitstreamLengthTooSmall.json
│   │   │   ├── subtreeTileAvailabilityConstantInvalidType.json
│   │   │   ├── subtreeTileAvailabilityConstantInvalidValue.json
│   │   │   ├── subtreeTileAvailabilityForParentMissingForAvailableTile.json
│   │   │   ├── subtreeTileAvailabilityInvalidType.json
│   │   │   ├── subtreeTileAvailabilityMissing.json
│   │   │   ├── subtreeTileAvailabilityMissingForAvailableContent.json
│   │   │   ├── subtreeTileAvailabilityNeitherBitstreamNorConstant.json
│   │   │   ├── subtreeTileMetadataInvalidType.json
│   │   │   ├── subtreeTileMetadataInvalidValueA.json
│   │   │   ├── subtreeTileMetadataInvalidValueB.json
│   │   │   ├── validSubtree-0-0-0.json
│   │   │   ├── validSubtree.json
│   │   │   ├── validSubtreeBuffersWithoutBufferViews.json
│   │   │   ├── validSubtreeImplicitTiling.json.input
│   │   │   └── validSubtreeNoBuffers.json
│   │   └── tilesets/
│   │       ├── assetTilesetVersionInvalidType.json
│   │       ├── assetVersionInvalidType.json
│   │       ├── assetVersionMissing.json
│   │       ├── assetVersionUnknown.json
│   │       ├── boundingVolumeBoxArrayInvalidElementType.json
│   │       ├── boundingVolumeBoxInvalidArrayLength.json
│   │       ├── boundingVolumeMissingProperty.json
│   │       ├── boundingVolumeRegionArrayElementsOutOfRange.json
│   │       ├── boundingVolumeRegionArrayInvalidElementType.json
│   │       ├── boundingVolumeRegionInvalidArrayLength.json
│   │       ├── boundingVolumeSphereArrayElementOutOfRange.json
│   │       ├── boundingVolumeSphereArrayInvalidElementType.json
│   │       ├── boundingVolumeSphereInvalidArrayLength.json
│   │       ├── customSemanticsSchema.json
│   │       ├── extensionFoundButNotUsed.json
│   │       ├── extensionNotDeclaredAsRequired.json
│   │       ├── extensionNotDeclared_1_0_glTF.json
│   │       ├── extensionNotNecessary_1_1_glTF.json
│   │       ├── extensionRequiredButNotUsed.json
│   │       ├── extensionUsedButNotFound.json
│   │       ├── extensionsInvalidType.json
│   │       ├── extensionsRequiredDuplicateElement.json
│   │       ├── extensionsRequiredInvalidArrayLength.json
│   │       ├── extensionsRequiredInvalidType.json
│   │       ├── extensionsUsedDuplicateElement.json
│   │       ├── extensionsUsedInvalidArrayLength.json
│   │       ├── extensionsUsedInvalidType.json
│   │       ├── extensionsValueInvalidType.json
│   │       ├── externalTilesetExtensions/
│   │       │   ├── README.md
│   │       │   ├── declaredInBothContainedInExternal/
│   │       │   │   ├── external.json
│   │       │   │   └── tileset.json
│   │       │   ├── declaredInBothContainedInTileset/
│   │       │   │   ├── external.json
│   │       │   │   └── tileset.json
│   │       │   ├── declaredInExternalContainedInExternal/
│   │       │   │   ├── external.json
│   │       │   │   └── tileset.json
│   │       │   ├── declaredInExternalContainedInTileset/
│   │       │   │   ├── external.json
│   │       │   │   └── tileset.json
│   │       │   ├── declaredInNoneContainedInExternal/
│   │       │   │   ├── external.json
│   │       │   │   └── tileset.json
│   │       │   ├── declaredInTilesetContainedInExternal/
│   │       │   │   ├── external.json
│   │       │   │   └── tileset.json
│   │       │   └── declaredInTilesetContainedInTileset/
│   │       │       ├── external.json
│   │       │       └── tileset.json
│   │       ├── extrasUnexpectedType.json
│   │       ├── groupClassIdInvalid.json
│   │       ├── groupClassIdInvalidType.json
│   │       ├── groupWithoutSchema.json
│   │       ├── implicitTilingAvailableLevelsInvalidType.json
│   │       ├── implicitTilingAvailableLevelsInvalidValue.json
│   │       ├── implicitTilingContentUriTemplateVariableInvalid.json
│   │       ├── implicitTilingContentsUriTemplateVariableInvalid.json
│   │       ├── implicitTilingInvalidType.json
│   │       ├── implicitTilingRootWithChildren.json
│   │       ├── implicitTilingRootWithContentBoundingVolume.json
│   │       ├── implicitTilingRootWithMetadata.json
│   │       ├── implicitTilingSubdivisionSchemeInvalidType.json
│   │       ├── implicitTilingSubdivisionSchemeInvalidValue.json
│   │       ├── implicitTilingSubtreeLevelsInvalidType.json
│   │       ├── implicitTilingSubtreeLevelsInvalidValue.json
│   │       ├── implicitTilingSubtreesInvalidType.json
│   │       ├── implicitTilingSubtreesUriInvalidType.json
│   │       ├── implicitTilingSubtreesUriMissing.json
│   │       ├── implicitTilingSubtreesUriTemplateVariableInvalid.json
│   │       ├── implicitTilingSubtreesUriTemplateVariableMissing.json
│   │       ├── implicitTilingValid.json
│   │       ├── implicitTilingWithBoundingSphere.json
│   │       ├── invalidJson.json
│   │       ├── packages/
│   │       │   ├── tilesetPackageWithWarnings/
│   │       │   │   ├── TriangleWithWarnings/
│   │       │   │   │   └── TriangleWithWarnings.gltf
│   │       │   │   └── tileset.json
│   │       │   ├── tilesetPackageWithWarnings.3dtiles
│   │       │   ├── tilesetPackageWithWarnings.3tz
│   │       │   ├── validTilesetPackage/
│   │       │   │   ├── Triangle/
│   │       │   │   │   └── Triangle.gltf
│   │       │   │   └── tileset.json
│   │       │   ├── validTilesetPackage.3dtiles
│   │       │   ├── validTilesetPackage.3tz
│   │       │   ├── validTilesetPackageZipped.3dtiles
│   │       │   └── validTilesetPackageZipped.3tz
│   │       ├── propertiesInvalidType.json
│   │       ├── propertiesMaximumInvalidType.json
│   │       ├── propertiesMaximumMissing.json
│   │       ├── propertiesMinimumInvalidType.json
│   │       ├── propertiesMinimumLargerThanMaximum.json
│   │       ├── propertiesMinimumMissing.json
│   │       ├── statisticsClassesIdInvalid.json
│   │       ├── statisticsClassesInvalidType.json
│   │       ├── statisticsClassesMinPropertiesMismatch.json
│   │       ├── statisticsClassesPropertiesMinPropertiesMismatch.json
│   │       ├── statisticsClassesPropertiesPropertyNameInvalid.json
│   │       ├── statisticsClassesValueInvalidType.json
│   │       ├── statisticsClassesWithoutSchema.json
│   │       ├── tileChildrenEmptyArray.json
│   │       ├── tileContentBoundingVolumeInvalidType.json
│   │       ├── tileContentBoundingVolumeNotInTileBoundingVolume.json
│   │       ├── tileContentBoundingVolumeWithRotationTransform.json
│   │       ├── tileContentBoundingVolumeWithTransform.json
│   │       ├── tileContentGroupInvalidIndex.json
│   │       ├── tileContentGroupInvalidType.json
│   │       ├── tileContentGroupNegativeIndex.json
│   │       ├── tileContentGroupWithoutTilesetGroups.json
│   │       ├── tileContentInvalidType.json
│   │       ├── tileContentsInvalidType.json
│   │       ├── tileGeometricErrorMissing.json
│   │       ├── tileGeometricErrorNegative.json
│   │       ├── tileGeometricErrorNotSmallerThanParentGeometricError.json
│   │       ├── tileInvalidType.json
│   │       ├── tileMetadataClassInvalid.json
│   │       ├── tileMetadataClassInvalidType.json
│   │       ├── tileMetadataClassMissing.json
│   │       ├── tileMetadataGeometricErrorInconsistent.json
│   │       ├── tileMetadataRequiredPropertyMissing.json
│   │       ├── tileMetadataRequiredPropertyNull.json
│   │       ├── tileMetadataScalarValueNotInRange.json
│   │       ├── tileMetadataVec3ArrayElementValueNotInRange.json
│   │       ├── tileMetadataVec3ElementValueNotInRange.json
│   │       ├── tileMetadataWithoutSchema.json
│   │       ├── tileRefineInvalidValue.json
│   │       ├── tileRefineMissingInRoot.json
│   │       ├── tileRefineMissingInRootOfExternal.json
│   │       ├── tileRefineMissingInRootOfExternalA.json
│   │       ├── tileRefineWrongCase.json
│   │       ├── tileRefineWrongType.json
│   │       ├── tileTransformInvalidArrayElementType.json
│   │       ├── tileTransformInvalidArrayLength.json
│   │       ├── tileTransformInvalidType.json
│   │       ├── tileTransformNonInvertible.json
│   │       ├── tileTransformNotAffine.json
│   │       ├── tileWithContentAndContents.json
│   │       ├── tiles/
│   │       │   ├── 3tz/
│   │       │   │   ├── invalid.3tz
│   │       │   │   ├── simple.3tz
│   │       │   │   └── withError.3tz
│   │       │   ├── Notes.txt
│   │       │   ├── b3dm/
│   │       │   │   ├── invalid.b3dm
│   │       │   │   ├── invalidAlignment.b3dm
│   │       │   │   ├── invalidDueToWrongAlignmentWithGlbWithInfos.b3dm
│   │       │   │   ├── valid.b3dm
│   │       │   │   └── validWithInvalidGlb.b3dm
│   │       │   ├── cmpt/
│   │       │   │   └── validWithGlbInfo.cmpt
│   │       │   ├── geojson/
│   │       │   │   └── lineString.geojson
│   │       │   ├── geom/
│   │       │   │   └── content.geom
│   │       │   ├── glTF/
│   │       │   │   ├── Triangle/
│   │       │   │   │   └── Triangle.gltf
│   │       │   │   ├── TriangleGlbWithErrors/
│   │       │   │   │   └── TriangleGlbWithInvalidLength.glb
│   │       │   │   ├── TriangleWithErrors/
│   │       │   │   │   └── TriangleWithErrors.gltf
│   │       │   │   └── TriangleWithWarnings/
│   │       │   │       └── TriangleWithWarnings.gltf
│   │       │   ├── i3dm/
│   │       │   │   ├── i3dmWithUri/
│   │       │   │   │   ├── Box.glb
│   │       │   │   │   ├── README.md
│   │       │   │   │   ├── i3dmWithUri.i3dm
│   │       │   │   │   └── tileset.json
│   │       │   │   └── invalid.i3dm
│   │       │   ├── pnts/
│   │       │   │   └── invalid.pnts
│   │       │   └── vctr/
│   │       │       └── parent.vctr
│   │       ├── tilesetAssetMissing.json
│   │       ├── tilesetGeometricErrorMissing.json
│   │       ├── tilesetGeometricErrorNegative.json
│   │       ├── tilesetMetadataEntityPropertyEnumInvalidValue.json
│   │       ├── tilesetMetadataEntityPropertyMaxNotInRange.json
│   │       ├── tilesetMetadataEntityPropertyMaxWithNormalizedNotInRange.json
│   │       ├── tilesetMetadataEntityPropertyMaxWithOffsetNotInRange.json
│   │       ├── tilesetMetadataEntityPropertyMaxWithScaleNotInRange.json
│   │       ├── tilesetMetadataEntityPropertyMinNotInRange.json
│   │       ├── tilesetMetadataEntityPropertyMinWithNormalizedNotInRange.json
│   │       ├── tilesetMetadataEntityPropertyMinWithOffsetNotInRange.json
│   │       ├── tilesetMetadataEntityPropertyMinWithScaleNotInRange.json
│   │       ├── tilesetSchemaUriInvalidType.json
│   │       ├── tilesetWithCycleA.json
│   │       ├── tilesetWithCycleB.json
│   │       ├── tilesetWithCycleC.json
│   │       ├── tilesetWithMultipleExternal.json
│   │       ├── tilesetWithMultipleExternalA.json
│   │       ├── tilesetWithMultipleExternalA0.json
│   │       ├── tilesetWithMultipleExternalA1.json
│   │       ├── tilesetWithMultipleExternalB.json
│   │       ├── tilesetWithSchemaAndSchemaUri.json
│   │       ├── tilesetWithUnicodeBOM.json
│   │       ├── validTileset.json
│   │       ├── validTilesetWith3tzWithError.json
│   │       ├── validTilesetWithCustomSemantics.json
│   │       ├── validTilesetWithCustomSemanticsWithInvalidType.json
│   │       ├── validTilesetWithExternalValidTilesetWithValidB3dmWithInvalidGlb.json
│   │       ├── validTilesetWithGlbWithErrors.json
│   │       ├── validTilesetWithGltfWithErrors.json
│   │       ├── validTilesetWithGltfWithWarnings.json
│   │       ├── validTilesetWithIB3dmWithInvalidAlignment.json
│   │       ├── validTilesetWithInvalid3tz.json
│   │       ├── validTilesetWithInvalidB3dm.json
│   │       ├── validTilesetWithInvalidB3dmWithGlbWithInfos.json
│   │       ├── validTilesetWithInvalidI3dm.json
│   │       ├── validTilesetWithInvalidPnts.json
│   │       ├── validTilesetWithInvalidSchemaFromUri.json
│   │       ├── validTilesetWithSchema.json
│   │       ├── validTilesetWithTileMetadata.json
│   │       ├── validTilesetWithUnresolvableSchemaUri.json
│   │       ├── validTilesetWithValid3tz.json
│   │       ├── validTilesetWithValidB3dm.json
│   │       ├── validTilesetWithValidB3dmWithInvalidGlb.json
│   │       ├── validTilesetWithValidCmptWithGlbInfo.json
│   │       ├── validTilesetWithValidGltf.json
│   │       └── validTilesetWithValidSchemaFromUri.json
│   ├── extensions/
│   │   ├── BoundingVolumeS2ValidationSpec.ts
│   │   ├── ContentGltfValidationSpec.ts
│   │   ├── MaxarContentGeojonValidationSpec.ts
│   │   ├── MaxarExtentValidatorSpec.ts
│   │   ├── MaxarGridValidationSpec.ts
│   │   ├── MaxarGridValidatorSpec.ts
│   │   ├── NgaGpmValidatorSpec.ts
│   │   └── VriconClassValidationSpec.ts
│   ├── gltfExtensions/
│   │   ├── ExtInstanceFeaturesValidationSpec.ts
│   │   ├── ExtMeshFeaturesValidationSpec.ts
│   │   ├── ExtStructuralMetadataValidationSpec.ts
│   │   ├── ExtValidationSpec.ts
│   │   ├── KhrLightsPunctualValidationSpec.ts
│   │   ├── MaxarImageOrthoValidationSpec.ts
│   │   ├── MaxarNonvisualGeometryValidationSpec.ts
│   │   ├── MaxarTemporalLightTraits/
│   │   │   └── MaxarTemporalLightTraitsValidationSpec.ts
│   │   ├── NgaGpmLocalValidationSpec.ts
│   │   └── validateGltf.ts
│   ├── jasmine.json
│   └── metadata/
│       ├── BinaryPropertyTableValidationSpec.ts
│       ├── BinaryPropertyTableValuesValidationSpec.ts
│       ├── PropertyTableTestUtilities.ts
│       └── PropertyTableValidationSpec.ts
├── src/
│   ├── ValidatorMain.ts
│   ├── archives/
│   │   └── ArchiveValidation3tz.ts
│   ├── base/
│   │   ├── ResourceError.ts
│   │   ├── globMatcher.ts
│   │   ├── readJsonUnchecked.ts
│   │   └── writeUnchecked.ts
│   ├── index.ts
│   ├── issues/
│   │   ├── BinaryValidationIssues.ts
│   │   ├── ContentValidationIssues.ts
│   │   ├── GltfExtensionValidationIssues.ts
│   │   ├── IoValidationIssue.ts
│   │   ├── JsonValidationIssues.ts
│   │   ├── MetadataValidationIssues.ts
│   │   ├── SemanticValidationIssues.ts
│   │   ├── StructureValidationIssues.ts
│   │   ├── ValidationIssueUtils.ts
│   │   └── ValidationIssues.ts
│   ├── main.ts
│   ├── tileFormats/
│   │   ├── B3dmValidator.ts
│   │   ├── CmptValidator.ts
│   │   ├── GeojsonValidator.ts
│   │   ├── GltfValidator.ts
│   │   ├── I3dmValidator.ts
│   │   ├── PntsValidator.ts
│   │   ├── TileFormatValidator.ts
│   │   └── legacy/
│   │       ├── utility.ts
│   │       ├── validateBatchTable.ts
│   │       └── validateFeatureTable.ts
│   └── validation/
│       ├── AssetValidator.ts
│       ├── BasicValidator.ts
│       ├── BinaryBufferStructureValidator.ts
│       ├── BinaryValidator.ts
│       ├── BoundingVolumeValidator.ts
│       ├── ContentDataValidator.ts
│       ├── ContentDataValidators.ts
│       ├── ContentValidator.ts
│       ├── ExtendedObjectsValidators.ts
│       ├── ExtensionsDeclarationsValidator.ts
│       ├── ImplicitTilingValidator.ts
│       ├── NumberValidator.ts
│       ├── PropertiesValidator.ts
│       ├── RootPropertyValidator.ts
│       ├── StatisticsClassValidator.ts
│       ├── StatisticsValidator.ts
│       ├── StringValidator.ts
│       ├── StructureValidator.ts
│       ├── SubtreeConsistencyValidator.ts
│       ├── SubtreeInfoValidator.ts
│       ├── SubtreeValidator.ts
│       ├── TemplateUriValidator.ts
│       ├── TileContentValidator.ts
│       ├── TileValidator.ts
│       ├── TilesetPackageValidator.ts
│       ├── TilesetTraversingValidator.ts
│       ├── TilesetValidator.ts
│       ├── TransformValidator.ts
│       ├── ValidatedElement.ts
│       ├── ValidationContext.ts
│       ├── ValidationContexts.ts
│       ├── ValidationIssue.ts
│       ├── ValidationIssueFilter.ts
│       ├── ValidationIssueFilters.ts
│       ├── ValidationIssueSeverity.ts
│       ├── ValidationOptionChecks.ts
│       ├── ValidationOptions.ts
│       ├── ValidationResult.ts
│       ├── ValidationResults.ts
│       ├── ValidationState.ts
│       ├── Validator.ts
│       ├── Validators.ts
│       ├── extensions/
│       │   ├── BoundingVolumeS2ValidationIssues.ts
│       │   ├── BoundingVolumeS2Validator.ts
│       │   ├── ContentGltfValidator.ts
│       │   ├── MaxarContentGeojsonValidator.ts
│       │   ├── MaxarExtentValidator.ts
│       │   ├── MaxarGridValidator.ts
│       │   ├── NgaGpmValidator.ts
│       │   ├── gpm/
│       │   │   ├── NgaGpmValidationIssues.ts
│       │   │   └── NgaGpmValidatorCommon.ts
│       │   └── maxar/
│       │       └── MaxarValidatorCommon.ts
│       ├── gltf/
│       │   ├── Accessors.ts
│       │   ├── GltfData.ts
│       │   ├── GltfDataReader.ts
│       │   ├── GltfExtensionValidators.ts
│       │   ├── ImageData.ts
│       │   ├── ImageDataReader.ts
│       │   ├── SamplerValidator.ts
│       │   ├── TextureValidator.ts
│       │   ├── gpmLocal/
│       │   │   └── NgaGpmLocalValidator.ts
│       │   ├── imageOrtho/
│       │   │   └── MaxarImageOrthoValidator.ts
│       │   ├── instanceFeatures/
│       │   │   └── ExtInstanceFeaturesValidator.ts
│       │   ├── lightsPunctual/
│       │   │   ├── KhrLightsPunctualValidator.ts
│       │   │   └── MaxarTemporalLightTraits/
│       │   │       └── MaxarTemporalLightTraitsValidator.ts
│       │   ├── meshFeatures/
│       │   │   ├── ExtMeshFeaturesValidator.ts
│       │   │   ├── FeatureIdAccessorValidator.ts
│       │   │   └── FeatureIdValidator.ts
│       │   ├── nonvisualGeometry/
│       │   │   └── MaxarNonvisualGeometryValidator.ts
│       │   └── structuralMetadata/
│       │       ├── ExtStructuralMetadataValidator.ts
│       │       ├── PropertyAttributePropertyModel.ts
│       │       ├── PropertyAttributePropertyValidator.ts
│       │       ├── PropertyAttributeValidator.ts
│       │       ├── PropertyAttributeValuesValidator.ts
│       │       ├── PropertyAttributesDefinitionValidator.ts
│       │       ├── PropertyTableDefinitionValidator.ts
│       │       ├── PropertyTextureBooleanMetadataPropertyModel.ts
│       │       ├── PropertyTextureEnumMetadataPropertyModel.ts
│       │       ├── PropertyTextureMetadataPropertyModels.ts
│       │       ├── PropertyTextureNumericMetadataPropertyModel.ts
│       │       ├── PropertyTexturePropertyValidator.ts
│       │       ├── PropertyTextureValidator.ts
│       │       ├── PropertyTextureValuesValidator.ts
│       │       └── PropertyTexturesDefinitionValidator.ts
│       ├── legacy/
│       │   └── BoundingVolumeChecks.ts
│       └── metadata/
│           ├── BinaryPropertyTableDefaultMetadataPropertyModel.ts
│           ├── BinaryPropertyTableEnumMetadataPropertyModel.ts
│           ├── BinaryPropertyTableValidator.ts
│           ├── BinaryPropertyTableValuesValidator.ts
│           ├── ClassPropertySemanticsValidator.ts
│           ├── ClassPropertyValidator.ts
│           ├── ClassPropertyValueValidator.ts
│           ├── MetadataClassValidator.ts
│           ├── MetadataEntityValidator.ts
│           ├── MetadataEnumValidator.ts
│           ├── MetadataPropertyModel.ts
│           ├── MetadataPropertyValidator.ts
│           ├── MetadataPropertyValuesValidator.ts
│           ├── MetadataStructureValidator.ts
│           ├── MetadataValidationUtilities.ts
│           ├── MetadataValueValidationMessages.ts
│           ├── MetadataValueValidator.ts
│           ├── PropertyTablePropertyValidator.ts
│           ├── PropertyTableValidator.ts
│           ├── PropertyTablesDefinitionValidator.ts
│           ├── RangeIterables.ts
│           ├── SchemaDefinitionValidator.ts
│           └── SchemaValidator.ts
├── tools/
│   └── README.md
└── tsconfig.json

================================================
FILE CONTENTS
================================================

================================================
FILE: .eslintignore
================================================
/build
/dist
/etc
generateThirdParty.js

================================================
FILE: .eslintrc.json
================================================
{
  "extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended"],
  "parser": "@typescript-eslint/parser",
  "parserOptions": {
    "ecmaVersion": 2020
  },
  "plugins": ["@typescript-eslint", "eslint-plugin-tsdoc"],
  "root": true,
  "rules": {
    "@typescript-eslint/no-non-null-assertion": "off",
    "@typescript-eslint/no-explicit-any": "off",
    "tsdoc/syntax": "warn"
  }
}


================================================
FILE: .github/workflows/ci.yml
================================================
name: CI

on: [push, pull_request]

env:
  CI: true

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - name: Check out repository
      uses: actions/checkout@v2

    - name: Run npm install
      run: |
        npm install

    - name: Run linting
      run: |
        npm run eslint

    - name: Run formatting checks
      run: |
        npm run prettier-check

    - name: Run tests
      run: |
        npm run test

    - name: Run coverage
      run: |
        npm run coverage



================================================
FILE: .gitignore
================================================
/node_modules
/build
/dist
/coverage
/.nyc_output
/.vscode
tsdoc-metadata.json
package-lock.json
.eslintcache
*.tgz


================================================
FILE: .npmignore
================================================
/specs
/demos
/tools
/node_modules
/dist
/etc
/coverage
/.nyc_output
/.github
/.vscode
/bin
.eslintcache
.eslintignore
.eslintrc.json
.gitignore
.npmignore
.nycrc
.prettierrc.json
.prettierignore
tsconfig.json
generateThirdParty.js
ThirdParty.json
api-extractor.jsonc
*.tgz


================================================
FILE: .nycrc
================================================
{
    "exclude": [
        "specs/**/*.ts"
    ],
    "include": [
        "**/*.ts"
    ],
    "reporter": [
        "html",
        "text",
        "text-summary"
    ]
}

================================================
FILE: .prettierignore
================================================
*
!src/**/
!specs/**/
!**/*.js
!**/*.ts
!**/*.json
specs/data/**/
tsconfig.json
.prettierrc.json
ThirdParty.json

================================================
FILE: .prettierrc.json
================================================
{}

================================================
FILE: CHANGES.md
================================================

Version 0.6.1 - 2026-01-25

- Added validation for the `3DTILES_content_gltf` extension [#336](https://github.com/CesiumGS/3d-tiles-validator/pull/336)
- Added validation for the `MAXAR_grid` extension [#337](https://github.com/CesiumGS/3d-tiles-validator/pull/337)
- Added validation for the `MAXAR_extent` extension [#338](https://github.com/CesiumGS/3d-tiles-validator/pull/338), [#347](https://github.com/CesiumGS/3d-tiles-validator/pull/347), [#351](https://github.com/CesiumGS/3d-tiles-validator/pull/351)
- Added validation for the `MAXAR_content_geojson` extension [#339](https://github.com/CesiumGS/3d-tiles-validator/pull/339)
- Changed the validation issue type for string lengths that are invalid according to the `minLength/maxLength` definitions of the JSON schema from `ARRAY_LENGTH_MISMATCH` to `STRING_LENGTH_MISMATCH` [#340](https://github.com/CesiumGS/3d-tiles-validator/pull/340)
- Added validation for the `MAXAR_image_ortho` glTF extension [#341](https://github.com/CesiumGS/3d-tiles-validator/pull/341)
- Added validation for the `MAXAR_temporal_light_traits` glTF extension [#342](https://github.com/CesiumGS/3d-tiles-validator/pull/342)
- Added validation for the `MAXAR_nonvisual_geometry` glTF extension [#343](https://github.com/CesiumGS/3d-tiles-validator/pull/343)
- Fixed a case where a missing `extensionsRequired` declaration was not detected [#346](https://github.com/CesiumGS/3d-tiles-validator/pull/346)
- Changed the mechanism for resolving semantic schema files to resolve them relative to the options file that defines them [#350](https://github.com/CesiumGS/3d-tiles-validator/pull/350)
- Fixed MAXAR spatial reference system validation of S2 faces [#352](https://github.com/CesiumGS/3d-tiles-validator/pull/352)
- Fixed a case where a validation issue was erroneously generated when a non-scalar class property defined valid `min/max` properties [#356](https://github.com/CesiumGS/3d-tiles-validator/pull/356)
- Added validation of the values in binary property tables in glTF against the value ranges that have been defined in the schema [#357](https://github.com/CesiumGS/3d-tiles-validator/pull/357)
- Build process: The CI will now fail when `eslint` generates warnings [#344](https://github.com/CesiumGS/3d-tiles-validator/pull/344)

Version 0.6.0 - 2025-02-24

- Fixed a bug where a `BOUNDING_VOLUMES_INCONSISTENT` error was reported when a tile defined a `transform` [#328](https://github.com/CesiumGS/3d-tiles-validator/pull/328)
- Allow users to provide schema files for validating custom metadata semantics [#329](https://github.com/CesiumGS/3d-tiles-validator/pull/329)
- Do not emit warnings when encountering `MAXAR_content_geojson`, `VRICON_class`, or `VRICON_grid` extensions [#330](https://github.com/CesiumGS/3d-tiles-validator/pull/330)
- Fixes for 3TZ validation [#331](https://github.com/CesiumGS/3d-tiles-validator/pull/331)
  - Fixed a bug where a 3TZ file could not be referred to with a relative path
  - Handled the case where completely invalid 3TZ files caused an `INTERNAL_ERROR`
- Updated `3d-tiles-tools` version to `0.5.0`
  - Minor updates for the new `async` API that was introduced via [`3d-tiles-tools/pull/167`](https://github.com/CesiumGS/3d-tiles-tools/pull/167)
  - Includes a bugfix from [`3d-tiles-tools/pull/173](https://github.com/CesiumGS/3d-tiles-tools/pull/173) where 3TZ files that contained certain local ZIP file headers caused an internal error in the validator
- Changed the severity of issues that have been generated for content types that are known but not validated (like `VCTR`, `GEOM`, and `GEOJSON`) from `WARNING` to `INFO` [#332](https://github.com/CesiumGS/3d-tiles-validator/pull/332)

Version 0.5.1 - 2024-12-05

- The maximum number of issues that are reported for a single glTF asset is now limited ([#291](https://github.com/CesiumGS/3d-tiles-validator/pull/291)).
- When the number of bytes that are required for a certain property texture property did not match the number of `channels`, then the validator reported this as an `ERROR`, with the type `TEXTURE_CHANNELS_OUT_OF_RANGE`. This could cause errors to be reported for the case of 16-bit channels in textures, where these numbers do not have to match. Now, these cases are only reported as a `WARNING`, of the type `TEXTURE_CHANNELS_SIZE_MISMATCH` ([#293](https://github.com/CesiumGS/3d-tiles-validator/pull/293)).
- The `refine` property for tiles is optional in general, but _required_ for the root tile. The validator did not check this. Now, it reports a  `TILE_REFINE_MISSING_IN_ROOT` error when the `refine` property is missing in a root tile ([#303](https://github.com/CesiumGS/3d-tiles-validator/pull/303)).
- When encountering an invalid alignment in the binary data of legacy tile content files, the validator stopped the validation of these files, and only reported a `BINARY_INVALID_ALIGNMENT` error. Now, it will try to process the data despite the invalid alignment, and perform further validation steps, for example, of the binary glTF data ([#304](https://github.com/CesiumGS/3d-tiles-validator/pull/304)).
- Fixed a bug where the validator erroneously reported validation error when external tilesets did not use extensions that had been declared in the `extensionsUsed` of the containing tileset ([#305](https://github.com/CesiumGS/3d-tiles-validator/pull/305)).
- Added a convenience function to the `ValidationResult` class, to easily deserialize and post-process validation reports ([#307](https://github.com/CesiumGS/3d-tiles-validator/pull/307)).
- Fixed a bug where the default value for `texCoord` properties of property texture was not handled properly ([#309](https://github.com/CesiumGS/3d-tiles-validator/pull/309)).
- Added the option to define a severity threshold for content validation issues. Setting the `contentValidationIssueSeverity` in the validation config file will omit all content validation issues that are below this severity threshold ([#310](https://github.com/CesiumGS/3d-tiles-validator/pull/310)).
- Fixed a bug where the validator reported an error for binary `.subtree` files that did not contain any buffers ([#313](https://github.com/CesiumGS/3d-tiles-validator/pull/313)).
- Added support for the validation of the `NGA_gpm_local` glTF extension ([#316](https://github.com/CesiumGS/3d-tiles-validator/pull/316)).
- Added support for the validation of the `NGA_gpm` 3D Tiles extension ([#319](https://github.com/CesiumGS/3d-tiles-validator/pull/319)).
- Fixed a bug where the validator erroneously reported a `BOUNDING_VOLUMES_INCONSISTENT` error when a tile with a `transform` contained a `content` with a `boundingVolume` ([#322](https://github.com/CesiumGS/3d-tiles-validator/pull/322)).
- Updated the underlying `3d-tiles-tools` dependency to include a fix for a bug where the validator reported an `INTERNAL_ERROR` when trying to validate a tileset that contains glTF that use the `EXT_meshopt_compression` extension ([#323](https://github.com/CesiumGS/3d-tiles-validator/issues/323)).
- Fixed a bug where the semantics that are referred to as 'General Semantics' in the 3D Metadata Semantic Reference had been reported to be unknown with a `METADATA_SEMANTIC_UNKNOWN` message ([#325](https://github.com/CesiumGS/3d-tiles-validator/pull/325)).

Version 0.5.0 - 2023-10-24

- Added validation of glTF extensions via [#280](https://github.com/CesiumGS/3d-tiles-validator/pull/280) and [#284](https://github.com/CesiumGS/3d-tiles-validator/pull/284). In addition to the basic validation of glTF tile content that is performed with the glTF validator, the 3D Tiles Validator now checks the validity of certain glTF extensions:
  - For `EXT_mesh_features`, it will check the validity of feature ID attributes and feature ID textures
  - For `EXT_instance_features`, it will check the validity of the feature ID attributes that refer to the `EXT_mesh_gpu_instancing` extension
  - For `EXT_structural_metadata`, it will check the validity of the metadata schema definition, property tables, property attributes, and property textures
- Added a command line functionality for validating single tile content files (glTF/GLB, B3DM, I3DM, PNTS, and CMPT), via [#285](https://github.com/CesiumGS/3d-tiles-validator/pull/285)
- When an I3DM refers to an external glTF asset with a URI, then the URI has to be padded with `0x20` (space) bytes if necessary to satisfy the alignment requirements. The validator only accepted `0x00` (zero) bytes as padding bytes. Now the validator properly handles trailing spaces, and reports the presence of zero-bytes with a validation warning ([#276](https://github.com/CesiumGS/3d-tiles-validator/issues/276))
- Changed the severity level of validation issues:
  - The case that the `geometricError` of a tile was larger than the `geometricError` of its parent was reported as an `ERROR`. The specification does not explicitly disallow this, so it is now only treated as a `WARNING` ([#286](https://github.com/CesiumGS/3d-tiles-validator/issues/286))
  - An empty `children` array in a tile was treated as an `ERROR`, but is now treated as a `WARNING`, via [#288](https://github.com/CesiumGS/3d-tiles-validator/pull/288)

Version 0.4.1 - 2023-05-02

- Moved most of the internal implementation into the `3d-tiles-tools`, and replaced it with a dependency to `3d-tiles-tools`
- Detect cycles in external tilesets ([#269](https://github.com/CesiumGS/3d-tiles-validator/issues/269))
- Handle 3D Tiles packages that contain entries that are individually compressed with GZIP

Version 0.4.0 - 2023-01-31

- Padding bytes in B3DM that had only be inserted to align its length to 8 bytes had not been handled properly, and caused unwanted validation warnings. This case is now handled by restricting the glTF validation to the GLB _without_ padding bytes ([#256](https://github.com/CesiumGS/3d-tiles-validator/issues/256))
- When a tileset referred to glTF (JSON) data that could not be resolved, then this was ignored. Now, it creates an error saying that the data could not be resolved. The treatment of non-resolvable data might be configured with validation options in the future (see https://github.com/CesiumGS/3d-tiles-validator/issues/224)
- When the glTF validator generated messages with the "hint" severity, these had not been shown in the tileset validation report. Now, they show up as issues with the `INFO` severity level.
- The `tile.transform` matrices had been checked to be invertible. Now they are checked to be affine ([#262](https://github.com/CesiumGS/3d-tiles-validator/issues/262)).
- Fixed a bug where the validation of PNTS caused wrong validation issues for the batch table length for batched point clouds.
- Added experimental support for validating tileset package files. The `--tilesetFile` that is given at the command line can now also be a 3TZ or 3DTILES file.
- When input JSON files contained a Unicode BOM (Byte Order Mark), the validator reported a `JSON_PARSE_ERROR` without information about the reason for the parsing error. Now it reports an `IO_ERROR` with a helpful error message.

Version 0.3.0 - 2022-12-20

- Updated the packaging so that the validator can more easily be executed as a command line tool after installing
- Updated the scripts in `package.json` to simplify the packaging process

Version 0.2.0 - 2022-12-13

- Add support for validation options that allow to include/exclude certain content types for the validation. These options can either be given via the `--optionsFile` command line argument, or passed as an optional parameter to `Validators.validateTilesetFile`.
- Fixed a bug where the content data was not validated when the validator was used as a library ([#248](https://github.com/CesiumGS/3d-tiles-validator/issues/248))
- Fixed a bug that caused validation errors for `statistics.class` properties
- When a tileset input file did not exist, the validator generated a `JSON_PARSE_ERROR`. Now it generates an `IO_ERROR` (including the file path) instead.
- Dependency updates:
  - Updated `better-sqlite3` from `7.5.3` to `8.0.1` (for compatibility with Node 19 - see [#245](https://github.com/CesiumGS/3d-tiles-validator/issues/245))
  - Removed `jasmine-node` 
  - Removed `tsconfig/node16`
  - Reduced `engines.node` version from `>=16.0.0` to `>=14.0.0`

Version 0.1.0 - 2022-11-29
  
  - Initial release


================================================
FILE: IMPLEMENTATION.md
================================================
# 3D Tiles Validator Implementation Notes

Parts of the current implementation may still change. This page is only a short description of the overall structure.

## Directory structure:

- `./src`: The entry point for the command line interface is in `main.ts`
- `./src/validation`: The core classes for the 3D Tiles validation
- `./src/issues`: Classes defining the categories of detected issues
- `./src/tileFormats`: Classes for the validation of tile contents
- `./src/archives`: Functions that are specific for the validation of 3TZ archives/packages
- `./specs`: Jasmine specs
- `./specs/data`: Test data

## Overview

The classes in the `./src/validation` directory are the core classes for the 3D Tiles validation. 

The entry point for the tileset validation is the `TilesetValidator` class. This class is not publicly visible, but it is the main class that is used in the public `Validators.validateTilesetFile` method. The validation process, as it is implemented in the `TilesetValidator`, is:

- It receives a tileset JSON string and parses it into a `Tileset` object from the `structure` package of the `3d-tiles-tools`
- It traverses the `Tileset` structure, and performs the validation
  - For each object type, there is a validator, like `AssetValidator`, `ContentValidator`, `TileValidator`, `BoundingVolumeValidator` etc. For now, these are mainly classes with single static functions, but they might be refined for some objects.

Each validation function receives a `ValidationContext` as the last parameter. 

The `ValidationContext` class:

- Contains a `ValidationOptions` object that contains configuration options for the validation process (e.g. flags that determine whether tile content should be validated)
- Maintains a `ResourceResolver` that reads a `Buffer` from a given URI (resolved in the respective context - the tileset, external tileset, or glTF)
- Collects the `ValidationIssue` instances (errors and warnings) that are found during the traversal

The `ValidationIssue` class and its types:

- The `ValidationIssue` itself is a plain data structure with basic info about the issue (message, path, severity...)
- Instances of this class are created with methods in the `issues*` classes, roughly categorized here:
  - `IoValidationIssues.ts`: Fundamental IO errors, like `JSON_PARSE_ERROR`
  - `JsonValidationIssues.ts`: Violations of the JSON schema, like `PROPERTY_MISSING` or `ARRAY_LENGTH_MISMATCH`
  - `StructureValidationIssues.ts`: General, inconsistent structures, like `IDENTIFIER_NOT_FOUND` 
  - `SemanticValidationIssues.ts`: Inconsistent property values, like `TILE_GEOMETRIC_ERRORS_INCONSISTENT` 
  - `MetadataValidationIssues.ts`: Invalid metadata schema and values
  - `BinaryValidationIssues.ts`: Invalid data layouts of binary tile content data
  - `ContentValidationIssues.ts`: Issues that are found in tile content or external tilesets
- For validation issues that refer to the tile content, each `ValidationIssue` can have an array of `causes`. This can be filled, for example, with the information from the glTF validator that caused the validation to fail


## Future Work

Certain functionalities are currently offered via the command line, but only intended for internal use:

#### Validate a single metadata schema file:
```
npx ts-node src/main.ts --metadataSchemaFile specs/data/schemas/validSchema.json
```

#### Validate a single subtree file:

**Note:** For the actual validation of standalone subtree files, there has to be a mechanism for passing in the information about the expected _structure_ of the subtree (namely, the information from the `implicitTiling` object). This example only refers to the files in the `specs` directory, which all assume the same subtree structure for now.
```
npx ts-node src/main.ts --subtreeFile specs/data/subtrees/binarySubtreeValid.subtree
```

#### Batch runs for the spec files

The `specs/data` directory contains sample files that cause different validation issues. These files can be processed with
```
npx ts-node src/main.ts --tilesetSpecs
npx ts-node src/main.ts --metadataSchemaSpecs
npx ts-node src/main.ts --subtreeSpecs
```



## API Definition

The API definition is tracked with https://api-extractor.com

After running `npm install`, the API documentation can be created with `npm run docs`. The API documentation will be written into the `build/docs` directory. The surface API information will be written into `etc/3d-tiles-validator.api.md`. This file captures the public API, and changes in the public API will cause a warning to be printed

> Warning: You have changed the public API signature for this project. Updating etc/3d-tiles-validator.api.md

This API definition file is tracked with Git, so changes in this file should be reviewed carefully.


## Release Process

- Prepare the actual release:
  - Update `CHANGES.md`
  - Update the version number in `package.json`

- Generate the tarball for the release:  
  
  `npm run package` 

  This will run the required scripts from the `package.json`:
    - Clean the build output folder
    - Prepare the package: 
      - Perform linting
      - Check formatting
      - Build (compile TypeScript to JavaScript)
      - Run the unit tests
      - Generate the documentation
      - Update the third-party information
    - Package the build output folder into a TAR file

- Verify the contents of the resulting TAR file. If there are unwanted files, add these files to `.npmignore` and re-generate the tarball

- Create a git tag for the version and push it:
 
  `git tag -a v1.2.3 -m "Release of version 1.2.3"`
  
  `git push origin v1.2.3`

- Publish the package:
  
  `npm publish`


### Build Scripts

The build scripts that are used for the release process are documented with `about:`_`<step>`_ in the `package.json` file. Each of these comments indicates the goal and preconditions for running the respective step. The structure of these scripts is often organized hierarchically:

- `docs`
  - `build`
  - `docs-generate`
    - `docs-prepare-directory`
    - `docs-extract-api`,
    - `docs-generate-markdown`,

 The intention is to make sure that each "top-level" (single-word) script can be executed without any preconditions (athough this pattern may not be applied for all steps). Intermediate steps can be executed manually or as part of other steps when it is ensured that the respective preconditions are met.

The following `devDependencies` are *only* used for the implementation of the build process:

- `mkdirp` - To generate the `etc` output directory for the API definition file (if it does not exist yet)
- `del-cli` - To delete the contents of the `build` output folder
- `copyfiles` - To copy the `bin/main` file to the build folder (see `bin/README.md` for details)



================================================
FILE: LICENSE.md
================================================
Copyright 2016-2022 CesiumGS, Inc. and Contributors

                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "{}"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright 2016-2020 Cesium GS, Inc. and Contributors

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.


================================================
FILE: README.md
================================================
# 3D Tiles Validator

A validator for [3D Tiles](https://github.com/CesiumGS/3d-tiles).

> **A note about the repository structure**
> 
> This repository originally contained multiple projects. Now, these projects are maintained in separate repositories:
> 
> - The `3d-tiles-tools` can be found in [the `3d-tiles-tools` repository](https://github.com/CesiumGS/3d-tiles-tools)
> - The `3d-tiles-samples-generator` can be found in [the `3d-tiles-samples-generator` repository](https://github.com/CesiumGS/3d-tiles-samples-generator)
> 

## Overview

The 3D Tiles validator can be used to validate 3D Tiles tilesets and their associated tile content data. It supports version 1.0 and version 1.1 of the 3D Tiles specification. The validator can be used as a command line tool, or as a library.

**Note**: Some of the implementation and interfaces may still change. This refers to the source code as well as details of the command line interface and report format.

### Implemented Features 

- Validation of the JSON structure of the `tileset.json` file
- Validation of the 3D Tiles [Tile Formats](https://github.com/CesiumGS/3d-tiles/tree/main/specification/TileFormats)
  - The supported tile formats are: Batched 3D Model (`b3dm`), Instanced 3D Model (`i3dm`), Point Cloud (`pnts`), Composite (`cmpt`)
  - glTF tile content is validated with the [glTF Validator](https://github.com/KhronosGroup/glTF-Validator)
- Validation of implicit tilesets
- Validation of 3D Tiles Metadata
  - This includes the validation of the JSON structure of the metadata, as well as the structure and ranges of metadata values, both for the JSON based representation and for the binary metadata that is stored in property tables
- A basic validation of the [`3DTILES_bounding_volume_S2` extension](https://github.com/CesiumGS/3d-tiles/tree/main/extensions/3DTILES_bounding_volume_S2)
- Validation of tilesets that are contained in 3D Tiles package files (3TZ and 3DTILES files)

## Installation

In order to install the validator locally into a directory, run
```
npm install 3d-tiles-validator
```
(If you want to work directly with a clone of the Git repository, see [Developer Setup](#developer-setup))

## Command Line Usage

#### Validate a single tileset file
```
npx 3d-tiles-validator --tilesetFile specs/data/Samples/SparseImplicitQuadtree/tileset.json
```

The input file can either be a tileset JSON file, or one of the known tileset package files. The known package file formats are 3TZ (a package format based on ZIP), and 3DTILES (a package format based on SQLite). The type of the input is determined from the file extension, which may be `.3tz` or `.3dtiles` (case-insensitively). For example, to validate a 3TZ file:
```
npx 3d-tiles-validator --tilesetFile ./specs/data/tilesets/packages/validTilesetPackage.3tz
```

#### Validate a set of tileset files
```
npx 3d-tiles-validator --tilesetsDirectory specs/data/Samples/
```
This will validate all tileset files in the given directory and all its subdirectories. The tileset files are identified by matching the file name against the glob pattern `**/*tileset*.json`. The pattern can be configured with the `tilesetGlobPattern` parameter. For example, in order to treat all .json files as tileset files:
```
npx 3d-tiles-validator --tilesetsDirectory specs/data/Samples/ --tilesetGlobPattern **/*.json
```

#### Validate a tile content file
```
npx 3d-tiles-validator --tileContentFile specs/data/gltfExtensions/FeatureIdAttributeAndPropertyTableFeatureIdNotInRange.gltf
```

The input file can be any of the content types that are supported by the validator. This includes B3DM, I3DM, PNTS, CMPT, and glTF/GLB files. The type of the file will be determined, and if it is not a known type, then a validation warning will be created.

### Report Files

By default, validation reports are printed to the console. 

When validating a single file, then the `reportFile` argument can be used to specify the output file for the validation report. For example:
```
npx 3d-tiles-validator --tilesetFile specs/data/Samples/TilesetWithFullMetadata/tileset.json --reportFile MY_REPORT.json
```

Alternatively, or when validating multiple files, the `writeReports` argument can be used to write report files into the same directory as the input files. The name of the report file will be derived from the input file name. 
```
npx 3d-tiles-validator --tilesetsDirectory specs/data/Samples/ --writeReports
```

### Option Files

Options for the validation process can be specified in a file that is given via the `--optionsFile` argument: 
```
npx 3d-tiles-validator --optionsFile exampleOptions.json
```
The options represent the properties of the `ValidationOptions` class. For example, using the following `exampleOptions.json` file, then the validator will only validate the tileset JSON structure, but _no_ tile content data:
```JSON
{
  "validateContentData": false
}
```
The following options will cause the validator to _include_ B3DM- and GLB files in the validation process, but ignore all other content types:
```JSON
{
  "includeContentTypes": [ "CONTENT_TYPE_B3DM", "CONTENT_TYPE_GLB" ]
}
```
The following options will cause the validator to _exclude_ tileset files (i.e. external tilesets) during the validation:
```JSON
{
  "excludeContentTypes": [ "CONTENT_TYPE_TILESET" ]
}
```

The options can also be part of a configuration file, as described in the next section.


### Configuration Files

The command line arguments for a validator run can be summarized in a configuration file that is given with the `--configFile` argument. For example, when running the validator with
```
npx 3d-tiles-validator --configFile exampleConfig.json
```
using the following `exampleConfig.json` file
```JSON
{
  "tilesetsDirectory": "specs/data/tilesets",
  "tilesetGlobPattern": "**/*.json"
}
```
then the validator will validate all files in the given directory that match the given glob pattern.

The configuration can also contain an `options` object. This object summarizes the validation options, as described in the [Option Files](#option-files) section. For example: 
```JSON
{
  "tilesetsDirectory": "specs/data/tilesets",
  "tilesetGlobPattern": "**/*.json",
  "options": {
    "includeContentTypes": [ "CONTENT_TYPE_B3DM", "CONTENT_TYPE_GLB" ]
  }
}
```
This will cause the validator to validate all JSON files in the specified directory, but only consider B3DM- and GLB tile content data during the validation.

### Custom Metadata Semantics

The [3D Metadata Specification](https://github.com/CesiumGS/3d-tiles/tree/main/specification/Metadata) allows for the definition of custom _semantics_ for metadata properties. The built-in semantics are described in the [3D Metadata Semantic Reference](https://github.com/CesiumGS/3d-tiles/tree/main/specification/Metadata/Semantics). For other semantics, the validator will by default generate a `METADATA_SEMANTIC_UNKNOWN` issue. 

To avoid these warnings, clients can define their own semantics in a metadata schema file, so that they are taken into account during the validation process. Some details of this process might still change (see [`3d-tiles/issues/643`](https://github.com/CesiumGS/3d-tiles/issues/643) for a discussion). But the current state of the support of metadata semantics validation in the 3D Tiles Validator is described here.

#### Metadata Semantics Schema

A 'semantics schema' is a [3D Metadata Schema](https://github.com/CesiumGS/3d-tiles/tree/main/specification/Metadata#schema) file that describes the _semantics_ that may appear in another metadata schema. In a semantics schema, the property names are just the names of the semantics. For example, when a client wants to define a semantic for a class like `ExampleClass`, and this semantic has the name `EXAMPLE_SEMANTIC`, then this structure can be represented in a semantics schema file as follows:

**`exampleSemanticsSchema.json`:**
```json
{
  "id": "Example-Semantics-0.0.0",
  "description": "A metadata schema where each class property has a name that represents one possible semantic of a metadata property, and that is used for validating semantics, by passing it in as one of the 'semanticSchemaFileNames' of the validation options",
  "classes": {
    "ExampleClassSemantics": {
      "description": "A class where each property is a semantic for a property of the 'ExampleClass'",
      "properties": {
        "EXAMPLE_SEMANTIC": {
          "name": "The 'EXAMPLE_SEMANTIC' structure",
          "description": "The structure that a property must have so that it can have the 'EXAMPLE_SEMANTIC'",
          "type": "SCALAR",
          "componentType": "FLOAT32"
        }
      }
    }
  }
}
```

> Note: 
> 
> This schema file contains elaborate names and descriptions. These are optional on a technical level. An equivalent schema file is
> ```json
> {
>   "id": "Example-Semantics-0.0.0",
>   "classes": {
>     "ExampleClassSemantics": {
>       "properties": {
>         "EXAMPLE_SEMANTIC": {
>           "type": "SCALAR",
>           "componentType": "FLOAT32"
>         }
>       }
>     }
>   }
> }
> ```
> But adding names and descriptions is strongly recommended for documentation purposes. 

#### Metadata Semantics Schema Registration

In order to include a 'semantics schema' in the validation process, the name of the schema file can be passed to the validator, as part of the validation options:

**`exampleOptions.json`:**
```json
{
  "semanticSchemaFileNames": ["exampleSemanticsSchema.json"]
}
```

Note: Relative paths in the `semanticSchemaFileNames` array are resolved relative to the directory of the options file (`--optionsFile`)


This options file can then be passed to the validator:
```
npx 3d-tiles-validator --optionsFile exampleOptions.json -t ./data/exampleTileset.json
```

The validator will then validate the semantics that are defined in the tileset JSON against the structure that was defined in the semantics schema.



## Developer Setup

When the validator is not installed as a package from NPM, but supposed to be used directly in a cloned repository, then the command line usage is as follows:

- Clone the repository into the current directory:
  ```
  git clone https://github.com/CesiumGS/3d-tiles-validator
  ```
- Change into the directory of the cloned repository:
  ```
  cd 3d-tiles-validator
  ```
- Install the validator and all its dependencies:
  ```
  npm install
  ```

After this, `ts-node` can be used to directly execute the validator, using the same command line options as described above - for example, to validate a single tileset file:
```
npx ts-node src/main.ts --tilesetFile specs/data/Samples/SparseImplicitQuadtree/tileset.json
```


## Library Usage

The basic usage of the validator as a library is shown here:
```JavaScript
const { Validators } = require("3d-tiles-validator");

const resultPromise = Validators.validateTilesetFile("example.json");
resultPromise.then((result) => {
  console.log(result.serialize());
});
```
The `Validators.validateTilesetFile` receives a file name, and returns a promise to the `ValidationResult`, which can then be printed to the console. The second (optional) parameter is a `ValidationOptions` object that summarizes the options for the validation process (also see [Option Files](#option-files)).

### Validation Result Filtering

Clients can perform basic filtering operations on a `ValidationResult`, in order to remove validation issues that are below a certain severity level, or warnings that are anticipated in a certain application context.

For example, a given validation result can be filtered to 
- include validation issues that have the severity `ERROR`
- exclude validation issues that have the type `EXTENSION_NOT_SUPPORTED`

An example of applying such a filter to a given validation result is shown here:
```JavaScript
const { Validators, ValidationIssueFilters, ValidationIssueSeverity } = require("3d-tiles-validator");

const resultPromise = Validators.validateTilesetFile("example.json");
resultPromise.then((result) => {
  const filteredResult = result
    .filter(ValidationIssueFilters.byIncludedSeverities(ValidationIssueSeverity.ERROR))
    .filter(ValidationIssueFilters.byExcludedTypes("EXTENSION_NOT_SUPPORTED"));
  console.log(filteredResult.serialize());
});
```

**Note**: The `type` strings that are used for describing and categorizing the validation issues are not part of the core API. These strings might change between minor- or patch releases. But changes will be pointed out in the change log.

## Implementation Notes

See [`IMPLEMENTATION.md`](IMPLEMENTATION.md) for implementation notes.



================================================
FILE: ThirdParty.json
================================================
[
  {
    "name": "3d-tiles-tools",
    "license": [
      "Apache-2.0"
    ],
    "version": "0.5.0",
    "url": "https://www.npmjs.com/package/3d-tiles-tools"
  },
  {
    "name": "@gltf-transform/core",
    "license": [
      "MIT"
    ],
    "version": "3.10.1",
    "url": "https://www.npmjs.com/package/@gltf-transform/core"
  },
  {
    "name": "@gltf-transform/extensions",
    "license": [
      "MIT"
    ],
    "version": "3.10.1",
    "url": "https://www.npmjs.com/package/@gltf-transform/extensions"
  },
  {
    "name": "@gltf-transform/functions",
    "license": [
      "MIT"
    ],
    "version": "3.10.1",
    "url": "https://www.npmjs.com/package/@gltf-transform/functions"
  },
  {
    "name": "cesium",
    "license": [
      "Apache-2.0"
    ],
    "version": "1.124.0",
    "url": "https://www.npmjs.com/package/cesium"
  },
  {
    "name": "gltf-validator",
    "license": [
      "Apache-2.0"
    ],
    "version": "2.0.0-dev.3.10",
    "url": "https://www.npmjs.com/package/gltf-validator"
  },
  {
    "name": "minimatch",
    "license": [
      "ISC"
    ],
    "version": "5.1.6",
    "url": "https://www.npmjs.com/package/minimatch"
  },
  {
    "name": "node-stream-zip",
    "license": [
      "MIT"
    ],
    "version": "1.15.0",
    "url": "https://www.npmjs.com/package/node-stream-zip"
  },
  {
    "name": "sharp",
    "license": [
      "Apache-2.0"
    ],
    "version": "0.32.6",
    "url": "https://www.npmjs.com/package/sharp"
  },
  {
    "name": "yargs",
    "license": [
      "MIT"
    ],
    "version": "17.7.2",
    "url": "https://www.npmjs.com/package/yargs"
  }
]

================================================
FILE: api-extractor.jsonc
================================================
/**
 * Config file for API Extractor.  For more info, please visit: https://api-extractor.com
 */
{
  "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json",

  /**
   * (REQUIRED) Specifies the .d.ts file to be used as the starting point for analysis.  API Extractor
   * analyzes the symbols exported by this module.
   *
   * The file extension must be ".d.ts" and not ".ts".
   *
   * The path is resolved relative to the folder of the config file that contains the setting; to change this,
   * prepend a folder token such as "<projectFolder>".
   *
   * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>
   */
  "mainEntryPointFilePath": "build/index.d.ts",

  /**
   * Configures how the API report file (*.api.md) will be generated.
   */
  "apiReport": {
    /**
     * (REQUIRED) Whether to generate an API report.
     */
    "enabled": true,

    /**
     * Specifies the folder where the temporary report file is written.  The file name portion is determined by
     * the "reportFileName" setting.
     *
     * After the temporary file is written to disk, it is compared with the file in the "reportFolder".
     * If they are different, a production build will fail.
     *
     * The path is resolved relative to the folder of the config file that contains the setting; to change this,
     * prepend a folder token such as "<projectFolder>".
     *
     * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>
     * DEFAULT VALUE: "<projectFolder>/temp/"
     */
    "reportTempFolder": "<projectFolder>/build/api-extractor"
  },

  /**
   * Configures how the doc model file (*.api.json) will be generated.
   */
  "docModel": {
    /**
     * (REQUIRED) Whether to generate a doc model file.
     */
    "enabled": true,

    /**
     * The output path for the doc model file.  The file extension should be ".api.json".
     *
     * The path is resolved relative to the folder of the config file that contains the setting; to change this,
     * prepend a folder token such as "<projectFolder>".
     *
     * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>
     * DEFAULT VALUE: "<projectFolder>/temp/<unscopedPackageName>.api.json"
     */
     "apiJsonFilePath": "<projectFolder>/build/api-extractor/<unscopedPackageName>.api.json"
  },

  /**
   * Configures how the .d.ts rollup file will be generated.
   */
  "dtsRollup": {
    /**
     * (REQUIRED) Whether to generate the .d.ts rollup file.
     */
    "enabled": true
  },

}


================================================
FILE: bin/README.md
================================================
The `main` file in this directory is the entry point for the validator application when it is installed from an NPM package. It is defined as the entry point via the `bin` property of the main `package.json`.

It only sets up the Node execution environment for the validator, as required as of https://docs.npmjs.com/cli/v9/configuring-npm/package-json#bin . Beyond that, it just includes `main.js`. 

It is copied to the `build` directory by the `package-copy` script of the `package.json`, before generating the release package (similar to https://github.com/microsoft/TypeScript/blob/main/bin )

================================================
FILE: bin/main
================================================
#!/usr/bin/env node
require('./main.js')

================================================
FILE: demos/README.md
================================================

### Demos

These are small command-line demos that show how to use various parts of the API.

**Note that not everything that is shown in these demos is part of a _public_ API!**

The demos that show the basic usage of the _public_ API are the following:

- [`validationResultDemos.ts`](validationResultDemos.ts) : Shows how to perform filtering operations on a `ValidationResult` that is returned from `Validators.validateTilesetFile`. It creates a "dummy" `ValidationResult` instance and then filters it based on different criteria.
- [`validationOptionsDemo.ts`](validationOptionsDemo.ts) : Shows the effect of the `ValidationOptions` that can be passed to `Validators.validateTilesetFile`. It shows how to include/exclude certain content types in the validation process.



================================================
FILE: demos/validationOptionsDemo.ts
================================================
import { ContentDataTypes } from "3d-tiles-tools";
import {
  Validators,
  ValidationOptions,
} from "../src";


async function runWithIncluded() {    

  // Options that list the included types, including B3DM:
  const options = ValidationOptions.fromJson({
    validateContentData: true, // The default
    includeContentTypes: [
      ContentDataTypes.CONTENT_TYPE_B3DM, // Explicitly included here
    ],
    excludeContentTypes: undefined, // The default
  });
  const tilesetFile = "specs/data/tilesets/validTilesetWithInvalidB3dm.json";
  const result = await Validators.validateTilesetFile(tilesetFile, options);

  console.log("Result of validating a tileset with an invalid B3DM, ")
  console.log("with the B3MD content type being INcluded:")
  console.log(result.serialize());
  console.log("-".repeat(80));
}


async function runWithoutIncluded() {    

  // Options that list the included types, NOT including B3DM:
  const options = ValidationOptions.fromJson({
    validateContentData: true, // The default
    includeContentTypes: [
      //ContentDataTypes.CONTENT_TYPE_B3DM, // Not included here!
    ],
    excludeContentTypes: undefined, // The default
  });
  const tilesetFile = "specs/data/tilesets/validTilesetWithInvalidB3dm.json";
  const result = await Validators.validateTilesetFile(tilesetFile, options);

  console.log("Result of validating a tileset with an invalid B3DM, ")
  console.log("with the B3MD content type NOT being INcluded:")
  console.log(result.serialize());
  console.log("-".repeat(80));
}


async function runWithExcluded() {    

  // Options that list the included types, EXcluding B3DM:
  const options = ValidationOptions.fromJson({
    validateContentData: true, // The default
    includeContentTypes: undefined, // The default
    excludeContentTypes: [
      ContentDataTypes.CONTENT_TYPE_B3DM // Explicitly excluded here
    ]
  });
  const tilesetFile = "specs/data/tilesets/validTilesetWithInvalidB3dm.json";
  const result = await Validators.validateTilesetFile(tilesetFile, options);

  console.log("Result of validating a tileset with an invalid B3DM, ")
  console.log("with the B3MD content type being EXcluded:")
  console.log(result.serialize());
  console.log("-".repeat(80));
}


async function runWithoutExcluded() {    

  // Options that list the included types, NOT excluding B3DM:
  const options = ValidationOptions.fromJson({
    validateContentData: true, // The default
    includeContentTypes: undefined, // The default
    excludeContentTypes: [
      // ContentDataTypes.CONTENT_TYPE_B3DM // NOT Excluded here
    ]
  });
  const tilesetFile = "specs/data/tilesets/validTilesetWithInvalidB3dm.json";
  const result = await Validators.validateTilesetFile(tilesetFile, options);

  console.log("Result of validating a tileset with an invalid B3DM, ")
  console.log("the B3MD content type NOT being EXcluded:")
  console.log(result.serialize());
  console.log("-".repeat(80));
}




async function runDemo() {    
  await runWithIncluded();
  await runWithoutIncluded();
  await runWithExcluded();
  await runWithoutExcluded();
}

runDemo();

================================================
FILE: demos/validationResultDemos.ts
================================================
import { ValidationIssue } from "../src/validation/ValidationIssue";
import { ValidationIssueSeverity } from "../src/validation/ValidationIssueSeverity";
import { ValidationResult } from "../src/validation/ValidationResult";
import { ValidationIssueFilters } from "../src/validation/ValidationIssueFilters";
import { ValidationResults } from "../src/validation/ValidationResults";

// A function to create an unspecified `ValidationResult`
// that contains dummy issues for demonstrating the
// validation result filtering options
function createDemoResult() {
  function createError(id: string) {
    const issue = new ValidationIssue(
      `EXAMPLE_ERROR_${id}`,
      "example",
      `Example Error ${id}`,
      ValidationIssueSeverity.ERROR
    );
    return issue;
  }
  function createWarning(id: string) {
    const issue = new ValidationIssue(
      `EXAMPLE_WARNING_${id}`,
      "example",
      `Example Warning ${id}`,
      ValidationIssueSeverity.WARNING
    );
    return issue;
  }
  function createInfo(id: string) {
    const issue = new ValidationIssue(
      `EXAMPLE_INFO_${id}`,
      "example",
      `Example Info ${id}`,
      ValidationIssueSeverity.INFO
    );
    return issue;
  }
  function createContentWarning(id: string, childId: string) {
    const issue = new ValidationIssue(
      `EXAMPLE_CONTENT_WARNING_${id}`,
      "example/content/" + childId,
      `Example Content Warning ${id}`,
      ValidationIssueSeverity.WARNING
    );
    issue.addCause(createWarning(id + childId));
    issue.addCause(createInfo(id + childId));
    return issue;
  }

  function createContentError(id: string, childId: string) {
    const issue = new ValidationIssue(
      `EXAMPLE_CONTENT_ERROR_${id}`,
      "example/content/" + childId,
      `Example Content Error ${id}`,
      ValidationIssueSeverity.ERROR
    );
    issue.addCause(createError(id + childId));
    issue.addCause(createWarning(id + childId));
    issue.addCause(createInfo(id + childId));
    return issue;
  }

  function createNestedContentError(
    id: string,
    childId: string,
    grandChildId: string
  ) {
    const issue = new ValidationIssue(
      `EXAMPLE_CONTENT_ERROR_${id}`,
      "example/content/" + childId,
      `Example Content Error ${id}`,
      ValidationIssueSeverity.ERROR
    );
    issue.addCause(createContentError(id, childId + grandChildId));
    issue.addCause(createContentWarning(id, childId + grandChildId));
    issue.addCause(createError(id + childId));
    issue.addCause(createWarning(id + childId));
    issue.addCause(createInfo(id + childId));
    return issue;
  }

  const result = ValidationResult.create();

  result.add(createError("A"));
  result.add(createWarning("A"));
  result.add(createInfo("A"));

  result.add(createContentWarning("B", "0"));
  result.add(createContentWarning("B", "1"));

  result.add(createError("C"));
  result.add(createWarning("C"));
  result.add(createInfo("C"));

  result.add(createContentError("D", "0"));
  result.add(createContentError("D", "1"));

  result.add(createNestedContentError("E", "0", "x"));
  return result;
}

// A function that demonstrates the basic validation
// result filtering functionality
function validationResultFilterDemo() {
  const result = createDemoResult();

  console.log("Initial:");
  console.log(ValidationResults.createSimpleResultString(result));

  // Create some shortcuts for this demo:
  const byIncludedSeverities = ValidationIssueFilters.byIncludedSeverities;
  const byExcludedTypes = ValidationIssueFilters.byExcludedTypes;
  const ERROR = ValidationIssueSeverity.ERROR;
  const INFO = ValidationIssueSeverity.INFO;

  // Demonstrate basic filtering:
  console.log("Filtered by severities and types");
  console.log(" - include severities ERROR and INFO");
  console.log(" - exclude types EXAMPLE_ERROR_A and EXAMPLE_INFO_C");
  const filtered = result
    .filter(byIncludedSeverities(ERROR, INFO))
    .filter(byExcludedTypes("EXAMPLE_ERROR_A", "EXAMPLE_INFO_C"));
  console.log(ValidationResults.createSimpleResultString(filtered));

  // Demonstrate complex filtering:
  // Defines a filter that filters out all issues that are the causes
  // of issues with the type 'EXAMPLE_CONTENT...' (warning, info, or error)
  // and the actual issue is a 'EXAMPLE_WARNING...'
  console.log("Filtered by complex, custom filter:");
  console.log("(This filter is omitting, for example, issues like");
  console.log("[...] -> EXAMPLE_CONTENT_ERROR_E -> EXAMPLE_WARNING_E0x");
  const complexFilter = (issuesStack: ValidationIssue[]) => {
    if (issuesStack.length > 1) {
      const issue0 = issuesStack[issuesStack.length - 2];
      const issue1 = issuesStack[issuesStack.length - 1];
      if (
        issue0.type.startsWith("EXAMPLE_CONTENT") &&
        issue1.type.startsWith("EXAMPLE_WARNING")
      ) {
        return false;
      }
    }
    return true;
  };
  const filteredComplex = result.filter(complexFilter);
  console.log(ValidationResults.createSimpleResultString(filteredComplex));
}

function validationResultSerializationDemo() {
  const result = createDemoResult();

  const serializedJsonString = result.serialize();
  console.log("Serialized into a JSON string:");
  console.log(serializedJsonString);

  const deserializedResult = ValidationResult.deserialize(serializedJsonString);
  console.log("Deserialized from JSON string (simple representation):");
  console.log(ValidationResults.createSimpleResultString(deserializedResult));
}

validationResultFilterDemo();
validationResultSerializationDemo();


================================================
FILE: etc/3d-tiles-validator.api.md
================================================
## API Report File for "3d-tiles-validator"

> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).

```ts

/// <reference types="node" />

import { ResourceResolver } from '3d-tiles-tools';
import { Schema } from '3d-tiles-tools';
import { TileImplicitTiling } from '3d-tiles-tools';
import { Tileset } from '3d-tiles-tools';

// @beta
export class ValidationIssue {
    // @internal
    constructor(type: string, path: string, message: string, severity: ValidationIssueSeverity);
    // @internal
    addCause(cause: ValidationIssue): void;
    get causes(): readonly ValidationIssue[];
    static deserialize(jsonString: string): ValidationIssue;
    static fromJson(object: any): ValidationIssue;
    get message(): string;
    get path(): string;
    // @internal
    serialize(): string;
    get severity(): ValidationIssueSeverity;
    // @internal
    toJson(): any;
    get type(): string;
}

// @beta
export type ValidationIssueFilter = (issuesStack: ValidationIssue[]) => boolean;

// @beta
export class ValidationIssueFilters {
    static byExcludedTypes(...excludedTypes: string[]): ValidationIssueFilter;
    static byIncludedSeverities(...includedSeverities: ValidationIssueSeverity[]): ValidationIssueFilter;
}

// @beta
export enum ValidationIssueSeverity {
    ERROR = "ERROR",
    INFO = "INFO",
    WARNING = "WARNING"
}

// @beta
export class ValidationOptions {
    constructor();
    get contentValidationIssueSeverity(): ValidationIssueSeverity;
    set contentValidationIssueSeverity(value: ValidationIssueSeverity);
    get excludeContentTypes(): string[] | undefined;
    set excludeContentTypes(value: string[] | undefined);
    static fromJson(json: any): ValidationOptions;
    get includeContentTypes(): string[] | undefined;
    set includeContentTypes(value: string[] | undefined);
    get semanticSchemaFileNames(): string[] | undefined;
    set semanticSchemaFileNames(value: string[] | undefined);
    get validateContentData(): boolean;
    set validateContentData(value: boolean);
}

// @beta
export class ValidationResult {
    // @internal
    add(issue: ValidationIssue): void;
    // @internal
    static create(): ValidationResult;
    static deserialize(jsonString: string): ValidationResult;
    filter(includePredicate: ValidationIssueFilter): ValidationResult;
    static fromJson(object: any): ValidationResult;
    get(index: number): ValidationIssue;
    get issues(): readonly ValidationIssue[];
    get length(): number;
    // @internal
    get numErrors(): number;
    // @internal
    get numInfos(): number;
    // @internal
    get numWarnings(): number;
    serialize(): string;
    // @internal
    toJson(): any;
}

// @beta
export class Validators {
    // @internal
    static createContentValidationInfo(message: string): Validator<Buffer>;
    // Warning: (ae-forgotten-export) The symbol "SchemaValidator" needs to be exported by the entry point index.d.ts
    //
    // @internal
    static createDefaultSchemaValidator(): SchemaValidator;
    // Warning: (ae-forgotten-export) The symbol "ValidatedElement" needs to be exported by the entry point index.d.ts
    // Warning: (ae-forgotten-export) The symbol "SubtreeValidator" needs to be exported by the entry point index.d.ts
    //
    // @internal
    static createDefaultSubtreeValidator(uri: string, schemaState: ValidatedElement<Schema>, implicitTiling: TileImplicitTiling | undefined): SubtreeValidator;
    // Warning: (ae-forgotten-export) The symbol "TilesetValidator" needs to be exported by the entry point index.d.ts
    //
    // @internal
    static createDefaultTilesetValidator(): TilesetValidator;
    // @internal
    static createEmptyValidator<T>(): Validator<T>;
    // Warning: (ae-forgotten-export) The symbol "Validator" needs to be exported by the entry point index.d.ts
    //
    // @internal
    static parseFromBuffer<T>(delegate: Validator<T>): Validator<Buffer>;
    // @internal
    static validateSchemaFile(filePath: string): Promise<ValidationResult>;
    // @internal
    static validateSubtreeFile(filePath: string, schemaState: ValidatedElement<Schema>, implicitTiling: TileImplicitTiling | undefined): Promise<ValidationResult>;
    static validateTileContentFile(filePath: string, validationOptions?: ValidationOptions): Promise<ValidationResult>;
    static validateTilesetFile(filePath: string, validationOptions?: ValidationOptions): Promise<ValidationResult>;
}

// (No @packageDocumentation comment for this package)

```


================================================
FILE: generateThirdParty.js
================================================
"use strict";

const fs = require("fs");
const path = require("path");

function defaultValue(a, b) {
  if (a !== undefined && a !== null) {
    return a;
  }
  return b;
}
function getLicenseDataFromPackage(packageName, override) {
  override = defaultValue(override, {});
  const packagePath = path.join("node_modules", packageName, "package.json");

  if (!fs.existsSync(packagePath)) {
    throw new Error(`Unable to find ${packageName} license information`);
  }

  const contents = fs.readFileSync(packagePath);
  const packageJson = JSON.parse(contents);

  let licenseField = override.license;

  if (!licenseField) {
    licenseField = [packageJson.license];
  }

  if (!licenseField && packageJson.licenses) {
    licenseField = packageJson.licenses;
  }

  if (!licenseField) {
    console.log(`No license found for ${packageName}`);
    licenseField = ["NONE"];
  }

  let version = packageJson.version;
  if (!packageJson.version) {
    console.log(`No version information found for ${packageName}`);
    version = "NONE";
  }

  return {
    name: packageName,
    license: licenseField,
    version: version,
    url: `https://www.npmjs.com/package/${packageName}`,
    notes: override.notes,
  };
}

function readThirdPartyExtraJson() {
  const path = "ThirdParty.extra.json";
  if (fs.existsSync(path)) {
    const contents = fs.readFileSync(path);
    return JSON.parse(contents);
  }
  return [];
}

async function generateThirdParty() {
  const packageJson = JSON.parse(fs.readFileSync("package.json"));
  const thirdPartyExtraJson = readThirdPartyExtraJson();

  const thirdPartyJson = [];

  const dependencies = packageJson.dependencies;
  for (const packageName in dependencies) {
    if (dependencies.hasOwnProperty(packageName)) {
      const override = thirdPartyExtraJson.find(
        (entry) => entry.name === packageName
      );
      thirdPartyJson.push(getLicenseDataFromPackage(packageName, override));
    }
  }

  thirdPartyJson.sort(function (a, b) {
    const nameA = a.name.toLowerCase();
    const nameB = b.name.toLowerCase();
    if (nameA < nameB) {
      return -1;
    }
    if (nameA > nameB) {
      return 1;
    }
    return 0;
  });

  fs.writeFileSync("ThirdParty.json", JSON.stringify(thirdPartyJson, null, 2));
}

generateThirdParty();


================================================
FILE: package.json
================================================
{
  "name": "3d-tiles-validator",
  "version": "0.6.1",
  "license": "Apache-2.0",
  "description": "Tools for validating 3D Tiles tilesets.",
  "keywords": [
    "3D Tiles"
  ],
  "homepage": "https://github.com/CesiumGS/3d-tiles-validator/",
  "repository": {
    "type": "git",
    "url": "https://github.com/CesiumGS/3d-tiles-validator.git"
  },
  "bugs": {
    "url": "https://github.com/CesiumGS/3d-tiles-validator/issues"
  },
  "engines": {
    "node": ">=18.0.0"
  },
  "main": "./build/index.js",
  "types": "./build/index.d.ts",
  "bin": {
    "3d-tiles-validator": "./build/main"
  },
  "dependencies": {
    "@gltf-transform/core": "^3.2.1",
    "@gltf-transform/extensions": "^3.2.1",
    "@gltf-transform/functions": "^3.2.1",
    "3d-tiles-tools": "0.5.0",
    "cesium": "^1.97.0",
    "gltf-validator": "^2.0.0-dev.3.9",
    "minimatch": "^5.1.0",
    "node-stream-zip": "^1.10.1",
    "sharp": "^0.32.1",
    "yargs": "^17.5.1"
  },
  "devDependencies": {
    "@microsoft/api-documenter": "^7.19.24",
    "@microsoft/api-extractor": "^7.33.6",
    "@types/jasmine": "^4.0.3",
    "@types/minimatch": "^5.1.2",
    "@typescript-eslint/eslint-plugin": "^5.38.0",
    "@typescript-eslint/parser": "^5.38.0",
    "copyfiles": "^2.4.1",
    "del-cli": "^5.0.0",
    "eslint": "^8.23.1",
    "eslint-config-cesium": "^9.0.0",
    "eslint-config-prettier": "^8.3.0",
    "eslint-plugin-node": "^11.1.0",
    "eslint-plugin-tsdoc": "^0.2.17",
    "jasmine": "^4.3.0",
    "mkdirp": "^1.0.4",
    "nyc": "^15.1.0",
    "prettier": "2.7.1",
    "ts-node": "^10.9.1",
    "typescript": "^4.8.3"
  },
  "scripts": {
    "about:start": "echo 'Start the validator, as a TypeScript command line application'",
    "about:eslint": "echo 'Perform linting of the source code. This may modify the source files.'",
    "about:build": "echo 'Run the TypeScript compiler to generate the build output.'",
    "about:test": "echo 'Execute the unit tests'",
    "about:coverage": "echo 'Compute the test coverage'",
    "about:prettier-check": "echo 'Check the formatting of the source code (without fixing formatting errors).'",
    "about:prettier": "echo 'Ensure the right formatting of the source code, automatically fixing formatting errors.'",
    "about:generate-third-party": "echo 'Update the ThirdParty.json file with the most recent dependency versions'",
    "about:docs-prepare-directory": "echo 'Prepare the output directory for the API definition file'",
    "about:docs-extract-api": "echo 'Extract the API definition file from the current build output.'",
    "about:docs-generate-markdown": "echo 'Generate the API documentation based on the API definition file'",
    "about:docs-generate": "echo 'Generate the API documentation based on the current build output'",
    "about:docs": "echo 'Perform a build and generate the API documentation based on the build output'",
    "about:package-clean": "echo 'Delete the contents of the 'build' output folder'",
    "about:package-prepare": "echo 'Prepare a package: Linting, formatting, build, test, documentation, and third-party information updates'",
    "about:package-copy": "echo 'Copy the entry point for the application from the bin to the build directory'",
    "about:package": "echo 'Prepare a package that can then be published on NPM'",
    "start": "npx ts-node src/main.ts",
    "eslint": "eslint \"./**/*.ts\" --cache --max-warnings=0",
    "build": "npx tsc",
    "test": "ts-node node_modules/jasmine/bin/jasmine --config=specs/jasmine.json",
    "coverage": "nyc npm run test",
    "prettier-check": "prettier --check \"**/*\"",
    "prettier": "prettier --write \"**/*\"",
    "generate-third-party": "node generateThirdParty.js",
    "docs-prepare-directory": "mkdirp etc",
    "docs-extract-api": "api-extractor run --config api-extractor.jsonc --local --verbose",
    "docs-generate-markdown": "api-documenter markdown -i build/api-extractor -o build/docs",
    "docs-generate": "npm run docs-prepare-directory && npm run docs-extract-api && npm run docs-generate-markdown",
    "docs": "npm run build && npm run docs-generate",
    "package-clean": "del-cli ./build/**",
    "package-prepare": "npm run eslint && npm run prettier-check && npm run build && npm run test && npm run docs-generate && npm run generate-third-party",
    "package-copy": "npx copyfiles --flat bin/main build",
    "package": "npm run package-clean && npm run package-prepare && npm run package-copy && npm pack"
  }
}


================================================
FILE: specs/BasicValidatorSpec.ts
================================================
import { BasicValidator } from "../src/validation/BasicValidator";
import { ValidationContext } from "../src/validation/ValidationContext";

import { ResourceResolvers } from "3d-tiles-tools";

function validateNumberRange(
  value: number,
  min: number | undefined,
  minInclusive: boolean,
  max: number | undefined,
  maxInclusive: boolean
): boolean {
  const resourceResolver = ResourceResolvers.createFileResourceResolver("");
  const context = new ValidationContext(".", resourceResolver);
  const result = BasicValidator.validateNumberRange(
    "path",
    "name",
    value,
    min,
    minInclusive,
    max,
    maxInclusive,
    context
  );
  //if (context.getResult().length > 0) {
  //  console.log(context.getResult().get(0).message);
  //}
  return result;
}

describe("BasicValidator", function () {
  // Closed range, []
  it("validateNumberRange detects that -5 is NOT in [0,10]", function () {
    const result = validateNumberRange(-5, 0, true, 10, true);
    expect(result).toBeFalse();
  });
  it("validateNumberRange detects that 0 is in [0,10]", function () {
    const result = validateNumberRange(0, 0, true, 10, true);
    expect(result).toBeTrue();
  });
  it("validateNumberRange detects that 5 is in [0,10]", function () {
    const result = validateNumberRange(5, 0, true, 10, true);
    expect(result).toBeTrue();
  });
  it("validateNumberRange detects that 10 is in [0,10]", function () {
    const result = validateNumberRange(10, 0, true, 10, true);
    expect(result).toBeTrue();
  });
  it("validateNumberRange detects that 15 is NOT in [0,10]", function () {
    const result = validateNumberRange(15, 0, true, 10, true);
    expect(result).toBeFalse();
  });

  // Closed range, (]
  it("validateNumberRange detects that -5 is NOT in (0,10]", function () {
    const result = validateNumberRange(-5, 0, false, 10, true);
    expect(result).toBeFalse();
  });
  it("validateNumberRange detects that 0 is NOT in (0,10]", function () {
    const result = validateNumberRange(0, 0, false, 10, true);
    expect(result).toBeFalse();
  });
  it("validateNumberRange detects that 5 is in (0,10]", function () {
    const result = validateNumberRange(5, 0, false, 10, true);
    expect(result).toBeTrue();
  });
  it("validateNumberRange detects that 10 is in (0,10]", function () {
    const result = validateNumberRange(10, 0, false, 10, true);
    expect(result).toBeTrue();
  });
  it("validateNumberRange detects that 15 is NOT in (0,10]", function () {
    const result = validateNumberRange(15, 0, false, 10, true);
    expect(result).toBeFalse();
  });

  // Closed range, [)
  it("validateNumberRange detects that -5 is NOT in [0,10)", function () {
    const result = validateNumberRange(-5, 0, true, 10, false);
    expect(result).toBeFalse();
  });
  it("validateNumberRange detects that 0 is in [0,10)", function () {
    const result = validateNumberRange(0, 0, true, 10, false);
    expect(result).toBeTrue();
  });
  it("validateNumberRange detects that 5 is in [0,10)", function () {
    const result = validateNumberRange(5, 0, true, 10, false);
    expect(result).toBeTrue();
  });
  it("validateNumberRange detects that 10 is NOT in [0,10)", function () {
    const result = validateNumberRange(10, 0, true, 10, false);
    expect(result).toBeFalse();
  });
  it("validateNumberRange detects that 15 is NOT in [0,10)", function () {
    const result = validateNumberRange(15, 0, true, 10, false);
    expect(result).toBeFalse();
  });

  // Closed range, ()
  it("validateNumberRange detects that -5 is NOT in (0,10)", function () {
    const result = validateNumberRange(-5, 0, false, 10, false);
    expect(result).toBeFalse();
  });
  it("validateNumberRange detects that 0 is NOT in (0,10)", function () {
    const result = validateNumberRange(0, 0, false, 10, false);
    expect(result).toBeFalse();
  });
  it("validateNumberRange detects that 5 is in (0,10)", function () {
    const result = validateNumberRange(5, 0, false, 10, false);
    expect(result).toBeTrue();
  });
  it("validateNumberRange detects that 10 is NOT in (0,10)", function () {
    const result = validateNumberRange(10, 0, false, 10, false);
    expect(result).toBeFalse();
  });
  it("validateNumberRange detects that 15 is NOT in (0,10)", function () {
    const result = validateNumberRange(15, 0, false, 10, false);
    expect(result).toBeFalse();
  });

  // Lower bound [
  it("validateNumberRange detects that -5 is NOT in [5,...", function () {
    const result = validateNumberRange(-5, 0, true, undefined, true);
    expect(result).toBeFalse();
  });
  it("validateNumberRange detects that 0 is in [0,...", function () {
    const result = validateNumberRange(0, 0, true, undefined, false);
    expect(result).toBeTrue();
  });
  it("validateNumberRange detects that 5 is in [0,...", function () {
    const result = validateNumberRange(5, 0, true, 10, false);
    expect(result).toBeTrue();
  });

  // Lower bound (
  it("validateNumberRange detects that -5 is NOT in (5,...", function () {
    const result = validateNumberRange(-5, 0, false, undefined, true);
    expect(result).toBeFalse();
  });
  it("validateNumberRange detects that 0 is NOT in (0,...", function () {
    const result = validateNumberRange(0, 0, false, undefined, false);
    expect(result).toBeFalse();
  });
  it("validateNumberRange detects that 5 is in (0,...", function () {
    const result = validateNumberRange(5, 0, false, 10, false);
    expect(result).toBeTrue();
  });

  // Upper bound ]
  it("validateNumberRange detects that 5 is in ...,10]", function () {
    const result = validateNumberRange(5, undefined, true, 10, true);
    expect(result).toBeTrue();
  });
  it("validateNumberRange detects that 10 is in ...,10]", function () {
    const result = validateNumberRange(10, undefined, true, 10, true);
    expect(result).toBeTrue();
  });
  it("validateNumberRange detects that 15 is NOT in ...,10]", function () {
    const result = validateNumberRange(15, undefined, true, 10, true);
    expect(result).toBeFalse();
  });

  // Upper bound )
  it("validateNumberRange detects that 5 is in ...,10)", function () {
    const result = validateNumberRange(5, undefined, true, 10, false);
    expect(result).toBeTrue();
  });
  it("validateNumberRange detects that 10 is NOT in ...,10)", function () {
    const result = validateNumberRange(10, undefined, true, 10, false);
    expect(result).toBeFalse();
  });
  it("validateNumberRange detects that 15 is NOT in ...,10)", function () {
    const result = validateNumberRange(15, undefined, true, 10, false);
    expect(result).toBeFalse();
  });
});


================================================
FILE: specs/BinaryBufferStructureSpec.ts
================================================
import fs from "fs";

import { ResourceResolvers } from "3d-tiles-tools";

import { BinaryBufferStructure } from "3d-tiles-tools";

import { BinaryBufferStructureValidator } from "../src/validation/BinaryBufferStructureValidator";
import { ValidationContext } from "../src/validation/ValidationContext";

/**
 * Only for internal use and basic tests:
 *
 * Reads a JSON file, parses it, and returns the result.
 * If the file cannot be read or parsed, then an error
 * message will be printed and `undefined` is returned.
 *
 * @param filePath - The path to the file
 * @returns A promise that resolves with the result or `undefined`
 */
async function readJsonUnchecked(filePath: string): Promise<any> {
  try {
    const data = fs.readFileSync(filePath);
    if (!data) {
      console.error("Could not read " + filePath);
      return undefined;
    }
    const jsonString = data.toString();
    const result = JSON.parse(jsonString);
    return result;
  } catch (error) {
    console.error("Could not parse JSON", error);
    return undefined;
  }
}

function performTestValidation(
  binaryBufferStructure: BinaryBufferStructure,
  context: ValidationContext
): void {
  const path = "test";
  const firstBufferUriIsRequired = true;
  if (
    BinaryBufferStructureValidator.validateBinaryBufferStructure(
      path,
      binaryBufferStructure.buffers,
      binaryBufferStructure.bufferViews,
      firstBufferUriIsRequired,
      context
    )
  ) {
    BinaryBufferStructureValidator.validateBinaryBufferStructureConsistency(
      path,
      binaryBufferStructure,
      context
    );
  }
}

describe("3d-tiles-tools", function () {
  let context: ValidationContext;

  beforeEach(async function () {
    const directory = "specs/data/buffers/";
    const resourceResolver =
      ResourceResolvers.createFileResourceResolver(directory);
    context = new ValidationContext(directory, resourceResolver);
  });

  it("detects issues in buffersElementByteLengthInvalidType", async function () {
    const binaryBufferStructure = await readJsonUnchecked(
      "specs/data/buffers/buffersElementByteLengthInvalidType.json"
    );
    performTestValidation(binaryBufferStructure, context);
    const result = context.getResult();
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in buffersElementByteLengthInvalidValueA", async function () {
    const binaryBufferStructure = await readJsonUnchecked(
      "specs/data/buffers/buffersElementByteLengthInvalidValueA.json"
    );
    performTestValidation(binaryBufferStructure, context);
    const result = context.getResult();
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in buffersElementByteLengthInvalidValueB", async function () {
    const binaryBufferStructure = await readJsonUnchecked(
      "specs/data/buffers/buffersElementByteLengthInvalidValueB.json"
    );
    performTestValidation(binaryBufferStructure, context);
    const result = context.getResult();
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("VALUE_NOT_IN_RANGE");
  });

  it("detects issues in buffersElementByteLengthMissing", async function () {
    const binaryBufferStructure = await readJsonUnchecked(
      "specs/data/buffers/buffersElementByteLengthMissing.json"
    );
    performTestValidation(binaryBufferStructure, context);
    const result = context.getResult();
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("PROPERTY_MISSING");
  });

  it("detects issues in buffersElementInvalidType", async function () {
    const binaryBufferStructure = await readJsonUnchecked(
      "specs/data/buffers/buffersElementInvalidType.json"
    );
    performTestValidation(binaryBufferStructure, context);
    const result = context.getResult();
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("ARRAY_ELEMENT_TYPE_MISMATCH");
  });

  it("detects issues in buffersElementNameInvalidLength", async function () {
    const binaryBufferStructure = await readJsonUnchecked(
      "specs/data/buffers/buffersElementNameInvalidLength.json"
    );
    performTestValidation(binaryBufferStructure, context);
    const result = context.getResult();
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("STRING_LENGTH_MISMATCH");
  });

  it("detects issues in buffersElementNameInvalidType", async function () {
    const binaryBufferStructure = await readJsonUnchecked(
      "specs/data/buffers/buffersElementNameInvalidType.json"
    );
    performTestValidation(binaryBufferStructure, context);
    const result = context.getResult();
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in buffersElementUriInvalidType", async function () {
    const binaryBufferStructure = await readJsonUnchecked(
      "specs/data/buffers/buffersElementUriInvalidType.json"
    );
    performTestValidation(binaryBufferStructure, context);
    const result = context.getResult();
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in buffersElementUriMissing", async function () {
    const binaryBufferStructure = await readJsonUnchecked(
      "specs/data/buffers/buffersElementUriMissing.json"
    );
    performTestValidation(binaryBufferStructure, context);
    const result = context.getResult();
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("REQUIRED_VALUE_NOT_FOUND");
  });

  it("detects issues in buffersInvalidLength", async function () {
    const binaryBufferStructure = await readJsonUnchecked(
      "specs/data/buffers/buffersInvalidLength.json"
    );
    performTestValidation(binaryBufferStructure, context);
    const result = context.getResult();
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("ARRAY_LENGTH_MISMATCH");
  });

  it("detects issues in buffersInvalidType", async function () {
    const binaryBufferStructure = await readJsonUnchecked(
      "specs/data/buffers/buffersInvalidType.json"
    );
    performTestValidation(binaryBufferStructure, context);
    const result = context.getResult();
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in bufferViewsElementBufferInvalidType", async function () {
    const binaryBufferStructure = await readJsonUnchecked(
      "specs/data/buffers/bufferViewsElementBufferInvalidType.json"
    );
    performTestValidation(binaryBufferStructure, context);
    const result = context.getResult();
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in bufferViewsElementBufferInvalidValueA", async function () {
    const binaryBufferStructure = await readJsonUnchecked(
      "specs/data/buffers/bufferViewsElementBufferInvalidValueA.json"
    );
    performTestValidation(binaryBufferStructure, context);
    const result = context.getResult();
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in bufferViewsElementBufferInvalidValueB", async function () {
    const binaryBufferStructure = await readJsonUnchecked(
      "specs/data/buffers/bufferViewsElementBufferInvalidValueB.json"
    );
    performTestValidation(binaryBufferStructure, context);
    const result = context.getResult();
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("VALUE_NOT_IN_RANGE");
  });

  it("detects issues in bufferViewsElementBufferInvalidValueC", async function () {
    const binaryBufferStructure = await readJsonUnchecked(
      "specs/data/buffers/bufferViewsElementBufferInvalidValueC.json"
    );
    performTestValidation(binaryBufferStructure, context);
    const result = context.getResult();
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("VALUE_NOT_IN_RANGE");
  });

  it("detects issues in bufferViewsElementByteLengthInvalidType", async function () {
    const binaryBufferStructure = await readJsonUnchecked(
      "specs/data/buffers/bufferViewsElementByteLengthInvalidType.json"
    );
    performTestValidation(binaryBufferStructure, context);
    const result = context.getResult();
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in bufferViewsElementByteLengthInvalidValueA", async function () {
    const binaryBufferStructure = await readJsonUnchecked(
      "specs/data/buffers/bufferViewsElementByteLengthInvalidValueA.json"
    );
    performTestValidation(binaryBufferStructure, context);
    const result = context.getResult();
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in bufferViewsElementByteLengthInvalidValueB", async function () {
    const binaryBufferStructure = await readJsonUnchecked(
      "specs/data/buffers/bufferViewsElementByteLengthInvalidValueB.json"
    );
    performTestValidation(binaryBufferStructure, context);
    const result = context.getResult();
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("VALUE_NOT_IN_RANGE");
  });

  it("detects issues in bufferViewsElementByteOffsetInvalidType", async function () {
    const binaryBufferStructure = await readJsonUnchecked(
      "specs/data/buffers/bufferViewsElementByteOffsetInvalidType.json"
    );
    performTestValidation(binaryBufferStructure, context);
    const result = context.getResult();
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in bufferViewsElementByteOffsetInvalidValueA", async function () {
    const binaryBufferStructure = await readJsonUnchecked(
      "specs/data/buffers/bufferViewsElementByteOffsetInvalidValueA.json"
    );
    performTestValidation(binaryBufferStructure, context);
    const result = context.getResult();
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in bufferViewsElementByteOffsetInvalidValueB", async function () {
    const binaryBufferStructure = await readJsonUnchecked(
      "specs/data/buffers/bufferViewsElementByteOffsetInvalidValueB.json"
    );
    performTestValidation(binaryBufferStructure, context);
    const result = context.getResult();
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("VALUE_NOT_IN_RANGE");
  });

  it("detects issues in bufferViewsElementExceedsBufferLength", async function () {
    const binaryBufferStructure = await readJsonUnchecked(
      "specs/data/buffers/bufferViewsElementExceedsBufferLength.json"
    );
    performTestValidation(binaryBufferStructure, context);
    const result = context.getResult();
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("BUFFERS_INCONSISTENT");
  });

  it("detects issues in bufferViewsElementInvalidType", async function () {
    const binaryBufferStructure = await readJsonUnchecked(
      "specs/data/buffers/bufferViewsElementInvalidType.json"
    );
    performTestValidation(binaryBufferStructure, context);
    const result = context.getResult();
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("ARRAY_ELEMENT_TYPE_MISMATCH");
  });

  it("detects issues in bufferViewsInvalidLength", async function () {
    const binaryBufferStructure = await readJsonUnchecked(
      "specs/data/buffers/bufferViewsInvalidLength.json"
    );
    performTestValidation(binaryBufferStructure, context);
    const result = context.getResult();
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("ARRAY_LENGTH_MISMATCH");
  });

  it("detects issues in bufferViewsInvalidType", async function () {
    const binaryBufferStructure = await readJsonUnchecked(
      "specs/data/buffers/bufferViewsInvalidType.json"
    );
    performTestValidation(binaryBufferStructure, context);
    const result = context.getResult();
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });
});


================================================
FILE: specs/ExternalTilesetExtensionsValidationSpec.ts
================================================
import { Validators } from "../src/validation/Validators";

// Note: These test cases use a dummy extension called
// VENDOR_example_extension
// So they will always create at least a WARNING about
// this not being supported

describe("External tileset extensions validation", function () {
  it("detects no errors in declaredInBothContainedInExternal", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/externalTilesetExtensions/declaredInBothContainedInExternal/tileset.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("EXTERNAL_TILESET_VALIDATION_WARNING");
    expect(result.get(0).causes[0].type).toEqual("EXTENSION_NOT_SUPPORTED");
  });

  it("detects no errors (but one warning) in declaredInBothContainedInTileset", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/externalTilesetExtensions/declaredInBothContainedInTileset/tileset.json"
    );
    expect(result.length).toEqual(2);
    expect(result.get(0).type).toEqual("EXTENSION_NOT_SUPPORTED");
    expect(result.get(1).type).toEqual("EXTERNAL_TILESET_VALIDATION_WARNING");
    expect(result.get(1).causes[0].type).toEqual(
      "EXTENSION_USED_BUT_NOT_FOUND"
    );
  });

  it("detects an error in declaredInExternalContainedInExternal", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/externalTilesetExtensions/declaredInExternalContainedInExternal/tileset.json"
    );
    expect(result.length).toEqual(2);
    expect(result.get(0).type).toEqual("EXTERNAL_TILESET_VALIDATION_WARNING");
    expect(result.get(0).causes[0].type).toEqual("EXTENSION_NOT_SUPPORTED");
    expect(result.get(1).type).toEqual("EXTENSION_FOUND_BUT_NOT_USED");
  });

  it("detects an error and a warning in declaredInExternalContainedInTileset", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/externalTilesetExtensions/declaredInExternalContainedInTileset/tileset.json"
    );
    expect(result.length).toEqual(3);
    expect(result.get(0).type).toEqual("EXTENSION_NOT_SUPPORTED");
    expect(result.get(1).type).toEqual("EXTERNAL_TILESET_VALIDATION_WARNING");
    expect(result.get(1).causes[0].type).toEqual(
      "EXTENSION_USED_BUT_NOT_FOUND"
    );
    expect(result.get(2).type).toEqual("EXTENSION_FOUND_BUT_NOT_USED");
  });

  it("detects two errors in declaredInNoneContainedInExternal", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/externalTilesetExtensions/declaredInNoneContainedInExternal/tileset.json"
    );
    expect(result.length).toEqual(2);
    expect(result.get(0).type).toEqual("EXTERNAL_TILESET_VALIDATION_ERROR");
    expect(result.get(1).type).toEqual("EXTENSION_FOUND_BUT_NOT_USED");
  });

  it("detects one error in declaredInTilesetContainedInExternal", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/externalTilesetExtensions/declaredInTilesetContainedInExternal/tileset.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("EXTERNAL_TILESET_VALIDATION_ERROR");
    expect(result.get(0).causes[1].type).toEqual(
      "EXTENSION_FOUND_BUT_NOT_USED"
    );
  });

  it("detects no errors in declaredInTilesetContainedInTileset", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/externalTilesetExtensions/declaredInTilesetContainedInTileset/tileset.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("EXTENSION_NOT_SUPPORTED");
  });
});


================================================
FILE: specs/MetadataSchemaValidationSpec.ts
================================================
import { Validators } from "../src/validation/Validators";

describe("Metadata schema validation", function () {
  it("detects issues in metadataClassDescriptionInvalidType", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassDescriptionInvalidType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in metadataClassesInvalidType", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassesInvalidType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in metadataClassesNameInvalid", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassesNameInvalid.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("STRING_PATTERN_MISMATCH");
  });

  it("detects issues in metadataClassNameInvalidType", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassNameInvalidType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in metadataClassPropertiesDuplicateSemantics", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertiesDuplicateSemantics.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("CLASS_PROPERTIES_DUPLICATE_SEMANTIC");
  });

  it("detects issues in metadataClassPropertiesEmpty", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertiesEmpty.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("NUMBER_OF_PROPERTIES_MISMATCH");
  });

  it("detects issues in metadataClassPropertiesNameInvalid", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertiesNameInvalid.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("STRING_PATTERN_MISMATCH");
  });

  it("detects issues in metadataClassPropertyArrayInvalidType", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertyArrayInvalidType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in metadataClassPropertyComponentTypeForTypeWithoutComponents", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertyComponentTypeForTypeWithoutComponents.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual(
      "CLASS_PROPERTY_COMPONENT_TYPE_FOR_NON_NUMERIC_TYPE"
    );
  });

  it("detects issues in metadataClassPropertyComponentTypeMissing", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertyComponentTypeMissing.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("CLASS_PROPERTY_COMPONENT_TYPE_MISSING");
  });

  it("detects issues in metadataClassPropertyComponentTypeInvalidType", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertyComponentTypeInvalidType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in metadataClassPropertyComponentTypeInvalidValue", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertyComponentTypeInvalidValue.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("VALUE_NOT_IN_LIST");
  });

  it("detects issues in metadataClassPropertyCountInvalidType", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertyCountInvalidType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in metadataClassPropertyCountInvalidValue", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertyCountInvalidValue.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("VALUE_NOT_IN_RANGE");
  });

  it("detects issues in metadataClassPropertyCountWithoutArray", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertyCountWithoutArray.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("CLASS_PROPERTY_COUNT_FOR_NON_ARRAY");
  });

  it("detects issues in metadataClassPropertyDefaultWithRequired", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertyDefaultWithRequired.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("CLASS_PROPERTY_INCONSISTENT");
  });

  it("detects issues in metadataClassPropertyDescriptionInvalidType", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertyDescriptionInvalidType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in metadataClassPropertyEnumTypeForNonEnumType", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertyEnumTypeForNonEnumType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual(
      "CLASS_PROPERTY_ENUMTYPE_WITH_NON_ENUM_TYPE"
    );
  });

  it("detects issues in metadataClassPropertyEnumTypeInvalidType", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertyEnumTypeInvalidType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in metadataClassPropertyEnumTypeMissingForEnumType", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertyEnumTypeMissingForEnumType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual(
      "CLASS_PROPERTY_ENUM_TYPE_WITHOUT_ENUMTYPE"
    );
  });

  it("detects issues in metadataClassPropertyEnumTypeNotFound", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertyEnumTypeNotFound.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("CLASS_PROPERTY_ENUMTYPE_NOT_FOUND");
  });

  it("detects issues in metadataClassPropertyEnumTypeWithoutEnums", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertyEnumTypeWithoutEnums.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("CLASS_PROPERTY_ENUMTYPE_NOT_FOUND");
  });

  it("detects issues in metadataClassPropertyMaxForNonNumericType", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertyMaxForNonNumericType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("METADATA_MIN_MAX_FOR_NON_NUMERIC_TYPE");
  });

  it("detects issues in metadataClassPropertyMinForNonNumericType", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertyMinForNonNumericType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("METADATA_MIN_MAX_FOR_NON_NUMERIC_TYPE");
  });

  it("detects issues in metadataClassPropertyMinForVariableLengthArray", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertyMinForVariableLengthArray.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual(
      "METADATA_PROPERTY_INVALID_FOR_VARIABLE_LENGTH_ARRAY"
    );
  });

  it("detects issues in metadataClassPropertyNameInvalidType", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertyNameInvalidType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in metadataClassPropertyNoDataForBoolean", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertyNoDataForBoolean.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("CLASS_PROPERTY_INCONSISTENT");
  });

  it("detects issues in metadataClassPropertyNoDataInvalidEnumValueName", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertyNoDataInvalidEnumValueName.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual(
      "CLASS_PROPERTY_ENUM_VALUE_NAME_NOT_FOUND"
    );
  });

  it("detects issues in metadataClassPropertyNoDataInvalidEnumValueNames", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertyNoDataInvalidEnumValueNames.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual(
      "CLASS_PROPERTY_ENUM_VALUE_NAME_NOT_FOUND"
    );
  });

  it("detects issues in metadataClassPropertyNoDataTypeMismatchA", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertyNoDataTypeMismatchA.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in metadataClassPropertyNoDataTypeMismatchB", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertyNoDataTypeMismatchB.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("ARRAY_LENGTH_MISMATCH");
  });

  it("detects issues in metadataClassPropertyNoDataTypeMismatchC", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertyNoDataTypeMismatchC.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("ARRAY_ELEMENT_TYPE_MISMATCH");
  });

  it("detects issues in metadataClassPropertyNoDataWithRequired", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertyNoDataWithRequired.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("CLASS_PROPERTY_INCONSISTENT");
  });

  it("detects issues in metadataClassPropertyNormalizedForNonIntegerComponentType", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertyNormalizedForNonIntegerComponentType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual(
      "CLASS_PROPERTY_NORMALIZED_FOR_NON_NORMALIZABLE_TYPE"
    );
  });

  it("detects issues in metadataClassPropertyNormalizedForUnnormalizableType", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertyNormalizedForUnnormalizableType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual(
      "CLASS_PROPERTY_NORMALIZED_FOR_NON_NORMALIZABLE_TYPE"
    );
  });

  it("detects issues in metadataClassPropertyNormalizedInvalidType", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertyNormalizedInvalidType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in metadataClassPropertyOffsetForNonFloatingPointTypeA", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertyOffsetForNonFloatingPointTypeA.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual(
      "METADATA_OFFSET_SCALE_FOR_NON_FLOATING_POINT_TYPE"
    );
  });

  it("detects issues in metadataClassPropertyOffsetForNonFloatingPointTypeB", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertyOffsetForNonFloatingPointTypeB.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual(
      "METADATA_OFFSET_SCALE_FOR_NON_FLOATING_POINT_TYPE"
    );
  });

  it("detects issues in metadataClassPropertyOffsetForVariableLengthArray", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertyOffsetForVariableLengthArray.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual(
      "METADATA_PROPERTY_INVALID_FOR_VARIABLE_LENGTH_ARRAY"
    );
  });

  it("detects issues in metadataClassPropertyOffsetTypeMismatchA", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertyOffsetTypeMismatchA.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in metadataClassPropertyOffsetTypeMismatchB", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertyOffsetTypeMismatchB.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in metadataClassPropertyOffsetTypeMismatchC", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertyOffsetTypeMismatchC.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("ARRAY_LENGTH_MISMATCH");
  });

  it("detects issues in metadataClassPropertyOffsetTypeMismatchD", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertyOffsetTypeMismatchD.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("ARRAY_ELEMENT_TYPE_MISMATCH");
  });

  it("detects issues in metadataClassPropertyOffsetTypeMismatchE", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertyOffsetTypeMismatchE.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("ARRAY_LENGTH_MISMATCH");
  });

  it("detects issues in metadataClassPropertyOffsetTypeMismatchF", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertyOffsetTypeMismatchF.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("ARRAY_LENGTH_MISMATCH");
  });

  it("detects issues in metadataClassPropertyOffsetTypeMismatchG", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertyOffsetTypeMismatchG.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("ARRAY_LENGTH_MISMATCH");
  });

  it("detects issues in metadataClassPropertyRequiredInvalidType", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertyRequiredInvalidType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in metadataClassPropertyScaleForNonFloatingPointType", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertyScaleForNonFloatingPointType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual(
      "METADATA_OFFSET_SCALE_FOR_NON_FLOATING_POINT_TYPE"
    );
  });

  it("detects issues in metadataClassPropertyScaleForNonFloatingPointTypeB", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertyScaleForNonFloatingPointTypeB.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual(
      "METADATA_OFFSET_SCALE_FOR_NON_FLOATING_POINT_TYPE"
    );
  });

  it("detects issues in metadataClassPropertyTypeInvalidType", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertyTypeInvalidType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in metadataClassPropertyTypeInvalidValue", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertyTypeInvalidValue.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("VALUE_NOT_IN_LIST");
  });

  it("detects issues in metadataClassPropertyTypeMissing", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertyTypeMissing.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("PROPERTY_MISSING");
  });

  it("detects issues in metadataEnumDescriptionInvalidType", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataEnumDescriptionInvalidType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in metadataEnumNameInvalidType", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataEnumNameInvalidType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in metadataEnumsInvalidName", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataEnumsInvalidName.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("STRING_PATTERN_MISMATCH");
  });

  it("detects issues in metadataEnumsInvalidType", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataEnumsInvalidType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in metadataEnumValueDescriptionInvalidType", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataEnumValueDescriptionInvalidType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in metadataEnumValueNameInvalidType", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataEnumValueNameInvalidType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in metadataEnumValuesDuplicateName", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataEnumValuesDuplicateName.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("ENUM_VALUE_DUPLICATE_NAME");
  });

  it("detects issues in metadataEnumValuesDuplicateValue", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataEnumValuesDuplicateValue.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("ENUM_VALUE_DUPLICATE_VALUE");
  });

  it("detects issues in metadataEnumValuesEmpty", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataEnumValuesEmpty.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("ARRAY_LENGTH_MISMATCH");
  });

  it("detects issues in metadataEnumValuesMissing", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataEnumValuesMissing.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("PROPERTY_MISSING");
  });

  it("detects issues in metadataEnumValueTypeInvalid", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataEnumValueTypeInvalid.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("ARRAY_ELEMENT_TYPE_MISMATCH");
  });

  it("detects issues in metadataEnumValueTypeInvalidType", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataEnumValueTypeInvalidType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in metadataEnumValueTypeInvalidValue", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataEnumValueTypeInvalidValue.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("VALUE_NOT_IN_LIST");
  });

  it("detects issues in metadataEnumValueValueInvalidType", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataEnumValueValueInvalidType.json"
    );
    expect(result.length).toEqual(2);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
    expect(result.get(1).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in schemaIdInvalidType", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/schemaIdInvalidType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in schemaIdInvalidValue", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/schemaIdInvalidValue.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("STRING_PATTERN_MISMATCH");
  });

  it("detects issues in schemaIdMissing", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/schemaIdMissing.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("PROPERTY_MISSING");
  });

  it("detects no issues in validSchema", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/validSchema.json"
    );
    expect(result.length).toEqual(0);
  });

  it("detects no issues in validSchemaWithMinMax", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/validSchemaWithMinMax.json"
    );
    expect(result.length).toEqual(0);
  });

  it("detects issues in metadataClassPropertySemanticArrayMismatchA", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertySemanticArrayMismatchA.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("METADATA_SEMANTIC_INVALID");
  });

  it("detects issues in metadataClassPropertySemanticArrayMismatchB", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertySemanticArrayMismatchB.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("METADATA_SEMANTIC_INVALID");
  });

  it("detects issues in metadataClassPropertySemanticComponentTypeMismatchA", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertySemanticComponentTypeMismatchA.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("METADATA_SEMANTIC_INVALID");
  });

  it("detects issues in metadataClassPropertySemanticComponentTypeMismatchB", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertySemanticComponentTypeMismatchB.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("METADATA_SEMANTIC_INVALID");
  });

  it("detects issues in metadataClassPropertySemanticCountMismatch", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertySemanticCountMismatch.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("METADATA_SEMANTIC_INVALID");
  });

  it("detects issues in metadataClassPropertySemanticInvalidType", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertySemanticInvalidType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects no issues in metadataClassPropertySemanticGeneric", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertySemanticGeneric.json"
    );
    expect(result.length).toEqual(0);
  });

  it("detects issues in metadataClassPropertySemanticNormalizedMismatch", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertySemanticNormalizedMismatch.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("METADATA_SEMANTIC_INVALID");
  });

  it("detects issues in metadataClassPropertySemanticTypeMismatch", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertySemanticTypeMismatch.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("METADATA_SEMANTIC_INVALID");
  });

  it("detects issues in metadataClassPropertySemanticUnknown", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataClassPropertySemanticUnknown.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("METADATA_SEMANTIC_UNKNOWN");
  });

  it("detects issues in metadataEnumValueNotInValueTypeRange", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataEnumValueNotInValueTypeRange.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("VALUE_NOT_IN_RANGE");
  });

  it("detects issues in metadataEnumValueNotInDefaultValueTypeRange", async function () {
    const result = await Validators.validateSchemaFile(
      "specs/data/schemas/metadataEnumValueNotInDefaultValueTypeRange.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("VALUE_NOT_IN_RANGE");
  });
});


================================================
FILE: specs/SubtreeValidationSpec.ts
================================================
import { Schema } from "3d-tiles-tools";

import { readJsonUnchecked } from "../src/base/readJsonUnchecked";

import { Validators } from "../src/validation/Validators";
import { ValidatedElement } from "../src/validation/ValidatedElement";
import { ValidationResult } from "../src/validation/ValidationResult";

/**
 * Validate the specified subtree file from the `specs/data/subtrees`
 * directory.
 *
 * Note that in order to validate a subtree file, the validator requires
 * additional data elements. Namely, the `TileImplicitTiling` that
 * defines the structure of the subtree, and a `Schema` (if the
 * subtree contains metadata).
 *
 * This function will load this data from the additional files in
 * the `specs/data/` directory that define the same structure for
 * all subtree spec files.
 *
 * @param fileName - The subtree file name
 * @returns A promise to the `ValidationResult`
 */
async function validateSpecSubtreeFile(
  fileName: string
): Promise<ValidationResult> {
  // The schema for the subtrees in the specs directory
  const specSchema: Schema = await readJsonUnchecked(
    "specs/data/schemas/validSchema.json"
  );
  const specSchemaState: ValidatedElement<Schema> = {
    wasPresent: true,
    validatedElement: specSchema,
  };

  // The `TileImplicitTiling` object that defines the
  // structure of subtrees in the specs directory
  const specImplicitTiling = await readJsonUnchecked(
    "specs/data/subtrees/validSubtreeImplicitTiling.json.input"
  );

  const validationResult = await Validators.validateSubtreeFile(
    fileName,
    specSchemaState,
    specImplicitTiling
  );
  return validationResult;
}

describe("Subtree validation", function () {
  it("detects issues in binarySubtreeComputedLengthInvalid", async function () {
    const result = await validateSpecSubtreeFile(
      "specs/data/subtrees/binarySubtreeComputedLengthInvalid.subtree"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("BINARY_INVALID_LENGTH");
  });

  it("detects issues in binarySubtreeInvalidBinaryByteLengthAlignment", async function () {
    const result = await validateSpecSubtreeFile(
      "specs/data/subtrees/binarySubtreeInvalidBinaryByteLengthAlignment.subtree"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("BINARY_INVALID_ALIGNMENT");
  });

  it("detects issues in binarySubtreeInvalidJsonByteLengthAlignment", async function () {
    const result = await validateSpecSubtreeFile(
      "specs/data/subtrees/binarySubtreeInvalidJsonByteLengthAlignment.subtree"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("BINARY_INVALID_ALIGNMENT");
  });

  it("detects issues in binarySubtreeInvalidMagic", async function () {
    const result = await validateSpecSubtreeFile(
      "specs/data/subtrees/binarySubtreeInvalidMagic.subtree"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("IO_ERROR");
  });

  it("detects issues in binarySubtreeInvalidVersion", async function () {
    const result = await validateSpecSubtreeFile(
      "specs/data/subtrees/binarySubtreeInvalidVersion.subtree"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("BINARY_INVALID_VALUE");
  });

  it("detects issues in binarySubtreeJsonInvalid", async function () {
    const result = await validateSpecSubtreeFile(
      "specs/data/subtrees/binarySubtreeJsonInvalid.subtree"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("JSON_PARSE_ERROR");
  });

  it("detects no issues in binarySubtreeValid", async function () {
    const result = await validateSpecSubtreeFile(
      "specs/data/subtrees/binarySubtreeValid.subtree"
    );
    expect(result.length).toEqual(0);
  });

  it("detects issues in subtreeBufferViewsWithoutBuffers", async function () {
    const result = await validateSpecSubtreeFile(
      "specs/data/subtrees/subtreeBufferViewsWithoutBuffers.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("BUFFER_VIEWS_WITHOUT_BUFFERS");
  });

  it("detects issues in subtreeChildSubtreeAvailabilityInvalidType", async function () {
    const result = await validateSpecSubtreeFile(
      "specs/data/subtrees/subtreeChildSubtreeAvailabilityInvalidType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in subtreeChildSubtreeAvailabilityMissing", async function () {
    const result = await validateSpecSubtreeFile(
      "specs/data/subtrees/subtreeChildSubtreeAvailabilityMissing.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("PROPERTY_MISSING");
  });

  it("detects issues in subtreeContentAvailabilityInvalidLength", async function () {
    const result = await validateSpecSubtreeFile(
      "specs/data/subtrees/subtreeContentAvailabilityInvalidLength.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("ARRAY_LENGTH_MISMATCH");
  });

  it("detects issues in subtreeContentAvailabilityInvalidType", async function () {
    const result = await validateSpecSubtreeFile(
      "specs/data/subtrees/subtreeContentAvailabilityInvalidType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in subtreeContentMetadataArrayElementInvalidType", async function () {
    const result = await validateSpecSubtreeFile(
      "specs/data/subtrees/subtreeContentMetadataArrayElementInvalidType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("ARRAY_ELEMENT_TYPE_MISMATCH");
  });

  it("detects issues in subtreeContentMetadataArrayElementInvalidValueA", async function () {
    const result = await validateSpecSubtreeFile(
      "specs/data/subtrees/subtreeContentMetadataArrayElementInvalidValueA.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in subtreeContentMetadataArrayElementInvalidValueB", async function () {
    const result = await validateSpecSubtreeFile(
      "specs/data/subtrees/subtreeContentMetadataArrayElementInvalidValueB.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("VALUE_NOT_IN_RANGE");
  });

  it("detects issues in subtreeContentMetadataInvalidLength", async function () {
    const result = await validateSpecSubtreeFile(
      "specs/data/subtrees/subtreeContentMetadataInvalidLength.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("ARRAY_LENGTH_MISMATCH");
  });

  it("detects issues in subtreeContentMetadataInvalidType", async function () {
    const result = await validateSpecSubtreeFile(
      "specs/data/subtrees/subtreeContentMetadataInvalidType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in subtreeContentMetadataWithoutPropertyTables", async function () {
    const result = await validateSpecSubtreeFile(
      "specs/data/subtrees/subtreeContentMetadataWithoutPropertyTables.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("REQUIRED_VALUE_NOT_FOUND");
  });

  it("detects issues in subtreePropertyTablesElementInvalidType", async function () {
    const result = await validateSpecSubtreeFile(
      "specs/data/subtrees/subtreePropertyTablesElementInvalidType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("ARRAY_ELEMENT_TYPE_MISMATCH");
  });

  it("detects issues in subtreePropertyTablesInvalidLength", async function () {
    const result = await validateSpecSubtreeFile(
      "specs/data/subtrees/subtreePropertyTablesInvalidLength.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("ARRAY_LENGTH_MISMATCH");
  });

  it("detects issues in subtreePropertyTablesInvalidType", async function () {
    const result = await validateSpecSubtreeFile(
      "specs/data/subtrees/subtreePropertyTablesInvalidType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in subtreeTileAvailabilityAvailableCountInvalid", async function () {
    const result = await validateSpecSubtreeFile(
      "specs/data/subtrees/subtreeTileAvailabilityAvailableCountInvalid.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("SUBTREE_AVAILABILITY_INCONSISTENT");
  });

  it("detects issues in subtreeTileAvailabilityAvailableCountMismatch", async function () {
    const result = await validateSpecSubtreeFile(
      "specs/data/subtrees/subtreeTileAvailabilityAvailableCountMismatch.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("SUBTREE_AVAILABILITY_INCONSISTENT");
  });

  it("detects issues in subtreeTileAvailabilityBitstreamAndConstant", async function () {
    const result = await validateSpecSubtreeFile(
      "specs/data/subtrees/subtreeTileAvailabilityBitstreamAndConstant.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("ONE_OF_ERROR");
  });

  it("detects issues in subtreeTileAvailabilityBitstreamInvalidType", async function () {
    const result = await validateSpecSubtreeFile(
      "specs/data/subtrees/subtreeTileAvailabilityBitstreamInvalidType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in subtreeTileAvailabilityBitstreamInvalidValueA", async function () {
    const result = await validateSpecSubtreeFile(
      "specs/data/subtrees/subtreeTileAvailabilityBitstreamInvalidValueA.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in subtreeTileAvailabilityBitstreamInvalidValueB", async function () {
    const result = await validateSpecSubtreeFile(
      "specs/data/subtrees/subtreeTileAvailabilityBitstreamInvalidValueB.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("VALUE_NOT_IN_RANGE");
  });

  it("detects issues in subtreeTileAvailabilityBitstreamInvalidValueC", async function () {
    const result = await validateSpecSubtreeFile(
      "specs/data/subtrees/subtreeTileAvailabilityBitstreamInvalidValueC.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("VALUE_NOT_IN_RANGE");
  });

  it("detects issues in subtreeTileAvailabilityBitstreamLengthTooLarge", async function () {
    const result = await validateSpecSubtreeFile(
      "specs/data/subtrees/subtreeTileAvailabilityBitstreamLengthTooLarge.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("SUBTREE_AVAILABILITY_INCONSISTENT");
  });

  it("detects issues in subtreeTileAvailabilityBitstreamLengthTooSmall", async function () {
    const result = await validateSpecSubtreeFile(
      "specs/data/subtrees/subtreeTileAvailabilityBitstreamLengthTooSmall.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("SUBTREE_AVAILABILITY_INCONSISTENT");
  });

  it("detects issues in subtreeTileAvailabilityConstantInvalidType", async function () {
    const result = await validateSpecSubtreeFile(
      "specs/data/subtrees/subtreeTileAvailabilityConstantInvalidType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("VALUE_NOT_IN_LIST");
  });

  it("detects issues in subtreeTileAvailabilityConstantInvalidValue", async function () {
    const result = await validateSpecSubtreeFile(
      "specs/data/subtrees/subtreeTileAvailabilityConstantInvalidValue.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("VALUE_NOT_IN_LIST");
  });

  it("detects issues in subtreeTileAvailabilityForParentMissingForAvailableTile", async function () {
    const result = await validateSpecSubtreeFile(
      "specs/data/subtrees/subtreeTileAvailabilityForParentMissingForAvailableTile.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("SUBTREE_AVAILABILITY_INCONSISTENT");
  });

  it("detects issues in subtreeTileAvailabilityInvalidType", async function () {
    const result = await validateSpecSubtreeFile(
      "specs/data/subtrees/subtreeTileAvailabilityInvalidType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in subtreeTileAvailabilityMissing", async function () {
    const result = await validateSpecSubtreeFile(
      "specs/data/subtrees/subtreeTileAvailabilityMissing.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("PROPERTY_MISSING");
  });

  it("detects issues in subtreeTileAvailabilityMissingForAvailableContent", async function () {
    const result = await validateSpecSubtreeFile(
      "specs/data/subtrees/subtreeTileAvailabilityMissingForAvailableContent.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("SUBTREE_AVAILABILITY_INCONSISTENT");
  });

  it("detects issues in subtreeTileAvailabilityNeitherBitstreamNorConstant", async function () {
    const result = await validateSpecSubtreeFile(
      "specs/data/subtrees/subtreeTileAvailabilityNeitherBitstreamNorConstant.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("ANY_OF_ERROR");
  });

  it("detects issues in subtreeTileMetadataInvalidType", async function () {
    const result = await validateSpecSubtreeFile(
      "specs/data/subtrees/subtreeTileMetadataInvalidType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in subtreeTileMetadataInvalidValueA", async function () {
    const result = await validateSpecSubtreeFile(
      "specs/data/subtrees/subtreeTileMetadataInvalidValueA.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in subtreeTileMetadataInvalidValueB", async function () {
    const result = await validateSpecSubtreeFile(
      "specs/data/subtrees/subtreeTileMetadataInvalidValueB.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("VALUE_NOT_IN_RANGE");
  });

  it("detects no issues in validSubtree", async function () {
    const result = await validateSpecSubtreeFile(
      "specs/data/subtrees/validSubtree.json"
    );
    expect(result.length).toEqual(0);
  });

  it("detects issues in validSubtreeBuffersWithoutBufferViews", async function () {
    const result = await validateSpecSubtreeFile(
      "specs/data/subtrees/validSubtreeBuffersWithoutBufferViews.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("BUFFERS_WITHOUT_BUFFER_VIEWS");
  });

  it("detects no issues in validSubtreeNoBuffers", async function () {
    const result = await validateSpecSubtreeFile(
      "specs/data/subtrees/validSubtreeNoBuffers.json"
    );
    expect(result.length).toEqual(0);
  });
});


================================================
FILE: specs/TilesetPackageValidationSpec.ts
================================================
import { Validators } from "../src/validation/Validators";

describe("Tileset package validation", function () {
  it("detects no issues in validTilesetPackage.3tz", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/packages/validTilesetPackage.3tz"
    );
    expect(result.length).toEqual(0);
  });
  it("detects no issues in validTilesetPackage.3dtiles", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/packages/validTilesetPackage.3dtiles"
    );
    expect(result.length).toEqual(0);
  });
  it("detects no issues in validTilesetPackageZipped.3tz", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/packages/validTilesetPackageZipped.3tz"
    );
    expect(result.length).toEqual(0);
  });
  it("detects no issues in validTilesetPackageZipped.3dtiles", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/packages/validTilesetPackageZipped.3dtiles"
    );
    expect(result.length).toEqual(0);
  });
  it("detects issues in tilesetPackageWithWarnings.3tz", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/packages/tilesetPackageWithWarnings.3tz"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("CONTENT_VALIDATION_WARNING");
  });
  it("detects issues in tilesetPackageWithWarnings.3dtiles", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/packages/tilesetPackageWithWarnings.3dtiles"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("CONTENT_VALIDATION_WARNING");
  });
});


================================================
FILE: specs/TilesetValidationSpec.ts
================================================
import { ValidationOptions } from "../src/validation/ValidationOptions";
import { Validators } from "../src/validation/Validators";

describe("Tileset validation", function () {
  it("detects issues in assetTilesetVersionInvalidType", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/assetTilesetVersionInvalidType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in assetVersionInvalidType", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/assetVersionInvalidType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in assetVersionMissing", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/assetVersionMissing.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("PROPERTY_MISSING");
  });
  it("detects issues in assetVersionUnknown", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/assetVersionUnknown.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("ASSET_VERSION_UNKNOWN");
  });
  it("detects issues in boundingVolumeBoxArrayInvalidElementType", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/boundingVolumeBoxArrayInvalidElementType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("ARRAY_ELEMENT_TYPE_MISMATCH");
  });
  it("detects issues in boundingVolumeBoxInvalidArrayLength", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/boundingVolumeBoxInvalidArrayLength.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("ARRAY_LENGTH_MISMATCH");
  });
  it("detects issues in boundingVolumeMissingProperty", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/boundingVolumeMissingProperty.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("ANY_OF_ERROR");
  });
  it("detects issues in boundingVolumeRegionArrayElementsOutOfRange", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/boundingVolumeRegionArrayElementsOutOfRange.json"
    );
    expect(result.length).toEqual(6);
    expect(result.get(0).type).toEqual("BOUNDING_VOLUME_INVALID");
    expect(result.get(1).type).toEqual("BOUNDING_VOLUME_INVALID");
    expect(result.get(2).type).toEqual("BOUNDING_VOLUME_INVALID");
    expect(result.get(3).type).toEqual("BOUNDING_VOLUME_INVALID");
    expect(result.get(4).type).toEqual("BOUNDING_VOLUME_INVALID");
    expect(result.get(5).type).toEqual("BOUNDING_VOLUME_INVALID");
  });

  it("detects issues in boundingVolumeRegionArrayInvalidElementType", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/boundingVolumeRegionArrayInvalidElementType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("ARRAY_ELEMENT_TYPE_MISMATCH");
  });
  it("detects issues in boundingVolumeRegionInvalidArrayLength", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/boundingVolumeRegionInvalidArrayLength.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("ARRAY_LENGTH_MISMATCH");
  });
  it("detects issues in boundingVolumeSphereArrayElementOutOfRange", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/boundingVolumeSphereArrayElementOutOfRange.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("BOUNDING_VOLUME_INVALID");
  });

  it("detects issues in boundingVolumeSphereArrayInvalidElementType", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/boundingVolumeSphereArrayInvalidElementType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("ARRAY_ELEMENT_TYPE_MISMATCH");
  });

  it("detects issues in boundingVolumeSphereInvalidArrayLength", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/boundingVolumeSphereInvalidArrayLength.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("ARRAY_LENGTH_MISMATCH");
  });

  it("detects issues in groupClassIdInvalid", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/groupClassIdInvalid.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("IDENTIFIER_NOT_FOUND");
  });

  it("detects issues in groupClassIdInvalidType", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/groupClassIdInvalidType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in groupWithoutSchema", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/groupWithoutSchema.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("REQUIRED_VALUE_NOT_FOUND");
  });

  it("detects issues in implicitTilingAvailableLevelsInvalidType", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/implicitTilingAvailableLevelsInvalidType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in implicitTilingAvailableLevelsInvalidValue", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/implicitTilingAvailableLevelsInvalidValue.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("VALUE_NOT_IN_RANGE");
  });

  it("detects issues in implicitTilingContentsUriTemplateVariableInvalid", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/implicitTilingContentsUriTemplateVariableInvalid.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TEMPLATE_URI_INVALID_VARIABLE_NAME");
  });
  it("detects issues in implicitTilingContentUriTemplateVariableInvalid", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/implicitTilingContentUriTemplateVariableInvalid.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TEMPLATE_URI_INVALID_VARIABLE_NAME");
  });

  it("detects issues in implicitTilingInvalidType", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/implicitTilingInvalidType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });
  it("detects issues in implicitTilingRootWithChildren", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/implicitTilingRootWithChildren.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TILE_IMPLICIT_ROOT_INVALID");
  });

  it("detects issues in implicitTilingRootWithContentBoundingVolume", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/implicitTilingRootWithContentBoundingVolume.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TILE_IMPLICIT_ROOT_INVALID");
  });

  it("detects issues in implicitTilingRootWithMetadata", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/implicitTilingRootWithMetadata.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TILE_IMPLICIT_ROOT_INVALID");
  });

  it("detects issues in implicitTilingSubdivisionSchemeInvalidType", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/implicitTilingSubdivisionSchemeInvalidType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("VALUE_NOT_IN_LIST");
  });
  it("detects issues in implicitTilingSubdivisionSchemeInvalidValue", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/implicitTilingSubdivisionSchemeInvalidValue.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("VALUE_NOT_IN_LIST");
  });

  it("detects issues in implicitTilingSubtreeLevelsInvalidType", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/implicitTilingSubtreeLevelsInvalidType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in implicitTilingSubtreeLevelsInvalidValue", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/implicitTilingSubtreeLevelsInvalidValue.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("VALUE_NOT_IN_RANGE");
  });

  it("detects issues in implicitTilingSubtreesInvalidType", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/implicitTilingSubtreesInvalidType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in implicitTilingSubtreesUriInvalidType", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/implicitTilingSubtreesUriInvalidType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });
  it("detects issues in implicitTilingSubtreesUriMissing", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/implicitTilingSubtreesUriMissing.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("PROPERTY_MISSING");
  });

  it("detects issues in implicitTilingSubtreesUriTemplateVariableInvalid", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/implicitTilingSubtreesUriTemplateVariableInvalid.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TEMPLATE_URI_INVALID_VARIABLE_NAME");
  });

  it("detects issues in implicitTilingSubtreesUriTemplateVariableMissing", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/implicitTilingSubtreesUriTemplateVariableMissing.json"
    );
    // Expect the IMPLICIT_TILING_ERROR here, because the file
    // for the template URI for the test cannot be resolved
    expect(result.length).toEqual(2);
    expect(result.get(0).type).toEqual("TEMPLATE_URI_MISSING_VARIABLE_NAME");
  });

  it("detects issues in implicitTilingValid", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/implicitTilingValid.json"
    );
    // Expect the TILE_IMPLICIT_ROOT_INVALID here, because the file
    // for the template URI for the test cannot be resolved
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TILE_IMPLICIT_ROOT_INVALID");
  });

  it("detects issues in implicitTilingWithBoundingSphere", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/implicitTilingWithBoundingSphere.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TILE_IMPLICIT_ROOT_INVALID");
  });

  it("detects issues in invalidJson", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/invalidJson.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("JSON_PARSE_ERROR");
  });

  it("detects issues in propertiesInvalidType", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/propertiesInvalidType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in propertiesMaximumInvalidType", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/propertiesMaximumInvalidType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in propertiesMaximumMissing", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/propertiesMaximumMissing.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("PROPERTY_MISSING");
  });

  it("detects issues in propertiesMinimumInvalidType", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/propertiesMinimumInvalidType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in propertiesMinimumLargerThanMaximum", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/propertiesMinimumLargerThanMaximum.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual(
      "PROPERTIES_MINIMUM_LARGER_THAN_MAXIMUM"
    );
  });

  it("detects issues in propertiesMinimumMissing", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/propertiesMinimumMissing.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("PROPERTY_MISSING");
  });

  it("detects issues in statisticsClassesIdInvalid", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/statisticsClassesIdInvalid.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("IDENTIFIER_NOT_FOUND");
  });

  it("detects issues in statisticsClassesInvalidType", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/statisticsClassesInvalidType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in statisticsClassesMinPropertiesMismatch", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/statisticsClassesMinPropertiesMismatch.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("NUMBER_OF_PROPERTIES_MISMATCH");
  });

  it("detects issues in statisticsClassesPropertiesMinPropertiesMismatch", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/statisticsClassesPropertiesMinPropertiesMismatch.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("NUMBER_OF_PROPERTIES_MISMATCH");
  });

  it("detects issues in statisticsClassesPropertiesPropertyNameInvalid", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/statisticsClassesPropertiesPropertyNameInvalid.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("IDENTIFIER_NOT_FOUND");
  });

  it("detects issues in statisticsClassesValueInvalidType", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/statisticsClassesValueInvalidType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in statisticsClassesWithoutSchema", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/statisticsClassesWithoutSchema.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("REQUIRED_VALUE_NOT_FOUND");
  });

  it("detects issues in tileChildrenEmptyArray", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/tileChildrenEmptyArray.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("ARRAY_LENGTH_UNEXPECTED");
  });

  it("detects issues in tileContentBoundingVolumeInvalidType", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/tileContentBoundingVolumeInvalidType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in tileContentBoundingVolumeNotInTileBoundingVolume", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/tileContentBoundingVolumeNotInTileBoundingVolume.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("BOUNDING_VOLUMES_INCONSISTENT");
  });

  it("detects no issues in tileContentBoundingVolumeWithRotationTransform", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/tileContentBoundingVolumeWithRotationTransform.json"
    );
    expect(result.length).toEqual(0);
  });

  it("detects no issues in tileContentBoundingVolumeWithTransform", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/tileContentBoundingVolumeWithTransform.json"
    );
    expect(result.length).toEqual(0);
  });

  it("detects issues in tileContentGroupInvalidIndex", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/tileContentGroupInvalidIndex.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("IDENTIFIER_NOT_FOUND");
  });

  it("detects issues in tileContentGroupInvalidType", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/tileContentGroupInvalidType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in tileContentGroupNegativeIndex", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/tileContentGroupNegativeIndex.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("VALUE_NOT_IN_RANGE");
  });

  it("detects issues in tileContentGroupWithoutTilesetGroups", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/tileContentGroupWithoutTilesetGroups.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("IDENTIFIER_NOT_FOUND");
  });

  it("detects issues in tileContentInvalidType", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/tileContentInvalidType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in tileContentsInvalidType", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/tileContentsInvalidType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in tileGeometricErrorMissing", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/tileGeometricErrorMissing.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("PROPERTY_MISSING");
  });

  it("detects issues in tileGeometricErrorNegative", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/tileGeometricErrorNegative.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("VALUE_NOT_IN_RANGE");
  });

  it("detects issues in tileGeometricErrorNotSmallerThanParentGeometricError", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/tileGeometricErrorNotSmallerThanParentGeometricError.json"
    );
    expect(result.length).toEqual(2);
    expect(result.get(0).type).toEqual("TILE_GEOMETRIC_ERRORS_INCONSISTENT");
    expect(result.get(1).type).toEqual("TILE_GEOMETRIC_ERRORS_INCONSISTENT");
  });

  it("detects issues in tileInvalidType", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/tileInvalidType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("ARRAY_ELEMENT_TYPE_MISMATCH");
  });

  it("detects issues in tileMetadataClassInvalid", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/tileMetadataClassInvalid.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("IDENTIFIER_NOT_FOUND");
  });

  it("detects issues in tileMetadataClassInvalidType", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/tileMetadataClassInvalidType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in tileMetadataClassMissing", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/tileMetadataClassMissing.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("PROPERTY_MISSING");
  });

  it("detects issues in tileMetadataScalarValueNotInRange", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/tileMetadataScalarValueNotInRange.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("VALUE_NOT_IN_RANGE");
  });

  it("detects issues in tileMetadataVec3ElementValueNotInRange", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/tileMetadataVec3ElementValueNotInRange.json"
    );
    expect(result.length).toEqual(2);
    expect(result.get(0).type).toEqual("VALUE_NOT_IN_RANGE");
    expect(result.get(1).type).toEqual("VALUE_NOT_IN_RANGE");
  });

  it("detects issues in tileMetadataVec3ArrayElementValueNotInRange", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/tileMetadataVec3ArrayElementValueNotInRange.json"
    );
    expect(result.length).toEqual(2);
    expect(result.get(0).type).toEqual("VALUE_NOT_IN_RANGE");
    expect(result.get(1).type).toEqual("VALUE_NOT_IN_RANGE");
  });

  it("detects issues in tileMetadataRequiredPropertyMissing", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/tileMetadataRequiredPropertyMissing.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("METADATA_VALUE_REQUIRED_BUT_MISSING");
  });

  it("detects issues in tileMetadataRequiredPropertyNull", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/tileMetadataRequiredPropertyNull.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("METADATA_VALUE_REQUIRED_BUT_MISSING");
  });

  it("detects issues in tileMetadataWithoutSchema", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/tileMetadataWithoutSchema.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("REQUIRED_VALUE_NOT_FOUND");
  });

  it("detects issues in tileRefineInvalidValue", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/tileRefineInvalidValue.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("VALUE_NOT_IN_LIST");
  });

  it("detects issues in tileRefineMissingInRoot", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/tileRefineMissingInRoot.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TILE_REFINE_MISSING_IN_ROOT");
  });

  it("detects issues in tileRefineMissingInRootOfExternal", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/tileRefineMissingInRootOfExternal.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("EXTERNAL_TILESET_VALIDATION_ERROR");
  });

  it("detects issues in tileRefineWrongCase", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/tileRefineWrongCase.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TILE_REFINE_WRONG_CASE");
  });

  it("detects issues in tileRefineWrongType", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/tileRefineWrongType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in tilesetAssetMissing", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/tilesetAssetMissing.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("PROPERTY_MISSING");
  });

  it("detects issues in tilesetGeometricErrorMissing", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/tilesetGeometricErrorMissing.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("PROPERTY_MISSING");
  });

  it("detects issues in tilesetGeometricErrorNegative", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/tilesetGeometricErrorNegative.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("VALUE_NOT_IN_RANGE");
  });

  it("detects issues in tilesetMetadataEntityPropertyEnumInvalidValue", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/tilesetMetadataEntityPropertyEnumInvalidValue.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual(
      "CLASS_PROPERTY_ENUM_VALUE_NAME_NOT_FOUND"
    );
  });

  it("detects issues in tilesetMetadataEntityPropertyMaxNotInRange", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/tilesetMetadataEntityPropertyMaxNotInRange.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("METADATA_VALUE_NOT_IN_RANGE");
  });

  it("detects issues in tilesetMetadataEntityPropertyMaxWithNormalizedNotInRange", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/tilesetMetadataEntityPropertyMaxWithNormalizedNotInRange.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("METADATA_VALUE_NOT_IN_RANGE");
  });

  it("detects issues in tilesetMetadataEntityPropertyMaxWithOffsetNotInRange", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/tilesetMetadataEntityPropertyMaxWithOffsetNotInRange.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("METADATA_VALUE_NOT_IN_RANGE");
  });

  it("detects issues in tilesetMetadataEntityPropertyMaxWithScaleNotInRange", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/tilesetMetadataEntityPropertyMaxWithScaleNotInRange.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("METADATA_VALUE_NOT_IN_RANGE");
  });

  it("detects issues in tilesetMetadataEntityPropertyMinNotInRange", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/tilesetMetadataEntityPropertyMinNotInRange.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("METADATA_VALUE_NOT_IN_RANGE");
  });

  it("detects issues in tilesetMetadataEntityPropertyMinWithNormalizedNotInRange", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/tilesetMetadataEntityPropertyMinWithNormalizedNotInRange.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("METADATA_VALUE_NOT_IN_RANGE");
  });

  it("detects issues in tilesetMetadataEntityPropertyMinWithOffsetNotInRange", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/tilesetMetadataEntityPropertyMinWithOffsetNotInRange.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("METADATA_VALUE_NOT_IN_RANGE");
  });

  it("detects issues in tilesetMetadataEntityPropertyMinWithScaleNotInRange", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/tilesetMetadataEntityPropertyMinWithScaleNotInRange.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("METADATA_VALUE_NOT_IN_RANGE");
  });

  it("detects issues in tilesetSchemaUriInvalidType", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/tilesetSchemaUriInvalidType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in tilesetWithSchemaAndSchemaUri", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/tilesetWithSchemaAndSchemaUri.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("ONE_OF_ERROR");
  });

  it("detects issues in tilesetWithUnicodeBOM", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/tilesetWithUnicodeBOM.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("IO_ERROR");
  });

  it("detects issues in tileTransformInvalidArrayElementType", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/tileTransformInvalidArrayElementType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("ARRAY_ELEMENT_TYPE_MISMATCH");
  });

  it("detects issues in tileTransformInvalidArrayLength", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/tileTransformInvalidArrayLength.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("ARRAY_LENGTH_MISMATCH");
  });

  it("detects issues in tileTransformInvalidType", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/tileTransformInvalidType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects no issues in tileTransformNonInvertible", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/tileTransformNonInvertible.json"
    );
    // The matrix is not invertible, but it is affine.
    // So this should not cause an issue.
    expect(result.length).toEqual(0);
  });

  it("detects issues in tileTransformNotAffine", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/tileTransformNotAffine.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TRANSFORM_INVALID");
  });

  it("detects issues in tileWithContentAndContents", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/tileWithContentAndContents.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("ONE_OF_ERROR");
  });

  it("detects no issues in validTileset", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/validTileset.json"
    );
    expect(result.length).toEqual(0);
  });

  it("detects issues in validTilesetWithCustomSemantics", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/validTilesetWithCustomSemantics.json"
    );
    expect(result.length).toEqual(2);
    expect(result.get(0).type).toEqual("METADATA_SEMANTIC_UNKNOWN");
    expect(result.get(1).type).toEqual("METADATA_SEMANTIC_UNKNOWN");
  });

  it("detects no issues in validTilesetWithCustomSemantics when registering the custom semantics matcher", async function () {
    const validationOptions: ValidationOptions = ValidationOptions.fromJson({
      semanticSchemaFileNames: [
        "specs/data/tilesets/customSemanticsSchema.json",
      ],
    });
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/validTilesetWithCustomSemantics.json",
      validationOptions
    );
    expect(result.length).toEqual(0);
  });

  it("detects issues in validTilesetWithCustomSemanticsWithInvalidType (after registering the custom semantics matcher)", async function () {
    const validationOptions: ValidationOptions = ValidationOptions.fromJson({
      semanticSchemaFileNames: [
        "specs/data/tilesets/customSemanticsSchema.json",
      ],
    });
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/validTilesetWithCustomSemanticsWithInvalidType.json",
      validationOptions
    );
    expect(result.length).toEqual(2);
    expect(result.get(0).type).toEqual("METADATA_SEMANTIC_INVALID");
    expect(result.get(1).type).toEqual("METADATA_SEMANTIC_INVALID");
  });

  it("detects issues in validTilesetWithExternalValidTilesetWithValidB3dmWithInvalidGlb", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/validTilesetWithExternalValidTilesetWithValidB3dmWithInvalidGlb.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("EXTERNAL_TILESET_VALIDATION_ERROR");
  });

  it("detects issues in validTilesetWithGlbWithErrors", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/validTilesetWithGlbWithErrors.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("CONTENT_VALIDATION_ERROR");
  });

  it("detects issues in validTilesetWithGltfWithErrors", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/validTilesetWithGltfWithErrors.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("CONTENT_VALIDATION_ERROR");
  });

  it("detects issues in validTilesetWithGltfWithWarnings", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/validTilesetWithGltfWithWarnings.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("CONTENT_VALIDATION_WARNING");
  });

  it("detects issues in validTilesetWithInvalidB3dm", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/validTilesetWithInvalidB3dm.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("CONTENT_VALIDATION_ERROR");
  });

  it("detects issues in validTilesetWithInvalidB3dmWithGlbWithInfos", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/validTilesetWithInvalidB3dmWithGlbWithInfos.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("CONTENT_VALIDATION_ERROR");

    // Expect the 'infos' from the glTF validation to still be present,
    // even though the B3DM validation already caused an error due to
    // the invalid alignment.
    // See https://github.com/CesiumGS/3d-tiles-validator/issues/299
    expect(result.get(0).causes.length).toEqual(2);
    expect(result.get(0).causes[0].type).toEqual("BINARY_INVALID_ALIGNMENT");
    expect(result.get(0).causes[1].type).toEqual("CONTENT_VALIDATION_INFO");
  });

  it("detects issues in validTilesetWithInvalidSchemaFromUri", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/validTilesetWithInvalidSchemaFromUri.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("PROPERTY_MISSING");
  });

  it("detects no issues in validTilesetWithSchema", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/validTilesetWithSchema.json"
    );
    expect(result.length).toEqual(0);
  });

  it("detects issues in validTilesetWithUnresolvableSchemaUri", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/validTilesetWithUnresolvableSchemaUri.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("IO_ERROR");
  });

  it("detects no issues in validTilesetWithValidB3dm", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/validTilesetWithValidB3dm.json"
    );
    expect(result.length).toEqual(0);
  });

  it("detects issues in validTilesetWithValidCmptWithGlbInfo", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/validTilesetWithValidCmptWithGlbInfo.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("CONTENT_VALIDATION_INFO");
  });

  it("detects no issues in validTilesetWithValid3tz", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/validTilesetWithValid3tz.json"
    );
    expect(result.length).toEqual(0);
  });

  it("detects issues in validTilesetWith3tzWithError", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/validTilesetWith3tzWithError.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("CONTENT_VALIDATION_ERROR");
  });

  it("detects issues in validTilesetWithInvalid3tz", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/validTilesetWithInvalid3tz.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("CONTENT_VALIDATION_ERROR");
  });

  it("detects issues in validTilesetWithInvalidI3dm", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/validTilesetWithInvalidI3dm.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("CONTENT_VALIDATION_ERROR");
  });

  it("detects issues in validTilesetWithInvalidPnts", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/validTilesetWithInvalidPnts.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("CONTENT_VALIDATION_ERROR");
  });

  it("detects issues in validTilesetWithValidB3dmWithInvalidGlb", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/validTilesetWithValidB3dmWithInvalidGlb.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("CONTENT_VALIDATION_ERROR");
  });

  it("detects no issues in validTilesetWithValidGltf", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/validTilesetWithValidGltf.json"
    );
    expect(result.length).toEqual(0);
  });

  it("detects no issues in validTilesetWithValidSchemaFromUri", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/validTilesetWithValidSchemaFromUri.json"
    );
    expect(result.length).toEqual(0);
  });

  it("detects issues in extensionFoundButNotUsed", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/extensionFoundButNotUsed.json"
    );
    expect(result.length).toEqual(2);
    expect(result.get(0).type).toEqual("EXTENSION_NOT_SUPPORTED");
    expect(result.get(1).type).toEqual("EXTENSION_FOUND_BUT_NOT_USED");
  });

  it("detects issues in extensionNotDeclared_1_0_glTF", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/extensionNotDeclared_1_0_glTF.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("EXTENSION_FOUND_BUT_NOT_USED");
  });

  it("detects issues in extensionNotNecessary_1_1_glTF", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/extensionNotNecessary_1_1_glTF.json"
    );
    expect(result.length).toEqual(0);
  });

  it("detects issues in extensionNotDeclaredAsRequired", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/extensionNotDeclaredAsRequired.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("EXTENSION_REQUIRED_BUT_NOT_DECLARED");
  });

  it("detects issues in extensionRequiredButNotUsed", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/extensionRequiredButNotUsed.json"
    );
    expect(result.length).toEqual(3);
    expect(result.get(0).type).toEqual("EXTENSION_NOT_SUPPORTED");
    expect(result.get(1).type).toEqual("EXTENSION_NOT_SUPPORTED");
    expect(result.get(2).type).toEqual("EXTENSION_REQUIRED_BUT_NOT_USED");
  });

  it("detects issues in extensionsInvalidType", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/extensionsInvalidType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in extensionsRequiredDuplicateElement", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/extensionsRequiredDuplicateElement.json"
    );
    expect(result.length).toEqual(3);
    expect(result.get(0).type).toEqual("EXTENSION_NOT_SUPPORTED");
    expect(result.get(1).type).toEqual("EXTENSION_NOT_SUPPORTED");
    expect(result.get(2).type).toEqual("ARRAY_ELEMENT_NOT_UNIQUE");
  });

  it("detects issues in extensionsRequiredInvalidArrayLength", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/extensionsRequiredInvalidArrayLength.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("ARRAY_LENGTH_MISMATCH");
  });

  it("detects issues in extensionsRequiredInvalidType", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/extensionsRequiredInvalidType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in extensionsUsedDuplicateElement", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/extensionsUsedDuplicateElement.json"
    );
    expect(result.length).toEqual(3);
    expect(result.get(0).type).toEqual("EXTENSION_NOT_SUPPORTED");
    expect(result.get(1).type).toEqual("EXTENSION_NOT_SUPPORTED");
    expect(result.get(2).type).toEqual("ARRAY_ELEMENT_NOT_UNIQUE");
  });

  it("detects issues in extensionsUsedInvalidArrayLength", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/extensionsUsedInvalidArrayLength.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("ARRAY_LENGTH_MISMATCH");
  });

  it("detects issues in extensionsUsedInvalidType", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/extensionsUsedInvalidType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
  });

  it("detects issues in extensionsValueInvalidType", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/extensionsValueInvalidType.json"
    );
    expect(result.length).toEqual(3);
    expect(result.get(0).type).toEqual("TYPE_MISMATCH");
    expect(result.get(1).type).toEqual("EXTENSION_NOT_SUPPORTED");
    expect(result.get(2).type).toEqual("EXTENSION_USED_BUT_NOT_FOUND");
  });

  it("detects issues in extensionUsedButNotFound", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/extensionUsedButNotFound.json"
    );
    expect(result.length).toEqual(2);
    expect(result.get(0).type).toEqual("EXTENSION_NOT_SUPPORTED");
    expect(result.get(1).type).toEqual("EXTENSION_USED_BUT_NOT_FOUND");
  });

  it("detects issues in extrasUnexpectedType", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/extrasUnexpectedType.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("TYPE_UNEXPECTED");
  });

  it("detects issues in validTilesetWithIB3dmWithInvalidAlignment", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/validTilesetWithIB3dmWithInvalidAlignment.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("CONTENT_VALIDATION_ERROR");
  });

  it("detects issues in tilesetWithCycleA", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/tilesetWithCycleA.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("EXTERNAL_TILESET_VALIDATION_ERROR");
  });

  it("detects no issues in tilesetWithMultipleExternal", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/tilesetWithMultipleExternal.json"
    );
    expect(result.length).toEqual(0);
  });

  it("detects no issues in tilesets/tiles/i3dm/i3dmWithUri/tileset.json", async function () {
    const result = await Validators.validateTilesetFile(
      "specs/data/tilesets/tiles/i3dm/i3dmWithUri/tileset.json"
    );
    expect(result.length).toEqual(1);
    expect(result.get(0).type).toEqual("CONTENT_VALIDATION_WARNING");
  });
});


================================================
FILE: specs/data/Samples/ImplicitTileMetadata/subtrees/1.1/0.0.0.json
================================================
{
  "buffers": [
    {
      "byteLength": 32,
      "uri": "../shared.bin"
    }
  ],
  "bufferViews": [
    {
      "buffer": 0,
      "byteOffset": 0,
      "byteLength": 1
    },
    {
      "buffer": 0,
      "byteOffset": 8,
      "byteLength": 5
    },
    {
      "buffer": 0,
      "byteOffset": 16,
      "byteLength": 12
    }
  ],
  "tileAvailability": {
    "bitstream": 0,
    "availableCount": 5
  },
  "contentAvailability": [ {
    "constant": 1
  } ],
  "childSubtreeAvailability": {
    "constant": 0
  },
  "propertyTables": [
    {
      "class": "tile",
      "count": 1,
      "properties": {
        "quadrant": {
          "values": 1
        },
        "color": {
          "values": 2
        }
      }
    }
  ],
  "tileMetadata": 0
}

================================================
FILE: specs/data/Samples/ImplicitTileMetadata/tileset_1.1.json
================================================
{
  "asset": {
    "version": "1.1"
  },
  "schema": {
    "id": "ImplicitTileMetadataSchema",
    "classes": {
      "tile": {
        "properties": {
          "quadrant": {
            "type": "ENUM",
            "enumType": "quadrantType"
          },
          "color": {
            "type": "VEC3",
            "componentType": "UINT8"
          }
        }
      }
    },
    "enums": {
      "quadrantType": {
        "valueType": "UINT8",
        "values": [
          {
            "name": "Southwest",
            "value": 0
          },
          {
            "name": "Southeast",
            "value": 1
          },
          {
            "name": "Northwest",
            "value": 2
          },
          {
            "name": "Northeast",
            "value": 3
          },
          {
            "name": "None",
            "value": 4
          }
        ]
      }
    }
  },
  "geometricError": 240,
  "root": {
    "boundingVolume": {
      "region": [
        -1.3197209591796106,
        0.6988424218,
        -1.3196390408203893,
        0.6989055782,
        0,
        88
      ]
    },
    "content": {
      "uri": "content/{level}/{x}/{y}.b3dm"
    },
    "implicitTiling": {
      "subdivisionScheme": "QUADTREE",
      "subtreeLevels": 2,
      "availableLevels": 2,
      "subtrees": {
        "uri": "subtrees/1.1/{level}.{x}.{y}.json"
      }
    },
    "geometricError": 70,
    "refine": "ADD"
  }
}


================================================
FILE: specs/data/Samples/PaddingIssues/README.md
================================================
A set of tests for the handling of padding bytes for GLB data in B3DM tiles.
(Created for https://github.com/CesiumGS/3d-tiles-validator/issues/256)

The tilesets `tilesetA`/`B`/`C`/`D` refer to B3DM files `llA`/`B`/`C`/`D`, respectively.

- A: A B3DM where the length was not aligned to 8 bytes, causing an issue: "The byte length must be aligned to 8 bytes"
- B: Contains additional 0-bytes at the end of the B3DM, to ensure that its length is aligned to 8 bytes. The validator will extract the length of the actual GLB data (without padding) from the GLB header. This passes validation.
- C: Contains additional 0-bytes at the end of the BIN chunk of the GLB. The glTF validator will report an issue: "GLB-stored BIN chunk contains 4 extra padding byte(s)."
- D: Contains ` `-bytes (spaces) at the end of the JSON chunk of the GLB. This also passes validation.


================================================
FILE: specs/data/Samples/PaddingIssues/tilesetA.json
================================================
{
  "asset" : {
    "version" : "1.1"
  },
  "geometricError" : 2.0,
  "root" : {
    "boundingVolume" : {
      "box" : [ 0.5, 0.5, 0.5, 0.5, 0.0, 0.0, 0.0, 0.5, 0.0, 0.0, 0.0, 0.5 ]
    },
    "geometricError" : 1.0,
    "content": {
      "uri": "llA.b3dm"
    }
  }
}

================================================
FILE: specs/data/Samples/PaddingIssues/tilesetB.json
================================================
{
  "asset" : {
    "version" : "1.1"
  },
  "geometricError" : 2.0,
  "root" : {
    "boundingVolume" : {
      "box" : [ 0.5, 0.5, 0.5, 0.5, 0.0, 0.0, 0.0, 0.5, 0.0, 0.0, 0.0, 0.5 ]
    },
    "geometricError" : 1.0,
    "content": {
      "uri": "llB.b3dm"
    }
  }
}

================================================
FILE: specs/data/Samples/PaddingIssues/tilesetC.json
================================================
{
  "asset" : {
    "version" : "1.1"
  },
  "geometricError" : 2.0,
  "root" : {
    "boundingVolume" : {
      "box" : [ 0.5, 0.5, 0.5, 0.5, 0.0, 0.0, 0.0, 0.5, 0.0, 0.0, 0.0, 0.5 ]
    },
    "geometricError" : 1.0,
    "content": {
      "uri": "llC.b3dm"
    }
  }
}

================================================
FILE: specs/data/Samples/PaddingIssues/tilesetD.json
================================================
{
  "asset" : {
    "version" : "1.1"
  },
  "geometricError" : 2.0,
  "root" : {
    "boundingVolume" : {
      "box" : [ 0.5, 0.5, 0.5, 0.5, 0.0, 0.0, 0.0, 0.5, 0.0, 0.0, 0.0, 0.5 ]
    },
    "geometricError" : 1.0,
    "content": {
      "uri": "llD.b3dm"
    }
  }
}

================================================
FILE: specs/data/Samples/PaddingIssues/tilesetE.json
================================================
{
  "asset" : {
    "version" : "1.1"
  },
  "geometricError" : 2.0,
  "root" : {
    "boundingVolume" : {
      "box" : [ 0.5, 0.5, 0.5, 0.5, 0.0, 0.0, 0.0, 0.5, 0.0, 0.0, 0.0, 0.5 ]
    },
    "geometricError" : 1.0,
    "content": {
      "uri": "llD.b3dm"
    }
  }
}

================================================
FILE: specs/data/Samples/README.md
================================================

- `TilesetOfTilesets` is the original one from https://github.com/CesiumGS/cesium/tree/66e626c0f9d567f58ead7922d965490a5034e895/Specs/Data/Cesium3DTiles/Tilesets
- `TilesetOfTilesetsWithError` is the same, but with "tileset3/ll.b3dm" modified so that it contains an invalid size, causing a content validation error
- `SparseImplicitQuadtree` is from https://github.com/javagl/3d-tiles-samples/tree/7272499dcf9a998ef80c741c9da77abcfe3bf011/1.1/SparseImplicitQuadtree
- `TilesetWithFullMetadata` is https://github.com/javagl/3d-tiles-samples/tree/ec028f3580f71fa5b730fa9020f071fc22391ac3/1.1/TilesetWithFullMetadata
- `TilesetGzipped` is from https://github.com/CesiumGS/3d-tiles-validator/tree/b583fa66b29645506e66288db39b2d29aacb02c0/validator/specs/data/TilesetGzipped
- `ImplicitTileMetadats` is based on https://github.com/CesiumGS/cesium/tree/ad90cfdf3a59ab9a2ab6dff9212198253d5a7c31/Specs/Data/Cesium3DTiles/Metadata/ImplicitTileMetadata, but with fixes to pass validation


================================================
FILE: specs/data/Samples/SparseImplicitQuadtree/tileset.json
================================================
{
  "asset" : {
    "version" : "1.1"
  },
  "geometricError" : 1024.0,
  "root" : {
    "boundingVolume" : {
      "box" : [ 0.5, 0.5, 0.00625, 0.5, 0.0, 0.0, 0.0, 0.5, 0.0, 0.0, 0.0, 0.00625 ]
    },
    "geometricError" : 32.0,
    "refine" : "ADD",
    "content" : {
      "uri" : "content/content_{level}__{x}_{y}.glb"
    },
    "implicitTiling" : {
      "subdivisionScheme" : "QUADTREE",
      "subtreeLevels" : 3,
      "availableLevels" : 6,
      "subtrees" : {
        "uri" : "subtrees/{level}.{x}.{y}.subtree"
      }
    }
  }
}

================================================
FILE: specs/data/Samples/TilesetOfTilesets/tileset.json
================================================
{
  "asset": {
    "version": "1.0",
    "tilesetVersion": "1.2.3"
  },
  "properties": {
    "id": {
      "minimum": 0,
      "maximum": 9
    },
    "Longitude": {
      "minimum": -1.3197192952275933,
      "maximum": -1.319644104024109
    },
    "Latitude": {
      "minimum": 0.698848878034009,
      "maximum": 0.6989046192460953
    },
    "Height": {
      "minimum": 6.161747192963958,
      "maximum": 85.41026367992163
    }
  },
  "geometricError": 240,
  "root": {
    "boundingVolume": {
      "region": [
        -1.3197209591796106,
        0.6988424218,
        -1.3196390408203893,
        0.6989055782,
        0,
        88
      ]
    },
    "geometricError": 70,
    "refine": "ADD",
    "content": {
      "uri": "tileset2.json"
    }
  }
}


================================================
FILE: specs/data/Samples/TilesetOfTilesets/tileset2.json
================================================
{
  "asset": {
    "version": "1.0"
  },
  "geometricError": 240,
  "root": {
    "boundingVolume": {
      "region": [
        -1.3197209591796106,
        0.6988424218,
        -1.3196390408203893,
        0.6989055782,
        0,
        88
      ]
    },
    "geometricError": 70,
    "refine": "ADD",
    "content": {
      "uri": "parent.b3dm"
    },
    "children": [
      {
        "boundingVolume": {
          "region": [
            -1.3197209591796106,
            0.6988424218,
            -1.31968,
            0.698874,
            0,
            20
          ]
        },
        "geometricError": 0,
        "content": {
          "uri": "tileset3/tileset3.json"
        }
      },
      {
        "boundingVolume": {
          "region": [
            -1.31968,
            0.6988424218,
            -1.3196390408203893,
            0.698874,
            0,
            20
          ]
        },
        "geometricError": 0,
        "content": {
          "uri": "lr.b3dm"
        }
      },
      {
        "boundingVolume": {
          "region": [
            -1.31968,
            0.698874,
            -1.3196390408203893,
            0.6989055782,
            0,
            20
          ]
        },
        "geometricError": 0,
        "content": {
          "uri": "ur.b3dm"
        }
      },
      {
        "boundingVolume": {
          "region": [
            -1.3197209591796106,
            0.698874,
            -1.31968,
            0.6989055782,
            0,
            20
          ]
        },
        "geometricError": 0,
        "content": {
          "uri": "ul.b3dm"
        }
      }
    ]
  }
}


================================================
FILE: specs/data/Samples/TilesetOfTilesets/tileset3/tileset3.json
================================================
{
  "asset": {
    "version": "1.0"
  },
  "geometricError": 70,
  "root": {
    "boundingVolume": {
      "region": [
        -1.3197209591796106,
        0.6988424218,
        -1.31968,
        0.698874,
        0,
        20
      ]
    },
    "geometricError": 0,
    "refine": "ADD",
    "content": {
      "uri": "ll.b3dm"
    }
  }
}


================================================
FILE: specs/data/Samples/TilesetOfTilesetsWithError/tileset.json
================================================
{
  "asset": {
    "version": "1.0",
    "tilesetVersion": "1.2.3"
  },
  "properties": {
    "id": {
      "minimum": 0,
      "maximum": 9
    },
    "Longitude": {
      "minimum": -1.3197192952275933,
      "maximum": -1.319644104024109
    },
    "Latitude": {
      "minimum": 0
Download .txt
gitextract_nrezpdnq/

├── .eslintignore
├── .eslintrc.json
├── .github/
│   └── workflows/
│       └── ci.yml
├── .gitignore
├── .npmignore
├── .nycrc
├── .prettierignore
├── .prettierrc.json
├── CHANGES.md
├── IMPLEMENTATION.md
├── LICENSE.md
├── README.md
├── ThirdParty.json
├── api-extractor.jsonc
├── bin/
│   ├── README.md
│   └── main
├── demos/
│   ├── README.md
│   ├── validationOptionsDemo.ts
│   └── validationResultDemos.ts
├── etc/
│   └── 3d-tiles-validator.api.md
├── generateThirdParty.js
├── package.json
├── specs/
│   ├── BasicValidatorSpec.ts
│   ├── BinaryBufferStructureSpec.ts
│   ├── ExternalTilesetExtensionsValidationSpec.ts
│   ├── MetadataSchemaValidationSpec.ts
│   ├── SubtreeValidationSpec.ts
│   ├── TilesetPackageValidationSpec.ts
│   ├── TilesetValidationSpec.ts
│   ├── data/
│   │   ├── Samples/
│   │   │   ├── ImplicitTileMetadata/
│   │   │   │   ├── content/
│   │   │   │   │   ├── 0/
│   │   │   │   │   │   └── 0/
│   │   │   │   │   │       └── 0.b3dm
│   │   │   │   │   └── 1/
│   │   │   │   │       ├── 0/
│   │   │   │   │       │   ├── 0.b3dm
│   │   │   │   │       │   └── 1.b3dm
│   │   │   │   │       └── 1/
│   │   │   │   │           └── 1.b3dm
│   │   │   │   ├── subtrees/
│   │   │   │   │   └── 1.1/
│   │   │   │   │       └── 0.0.0.json
│   │   │   │   └── tileset_1.1.json
│   │   │   ├── PaddingIssues/
│   │   │   │   ├── README.md
│   │   │   │   ├── llA.b3dm
│   │   │   │   ├── llB.b3dm
│   │   │   │   ├── llC.b3dm
│   │   │   │   ├── llD.b3dm
│   │   │   │   ├── llE.b3dm
│   │   │   │   ├── tilesetA.json
│   │   │   │   ├── tilesetB.json
│   │   │   │   ├── tilesetC.json
│   │   │   │   ├── tilesetD.json
│   │   │   │   └── tilesetE.json
│   │   │   ├── README.md
│   │   │   ├── SparseImplicitQuadtree/
│   │   │   │   ├── content/
│   │   │   │   │   ├── content_5__0_21.glb
│   │   │   │   │   ├── content_5__10_31.glb
│   │   │   │   │   ├── content_5__11_30.glb
│   │   │   │   │   ├── content_5__12_25.glb
│   │   │   │   │   ├── content_5__13_24.glb
│   │   │   │   │   ├── content_5__14_27.glb
│   │   │   │   │   ├── content_5__15_26.glb
│   │   │   │   │   ├── content_5__16_5.glb
│   │   │   │   │   ├── content_5__17_4.glb
│   │   │   │   │   ├── content_5__18_7.glb
│   │   │   │   │   ├── content_5__19_6.glb
│   │   │   │   │   ├── content_5__1_20.glb
│   │   │   │   │   ├── content_5__20_1.glb
│   │   │   │   │   ├── content_5__21_0.glb
│   │   │   │   │   ├── content_5__22_3.glb
│   │   │   │   │   ├── content_5__23_2.glb
│   │   │   │   │   ├── content_5__24_13.glb
│   │   │   │   │   ├── content_5__25_12.glb
│   │   │   │   │   ├── content_5__26_15.glb
│   │   │   │   │   ├── content_5__27_14.glb
│   │   │   │   │   ├── content_5__28_9.glb
│   │   │   │   │   ├── content_5__29_8.glb
│   │   │   │   │   ├── content_5__2_23.glb
│   │   │   │   │   ├── content_5__30_11.glb
│   │   │   │   │   ├── content_5__31_10.glb
│   │   │   │   │   ├── content_5__3_22.glb
│   │   │   │   │   ├── content_5__4_17.glb
│   │   │   │   │   ├── content_5__5_16.glb
│   │   │   │   │   ├── content_5__6_19.glb
│   │   │   │   │   ├── content_5__7_18.glb
│   │   │   │   │   ├── content_5__8_29.glb
│   │   │   │   │   └── content_5__9_28.glb
│   │   │   │   ├── subtrees/
│   │   │   │   │   ├── 0.0.0.subtree
│   │   │   │   │   ├── 3.0.5.subtree
│   │   │   │   │   ├── 3.1.4.subtree
│   │   │   │   │   ├── 3.2.7.subtree
│   │   │   │   │   ├── 3.3.6.subtree
│   │   │   │   │   ├── 3.4.1.subtree
│   │   │   │   │   ├── 3.5.0.subtree
│   │   │   │   │   ├── 3.6.3.subtree
│   │   │   │   │   └── 3.7.2.subtree
│   │   │   │   └── tileset.json
│   │   │   ├── TilesetGzipped/
│   │   │   │   ├── ll.b3dm
│   │   │   │   ├── lr.b3dm
│   │   │   │   ├── parent.b3dm
│   │   │   │   ├── tileset.json
│   │   │   │   ├── ul.b3dm
│   │   │   │   └── ur.b3dm
│   │   │   ├── TilesetOfTilesets/
│   │   │   │   ├── lr.b3dm
│   │   │   │   ├── parent.b3dm
│   │   │   │   ├── tileset.json
│   │   │   │   ├── tileset2.json
│   │   │   │   ├── tileset3/
│   │   │   │   │   ├── ll.b3dm
│   │   │   │   │   └── tileset3.json
│   │   │   │   ├── ul.b3dm
│   │   │   │   └── ur.b3dm
│   │   │   ├── TilesetOfTilesetsWithError/
│   │   │   │   ├── lr.b3dm
│   │   │   │   ├── parent.b3dm
│   │   │   │   ├── tileset.json
│   │   │   │   ├── tileset2.json
│   │   │   │   ├── tileset3/
│   │   │   │   │   ├── ll.b3dm
│   │   │   │   │   └── tileset3.json
│   │   │   │   ├── ul.b3dm
│   │   │   │   └── ur.b3dm
│   │   │   └── TilesetWithFullMetadata/
│   │   │       └── tileset.json
│   │   ├── buffers/
│   │   │   ├── bufferViewsElementBufferInvalidType.json
│   │   │   ├── bufferViewsElementBufferInvalidValueA.json
│   │   │   ├── bufferViewsElementBufferInvalidValueB.json
│   │   │   ├── bufferViewsElementBufferInvalidValueC.json
│   │   │   ├── bufferViewsElementByteLengthInvalidType.json
│   │   │   ├── bufferViewsElementByteLengthInvalidValueA.json
│   │   │   ├── bufferViewsElementByteLengthInvalidValueB.json
│   │   │   ├── bufferViewsElementByteOffsetInvalidType.json
│   │   │   ├── bufferViewsElementByteOffsetInvalidValueA.json
│   │   │   ├── bufferViewsElementByteOffsetInvalidValueB.json
│   │   │   ├── bufferViewsElementExceedsBufferLength.json
│   │   │   ├── bufferViewsElementInvalidType.json
│   │   │   ├── bufferViewsInvalidLength.json
│   │   │   ├── bufferViewsInvalidType.json
│   │   │   ├── buffersElementByteLengthInvalidType.json
│   │   │   ├── buffersElementByteLengthInvalidValueA.json
│   │   │   ├── buffersElementByteLengthInvalidValueB.json
│   │   │   ├── buffersElementByteLengthMissing.json
│   │   │   ├── buffersElementInvalidType.json
│   │   │   ├── buffersElementNameInvalidLength.json
│   │   │   ├── buffersElementNameInvalidType.json
│   │   │   ├── buffersElementUriInvalidType.json
│   │   │   ├── buffersElementUriMissing.json
│   │   │   ├── buffersInvalidLength.json
│   │   │   └── buffersInvalidType.json
│   │   ├── extensions/
│   │   │   ├── boundingVolumeS2/
│   │   │   │   ├── s2AndInvalidBox.json
│   │   │   │   ├── s2MaximumHeightInvalidType.json
│   │   │   │   ├── s2MinimumHeightGreaterThanMaximumHeight.json
│   │   │   │   ├── s2MinimumHeightInvalidType.json
│   │   │   │   ├── s2TokenInvalidType.json
│   │   │   │   ├── s2TokenInvalidValue.json
│   │   │   │   ├── s2TokenMissing.json
│   │   │   │   └── validTilesetWithS2.json
│   │   │   ├── contentGltf/
│   │   │   │   ├── contentGltfExtensionRequiredButNotUsed.json
│   │   │   │   ├── contentGltfExtensionsRequiredDuplicateElement.json
│   │   │   │   ├── contentGltfExtensionsRequiredInvalidArrayLength.json
│   │   │   │   ├── contentGltfExtensionsRequiredInvalidElementType.json
│   │   │   │   ├── contentGltfExtensionsRequiredInvalidType.json
│   │   │   │   ├── contentGltfExtensionsUsedDuplicateElement.json
│   │   │   │   ├── contentGltfExtensionsUsedInvalidArrayLength.json
│   │   │   │   ├── contentGltfExtensionsUsedInvalidElementType.json
│   │   │   │   ├── contentGltfExtensionsUsedInvalidType.json
│   │   │   │   ├── tileset_1_0_withContentGltfRequiredButNotUsed.json
│   │   │   │   ├── tileset_1_0_withContentGltfUsedButNotFound.json
│   │   │   │   ├── tileset_1_0_withContentGltfUsedButNotRequired.json
│   │   │   │   ├── tileset_1_1_withContentGltfUsedButNotFound.json
│   │   │   │   ├── validTileset_1_0_withExtensionObject.json
│   │   │   │   ├── validTileset_1_0_withGltf.json
│   │   │   │   ├── validTileset_1_1_withContentGltfUsedAndFound.json
│   │   │   │   └── validTileset_1_1_withGltf.json
│   │   │   ├── gpm/
│   │   │   │   ├── anchorPointMetadataContentIndexInvalidType.json
│   │   │   │   ├── anchorPointMetadataContentIndexInvalidValue.json
│   │   │   │   ├── anchorPointMetadataContentIndexMissing.json
│   │   │   │   ├── anchorPointMetadataPlacementTypeInvalidValue.json
│   │   │   │   ├── anchorPointMetadataPlacementTypeMeshContentWithContentIndex.json
│   │   │   │   ├── anchorPointMetadataPlacementTypeMissing.json
│   │   │   │   ├── collectionRecordCollectionIdInvalidType.json
│   │   │   │   ├── collectionRecordCollectionIdMissing.json
│   │   │   │   ├── collectionRecordPlatformIdInvalidType.json
│   │   │   │   ├── collectionRecordPlatformIdMissing.json
│   │   │   │   ├── collectionRecordSensorRecordsElementInvalidType.json
│   │   │   │   ├── collectionRecordSensorRecordsInvalidLength.json
│   │   │   │   ├── collectionRecordSensorRecordsInvalidType.json
│   │   │   │   ├── collectionRecordSensorRecordsMissing.json
│   │   │   │   ├── collectionUnitRecordCollectionUnitIdInvalidType.json
│   │   │   │   ├── collectionUnitRecordCollectionUnitIdMissing.json
│   │   │   │   ├── collectionUnitRecordExtentInformationInvalidType.json
│   │   │   │   ├── collectionUnitRecordExtentInformationMissing.json
│   │   │   │   ├── collectionUnitRecordPointSourceIdInvalidType.json
│   │   │   │   ├── collectionUnitRecordPointSourceIdInvalidValue.json
│   │   │   │   ├── collectionUnitRecordPointSourceIdMissing.json
│   │   │   │   ├── collectionUnitRecordReferenceDateTimeInvalidType.json
│   │   │   │   ├── collectionUnitRecordReferenceDateTimeMissing.json
│   │   │   │   ├── correlationGroupGroupFlagsElementInvalidType.json
│   │   │   │   ├── correlationGroupGroupFlagsInvalidLengthA.json
│   │   │   │   ├── correlationGroupGroupFlagsInvalidLengthB.json
│   │   │   │   ├── correlationGroupGroupFlagsMissing.json
│   │   │   │   ├── correlationGroupGroupsGroupFlagsInvalidType.json
│   │   │   │   ├── correlationGroupGroupsParamsInvalidType.json
│   │   │   │   ├── correlationGroupGroupsParamsMissing.json
│   │   │   │   ├── correlationGroupParamsElementInvalidType.json
│   │   │   │   ├── correlationGroupParamsInvalidLengthA.json
│   │   │   │   ├── correlationGroupParamsInvalidLengthB.json
│   │   │   │   ├── correlationGroupRotationThetasInvalidType.json
│   │   │   │   ├── correlationGroupRotationThetasMissing.json
│   │   │   │   ├── covarUpperTriangleElementInvalidType.json
│   │   │   │   ├── covarUpperTriangleInvalidLengthA.json
│   │   │   │   ├── covarUpperTriangleInvalidLengthB.json
│   │   │   │   ├── extentInformationLsrAxisUnitVectorsElementInvalidType.json
│   │   │   │   ├── extentInformationLsrAxisUnitVectorsInvalidLengthA.json
│   │   │   │   ├── extentInformationLsrAxisUnitVectorsInvalidLengthB.json
│   │   │   │   ├── extentInformationLsrAxisUnitVectorsInvalidType.json
│   │   │   │   ├── extentInformationLsrAxisUnitVectorsMissing.json
│   │   │   │   ├── extentInformationLsrLengthsElementInvalidType.json
│   │   │   │   ├── extentInformationLsrLengthsInvalidLengthA.json
│   │   │   │   ├── extentInformationLsrLengthsInvalidLengthB.json
│   │   │   │   ├── extentInformationLsrLengthsInvalidType.json
│   │   │   │   ├── extentInformationLsrLengthsMissing.json
│   │   │   │   ├── extentInformationOriginInvalidType.json
│   │   │   │   ├── extentInformationOriginMissing.json
│   │   │   │   ├── idInformationDatasetIdInvalidType.json
│   │   │   │   ├── idInformationDatasetIdMissing.json
│   │   │   │   ├── idInformationReferenceDateTimeInvalidType.json
│   │   │   │   ├── idInformationReferenceDateTimeMissing.json
│   │   │   │   ├── interpolationParamsDampeningParamInvalidType.json
│   │   │   │   ├── interpolationParamsDampeningParamMissing.json
│   │   │   │   ├── interpolationParamsInterpNumPostsInvalidType.json
│   │   │   │   ├── interpolationParamsInterpNumPostsInvalidValueA.json
│   │   │   │   ├── interpolationParamsInterpNumPostsInvalidValueB.json
│   │   │   │   ├── interpolationParamsInterpNumPostsMissing.json
│   │   │   │   ├── interpolationParamsInterpolationModeInvalidType.json
│   │   │   │   ├── interpolationParamsInterpolationModeInvalidValue.json
│   │   │   │   ├── interpolationParamsInterpolationModeMissing.json
│   │   │   │   ├── interpolationParamsInterpolationModeNearestNeighborWithDampeningParam.json
│   │   │   │   ├── interpolationParamsInterpolationModeNearestNeighborWithInterpNumPoints.json
│   │   │   │   ├── lsrAxisUnitVectorsNotOrthogonalA.json
│   │   │   │   ├── lsrAxisUnitVectorsNotOrthogonalB.json
│   │   │   │   ├── lsrAxisUnitVectorsNotOrthogonalC.json
│   │   │   │   ├── masterRecordCollectionRecordListElementInvalidType.json
│   │   │   │   ├── masterRecordCollectionRecordListInvalidLength.json
│   │   │   │   ├── masterRecordCollectionRecordListInvalidType.json
│   │   │   │   ├── masterRecordDatasetExtentInformationInvalidType.json
│   │   │   │   ├── masterRecordIdInformationInvalidType.json
│   │   │   │   ├── masterRecordIdInformationMissing.json
│   │   │   │   ├── masterRecordImplementationInvalidType.json
│   │   │   │   ├── masterRecordImplementationMissing.json
│   │   │   │   ├── masterRecordModelCoordSystemInvalidType.json
│   │   │   │   ├── masterRecordModelCoordSystemMissing.json
│   │   │   │   ├── masterRecordVersionInvalidType.json
│   │   │   │   ├── masterRecordVersionMissing.json
│   │   │   │   ├── modelCoordSystemCrsEcefInvalidType.json
│   │   │   │   ├── modelCoordSystemCrsEcefMissing.json
│   │   │   │   ├── modelCoordSystemMcsTypeEcefCrsEcefInvalidType.json
│   │   │   │   ├── modelCoordSystemMcsTypeEcefCrsEcefMissing.json
│   │   │   │   ├── modelCoordSystemMcsTypeEcefWithAxisUnitVectors.json
│   │   │   │   ├── modelCoordSystemMcsTypeEcefWithCrsHorizontalUtm.json
│   │   │   │   ├── modelCoordSystemMcsTypeEcefWithCrsVertical.json
│   │   │   │   ├── modelCoordSystemMcsTypeEcefWithOrigin.json
│   │   │   │   ├── modelCoordSystemMcsTypeInvalidType.json
│   │   │   │   ├── modelCoordSystemMcsTypeInvalidValue.json
│   │   │   │   ├── modelCoordSystemMcsTypeLsrAxisUnitVectorsInvalidType.json
│   │   │   │   ├── modelCoordSystemMcsTypeLsrAxisUnitVectorsMissing.json
│   │   │   │   ├── modelCoordSystemMcsTypeLsrOriginInvalidType.json
│   │   │   │   ├── modelCoordSystemMcsTypeLsrOriginMissing.json
│   │   │   │   ├── modelCoordSystemMcsTypeLsrWithCrsEcef.json
│   │   │   │   ├── modelCoordSystemMcsTypeLsrWithCrsHorizontalUtm.json
│   │   │   │   ├── modelCoordSystemMcsTypeLsrWithCrsVertical.json
│   │   │   │   ├── modelCoordSystemMcsTypeMissing.json
│   │   │   │   ├── modelCoordSystemMcsTypeUtmCrsHorizontalUtmInvalidType.json
│   │   │   │   ├── modelCoordSystemMcsTypeUtmCrsHorizontalUtmMissing.json
│   │   │   │   ├── modelCoordSystemMcsTypeUtmCrsVerticalInvalidType.json
│   │   │   │   ├── modelCoordSystemMcsTypeUtmCrsVerticalMissing.json
│   │   │   │   ├── modelCoordSystemMcsTypeUtmWithAxisUnitVectors.json
│   │   │   │   ├── modelCoordSystemMcsTypeUtmWithCrsEcef.json
│   │   │   │   ├── modelCoordSystemMcsTypeUtmWithOrigin.json
│   │   │   │   ├── ngaGpmAnchorPointMetadataInvalidType.json
│   │   │   │   ├── ngaGpmInterTileCorrelationGroupsElementInvalidType.json
│   │   │   │   ├── ngaGpmInterTileCorrelationGroupsInvalidLength.json
│   │   │   │   ├── ngaGpmInterTileCorrelationGroupsInvalidType.json
│   │   │   │   ├── ngaGpmInterTileCorrelationGroupsMissing.json
│   │   │   │   ├── ngaGpmInterpolationParamsInvalidType.json
│   │   │   │   ├── ngaGpmInterpolationParamsMissing.json
│   │   │   │   ├── ngaGpmInvalidType.json
│   │   │   │   ├── ngaGpmMasterRecordInvalidType.json
│   │   │   │   ├── ngaGpmMasterRecordMissing.json
│   │   │   │   ├── ngaGpmPpeManifestInvalidType.json
│   │   │   │   ├── ngaGpmThreeDimConformalParamsInvalidType.json
│   │   │   │   ├── ngaGpmUnmodeledErrorRecordInvalidType.json
│   │   │   │   ├── ngaGpmUnmodeledErrorRecordMissing.json
│   │   │   │   ├── organizationSystemIdPairOrganizationInvalidType.json
│   │   │   │   ├── organizationSystemIdPairOrganizationMissing.json
│   │   │   │   ├── organizationSystemIdPairSystemIdInvalidType.json
│   │   │   │   ├── organizationSystemIdPairSystemIdMissing.json
│   │   │   │   ├── point3dElementInvalidType.json
│   │   │   │   ├── point3dInvalidLengthA.json
│   │   │   │   ├── point3dInvalidLengthB.json
│   │   │   │   ├── ppeManifestElementInvalidType.json
│   │   │   │   ├── ppeManifestInvalidLengthA.json
│   │   │   │   ├── ppeManifestInvalidLengthB.json
│   │   │   │   ├── ppeMetadataMaxInvalidType.json
│   │   │   │   ├── ppeMetadataMinInvalidType.json
│   │   │   │   ├── ppeMetadataSourceInvalidType.json
│   │   │   │   ├── ppeMetadataSourceMissing.json
│   │   │   │   ├── ppeMetadataSourceValuesNotUnique.json
│   │   │   │   ├── referenceDateTimeNotIso8601A.json
│   │   │   │   ├── referenceDateTimeNotIso8601B.json
│   │   │   │   ├── referenceDateTimeNotIso8601C.json
│   │   │   │   ├── referenceDateTimeNotIso8601D.json
│   │   │   │   ├── referenceSystemDefinitionMissing.json
│   │   │   │   ├── referenceSystemDescriptionInvalidType.json
│   │   │   │   ├── referenceSystemEpochInvalidType.json
│   │   │   │   ├── referenceSystemEpochMissing.json
│   │   │   │   ├── referenceSystemNameInvalidType.json
│   │   │   │   ├── referenceSystemNameMissing.json
│   │   │   │   ├── referenceSystemOrgWithIdInvalidType.json
│   │   │   │   ├── referenceSystemOrgWithIdMissing.json
│   │   │   │   ├── referenceSystemWithDefinitionAndEpoch.json
│   │   │   │   ├── referenceSystemWithDefinitionAndOrgWithId.json
│   │   │   │   ├── rotationThetasElementInvalidType.json
│   │   │   │   ├── rotationThetasInvalidLengthA.json
│   │   │   │   ├── rotationThetasInvalidLengthB.json
│   │   │   │   ├── sensorRecordCollectionUnitRecordsElementInvalidType.json
│   │   │   │   ├── sensorRecordCollectionUnitRecordsInvalidLength.json
│   │   │   │   ├── sensorRecordCollectionUnitRecordsInvalidType.json
│   │   │   │   ├── sensorRecordCollectionUnitRecordsMissing.json
│   │   │   │   ├── sensorRecordSensorIdInvalidType.json
│   │   │   │   ├── sensorRecordSensorIdMissing.json
│   │   │   │   ├── sensorRecordSensorModeInvalidType.json
│   │   │   │   ├── sensorRecordSensorModeMissing.json
│   │   │   │   ├── sensorRecordSensorTypeInvalidType.json
│   │   │   │   ├── sensorRecordSensorTypeMissing.json
│   │   │   │   ├── sensorRecordsSensorModeMissing.json
│   │   │   │   ├── sensorRecordsSensorTypeInvalidType.json
│   │   │   │   ├── sensorRecordsSensorTypeMissing.json
│   │   │   │   ├── spdcfAInvalidType.json
│   │   │   │   ├── spdcfAInvalidValueA.json
│   │   │   │   ├── spdcfAInvalidValueB.json
│   │   │   │   ├── spdcfAMissing.json
│   │   │   │   ├── spdcfAlphaInvalidType.json
│   │   │   │   ├── spdcfAlphaInvalidValueA.json
│   │   │   │   ├── spdcfAlphaInvalidValueB.json
│   │   │   │   ├── spdcfAlphaMissing.json
│   │   │   │   ├── spdcfBetaInvalidType.json
│   │   │   │   ├── spdcfBetaInvalidValueA.json
│   │   │   │   ├── spdcfBetaInvalidValueB.json
│   │   │   │   ├── spdcfBetaMissing.json
│   │   │   │   ├── spdcfTInvalidType.json
│   │   │   │   ├── spdcfTInvalidValue.json
│   │   │   │   ├── spdcfTMissing.json
│   │   │   │   ├── threeDimConformalParamsCovarianceElementInvalidType.json
│   │   │   │   ├── threeDimConformalParamsCovarianceInvalidLengthFor4A.json
│   │   │   │   ├── threeDimConformalParamsCovarianceInvalidLengthFor4B.json
│   │   │   │   ├── threeDimConformalParamsCovarianceInvalidType.json
│   │   │   │   ├── threeDimConformalParamsCovarianceMissing.json
│   │   │   │   ├── threeDimConformalParamsFlagsElementInvalidType.json
│   │   │   │   ├── threeDimConformalParamsFlagsInvalidLengthA.json
│   │   │   │   ├── threeDimConformalParamsFlagsInvalidLengthB.json
│   │   │   │   ├── threeDimConformalParamsFlagsInvalidType.json
│   │   │   │   ├── threeDimConformalParamsFlagsInvalidValues.json
│   │   │   │   ├── threeDimConformalParamsFlagsMissing.json
│   │   │   │   ├── threeDimConformalParamsNormalizingScaleFactorInvalidType.json
│   │   │   │   ├── threeDimConformalParamsNormalizingScaleFactorMissing.json
│   │   │   │   ├── threeDimConformalParamsParametersElementInvalidType.json
│   │   │   │   ├── threeDimConformalParamsParametersInvalidLengthFor4A.json
│   │   │   │   ├── threeDimConformalParamsParametersInvalidLengthFor4B.json
│   │   │   │   ├── threeDimConformalParamsParametersInvalidType.json
│   │   │   │   ├── threeDimConformalParamsParametersMissing.json
│   │   │   │   ├── threeDimConformalParamsRecenteringElementInvalidType.json
│   │   │   │   ├── threeDimConformalParamsRecenteringInvalidLengthA.json
│   │   │   │   ├── threeDimConformalParamsRecenteringInvalidLengthB.json
│   │   │   │   ├── threeDimConformalParamsRecenteringInvalidType.json
│   │   │   │   ├── threeDimConformalParamsRecenteringMissing.json
│   │   │   │   ├── unitVectorInvalidElementValueA.json
│   │   │   │   ├── unitVectorInvalidElementValueB.json
│   │   │   │   ├── unitVectorInvalidLength.json
│   │   │   │   ├── unitVectorNotUnitLengthA.json
│   │   │   │   ├── unitVectorNotUnitLengthB.json
│   │   │   │   ├── unmodeledErrorCorrParamsInvalidElementType.json
│   │   │   │   ├── unmodeledErrorCorrParamsInvalidLengthA.json
│   │   │   │   ├── unmodeledErrorCorrParamsInvalidLengthB.json
│   │   │   │   ├── unmodeledErrorCorrParamsInvalidType.json
│   │   │   │   ├── unmodeledErrorCorrParamsMissing.json
│   │   │   │   ├── unmodeledErrorCorrRotationThetasInvalidType.json
│   │   │   │   ├── unmodeledErrorCorrRotationThetasMissing.json
│   │   │   │   ├── unmodeledErrorPostCovarianceInvalidType.json
│   │   │   │   ├── unmodeledErrorPostCovarianceMissing.json
│   │   │   │   ├── unmodeledErrorPostPositionInvalidType.json
│   │   │   │   ├── unmodeledErrorPostPositionMissing.json
│   │   │   │   ├── unmodeledErrorPostsElementInvalidType.json
│   │   │   │   ├── unmodeledErrorPostsInvalidType.json
│   │   │   │   ├── unmodeledErrorPostsMissing.json
│   │   │   │   ├── unmodeledErrorUniqueIdInvalidType.json
│   │   │   │   ├── unmodeledErrorUniqueIdMissing.json
│   │   │   │   └── validTileset.json
│   │   │   ├── maxarContentGeojson/
│   │   │   │   ├── bareGeometryTileset.json
│   │   │   │   ├── bare_geometry.geojson
│   │   │   │   ├── content_schema.json
│   │   │   │   ├── duplicatePropertyIdsTileset.json
│   │   │   │   ├── duplicate_property_ids_schema.json
│   │   │   │   ├── extensionsUsedButNotRequiredTileset.json
│   │   │   │   ├── geometryCollection.geojson
│   │   │   │   ├── geometryCollectionTileset.json
│   │   │   │   ├── invalid.geojson
│   │   │   │   ├── invalidDefaultTypesTileset.json
│   │   │   │   ├── invalidExtensionObject.json
│   │   │   │   ├── invalidGeojsonTileset.json
│   │   │   │   ├── invalidMinMaxOnNonNumericType.json
│   │   │   │   ├── invalidMinMaxTileset.json
│   │   │   │   ├── invalidPropertiesSchemaUri.json
│   │   │   │   ├── invalidRequiredWithDefaultTileset.json
│   │   │   │   ├── invalidSchemaContent.json
│   │   │   │   ├── invalidTilesetWithGeojson.json
│   │   │   │   ├── invalidUriFormat.json
│   │   │   │   ├── invalid_content_schema.json
│   │   │   │   ├── invalid_default_types_schema.json
│   │   │   │   ├── invalid_min_max_schema.json
│   │   │   │   ├── invalid_minmax_schema.json
│   │   │   │   ├── invalid_required_with_default_schema.json
│   │   │   │   ├── lineString.geojson
│   │   │   │   ├── nonExistentSchema.json
│   │   │   │   ├── test_schema.json
│   │   │   │   ├── validOptionalWithoutDefaultsTileset.json
│   │   │   │   ├── validTilesetWithMaxarContentGeojson.json
│   │   │   │   ├── validWithPropertiesSchemaUri.json
│   │   │   │   ├── valid_optional_without_defaults_schema.json
│   │   │   │   └── vegetation_schema.json
│   │   │   ├── maxarExtent/
│   │   │   │   ├── collinearOverlap.geojson
│   │   │   │   ├── collinearOverlapTileset.json
│   │   │   │   ├── extent.geojson
│   │   │   │   ├── extentOverflowingTileTileset.json
│   │   │   │   ├── extent_overflowing_tile.geojson
│   │   │   │   ├── insufficientCoordinates.geojson
│   │   │   │   ├── insufficientCoordinatesTileset.json
│   │   │   │   ├── internalTouchRing.geojson
│   │   │   │   ├── internalTouchRingTileset.json
│   │   │   │   ├── invalidEmptyUri.json
│   │   │   │   ├── invalidGeojsonContent.json
│   │   │   │   ├── invalidGeometryTypes.geojson
│   │   │   │   ├── invalidGeometryTypesTileset.json
│   │   │   │   ├── invalidMissingUri.json
│   │   │   │   ├── invalidNonResolvableUri.json
│   │   │   │   ├── invalidSpatialExtent.json
│   │   │   │   ├── invalidUriType.json
│   │   │   │   ├── invalid_extent.geojson
│   │   │   │   ├── large_extent.geojson
│   │   │   │   ├── nearMiss.geojson
│   │   │   │   ├── nearMissTileset.json
│   │   │   │   ├── nearVertexOnOtherSideFail.geojson
│   │   │   │   ├── nearVertexOnOtherSideFailTileset.json
│   │   │   │   ├── nearVertexOnOtherSideOk.geojson
│   │   │   │   ├── nearVertexOnOtherSideOkTileset.json
│   │   │   │   ├── overlappingRings.geojson
│   │   │   │   ├── overlappingRingsTileset.json
│   │   │   │   ├── selfIntersecting.geojson
│   │   │   │   ├── selfIntersectingTileset.json
│   │   │   │   ├── small_extent.geojson
│   │   │   │   ├── trueCrossing.geojson
│   │   │   │   ├── trueCrossingTileset.json
│   │   │   │   ├── validPolygonsOnly.geojson
│   │   │   │   ├── validPolygonsOnlyTileset.json
│   │   │   │   ├── validTilesetWithMaxarExtent.json
│   │   │   │   └── validTilesetWithSpatialExtent.json
│   │   │   ├── maxarGrid/
│   │   │   │   ├── invalidBoundingBoxLength.json
│   │   │   │   ├── invalidBoundingBoxSemantics.json
│   │   │   │   ├── invalidCenterLength.json
│   │   │   │   ├── invalidCoordinateSystemType.json
│   │   │   │   ├── invalidCoordinateSystemValue.json
│   │   │   │   ├── invalidElevation.json
│   │   │   │   ├── invalidGridType.json
│   │   │   │   ├── invalidIndexLength.json
│   │   │   │   ├── invalidS2GridWithCenter.json
│   │   │   │   ├── invalidS2GridWithSize.json
│   │   │   │   ├── invalidS2GridWithSrs.json
│   │   │   │   ├── invalidSizeLength.json
│   │   │   │   ├── invalidSrsReferenceSystem.json
│   │   │   │   ├── invalidTileLevel.json
│   │   │   │   ├── validS2Grid.json
│   │   │   │   ├── validTilesetWithMaxarGrid.json
│   │   │   │   └── validTilesetWithVriconGrid.json
│   │   │   └── vriconClass/
│   │   │       └── validTilesetWithVriconClass.json
│   │   ├── gltfExtensions/
│   │   │   ├── FeatureIdAttributeAndPropertyTableFeatureIdNotInRange.gltf
│   │   │   ├── FeatureIdAttributeAndPropertyTableWithValueNotInRange.gltf
│   │   │   ├── FeatureIdAttributePropertyTableInvalidValue.gltf
│   │   │   ├── FeatureIdAttributePropertyTableWithoutPropertyTables.gltf
│   │   │   ├── FeatureIdAttributePropertyTableWithoutStructuralMetadata.gltf
│   │   │   ├── FeatureIdTextureAndPropertyTableFeatureIdNotInRange.gltf
│   │   │   ├── ValidFeatureIdAttributeAndPropertyTable.gltf
│   │   │   ├── ValidFeatureIdTextureAndPropertyTable.gltf
│   │   │   ├── gpmLocal/
│   │   │   │   ├── ValidGltfGpmLocal.gltf
│   │   │   │   ├── ValidMeshPrimitiveGpmLocal.gltf
│   │   │   │   ├── anchorPointDirectAdjustmentParamsInvalidElementType.gltf
│   │   │   │   ├── anchorPointDirectAdjustmentParamsInvalidLength.gltf
│   │   │   │   ├── anchorPointDirectAdjustmentParamsInvalidType.gltf
│   │   │   │   ├── anchorPointDirectAdjustmentParamsMissing.gltf
│   │   │   │   ├── anchorPointDirectPositionInvalidLength.gltf
│   │   │   │   ├── anchorPointDirectPositionInvalidType.gltf
│   │   │   │   ├── anchorPointDirectPositionMissing.gltf
│   │   │   │   ├── anchorPointIndirectAdjustmentParamsInvalidElementType.gltf
│   │   │   │   ├── anchorPointIndirectAdjustmentParamsInvalidLength.gltf
│   │   │   │   ├── anchorPointIndirectAdjustmentParamsInvalidType.gltf
│   │   │   │   ├── anchorPointIndirectAdjustmentParamsMissing.gltf
│   │   │   │   ├── anchorPointIndirectCovarianceInvalidLength.gltf
│   │   │   │   ├── anchorPointIndirectCovarianceMatrixInvalidElementType.gltf
│   │   │   │   ├── anchorPointIndirectCovarianceMatrixInvalidType.gltf
│   │   │   │   ├── anchorPointIndirectCovarianceMatrixMissing.gltf
│   │   │   │   ├── anchorPointIndirectPositionInvalidElementType.gltf
│   │   │   │   ├── anchorPointIndirectPositionInvalidLength.gltf
│   │   │   │   ├── anchorPointIndirectPositionInvalidType.gltf
│   │   │   │   ├── anchorPointIndirectPositionMissing.gltf
│   │   │   │   ├── anchorPointsDirectInvalidElementType.gltf
│   │   │   │   ├── anchorPointsDirectInvalidLength.gltf
│   │   │   │   ├── anchorPointsDirectInvalidType.gltf
│   │   │   │   ├── anchorPointsIndirectInvalidElementType.gltf
│   │   │   │   ├── anchorPointsIndirectInvalidLength.gltf
│   │   │   │   ├── anchorPointsIndirectInvalidType.gltf
│   │   │   │   ├── correlationGroupGroupFlagsElementInvalidType.gltf
│   │   │   │   ├── correlationGroupGroupFlagsInvalidLength.gltf
│   │   │   │   ├── correlationGroupGroupFlagsInvalidType.gltf
│   │   │   │   ├── correlationGroupGroupFlagsMissing.gltf
│   │   │   │   ├── correlationGroupParamsInvalidElementType.gltf
│   │   │   │   ├── correlationGroupParamsInvalidLength.gltf
│   │   │   │   ├── correlationGroupParamsInvalidType.gltf
│   │   │   │   ├── correlationGroupParamsMissing.gltf
│   │   │   │   ├── correlationGroupRotationThetasInvalidElementType.gltf
│   │   │   │   ├── correlationGroupRotationThetasInvalidLength.gltf
│   │   │   │   ├── correlationGroupRotationThetasInvalidType.gltf
│   │   │   │   ├── correlationGroupRotationThetasMissing.gltf
│   │   │   │   ├── covarianceDirectUpperTriangleElementInvalidType.gltf
│   │   │   │   ├── covarianceDirectUpperTriangleInconsistentLength.gltf
│   │   │   │   ├── covarianceDirectUpperTriangleInvalidLength.gltf
│   │   │   │   ├── directAnchorPointsDirectMissing.gltf
│   │   │   │   ├── directCovarianceDirectUpperTriangleMissing.gltf
│   │   │   │   ├── directWithAnchorPointsIndirect.gltf
│   │   │   │   ├── directWithIntraTileCorrelationGroups.gltf
│   │   │   │   ├── indirectAnchorPointsIndirectMissing.gltf
│   │   │   │   ├── indirectIntraTileCorrelationGroupsMissing.gltf
│   │   │   │   ├── indirectWithAnchorPointsDirect.gltf
│   │   │   │   ├── indirectWithCovarianceDirectUpperTriangle.gltf
│   │   │   │   ├── intraTileCorrelationGroupsInvalidElementType.gltf
│   │   │   │   ├── intraTileCorrelationGroupsInvalidLength.gltf
│   │   │   │   ├── intraTileCorrelationGroupsInvalidType.gltf
│   │   │   │   ├── ppeMetadataMaxInvalidType.gltf
│   │   │   │   ├── ppeMetadataMinInvalidType.gltf
│   │   │   │   ├── ppeMetadataSourceInvalidType.gltf
│   │   │   │   ├── ppeMetadataSourceInvalidValue.gltf
│   │   │   │   ├── ppeTextureIndexInvalidType.gltf
│   │   │   │   ├── ppeTextureIndexInvalidValue.gltf
│   │   │   │   ├── ppeTextureNoDataInvalidType.gltf
│   │   │   │   ├── ppeTextureNoDataInvalidValue.gltf
│   │   │   │   ├── ppeTextureOffsetInvalidType.gltf
│   │   │   │   ├── ppeTextureScaleInvalidType.gltf
│   │   │   │   ├── ppeTextureTexCoordInvalidType.gltf
│   │   │   │   ├── ppeTextureTexCoordInvalidValue.gltf
│   │   │   │   ├── ppeTextureTraitsInvalidType.gltf
│   │   │   │   ├── ppeTextureTraitsMissing.gltf
│   │   │   │   ├── ppeTexturesInvalidElementType.gltf
│   │   │   │   ├── ppeTexturesInvalidLength.gltf
│   │   │   │   ├── ppeTexturesInvalidType.gltf
│   │   │   │   ├── spdcfAInvalidType.gltf
│   │   │   │   ├── spdcfAInvalidValueA.gltf
│   │   │   │   ├── spdcfAInvalidValueB.gltf
│   │   │   │   ├── spdcfAMissing.gltf
│   │   │   │   ├── spdcfAlphaInvalidType.gltf
│   │   │   │   ├── spdcfAlphaInvalidValueA.gltf
│   │   │   │   ├── spdcfAlphaInvalidValueB.gltf
│   │   │   │   ├── spdcfAlphaMissing.gltf
│   │   │   │   ├── spdcfBetaInvalidType.gltf
│   │   │   │   ├── spdcfBetaInvalidValueA.gltf
│   │   │   │   ├── spdcfBetaInvalidValueB.gltf
│   │   │   │   ├── spdcfBetaMissing.gltf
│   │   │   │   ├── spdcfTInvalidType.gltf
│   │   │   │   ├── spdcfTInvalidValue.gltf
│   │   │   │   ├── spdcfTMissing.gltf
│   │   │   │   ├── storageTypeInvalidValue.gltf
│   │   │   │   └── storageTypeMissing.gltf
│   │   │   ├── instanceFeatures/
│   │   │   │   ├── InstanceFeaturesFeatureIdAttributeInvalidValue.gltf
│   │   │   │   ├── InstanceFeaturesWithoutMeshGpuInstancing.gltf
│   │   │   │   └── ValidInstanceFeatures.gltf
│   │   │   ├── khrLightsPunctual/
│   │   │   │   ├── maxarTemporalLightTraits/
│   │   │   │   │   ├── invalidDutyWithSineWaveform.gltf
│   │   │   │   │   ├── invalidDutyWithTriangleWaveform.gltf
│   │   │   │   │   ├── invalidMissingWaveform.gltf
│   │   │   │   │   ├── invalidUndeclaredExtension.gltf
│   │   │   │   │   ├── invalidWaveform.gltf
│   │   │   │   │   ├── validDutyWithSquareWaveform.gltf
│   │   │   │   │   └── validTemporalLightTraits.gltf
│   │   │   │   ├── validKhrLightsPunctual.gltf
│   │   │   │   ├── validTilesetWithInvalidKhrLightsPunctual.json
│   │   │   │   └── validTilesetWithKhrLightsPunctual.json
│   │   │   ├── maxarImageOrtho/
│   │   │   │   ├── invalidCoordinateSystem.gltf
│   │   │   │   ├── invalidMissingSrs.gltf
│   │   │   │   ├── invalidTransformLength.gltf
│   │   │   │   └── validMaxarImageOrtho.gltf
│   │   │   ├── maxarNonvisualGeometry/
│   │   │   │   ├── NodeExtensionMeshInvalidType.gltf
│   │   │   │   ├── NodeExtensionMeshInvalidValue.gltf
│   │   │   │   ├── NodeExtensionMeshMissing.gltf
│   │   │   │   ├── NodeExtensionMeshNotFound.gltf
│   │   │   │   ├── PrimitiveExtensionShapeInvalidType.gltf
│   │   │   │   ├── PrimitiveExtensionShapeInvalidValue.gltf
│   │   │   │   ├── PrimitiveExtensionShapeMissing.gltf
│   │   │   │   ├── PrimitiveExtensionTypeEmpty.gltf
│   │   │   │   ├── PrimitiveExtensionTypeInvalidType.gltf
│   │   │   │   ├── PrimitiveExtensionTypeMissing.gltf
│   │   │   │   ├── ShapePathIncompatibleMode.gltf
│   │   │   │   ├── ShapePointsIncompatibleMode.gltf
│   │   │   │   ├── ShapeSurfaceIncompatibleMode.gltf
│   │   │   │   ├── ShapeVolumeIncompatibleMode.gltf
│   │   │   │   ├── ValidComplexExample.gltf
│   │   │   │   ├── ValidNodeExtension.gltf
│   │   │   │   ├── ValidPrimitiveExtensionPath.gltf
│   │   │   │   ├── ValidPrimitiveExtensionPoints.gltf
│   │   │   │   ├── ValidPrimitiveExtensionSurface.gltf
│   │   │   │   └── ValidPrimitiveExtensionVolume.gltf
│   │   │   ├── meshFeatures/
│   │   │   │   ├── FeatureIdAttributeAccessorNormalized.gltf
│   │   │   │   ├── FeatureIdAttributeAccessorNotScalar.gltf
│   │   │   │   ├── FeatureIdAttributeAttributeInvalidType.gltf
│   │   │   │   ├── FeatureIdAttributeAttributeInvalidValue.gltf
│   │   │   │   ├── FeatureIdAttributeFeatureCountInvalidType.gltf
│   │   │   │   ├── FeatureIdAttributeFeatureCountInvalidValue.gltf
│   │   │   │   ├── FeatureIdAttributeFeatureCountMismatch.gltf
│   │   │   │   ├── FeatureIdAttributeFeatureCountMismatchForNullFeatureId.gltf
│   │   │   │   ├── FeatureIdAttributeFeatureCountMissing.gltf
│   │   │   │   ├── FeatureIdAttributeLabelInvalidType.gltf
│   │   │   │   ├── FeatureIdAttributeLabelInvalidValue.gltf
│   │   │   │   ├── FeatureIdAttributeNullFeatureIdInvalidType.gltf
│   │   │   │   ├── FeatureIdAttributeNullFeatureIdInvalidValue.gltf
│   │   │   │   ├── FeatureIdTextureFeatureCountMismatch.gltf
│   │   │   │   ├── FeatureIdTextureSamplerInvalidFilterMode.gltf
│   │   │   │   ├── FeatureIdTextureTextureChannelsInvalidElementType.gltf
│   │   │   │   ├── FeatureIdTextureTextureChannelsInvalidType.gltf
│   │   │   │   ├── FeatureIdTextureTextureChannelsTooManyChannels.gltf
│   │   │   │   ├── FeatureIdTextureTextureChannelsTooManyElements.gltf
│   │   │   │   ├── FeatureIdTextureTextureImageDataInvalid.gltf
│   │   │   │   ├── FeatureIdTextureTextureIndexInvalidType.gltf
│   │   │   │   ├── FeatureIdTextureTextureIndexInvalidValue.gltf
│   │   │   │   ├── FeatureIdTextureTextureInvalidType.gltf
│   │   │   │   ├── FeatureIdTextureTextureTexCoordInvalidType.gltf
│   │   │   │   ├── FeatureIdTextureTextureTexCoordInvalidValue.gltf
│   │   │   │   ├── README.md
│   │   │   │   ├── ValidFeatureIdAttribute.gltf
│   │   │   │   ├── ValidFeatureIdAttributeDefault/
│   │   │   │   │   └── ValidFeatureIdAttributeDefault.gltf
│   │   │   │   ├── ValidFeatureIdAttributeWithByteStride.glb
│   │   │   │   ├── ValidFeatureIdAttributeWithLargerFeatureCount.gltf
│   │   │   │   ├── ValidFeatureIdAttributeWithNullFeatureId.gltf
│   │   │   │   ├── ValidFeatureIdTexture.glb
│   │   │   │   ├── ValidFeatureIdTexture.gltf
│   │   │   │   └── ValidFeatureIdTextureUsingDefaultChannels.gltf
│   │   │   └── structuralMetadata/
│   │   │       ├── ExtensionInMeshPrimitiveWithoutTopLevelObject.gltf
│   │   │       ├── PropertyAttributesClassPropertyArray.gltf
│   │   │       ├── PropertyAttributesClassPropertyInvalidComponentType.gltf
│   │   │       ├── PropertyAttributesClassPropertyInvalidEnumValueType.gltf
│   │   │       ├── PropertyAttributesClassPropertyMaxNotInRange.gltf
│   │   │       ├── PropertyAttributesClassPropertyMinNotInRange.gltf
│   │   │       ├── PropertyAttributesClassPropertyString.gltf
│   │   │       ├── PropertyAttributesMeshPrimitivePropertyAttributesInvalidElementType.gltf
│   │   │       ├── PropertyAttributesMeshPrimitivePropertyAttributesInvalidElementValue.gltf
│   │   │       ├── PropertyAttributesMeshPrimitivePropertyAttributesInvalidLength.gltf
│   │   │       ├── PropertyAttributesMeshPrimitivePropertyAttributesInvalidType.gltf
│   │   │       ├── PropertyAttributesPropertyAttributePropertyInvalidAttribute.gltf
│   │   │       ├── PropertyAttributesPropertyAttributePropertyMaxMismatch.gltf
│   │   │       ├── PropertyAttributesPropertyAttributePropertyMaxNotInRange.gltf
│   │   │       ├── PropertyAttributesPropertyAttributePropertyMinMismatch.gltf
│   │   │       ├── PropertyAttributesPropertyAttributePropertyMinNotInRange.gltf
│   │   │       ├── PropertyTextureClassPropertyMaxNotInRange.gltf
│   │   │       ├── PropertyTextureClassPropertyMinNotInRange.gltf
│   │   │       ├── PropertyTextureClassPropertyWithOffsetScaleMinNotInRange.gltf
│   │   │       ├── PropertyTextureEnumsInvalidEnumValue.gltf
│   │   │       ├── PropertyTextureInvalidPropertyTypeA.gltf
│   │   │       ├── PropertyTextureInvalidPropertyTypeB.gltf
│   │   │       ├── PropertyTextureMeshPrimitivePropertyTextureTexCoordInvalidValue.gltf
│   │   │       ├── PropertyTextureMeshPrimitivePropertyTexturesInvalidElementType.gltf
│   │   │       ├── PropertyTextureMeshPrimitivePropertyTexturesInvalidElementValue.gltf
│   │   │       ├── PropertyTextureMeshPrimitivePropertyTexturesInvalidLength.gltf
│   │   │       ├── PropertyTextureMeshPrimitivePropertyTexturesInvalidType.gltf
│   │   │       ├── PropertyTexturePropertyChannelsSizeMismatch.gltf
│   │   │       ├── PropertyTexturePropertyIndexInvalidType.gltf
│   │   │       ├── PropertyTexturePropertyIndexInvalidValue.gltf
│   │   │       ├── PropertyTexturePropertyTexCoordDefault.gltf
│   │   │       ├── PropertyTexturePropertyTexCoordInvalidValue.gltf
│   │   │       ├── PropertyTexturePropertyTexturePropertyMaxMismatch.gltf
│   │   │       ├── PropertyTexturePropertyTexturePropertyMaxNotInRange.gltf
│   │   │       ├── PropertyTexturePropertyTexturePropertyMinMismatch.gltf
│   │   │       ├── PropertyTexturePropertyTexturePropertyMinNotInRange.gltf
│   │   │       ├── README.md
│   │   │       ├── StructuralMetadataMissingSchema.gltf
│   │   │       ├── StructuralMetadataSchemaAndSchemaUri.gltf
│   │   │       ├── ValidMultipleClasses.gltf
│   │   │       ├── ValidPropertyAttributes.gltf
│   │   │       ├── ValidPropertyTexture.gltf
│   │   │       └── ValidPropertyTextureEnums.gltf
│   │   ├── propertyTables/
│   │   │   ├── propertiesInvalidType.json
│   │   │   ├── propertiesMinPropertiesMismatch.json
│   │   │   ├── propertyArrayOffsetTypeInvalidType.json
│   │   │   ├── propertyArrayOffsetTypeInvalidValue.json
│   │   │   ├── propertyArrayOffsetsInvalidType.json
│   │   │   ├── propertyArrayOffsetsInvalidValue.json
│   │   │   ├── propertyClassInvalidType.json
│   │   │   ├── propertyClassInvalidValue.json
│   │   │   ├── propertyCountInvalidType.json
│   │   │   ├── propertyCountInvalidValue.json
│   │   │   ├── propertyIdInvalid.json
│   │   │   ├── propertyStringOffsetTypeInvalidType.json
│   │   │   ├── propertyStringOffsetTypeInvalidValue.json
│   │   │   ├── propertyStringOffsetsInvalidType.json
│   │   │   ├── propertyStringOffsetsInvalidValue.json
│   │   │   ├── propertyStringWithoutStringOffsets.json
│   │   │   ├── propertyValueMissing.json
│   │   │   ├── propertyValuesInvalidType.json
│   │   │   ├── propertyVariableLengthArrayWithMin.json
│   │   │   ├── propertyVariableLengthArrayWithOffset.json
│   │   │   └── propertyVariableLengthArrayWithoutArrayOffsets.json
│   │   ├── schemas/
│   │   │   ├── FullMetadataSchema.json
│   │   │   ├── metadataClassDescriptionInvalidType.json
│   │   │   ├── metadataClassNameInvalidType.json
│   │   │   ├── metadataClassPropertiesDuplicateSemantics.json
│   │   │   ├── metadataClassPropertiesEmpty.json
│   │   │   ├── metadataClassPropertiesNameInvalid.json
│   │   │   ├── metadataClassPropertyArrayInvalidType.json
│   │   │   ├── metadataClassPropertyComponentTypeForTypeWithoutComponents.json
│   │   │   ├── metadataClassPropertyComponentTypeInvalidType.json
│   │   │   ├── metadataClassPropertyComponentTypeInvalidValue.json
│   │   │   ├── metadataClassPropertyComponentTypeMissing.json
│   │   │   ├── metadataClassPropertyCountInvalidType.json
│   │   │   ├── metadataClassPropertyCountInvalidValue.json
│   │   │   ├── metadataClassPropertyCountWithoutArray.json
│   │   │   ├── metadataClassPropertyDefaultWithRequired.json
│   │   │   ├── metadataClassPropertyDescriptionInvalidType.json
│   │   │   ├── metadataClassPropertyEnumTypeForNonEnumType.json
│   │   │   ├── metadataClassPropertyEnumTypeInvalidType.json
│   │   │   ├── metadataClassPropertyEnumTypeMissingForEnumType.json
│   │   │   ├── metadataClassPropertyEnumTypeNotFound.json
│   │   │   ├── metadataClassPropertyEnumTypeWithoutEnums.json
│   │   │   ├── metadataClassPropertyMaxForNonNumericType.json
│   │   │   ├── metadataClassPropertyMinForNonNumericType.json
│   │   │   ├── metadataClassPropertyMinForVariableLengthArray.json
│   │   │   ├── metadataClassPropertyNameInvalidType.json
│   │   │   ├── metadataClassPropertyNoDataForBoolean.json
│   │   │   ├── metadataClassPropertyNoDataInvalidEnumValueName.json
│   │   │   ├── metadataClassPropertyNoDataInvalidEnumValueNames.json
│   │   │   ├── metadataClassPropertyNoDataTypeMismatchA.json
│   │   │   ├── metadataClassPropertyNoDataTypeMismatchB.json
│   │   │   ├── metadataClassPropertyNoDataTypeMismatchC.json
│   │   │   ├── metadataClassPropertyNoDataWithRequired.json
│   │   │   ├── metadataClassPropertyNormalizedForNonIntegerComponentType.json
│   │   │   ├── metadataClassPropertyNormalizedForUnnormalizableType.json
│   │   │   ├── metadataClassPropertyNormalizedInvalidType.json
│   │   │   ├── metadataClassPropertyOffsetForNonFloatingPointTypeA.json
│   │   │   ├── metadataClassPropertyOffsetForNonFloatingPointTypeB.json
│   │   │   ├── metadataClassPropertyOffsetForVariableLengthArray.json
│   │   │   ├── metadataClassPropertyOffsetTypeMismatchA.json
│   │   │   ├── metadataClassPropertyOffsetTypeMismatchB.json
│   │   │   ├── metadataClassPropertyOffsetTypeMismatchC.json
│   │   │   ├── metadataClassPropertyOffsetTypeMismatchD.json
│   │   │   ├── metadataClassPropertyOffsetTypeMismatchE.json
│   │   │   ├── metadataClassPropertyOffsetTypeMismatchF.json
│   │   │   ├── metadataClassPropertyOffsetTypeMismatchG.json
│   │   │   ├── metadataClassPropertyRequiredInvalidType.json
│   │   │   ├── metadataClassPropertyScaleForNonFloatingPointType.json
│   │   │   ├── metadataClassPropertyScaleForNonFloatingPointTypeB.json
│   │   │   ├── metadataClassPropertySemanticArrayMismatchA.json
│   │   │   ├── metadataClassPropertySemanticArrayMismatchB.json
│   │   │   ├── metadataClassPropertySemanticComponentTypeMismatchA.json
│   │   │   ├── metadataClassPropertySemanticComponentTypeMismatchB.json
│   │   │   ├── metadataClassPropertySemanticCountMismatch.json
│   │   │   ├── metadataClassPropertySemanticGeneric.json
│   │   │   ├── metadataClassPropertySemanticInvalidType.json
│   │   │   ├── metadataClassPropertySemanticNormalizedMismatch.json
│   │   │   ├── metadataClassPropertySemanticTypeMismatch.json
│   │   │   ├── metadataClassPropertySemanticUnknown.json
│   │   │   ├── metadataClassPropertyTypeInvalidType.json
│   │   │   ├── metadataClassPropertyTypeInvalidValue.json
│   │   │   ├── metadataClassPropertyTypeMissing.json
│   │   │   ├── metadataClassesInvalidType.json
│   │   │   ├── metadataClassesNameInvalid.json
│   │   │   ├── metadataEnumDescriptionInvalidType.json
│   │   │   ├── metadataEnumNameInvalidType.json
│   │   │   ├── metadataEnumValueDescriptionInvalidType.json
│   │   │   ├── metadataEnumValueNameInvalidType.json
│   │   │   ├── metadataEnumValueNotInDefaultValueTypeRange.json
│   │   │   ├── metadataEnumValueNotInValueTypeRange.json
│   │   │   ├── metadataEnumValueTypeInvalid.json
│   │   │   ├── metadataEnumValueTypeInvalidType.json
│   │   │   ├── metadataEnumValueTypeInvalidValue.json
│   │   │   ├── metadataEnumValueValueInvalidType.json
│   │   │   ├── metadataEnumValuesDuplicateName.json
│   │   │   ├── metadataEnumValuesDuplicateValue.json
│   │   │   ├── metadataEnumValuesEmpty.json
│   │   │   ├── metadataEnumValuesMissing.json
│   │   │   ├── metadataEnumsInvalidName.json
│   │   │   ├── metadataEnumsInvalidType.json
│   │   │   ├── schemaIdInvalidType.json
│   │   │   ├── schemaIdInvalidValue.json
│   │   │   ├── schemaIdMissing.json
│   │   │   ├── validSchema.json
│   │   │   └── validSchemaWithMinMax.json
│   │   ├── subtrees/
│   │   │   ├── binarySubtreeComputedLengthInvalid.subtree
│   │   │   ├── binarySubtreeInvalidBinaryByteLengthAlignment.subtree
│   │   │   ├── binarySubtreeInvalidJsonByteLengthAlignment.subtree
│   │   │   ├── binarySubtreeInvalidMagic.subtree
│   │   │   ├── binarySubtreeInvalidVersion.subtree
│   │   │   ├── binarySubtreeJsonInvalid.subtree
│   │   │   ├── binarySubtreeValid.subtree
│   │   │   ├── subtreeBufferViewsWithoutBuffers.json
│   │   │   ├── subtreeChildSubtreeAvailabilityInvalidType.json
│   │   │   ├── subtreeChildSubtreeAvailabilityMissing.json
│   │   │   ├── subtreeContentAvailabilityInvalidLength.json
│   │   │   ├── subtreeContentAvailabilityInvalidType.json
│   │   │   ├── subtreeContentMetadataArrayElementInvalidType.json
│   │   │   ├── subtreeContentMetadataArrayElementInvalidValueA.json
│   │   │   ├── subtreeContentMetadataArrayElementInvalidValueB.json
│   │   │   ├── subtreeContentMetadataInvalidLength.json
│   │   │   ├── subtreeContentMetadataInvalidType.json
│   │   │   ├── subtreeContentMetadataWithoutPropertyTables.json
│   │   │   ├── subtreePropertyTablesElementInvalidType.json
│   │   │   ├── subtreePropertyTablesInvalidLength.json
│   │   │   ├── subtreePropertyTablesInvalidType.json
│   │   │   ├── subtreeTileAvailabilityAvailableCountInvalid.json
│   │   │   ├── subtreeTileAvailabilityAvailableCountMismatch.json
│   │   │   ├── subtreeTileAvailabilityBitstreamAndConstant.json
│   │   │   ├── subtreeTileAvailabilityBitstreamInvalidType.json
│   │   │   ├── subtreeTileAvailabilityBitstreamInvalidValueA.json
│   │   │   ├── subtreeTileAvailabilityBitstreamInvalidValueB.json
│   │   │   ├── subtreeTileAvailabilityBitstreamInvalidValueC.json
│   │   │   ├── subtreeTileAvailabilityBitstreamLengthTooLarge.json
│   │   │   ├── subtreeTileAvailabilityBitstreamLengthTooSmall.json
│   │   │   ├── subtreeTileAvailabilityConstantInvalidType.json
│   │   │   ├── subtreeTileAvailabilityConstantInvalidValue.json
│   │   │   ├── subtreeTileAvailabilityForParentMissingForAvailableTile.json
│   │   │   ├── subtreeTileAvailabilityInvalidType.json
│   │   │   ├── subtreeTileAvailabilityMissing.json
│   │   │   ├── subtreeTileAvailabilityMissingForAvailableContent.json
│   │   │   ├── subtreeTileAvailabilityNeitherBitstreamNorConstant.json
│   │   │   ├── subtreeTileMetadataInvalidType.json
│   │   │   ├── subtreeTileMetadataInvalidValueA.json
│   │   │   ├── subtreeTileMetadataInvalidValueB.json
│   │   │   ├── validSubtree-0-0-0.json
│   │   │   ├── validSubtree.json
│   │   │   ├── validSubtreeBuffersWithoutBufferViews.json
│   │   │   ├── validSubtreeImplicitTiling.json.input
│   │   │   └── validSubtreeNoBuffers.json
│   │   └── tilesets/
│   │       ├── assetTilesetVersionInvalidType.json
│   │       ├── assetVersionInvalidType.json
│   │       ├── assetVersionMissing.json
│   │       ├── assetVersionUnknown.json
│   │       ├── boundingVolumeBoxArrayInvalidElementType.json
│   │       ├── boundingVolumeBoxInvalidArrayLength.json
│   │       ├── boundingVolumeMissingProperty.json
│   │       ├── boundingVolumeRegionArrayElementsOutOfRange.json
│   │       ├── boundingVolumeRegionArrayInvalidElementType.json
│   │       ├── boundingVolumeRegionInvalidArrayLength.json
│   │       ├── boundingVolumeSphereArrayElementOutOfRange.json
│   │       ├── boundingVolumeSphereArrayInvalidElementType.json
│   │       ├── boundingVolumeSphereInvalidArrayLength.json
│   │       ├── customSemanticsSchema.json
│   │       ├── extensionFoundButNotUsed.json
│   │       ├── extensionNotDeclaredAsRequired.json
│   │       ├── extensionNotDeclared_1_0_glTF.json
│   │       ├── extensionNotNecessary_1_1_glTF.json
│   │       ├── extensionRequiredButNotUsed.json
│   │       ├── extensionUsedButNotFound.json
│   │       ├── extensionsInvalidType.json
│   │       ├── extensionsRequiredDuplicateElement.json
│   │       ├── extensionsRequiredInvalidArrayLength.json
│   │       ├── extensionsRequiredInvalidType.json
│   │       ├── extensionsUsedDuplicateElement.json
│   │       ├── extensionsUsedInvalidArrayLength.json
│   │       ├── extensionsUsedInvalidType.json
│   │       ├── extensionsValueInvalidType.json
│   │       ├── externalTilesetExtensions/
│   │       │   ├── README.md
│   │       │   ├── declaredInBothContainedInExternal/
│   │       │   │   ├── external.json
│   │       │   │   └── tileset.json
│   │       │   ├── declaredInBothContainedInTileset/
│   │       │   │   ├── external.json
│   │       │   │   └── tileset.json
│   │       │   ├── declaredInExternalContainedInExternal/
│   │       │   │   ├── external.json
│   │       │   │   └── tileset.json
│   │       │   ├── declaredInExternalContainedInTileset/
│   │       │   │   ├── external.json
│   │       │   │   └── tileset.json
│   │       │   ├── declaredInNoneContainedInExternal/
│   │       │   │   ├── external.json
│   │       │   │   └── tileset.json
│   │       │   ├── declaredInTilesetContainedInExternal/
│   │       │   │   ├── external.json
│   │       │   │   └── tileset.json
│   │       │   └── declaredInTilesetContainedInTileset/
│   │       │       ├── external.json
│   │       │       └── tileset.json
│   │       ├── extrasUnexpectedType.json
│   │       ├── groupClassIdInvalid.json
│   │       ├── groupClassIdInvalidType.json
│   │       ├── groupWithoutSchema.json
│   │       ├── implicitTilingAvailableLevelsInvalidType.json
│   │       ├── implicitTilingAvailableLevelsInvalidValue.json
│   │       ├── implicitTilingContentUriTemplateVariableInvalid.json
│   │       ├── implicitTilingContentsUriTemplateVariableInvalid.json
│   │       ├── implicitTilingInvalidType.json
│   │       ├── implicitTilingRootWithChildren.json
│   │       ├── implicitTilingRootWithContentBoundingVolume.json
│   │       ├── implicitTilingRootWithMetadata.json
│   │       ├── implicitTilingSubdivisionSchemeInvalidType.json
│   │       ├── implicitTilingSubdivisionSchemeInvalidValue.json
│   │       ├── implicitTilingSubtreeLevelsInvalidType.json
│   │       ├── implicitTilingSubtreeLevelsInvalidValue.json
│   │       ├── implicitTilingSubtreesInvalidType.json
│   │       ├── implicitTilingSubtreesUriInvalidType.json
│   │       ├── implicitTilingSubtreesUriMissing.json
│   │       ├── implicitTilingSubtreesUriTemplateVariableInvalid.json
│   │       ├── implicitTilingSubtreesUriTemplateVariableMissing.json
│   │       ├── implicitTilingValid.json
│   │       ├── implicitTilingWithBoundingSphere.json
│   │       ├── invalidJson.json
│   │       ├── packages/
│   │       │   ├── tilesetPackageWithWarnings/
│   │       │   │   ├── TriangleWithWarnings/
│   │       │   │   │   └── TriangleWithWarnings.gltf
│   │       │   │   └── tileset.json
│   │       │   ├── tilesetPackageWithWarnings.3dtiles
│   │       │   ├── tilesetPackageWithWarnings.3tz
│   │       │   ├── validTilesetPackage/
│   │       │   │   ├── Triangle/
│   │       │   │   │   └── Triangle.gltf
│   │       │   │   └── tileset.json
│   │       │   ├── validTilesetPackage.3dtiles
│   │       │   ├── validTilesetPackage.3tz
│   │       │   ├── validTilesetPackageZipped.3dtiles
│   │       │   └── validTilesetPackageZipped.3tz
│   │       ├── propertiesInvalidType.json
│   │       ├── propertiesMaximumInvalidType.json
│   │       ├── propertiesMaximumMissing.json
│   │       ├── propertiesMinimumInvalidType.json
│   │       ├── propertiesMinimumLargerThanMaximum.json
│   │       ├── propertiesMinimumMissing.json
│   │       ├── statisticsClassesIdInvalid.json
│   │       ├── statisticsClassesInvalidType.json
│   │       ├── statisticsClassesMinPropertiesMismatch.json
│   │       ├── statisticsClassesPropertiesMinPropertiesMismatch.json
│   │       ├── statisticsClassesPropertiesPropertyNameInvalid.json
│   │       ├── statisticsClassesValueInvalidType.json
│   │       ├── statisticsClassesWithoutSchema.json
│   │       ├── tileChildrenEmptyArray.json
│   │       ├── tileContentBoundingVolumeInvalidType.json
│   │       ├── tileContentBoundingVolumeNotInTileBoundingVolume.json
│   │       ├── tileContentBoundingVolumeWithRotationTransform.json
│   │       ├── tileContentBoundingVolumeWithTransform.json
│   │       ├── tileContentGroupInvalidIndex.json
│   │       ├── tileContentGroupInvalidType.json
│   │       ├── tileContentGroupNegativeIndex.json
│   │       ├── tileContentGroupWithoutTilesetGroups.json
│   │       ├── tileContentInvalidType.json
│   │       ├── tileContentsInvalidType.json
│   │       ├── tileGeometricErrorMissing.json
│   │       ├── tileGeometricErrorNegative.json
│   │       ├── tileGeometricErrorNotSmallerThanParentGeometricError.json
│   │       ├── tileInvalidType.json
│   │       ├── tileMetadataClassInvalid.json
│   │       ├── tileMetadataClassInvalidType.json
│   │       ├── tileMetadataClassMissing.json
│   │       ├── tileMetadataGeometricErrorInconsistent.json
│   │       ├── tileMetadataRequiredPropertyMissing.json
│   │       ├── tileMetadataRequiredPropertyNull.json
│   │       ├── tileMetadataScalarValueNotInRange.json
│   │       ├── tileMetadataVec3ArrayElementValueNotInRange.json
│   │       ├── tileMetadataVec3ElementValueNotInRange.json
│   │       ├── tileMetadataWithoutSchema.json
│   │       ├── tileRefineInvalidValue.json
│   │       ├── tileRefineMissingInRoot.json
│   │       ├── tileRefineMissingInRootOfExternal.json
│   │       ├── tileRefineMissingInRootOfExternalA.json
│   │       ├── tileRefineWrongCase.json
│   │       ├── tileRefineWrongType.json
│   │       ├── tileTransformInvalidArrayElementType.json
│   │       ├── tileTransformInvalidArrayLength.json
│   │       ├── tileTransformInvalidType.json
│   │       ├── tileTransformNonInvertible.json
│   │       ├── tileTransformNotAffine.json
│   │       ├── tileWithContentAndContents.json
│   │       ├── tiles/
│   │       │   ├── 3tz/
│   │       │   │   ├── invalid.3tz
│   │       │   │   ├── simple.3tz
│   │       │   │   └── withError.3tz
│   │       │   ├── Notes.txt
│   │       │   ├── b3dm/
│   │       │   │   ├── invalid.b3dm
│   │       │   │   ├── invalidAlignment.b3dm
│   │       │   │   ├── invalidDueToWrongAlignmentWithGlbWithInfos.b3dm
│   │       │   │   ├── valid.b3dm
│   │       │   │   └── validWithInvalidGlb.b3dm
│   │       │   ├── cmpt/
│   │       │   │   └── validWithGlbInfo.cmpt
│   │       │   ├── geojson/
│   │       │   │   └── lineString.geojson
│   │       │   ├── geom/
│   │       │   │   └── content.geom
│   │       │   ├── glTF/
│   │       │   │   ├── Triangle/
│   │       │   │   │   └── Triangle.gltf
│   │       │   │   ├── TriangleGlbWithErrors/
│   │       │   │   │   └── TriangleGlbWithInvalidLength.glb
│   │       │   │   ├── TriangleWithErrors/
│   │       │   │   │   └── TriangleWithErrors.gltf
│   │       │   │   └── TriangleWithWarnings/
│   │       │   │       └── TriangleWithWarnings.gltf
│   │       │   ├── i3dm/
│   │       │   │   ├── i3dmWithUri/
│   │       │   │   │   ├── Box.glb
│   │       │   │   │   ├── README.md
│   │       │   │   │   ├── i3dmWithUri.i3dm
│   │       │   │   │   └── tileset.json
│   │       │   │   └── invalid.i3dm
│   │       │   ├── pnts/
│   │       │   │   └── invalid.pnts
│   │       │   └── vctr/
│   │       │       └── parent.vctr
│   │       ├── tilesetAssetMissing.json
│   │       ├── tilesetGeometricErrorMissing.json
│   │       ├── tilesetGeometricErrorNegative.json
│   │       ├── tilesetMetadataEntityPropertyEnumInvalidValue.json
│   │       ├── tilesetMetadataEntityPropertyMaxNotInRange.json
│   │       ├── tilesetMetadataEntityPropertyMaxWithNormalizedNotInRange.json
│   │       ├── tilesetMetadataEntityPropertyMaxWithOffsetNotInRange.json
│   │       ├── tilesetMetadataEntityPropertyMaxWithScaleNotInRange.json
│   │       ├── tilesetMetadataEntityPropertyMinNotInRange.json
│   │       ├── tilesetMetadataEntityPropertyMinWithNormalizedNotInRange.json
│   │       ├── tilesetMetadataEntityPropertyMinWithOffsetNotInRange.json
│   │       ├── tilesetMetadataEntityPropertyMinWithScaleNotInRange.json
│   │       ├── tilesetSchemaUriInvalidType.json
│   │       ├── tilesetWithCycleA.json
│   │       ├── tilesetWithCycleB.json
│   │       ├── tilesetWithCycleC.json
│   │       ├── tilesetWithMultipleExternal.json
│   │       ├── tilesetWithMultipleExternalA.json
│   │       ├── tilesetWithMultipleExternalA0.json
│   │       ├── tilesetWithMultipleExternalA1.json
│   │       ├── tilesetWithMultipleExternalB.json
│   │       ├── tilesetWithSchemaAndSchemaUri.json
│   │       ├── tilesetWithUnicodeBOM.json
│   │       ├── validTileset.json
│   │       ├── validTilesetWith3tzWithError.json
│   │       ├── validTilesetWithCustomSemantics.json
│   │       ├── validTilesetWithCustomSemanticsWithInvalidType.json
│   │       ├── validTilesetWithExternalValidTilesetWithValidB3dmWithInvalidGlb.json
│   │       ├── validTilesetWithGlbWithErrors.json
│   │       ├── validTilesetWithGltfWithErrors.json
│   │       ├── validTilesetWithGltfWithWarnings.json
│   │       ├── validTilesetWithIB3dmWithInvalidAlignment.json
│   │       ├── validTilesetWithInvalid3tz.json
│   │       ├── validTilesetWithInvalidB3dm.json
│   │       ├── validTilesetWithInvalidB3dmWithGlbWithInfos.json
│   │       ├── validTilesetWithInvalidI3dm.json
│   │       ├── validTilesetWithInvalidPnts.json
│   │       ├── validTilesetWithInvalidSchemaFromUri.json
│   │       ├── validTilesetWithSchema.json
│   │       ├── validTilesetWithTileMetadata.json
│   │       ├── validTilesetWithUnresolvableSchemaUri.json
│   │       ├── validTilesetWithValid3tz.json
│   │       ├── validTilesetWithValidB3dm.json
│   │       ├── validTilesetWithValidB3dmWithInvalidGlb.json
│   │       ├── validTilesetWithValidCmptWithGlbInfo.json
│   │       ├── validTilesetWithValidGltf.json
│   │       └── validTilesetWithValidSchemaFromUri.json
│   ├── extensions/
│   │   ├── BoundingVolumeS2ValidationSpec.ts
│   │   ├── ContentGltfValidationSpec.ts
│   │   ├── MaxarContentGeojonValidationSpec.ts
│   │   ├── MaxarExtentValidatorSpec.ts
│   │   ├── MaxarGridValidationSpec.ts
│   │   ├── MaxarGridValidatorSpec.ts
│   │   ├── NgaGpmValidatorSpec.ts
│   │   └── VriconClassValidationSpec.ts
│   ├── gltfExtensions/
│   │   ├── ExtInstanceFeaturesValidationSpec.ts
│   │   ├── ExtMeshFeaturesValidationSpec.ts
│   │   ├── ExtStructuralMetadataValidationSpec.ts
│   │   ├── ExtValidationSpec.ts
│   │   ├── KhrLightsPunctualValidationSpec.ts
│   │   ├── MaxarImageOrthoValidationSpec.ts
│   │   ├── MaxarNonvisualGeometryValidationSpec.ts
│   │   ├── MaxarTemporalLightTraits/
│   │   │   └── MaxarTemporalLightTraitsValidationSpec.ts
│   │   ├── NgaGpmLocalValidationSpec.ts
│   │   └── validateGltf.ts
│   ├── jasmine.json
│   └── metadata/
│       ├── BinaryPropertyTableValidationSpec.ts
│       ├── BinaryPropertyTableValuesValidationSpec.ts
│       ├── PropertyTableTestUtilities.ts
│       └── PropertyTableValidationSpec.ts
├── src/
│   ├── ValidatorMain.ts
│   ├── archives/
│   │   └── ArchiveValidation3tz.ts
│   ├── base/
│   │   ├── ResourceError.ts
│   │   ├── globMatcher.ts
│   │   ├── readJsonUnchecked.ts
│   │   └── writeUnchecked.ts
│   ├── index.ts
│   ├── issues/
│   │   ├── BinaryValidationIssues.ts
│   │   ├── ContentValidationIssues.ts
│   │   ├── GltfExtensionValidationIssues.ts
│   │   ├── IoValidationIssue.ts
│   │   ├── JsonValidationIssues.ts
│   │   ├── MetadataValidationIssues.ts
│   │   ├── SemanticValidationIssues.ts
│   │   ├── StructureValidationIssues.ts
│   │   ├── ValidationIssueUtils.ts
│   │   └── ValidationIssues.ts
│   ├── main.ts
│   ├── tileFormats/
│   │   ├── B3dmValidator.ts
│   │   ├── CmptValidator.ts
│   │   ├── GeojsonValidator.ts
│   │   ├── GltfValidator.ts
│   │   ├── I3dmValidator.ts
│   │   ├── PntsValidator.ts
│   │   ├── TileFormatValidator.ts
│   │   └── legacy/
│   │       ├── utility.ts
│   │       ├── validateBatchTable.ts
│   │       └── validateFeatureTable.ts
│   └── validation/
│       ├── AssetValidator.ts
│       ├── BasicValidator.ts
│       ├── BinaryBufferStructureValidator.ts
│       ├── BinaryValidator.ts
│       ├── BoundingVolumeValidator.ts
│       ├── ContentDataValidator.ts
│       ├── ContentDataValidators.ts
│       ├── ContentValidator.ts
│       ├── ExtendedObjectsValidators.ts
│       ├── ExtensionsDeclarationsValidator.ts
│       ├── ImplicitTilingValidator.ts
│       ├── NumberValidator.ts
│       ├── PropertiesValidator.ts
│       ├── RootPropertyValidator.ts
│       ├── StatisticsClassValidator.ts
│       ├── StatisticsValidator.ts
│       ├── StringValidator.ts
│       ├── StructureValidator.ts
│       ├── SubtreeConsistencyValidator.ts
│       ├── SubtreeInfoValidator.ts
│       ├── SubtreeValidator.ts
│       ├── TemplateUriValidator.ts
│       ├── TileContentValidator.ts
│       ├── TileValidator.ts
│       ├── TilesetPackageValidator.ts
│       ├── TilesetTraversingValidator.ts
│       ├── TilesetValidator.ts
│       ├── TransformValidator.ts
│       ├── ValidatedElement.ts
│       ├── ValidationContext.ts
│       ├── ValidationContexts.ts
│       ├── ValidationIssue.ts
│       ├── ValidationIssueFilter.ts
│       ├── ValidationIssueFilters.ts
│       ├── ValidationIssueSeverity.ts
│       ├── ValidationOptionChecks.ts
│       ├── ValidationOptions.ts
│       ├── ValidationResult.ts
│       ├── ValidationResults.ts
│       ├── ValidationState.ts
│       ├── Validator.ts
│       ├── Validators.ts
│       ├── extensions/
│       │   ├── BoundingVolumeS2ValidationIssues.ts
│       │   ├── BoundingVolumeS2Validator.ts
│       │   ├── ContentGltfValidator.ts
│       │   ├── MaxarContentGeojsonValidator.ts
│       │   ├── MaxarExtentValidator.ts
│       │   ├── MaxarGridValidator.ts
│       │   ├── NgaGpmValidator.ts
│       │   ├── gpm/
│       │   │   ├── NgaGpmValidationIssues.ts
│       │   │   └── NgaGpmValidatorCommon.ts
│       │   └── maxar/
│       │       └── MaxarValidatorCommon.ts
│       ├── gltf/
│       │   ├── Accessors.ts
│       │   ├── GltfData.ts
│       │   ├── GltfDataReader.ts
│       │   ├── GltfExtensionValidators.ts
│       │   ├── ImageData.ts
│       │   ├── ImageDataReader.ts
│       │   ├── SamplerValidator.ts
│       │   ├── TextureValidator.ts
│       │   ├── gpmLocal/
│       │   │   └── NgaGpmLocalValidator.ts
│       │   ├── imageOrtho/
│       │   │   └── MaxarImageOrthoValidator.ts
│       │   ├── instanceFeatures/
│       │   │   └── ExtInstanceFeaturesValidator.ts
│       │   ├── lightsPunctual/
│       │   │   ├── KhrLightsPunctualValidator.ts
│       │   │   └── MaxarTemporalLightTraits/
│       │   │       └── MaxarTemporalLightTraitsValidator.ts
│       │   ├── meshFeatures/
│       │   │   ├── ExtMeshFeaturesValidator.ts
│       │   │   ├── FeatureIdAccessorValidator.ts
│       │   │   └── FeatureIdValidator.ts
│       │   ├── nonvisualGeometry/
│       │   │   └── MaxarNonvisualGeometryValidator.ts
│       │   └── structuralMetadata/
│       │       ├── ExtStructuralMetadataValidator.ts
│       │       ├── PropertyAttributePropertyModel.ts
│       │       ├── PropertyAttributePropertyValidator.ts
│       │       ├── PropertyAttributeValidator.ts
│       │       ├── PropertyAttributeValuesValidator.ts
│       │       ├── PropertyAttributesDefinitionValidator.ts
│       │       ├── PropertyTableDefinitionValidator.ts
│       │       ├── PropertyTextureBooleanMetadataPropertyModel.ts
│       │       ├── PropertyTextureEnumMetadataPropertyModel.ts
│       │       ├── PropertyTextureMetadataPropertyModels.ts
│       │       ├── PropertyTextureNumericMetadataPropertyModel.ts
│       │       ├── PropertyTexturePropertyValidator.ts
│       │       ├── PropertyTextureValidator.ts
│       │       ├── PropertyTextureValuesValidator.ts
│       │       └── PropertyTexturesDefinitionValidator.ts
│       ├── legacy/
│       │   └── BoundingVolumeChecks.ts
│       └── metadata/
│           ├── BinaryPropertyTableDefaultMetadataPropertyModel.ts
│           ├── BinaryPropertyTableEnumMetadataPropertyModel.ts
│           ├── BinaryPropertyTableValidator.ts
│           ├── BinaryPropertyTableValuesValidator.ts
│           ├── ClassPropertySemanticsValidator.ts
│           ├── ClassPropertyValidator.ts
│           ├── ClassPropertyValueValidator.ts
│           ├── MetadataClassValidator.ts
│           ├── MetadataEntityValidator.ts
│           ├── MetadataEnumValidator.ts
│           ├── MetadataPropertyModel.ts
│           ├── MetadataPropertyValidator.ts
│           ├── MetadataPropertyValuesValidator.ts
│           ├── MetadataStructureValidator.ts
│           ├── MetadataValidationUtilities.ts
│           ├── MetadataValueValidationMessages.ts
│           ├── MetadataValueValidator.ts
│           ├── PropertyTablePropertyValidator.ts
│           ├── PropertyTableValidator.ts
│           ├── PropertyTablesDefinitionValidator.ts
│           ├── RangeIterables.ts
│           ├── SchemaDefinitionValidator.ts
│           └── SchemaValidator.ts
├── tools/
│   └── README.md
└── tsconfig.json
Download .txt
SYMBOL INDEX (762 symbols across 144 files)

FILE: demos/validationOptionsDemo.ts
  function runWithIncluded (line 8) | async function runWithIncluded() {
  function runWithoutIncluded (line 28) | async function runWithoutIncluded() {
  function runWithExcluded (line 48) | async function runWithExcluded() {
  function runWithoutExcluded (line 68) | async function runWithoutExcluded() {
  function runDemo (line 90) | async function runDemo() {

FILE: demos/validationResultDemos.ts
  function createDemoResult (line 10) | function createDemoResult() {
  function validationResultFilterDemo (line 104) | function validationResultFilterDemo() {
  function validationResultSerializationDemo (line 149) | function validationResultSerializationDemo() {

FILE: generateThirdParty.js
  function defaultValue (line 6) | function defaultValue(a, b) {
  function getLicenseDataFromPackage (line 12) | function getLicenseDataFromPackage(packageName, override) {
  function readThirdPartyExtraJson (line 53) | function readThirdPartyExtraJson() {
  function generateThirdParty (line 62) | async function generateThirdParty() {

FILE: specs/BasicValidatorSpec.ts
  function validateNumberRange (line 6) | function validateNumberRange(

FILE: specs/BinaryBufferStructureSpec.ts
  function readJsonUnchecked (line 20) | async function readJsonUnchecked(filePath: string): Promise<any> {
  function performTestValidation (line 36) | function performTestValidation(

FILE: specs/SubtreeValidationSpec.ts
  function validateSpecSubtreeFile (line 25) | async function validateSpecSubtreeFile(

FILE: specs/gltfExtensions/validateGltf.ts
  function validateGltf (line 10) | async function validateGltf(gltfFileName: string) {

FILE: specs/metadata/BinaryPropertyTableValuesValidationSpec.ts
  function prepareTest_example_INT16_SCALAR (line 16) | function prepareTest_example_INT16_SCALAR(
  function setClassPropertyOffsetScale (line 30) | function setClassPropertyOffsetScale(
  function setPropertyTablePropertyOffsetScale (line 43) | function setPropertyTablePropertyOffsetScale(
  function setClassPropertyMinMax (line 55) | function setClassPropertyMinMax(
  function setPropertyTablePropertyMinMax (line 68) | function setPropertyTablePropertyMinMax(

FILE: specs/metadata/PropertyTableTestUtilities.ts
  class PropertyTableTestUtilities (line 18) | class PropertyTableTestUtilities {
    method createDefaultBinaryPropertyTable_example_INT16_SCALAR (line 25) | static createDefaultBinaryPropertyTable_example_INT16_SCALAR(): Binary...
    method createDefaultBinaryPropertyTable_example_variable_length_INT16_SCALAR_array (line 55) | static createDefaultBinaryPropertyTable_example_variable_length_INT16_...
    method createDefaultBinaryPropertyTable_example_fixed_length_INT16_SCALAR_array (line 89) | static createDefaultBinaryPropertyTable_example_fixed_length_INT16_SCA...
    method createDefaultBinaryPropertyTable_example_BOOLEAN (line 124) | static createDefaultBinaryPropertyTable_example_BOOLEAN(): BinaryPrope...
    method createDefaultBinaryPropertyTable_example_variable_length_BOOLEAN_array (line 153) | static createDefaultBinaryPropertyTable_example_variable_length_BOOLEA...
    method createDefaultBinaryPropertyTable_example_fixed_length_BOOLEAN_array (line 186) | static createDefaultBinaryPropertyTable_example_fixed_length_BOOLEAN_a...
    method createDefaultBinaryPropertyTable_example_STRING (line 219) | static createDefaultBinaryPropertyTable_example_STRING(): BinaryProper...
    method createDefaultBinaryPropertyTable_example_variable_length_STRING_array (line 248) | static createDefaultBinaryPropertyTable_example_variable_length_STRING...
    method createDefaultBinaryPropertyTable_example_fixed_length_STRING_array (line 281) | static createDefaultBinaryPropertyTable_example_fixed_length_STRING_ar...
    method createDefaultBinaryPropertyTable_example_FLOAT32_VEC2 (line 315) | static createDefaultBinaryPropertyTable_example_FLOAT32_VEC2(): Binary...
    method createDefaultBinaryPropertyTable_example_variable_length_UINT32_VEC2_array (line 348) | static createDefaultBinaryPropertyTable_example_variable_length_UINT32...
    method createDefaultBinaryPropertyTable_example_fixed_length_UINT32_VEC2_array (line 389) | static createDefaultBinaryPropertyTable_example_fixed_length_UINT32_VE...
    method createDefaultBinaryPropertyTable_example_variable_length_ENUM_array (line 430) | static createDefaultBinaryPropertyTable_example_variable_length_ENUM_a...
    method createDefaultBinaryPropertyTable_example_ENUM_with_noData (line 480) | static createDefaultBinaryPropertyTable_example_ENUM_with_noData(): Bi...
    method createDefaultBinaryPropertyTable_example_fixed_length_normalized_INT64_VEC2_array (line 537) | static createDefaultBinaryPropertyTable_example_fixed_length_normalize...

FILE: src/ValidatorMain.ts
  class ValidatorMain (line 26) | class ValidatorMain {
    method performValidation (line 39) | static async performValidation(args: any, config: any) {
    method obtainReportFileName (line 107) | private static obtainReportFileName(
    method validateTilesetFile (line 120) | static async validateTilesetFile(
    method validateTilesetsDirectory (line 140) | static async validateTilesetsDirectory(
    method validateTileContentFile (line 185) | static async validateTileContentFile(
    method validateSchemaFile (line 205) | static async validateSchemaFile(
    method validateSubtreeFile (line 220) | static async validateSubtreeFile(
    method validateAllTilesetSpecFiles (line 241) | static async validateAllTilesetSpecFiles(
    method validateAllMetadataSchemaSpecFiles (line 265) | static async validateAllMetadataSchemaSpecFiles(
    method validateAllSubtreeSpecFiles (line 285) | static async validateAllSubtreeSpecFiles(
    method validateSubtreeSpecFile (line 305) | static async validateSubtreeSpecFile(
    method deriveReportFileName (line 340) | static deriveReportFileName(inputFileName: string): string | undefined {

FILE: src/archives/ArchiveValidation3tz.ts
  class ArchiveValidation3tz (line 13) | class ArchiveValidation3tz {
    method slowValidateIndex (line 14) | private static slowValidateIndex(
    method md5AsUInt64 (line 64) | private static md5AsUInt64(md5hashBuffer: Buffer) {
    method validateIndex (line 68) | static async validateIndex(

FILE: src/base/ResourceError.ts
  class ResourceError (line 5) | class ResourceError extends Error {
    method constructor (line 6) | constructor(message: string) {

FILE: src/base/globMatcher.ts
  function globMatcher (line 11) | function globMatcher(

FILE: src/base/readJsonUnchecked.ts
  function readJsonUnchecked (line 15) | async function readJsonUnchecked(filePath: string): Promise<any> {

FILE: src/base/writeUnchecked.ts
  function writeUnchecked (line 14) | async function writeUnchecked(

FILE: src/issues/BinaryValidationIssues.ts
  class BinaryValidationIssues (line 8) | class BinaryValidationIssues {
    method BINARY_INVALID (line 17) | static BINARY_INVALID(path: string, message: string) {
    method BINARY_INVALID_VALUE (line 34) | static BINARY_INVALID_VALUE(
    method _BINARY_INVALID_VALUE (line 45) | private static _BINARY_INVALID_VALUE(path: string, message: string) {
    method BINARY_INVALID_LENGTH (line 63) | static BINARY_INVALID_LENGTH(
    method _BINARY_INVALID_LENGTH (line 76) | private static _BINARY_INVALID_LENGTH(path: string, message: string) {
    method BINARY_INVALID_ALIGNMENT (line 92) | static BINARY_INVALID_ALIGNMENT(
    method _BINARY_INVALID_ALIGNMENT (line 106) | static _BINARY_INVALID_ALIGNMENT(path: string, message: string) {
    method BINARY_INVALID_ALIGNMENT_legacy (line 127) | static BINARY_INVALID_ALIGNMENT_legacy(

FILE: src/issues/ContentValidationIssues.ts
  class ContentValidationIssues (line 9) | class ContentValidationIssues {
    method createForContent (line 27) | static createForContent(
    method createForExternalTileset (line 55) | static createForExternalTileset(
    method createFrom (line 85) | private static createFrom(
    method createIssue (line 152) | private static createIssue(
    method CONTENT_VALIDATION_ERROR (line 173) | static CONTENT_VALIDATION_ERROR(path: string, message: string) {
    method CONTENT_VALIDATION_WARNING (line 190) | static CONTENT_VALIDATION_WARNING(path: string, message: string) {
    method CONTENT_VALIDATION_INFO (line 208) | static CONTENT_VALIDATION_INFO(path: string, message: string) {
    method CONTENT_JSON_INVALID (line 227) | static CONTENT_JSON_INVALID(path: string, message: string) {

FILE: src/issues/GltfExtensionValidationIssues.ts
  class GltfExtensionValidationIssues (line 8) | class GltfExtensionValidationIssues {
    method GLTF_INVALID (line 17) | static GLTF_INVALID(path: string, message: string) {
    method INVALID_GLTF_STRUCTURE (line 35) | static INVALID_GLTF_STRUCTURE(path: string, message: string) {
    method TEXTURE_CHANNELS_OUT_OF_RANGE (line 52) | static TEXTURE_CHANNELS_OUT_OF_RANGE(path: string, message: string) {
    method TEXTURE_CHANNELS_SIZE_MISMATCH (line 69) | static TEXTURE_CHANNELS_SIZE_MISMATCH(path: string, message: string) {
    method FEATURE_COUNT_MISMATCH (line 84) | static FEATURE_COUNT_MISMATCH(path: string, message: string) {
    method INVALID_METADATA_PROPERTY_TYPE (line 100) | static INVALID_METADATA_PROPERTY_TYPE(path: string, message: string) {

FILE: src/issues/IoValidationIssue.ts
  class IoValidationIssues (line 8) | class IoValidationIssues {
    method IO_ERROR (line 16) | static IO_ERROR(path: string, message: string) {
    method IO_WARNING (line 29) | static IO_WARNING(path: string, message: string) {
    method JSON_PARSE_ERROR (line 43) | static JSON_PARSE_ERROR(path: string, message: string) {

FILE: src/issues/JsonValidationIssues.ts
  class JsonValidationIssues (line 12) | class JsonValidationIssues {
    method PROPERTY_MISSING (line 21) | static PROPERTY_MISSING(path: string, name: string) {
    method _PROPERTY_MISSING (line 27) | private static _PROPERTY_MISSING(path: string, message: string) {
    method TYPE_MISMATCH (line 44) | static TYPE_MISMATCH(
    method _TYPE_MISMATCH (line 57) | private static _TYPE_MISMATCH(path: string, message: string) {
    method ARRAY_ELEMENT_TYPE_MISMATCH (line 75) | static ARRAY_ELEMENT_TYPE_MISMATCH(
    method _ARRAY_ELEMENT_TYPE_MISMATCH (line 89) | private static _ARRAY_ELEMENT_TYPE_MISMATCH(path: string, message: str...
    method ARRAY_ELEMENT_NOT_UNIQUE (line 106) | static ARRAY_ELEMENT_NOT_UNIQUE(path: string, name: string, item: any) {
    method VALUE_NOT_IN_RANGE (line 123) | static VALUE_NOT_IN_RANGE(path: string, message: string) {
    method VALUE_NOT_IN_LIST (line 138) | static VALUE_NOT_IN_LIST(path: string, message: string) {
    method ARRAY_LENGTH_MISMATCH (line 154) | static ARRAY_LENGTH_MISMATCH(path: string, message: string) {
    method ARRAY_LENGTH_UNEXPECTED (line 169) | static ARRAY_LENGTH_UNEXPECTED(path: string, message: string) {
    method STRING_LENGTH_MISMATCH (line 185) | static STRING_LENGTH_MISMATCH(path: string, message: string) {
    method NUMBER_OF_PROPERTIES_MISMATCH (line 201) | static NUMBER_OF_PROPERTIES_MISMATCH(path: string, message: string) {
    method STRING_PATTERN_MISMATCH (line 218) | static STRING_PATTERN_MISMATCH(
    method _STRING_PATTERN_MISMATCH (line 231) | private static _STRING_PATTERN_MISMATCH(path: string, message: string) {
    method STRING_VALUE_INVALID (line 248) | static STRING_VALUE_INVALID(path: string, message: string) {
    method ONE_OF_ERROR (line 264) | static ONE_OF_ERROR(path: string, name: string, ...properties: string[...
    method _ONE_OF_ERROR (line 271) | private static _ONE_OF_ERROR(path: string, message: string) {
    method ANY_OF_ERROR (line 287) | static ANY_OF_ERROR(path: string, name: string, ...properties: string[...
    method _ANY_OF_ERROR (line 296) | private static _ANY_OF_ERROR(path: string, message: string) {
    method TYPE_UNEXPECTED (line 316) | static TYPE_UNEXPECTED(
    method _TYPE_UNEXPECTED (line 329) | private static _TYPE_UNEXPECTED(path: string, message: string) {

FILE: src/issues/MetadataValidationIssues.ts
  class MetadataValidationIssues (line 8) | class MetadataValidationIssues {
    method METADATA_INVALID_LENGTH (line 20) | static METADATA_INVALID_LENGTH(path: string, message: string) {
    method METADATA_INVALID_ALIGNMENT (line 38) | static METADATA_INVALID_ALIGNMENT(path: string, message: string) {
    method METADATA_INVALID_OFFSETS (line 55) | static METADATA_INVALID_OFFSETS(path: string, message: string) {
    method METADATA_VALUE_NOT_IN_RANGE (line 75) | static METADATA_VALUE_NOT_IN_RANGE(path: string, message: string) {
    method METADATA_VALUE_MISMATCH (line 95) | static METADATA_VALUE_MISMATCH(path: string, message: string) {
    method METADATA_VALUE_REQUIRED_BUT_MISSING (line 111) | static METADATA_VALUE_REQUIRED_BUT_MISSING(
    method METADATA_SEMANTIC_UNKNOWN (line 133) | static METADATA_SEMANTIC_UNKNOWN(
    method METADATA_SEMANTIC_INVALID (line 160) | static METADATA_SEMANTIC_INVALID(path: string, message: string) {
    method CLASS_PROPERTY_COMPONENT_TYPE_FOR_NON_NUMERIC_TYPE (line 179) | static CLASS_PROPERTY_COMPONENT_TYPE_FOR_NON_NUMERIC_TYPE(
    method CLASS_PROPERTY_COMPONENT_TYPE_MISSING (line 204) | static CLASS_PROPERTY_COMPONENT_TYPE_MISSING(path: string, theType: st...
    method CLASS_PROPERTY_ENUMTYPE_WITH_NON_ENUM_TYPE (line 223) | static CLASS_PROPERTY_ENUMTYPE_WITH_NON_ENUM_TYPE(
    method CLASS_PROPERTY_ENUM_TYPE_WITHOUT_ENUMTYPE (line 244) | static CLASS_PROPERTY_ENUM_TYPE_WITHOUT_ENUMTYPE(path: string) {
    method CLASS_PROPERTY_ENUMTYPE_NOT_FOUND (line 263) | static CLASS_PROPERTY_ENUMTYPE_NOT_FOUND(path: string, enumType: strin...
    method CLASS_PROPERTY_ENUM_VALUE_NAME_NOT_FOUND (line 293) | static CLASS_PROPERTY_ENUM_VALUE_NAME_NOT_FOUND(
    method CLASS_PROPERTY_COUNT_FOR_NON_ARRAY (line 318) | static CLASS_PROPERTY_COUNT_FOR_NON_ARRAY(
    method CLASS_PROPERTY_NORMALIZED_FOR_NON_NORMALIZABLE_TYPE (line 343) | static CLASS_PROPERTY_NORMALIZED_FOR_NON_NORMALIZABLE_TYPE(
    method CLASS_PROPERTY_NORMALIZED_FOR_NON_INTEGER_COMPONENT_TYPE (line 369) | static CLASS_PROPERTY_NORMALIZED_FOR_NON_INTEGER_COMPONENT_TYPE(
    method METADATA_OFFSET_SCALE_FOR_NON_FLOATING_POINT_TYPE (line 402) | static METADATA_OFFSET_SCALE_FOR_NON_FLOATING_POINT_TYPE(
    method METADATA_MIN_MAX_FOR_NON_NUMERIC_TYPE (line 438) | static METADATA_MIN_MAX_FOR_NON_NUMERIC_TYPE(
    method CLASS_PROPERTY_INCONSISTENT (line 467) | static CLASS_PROPERTY_INCONSISTENT(path: string, message: string) {
    method METADATA_PROPERTY_INVALID_FOR_VARIABLE_LENGTH_ARRAY (line 490) | static METADATA_PROPERTY_INVALID_FOR_VARIABLE_LENGTH_ARRAY(
    method CLASS_PROPERTIES_DUPLICATE_SEMANTIC (line 517) | static CLASS_PROPERTIES_DUPLICATE_SEMANTIC(
    method ENUM_VALUE_DUPLICATE_NAME (line 541) | static ENUM_VALUE_DUPLICATE_NAME(path: string, name: string) {
    method ENUM_VALUE_DUPLICATE_VALUE (line 558) | static ENUM_VALUE_DUPLICATE_VALUE(path: string, value: number) {

FILE: src/issues/SemanticValidationIssues.ts
  class SemanticValidationIssues (line 9) | class SemanticValidationIssues {
    method ASSET_VERSION_UNKNOWN (line 20) | static ASSET_VERSION_UNKNOWN(path: string, message: string) {
    method TILE_REFINE_WRONG_CASE (line 39) | static TILE_REFINE_WRONG_CASE(path: string, message: string) {
    method TILE_REFINE_MISSING_IN_ROOT (line 54) | static TILE_REFINE_MISSING_IN_ROOT(path: string, message: string) {
    method TILE_IMPLICIT_ROOT_INVALID (line 78) | static TILE_IMPLICIT_ROOT_INVALID(path: string, message: string) {
    method BOUNDING_VOLUME_INVALID (line 98) | static BOUNDING_VOLUME_INVALID(path: string, message: string) {
    method BOUNDING_VOLUMES_INCONSISTENT (line 115) | static BOUNDING_VOLUMES_INCONSISTENT(path: string, message: string) {
    method INVALID_GEOMETRY_TYPE (line 134) | static INVALID_GEOMETRY_TYPE(path: string, message: string) {
    method INVALID_GEOMETRY_SIZE (line 153) | static INVALID_GEOMETRY_SIZE(path: string, message: string) {
    method INVALID_GEOMETRY_STRUCTURE (line 172) | static INVALID_GEOMETRY_STRUCTURE(path: string, message: string) {
    method PROPERTIES_MINIMUM_LARGER_THAN_MAXIMUM (line 187) | static PROPERTIES_MINIMUM_LARGER_THAN_MAXIMUM(path: string, message: s...
    method TILE_GEOMETRIC_ERRORS_INCONSISTENT (line 202) | static TILE_GEOMETRIC_ERRORS_INCONSISTENT(path: string, message: strin...
    method TEMPLATE_URI_INVALID_VARIABLE_NAME (line 221) | static TEMPLATE_URI_INVALID_VARIABLE_NAME(
    method TEMPLATE_URI_MISSING_VARIABLE_NAME (line 248) | static TEMPLATE_URI_MISSING_VARIABLE_NAME(
    method IMPLICIT_TILING_ERROR (line 278) | static IMPLICIT_TILING_ERROR(path: string, message: string) {
    method BUFFERS_INCONSISTENT (line 296) | static BUFFERS_INCONSISTENT(path: string, message: string) {
    method BUFFERS_WITHOUT_BUFFER_VIEWS (line 313) | static BUFFERS_WITHOUT_BUFFER_VIEWS(path: string) {
    method BUFFER_VIEWS_WITHOUT_BUFFERS (line 328) | static BUFFER_VIEWS_WITHOUT_BUFFERS(path: string) {
    method SUBTREE_AVAILABILITY_INCONSISTENT (line 352) | static SUBTREE_AVAILABILITY_INCONSISTENT(path: string, message: string) {
    method TRANSFORM_INVALID (line 370) | static TRANSFORM_INVALID(path: string, message: string) {
    method EXTENSION_REQUIRED_BUT_NOT_USED (line 386) | static EXTENSION_REQUIRED_BUT_NOT_USED(path: string, extensionName: st...
    method EXTENSION_REQUIRED_BUT_NOT_DECLARED (line 405) | static EXTENSION_REQUIRED_BUT_NOT_DECLARED(
    method EXTENSION_FOUND_BUT_NOT_USED (line 432) | static EXTENSION_FOUND_BUT_NOT_USED(path: string, extensionName: strin...
    method EXTENSION_USED_BUT_NOT_FOUND (line 458) | static EXTENSION_USED_BUT_NOT_FOUND(path: string, extensionName: strin...
    method EXTENSION_NOT_SUPPORTED (line 477) | static EXTENSION_NOT_SUPPORTED(path: string, extensionName: string) {

FILE: src/issues/StructureValidationIssues.ts
  class StructureValidationIssues (line 8) | class StructureValidationIssues {
    method IDENTIFIER_NOT_FOUND (line 17) | static IDENTIFIER_NOT_FOUND(path: string, message: string) {
    method REQUIRED_VALUE_NOT_FOUND (line 32) | static REQUIRED_VALUE_NOT_FOUND(path: string, message: string) {
    method DISALLOWED_VALUE_FOUND (line 47) | static DISALLOWED_VALUE_FOUND(path: string, message: string) {

FILE: src/issues/ValidationIssueUtils.ts
  class ValidationIssueUtils (line 8) | class ValidationIssueUtils {
    method describeSimpleRange (line 18) | static describeSimpleRange(
    method joinNames (line 53) | static joinNames(conjunction: string, ...s: string[]) {

FILE: src/issues/ValidationIssues.ts
  class ValidationIssues (line 7) | class ValidationIssues {
    method INTERNAL_ERROR (line 18) | static INTERNAL_ERROR(path: string, message: string) {

FILE: src/main.ts
  function readOptionsFile (line 93) | async function readOptionsFile(
  function main (line 114) | async function main() {

FILE: src/tileFormats/B3dmValidator.ts
  class B3dmValidator (line 38) | class B3dmValidator implements Validator<Buffer> {
    method validateObject (line 39) | async validateObject(

FILE: src/tileFormats/CmptValidator.ts
  class CmptValidator (line 21) | class CmptValidator implements Validator<Buffer> {
    method validateObject (line 22) | async validateObject(

FILE: src/tileFormats/GeojsonValidator.ts
  type GeojsonValidationMode (line 12) | enum GeojsonValidationMode {
  class GeojsonValidator (line 54) | class GeojsonValidator implements Validator<Buffer> {
    method validateObject (line 55) | async validateObject(
    method validateGeojsonObject (line 96) | static async validateGeojsonObject(
    method validateCoordinatesArray (line 200) | private static validateCoordinatesArray(
    method validatePosition (line 226) | private static validatePosition(
    method validateBbox (line 256) | private static validateBbox(
    method validatePoint (line 295) | private static validatePoint(
    method validateLineString (line 351) | private static validateLineString(
    method validatePolygon (line 420) | private static validatePolygon(
    method validateMultiPoint (line 506) | private static validateMultiPoint(
    method validateMultiLineString (line 578) | private static validateMultiLineString(
    method validateMultiPolygon (line 664) | private static validateMultiPolygon(
    method validateGeometryCollection (line 767) | private static validateGeometryCollection(
    method validateProperties (line 842) | private static validateProperties(
    method validateGeometry (line 863) | private static validateGeometry(
    method validateFeature (line 958) | private static validateFeature(
    method validateFeatureCollection (line 1046) | private static validateFeatureCollection(

FILE: src/tileFormats/GltfValidator.ts
  class GltfValidator (line 20) | class GltfValidator implements Validator<Buffer> {
    method createValidationIssueFromGltfMessage (line 37) | private static createValidationIssueFromGltfMessage(
    method stripPadding (line 78) | private static stripPadding(input: Buffer): Buffer {
    method validateObject (line 97) | async validateObject(

FILE: src/tileFormats/I3dmValidator.ts
  class I3dmValidator (line 100) | class I3dmValidator implements Validator<Buffer> {
    method validateObject (line 101) | async validateObject(

FILE: src/tileFormats/PntsValidator.ts
  class PntsValidator (line 98) | class PntsValidator implements Validator<Buffer> {
    method validateObject (line 99) | async validateObject(
  function hasDracoBatchIds (line 260) | function hasDracoBatchIds(featureTableJson: any) {

FILE: src/tileFormats/TileFormatValidator.ts
  type BinaryTableData (line 14) | interface BinaryTableData {
  class TileFormatValidator (line 28) | class TileFormatValidator {
    method validateHeader (line 44) | static validateHeader(
    method extractBinaryTableData (line 132) | static extractBinaryTableData(

FILE: src/tileFormats/legacy/utility.ts
  function typeToComponentsLength (line 4) | function typeToComponentsLength(type: string): number | undefined {
  function componentTypeToByteLength (line 19) | function componentTypeToByteLength(componentType: string): number | unde...

FILE: src/tileFormats/legacy/validateBatchTable.ts
  function validateBatchTable (line 17) | function validateBatchTable(
  function hasDracoProperty (line 79) | function hasDracoProperty(batchTableJson: any, propertyName: string): bo...

FILE: src/tileFormats/legacy/validateFeatureTable.ts
  function validateFeatureTable (line 20) | function validateFeatureTable(
  function hasDracoProperty (line 110) | function hasDracoProperty(

FILE: src/validation/AssetValidator.ts
  class AssetValidator (line 17) | class AssetValidator {
    method validateAsset (line 32) | static validateAsset(asset: Asset, context: ValidationContext): boolean {

FILE: src/validation/BasicValidator.ts
  class BasicValidator (line 22) | class BasicValidator {
    method validateOptionalString (line 41) | static validateOptionalString(
    method validateDefined (line 69) | static validateDefined(
    method validateArray (line 113) | static validateArray(
    method validateIndexArray (line 191) | static validateIndexArray(
    method validateArrayElementsUnique (line 247) | static validateArrayElementsUnique(
    method validateObject (line 287) | static validateObject(
    method validateString (line 316) | static validateString(
    method validateNumber (line 345) | static validateNumber(
    method validateBoolean (line 374) | static validateBoolean(
    method validateType (line 404) | static validateType(
    method validateInteger (line 444) | static validateInteger(
    method validateNumberRange (line 490) | static validateNumberRange(
    method validateIntegerRange (line 539) | static validateIntegerRange(
    method _validateNumberRangeInternal (line 583) | static _validateNumberRangeInternal(
    method validateEnum (line 654) | static validateEnum(
    method validateNumberOfProperties (line 698) | static validateNumberOfProperties(
    method validateStringLength (line 754) | static validateStringLength(

FILE: src/validation/BinaryBufferStructureValidator.ts
  class BinaryBufferStructureValidator (line 33) | class BinaryBufferStructureValidator {
    method validateBinaryBufferStructure (line 46) | static validateBinaryBufferStructure(
    method validateBuffer (line 166) | private static validateBuffer(
    method validateBufferView (line 254) | private static validateBufferView(
    method validateBinaryBufferStructureConsistency (line 365) | static validateBinaryBufferStructureConsistency(

FILE: src/validation/BinaryValidator.ts
  class BinaryValidator (line 9) | class BinaryValidator {
    method validateMinLength (line 29) | static validateMinLength(
    method validateLength (line 62) | static validateLength(
    method validateValue (line 97) | static validateValue(
    method validateAlignment (line 132) | static validateAlignment(

FILE: src/validation/BoundingVolumeValidator.ts
  class BoundingVolumeValidator (line 18) | class BoundingVolumeValidator {
    method validateBoundingVolume (line 29) | static async validateBoundingVolume(
    method validateBoundingVolumeInternal (line 97) | private static validateBoundingVolumeInternal(
    method validateBoundingBox (line 180) | static validateBoundingBox(
    method validateBoundingSphere (line 213) | static validateBoundingSphere(
    method validateBoundingRegion (line 260) | static validateBoundingRegion(

FILE: src/validation/ContentDataValidator.ts
  class ContentDataValidator (line 27) | class ContentDataValidator {
    method validateContentData (line 40) | static async validateContentData(
    method validateContentDataInternal (line 81) | private static async validateContentDataInternal(
    method validateExternalTilesetContent (line 175) | private static async validateExternalTilesetContent(
    method validateSimpleContent (line 240) | private static async validateSimpleContent(
    method filterResult (line 293) | private static filterResult(
    method trackExtensionsFound (line 326) | private static async trackExtensionsFound(

FILE: src/validation/ContentDataValidators.ts
  class ContentDataValidators (line 32) | class ContentDataValidators {
    method registerDefaults (line 54) | private static registerDefaults() {
    method createGeojsonValidator (line 143) | private static createGeojsonValidator(): Validator<ContentData> {
    method createPackageValidator (line 159) | private static createPackageValidator(): Validator<ContentData> {
    method createTilesetValidator (line 187) | private static createTilesetValidator(): Validator<ContentData> {
    method createGltfJsonValidator (line 204) | private static createGltfJsonValidator(): Validator<ContentData> {
    method findContentDataValidator (line 219) | static async findContentDataValidator(
    method wrapBufferValidator (line 243) | static wrapBufferValidator(
    method registerForBuffer (line 277) | private static registerForBuffer(
    method register (line 295) | private static register(

FILE: src/validation/ContentValidator.ts
  class ContentValidator (line 21) | class ContentValidator {
    method validateContent (line 37) | static async validateContent(

FILE: src/validation/ExtendedObjectsValidators.ts
  class ExtendedObjectsValidators (line 22) | class ExtendedObjectsValidators {
    method register (line 50) | static register(
    method hasOverride (line 72) | static hasOverride(rootProperty: RootProperty): boolean {
    method validateExtendedObject (line 112) | static async validateExtendedObject(

FILE: src/validation/ExtensionsDeclarationsValidator.ts
  class ExtensionsDeclarationsValidator (line 15) | class ExtensionsDeclarationsValidator {
    method validateExtensionDeclarationConsistency (line 32) | static validateExtensionDeclarationConsistency(

FILE: src/validation/ImplicitTilingValidator.ts
  class ImplicitTilingValidator (line 14) | class ImplicitTilingValidator {
    method validateImplicitTiling (line 29) | static validateImplicitTiling(

FILE: src/validation/NumberValidator.ts
  class NumberValidator (line 15) | class NumberValidator {
    method validateRanges (line 30) | static validateRanges(
    method validateRange (line 70) | static validateRange(
    method maximumValue (line 97) | private static maximumValue(
    method minimumValue (line 125) | private static minimumValue(

FILE: src/validation/PropertiesValidator.ts
  class PropertiesValidator (line 16) | class PropertiesValidator {
    method validateProperties (line 29) | static validateProperties(
    method validateSingleProperties (line 72) | private static validateSingleProperties(

FILE: src/validation/RootPropertyValidator.ts
  class RootPropertyValidator (line 18) | class RootPropertyValidator {
    method validateRootProperty (line 32) | static validateRootProperty(

FILE: src/validation/StatisticsClassValidator.ts
  class StatisticsClassValidator (line 19) | class StatisticsClassValidator {
    method validateStatisticsClass (line 33) | static validateStatisticsClass(

FILE: src/validation/StatisticsValidator.ts
  class StatisticsValidator (line 19) | class StatisticsValidator {
    method validateStatistics (line 30) | static validateStatistics(

FILE: src/validation/StringValidator.ts
  class StringValidator (line 12) | class StringValidator {
    method validateIdentifierString (line 38) | static validateIdentifierString(
    method validateIso8601String (line 84) | static validateIso8601String(
    method isValidIso8601String (line 112) | private static isValidIso8601String(str: string) {

FILE: src/validation/StructureValidator.ts
  class StructureValidator (line 15) | class StructureValidator {
    method validateDisallowedProperties (line 35) | static validateDisallowedProperties(

FILE: src/validation/SubtreeConsistencyValidator.ts
  class SubtreeConsistencyValidator (line 33) | class SubtreeConsistencyValidator {
    method validateSubtreeConsistency (line 51) | static validateSubtreeConsistency(
    method validateSubtreeAvailabilityConsistency (line 105) | private static validateSubtreeAvailabilityConsistency(
    method validateAvailabilityConsistency (line 201) | private static validateAvailabilityConsistency(

FILE: src/validation/SubtreeInfoValidator.ts
  class SubtreeInfoValidator (line 29) | class SubtreeInfoValidator {
    method validateSubtreeInfo (line 30) | static async validateSubtreeInfo(
    method validateAvailableCount (line 172) | private static validateAvailableCount(
    method validateTileAvailabilityConsistency (line 222) | static validateTileAvailabilityConsistency(
    method validateTileAvailabilityPresence (line 275) | static validateTileAvailabilityPresence(

FILE: src/validation/SubtreeValidator.ts
  class SubtreeValidator (line 50) | class SubtreeValidator implements Validator<Buffer> {
    method constructor (line 77) | constructor(
    method validateObject (line 98) | async validateObject(
    method validateSubtreeBinaryData (line 129) | private async validateSubtreeBinaryData(
    method validateSubtreeJsonData (line 261) | private async validateSubtreeJsonData(
    method validateSubtree (line 321) | private async validateSubtree(
    method validateSubtreeObject (line 416) | private validateSubtreeObject(
    method validateSubtreeBasic (line 443) | private validateSubtreeBasic(
    method validateAvailability (line 536) | private static validateAvailability(
    method validateMetadata (line 651) | private validateMetadata(
    method validateBinaryPropertyTables (line 843) | private async validateBinaryPropertyTables(

FILE: src/validation/TemplateUriValidator.ts
  class TemplateUriValidator (line 11) | class TemplateUriValidator {
    method validateTemplateUri (line 33) | static validateTemplateUri(

FILE: src/validation/TileContentValidator.ts
  class TileContentValidator (line 18) | class TileContentValidator {
    method validateTileContent (line 32) | static async validateTileContent(
    method validateContentBoundingVolumeConsistency (line 86) | private static validateContentBoundingVolumeConsistency(

FILE: src/validation/TileValidator.ts
  class TileValidator (line 44) | class TileValidator {
    method validateTile (line 54) | static async validateTile(
    method validateSimpleTile (line 283) | private static async validateSimpleTile(
    method validateDisallowedInImplicitTilesetRoot (line 399) | private static validateDisallowedInImplicitTilesetRoot(
    method validateImplicitTilesetRoot (line 430) | private static validateImplicitTilesetRoot(

FILE: src/validation/TilesetPackageValidator.ts
  class TilesetPackageValidator (line 34) | class TilesetPackageValidator implements Validator<string> {
    method validateObject (line 47) | async validateObject(
    method validatePackageFile (line 71) | static async validatePackageFile(uri: string, context: ValidationConte...
    method validatePackageFileInternal (line 95) | private static async validatePackageFileInternal(
    method validatePackageFileUnchecked (line 131) | private static async validatePackageFileUnchecked(
    method validatePackageInternal (line 181) | private static async validatePackageInternal(

FILE: src/validation/TilesetTraversingValidator.ts
  class TilesetTraversingValidator (line 34) | class TilesetTraversingValidator {
    method validateTileset (line 45) | static async validateTileset(
    method validateTraversedTile (line 147) | private static async validateTraversedTile(
    method validateExplicitTraversedTile (line 217) | private static async validateExplicitTraversedTile(
    method validateTraversedTileContent (line 308) | private static async validateTraversedTileContent(
    method validateSubtreeRoot (line 368) | private static async validateSubtreeRoot(
    method validateTraversedTiles (line 420) | private static validateTraversedTiles(

FILE: src/validation/TilesetValidator.ts
  class TilesetValidator (line 32) | class TilesetValidator implements Validator<Tileset> {
    method validateJsonString (line 41) | async validateJsonString(
    method validateObject (line 65) | async validateObject(
    method validateTileset (line 87) | static async validateTileset(
    method validateExtensionDeclarations (line 301) | private static validateExtensionDeclarations(
    method validateExtensionsRequired (line 433) | private static validateExtensionsRequired(
    method validateTilesetGroups (line 474) | private static validateTilesetGroups(

FILE: src/validation/TransformValidator.ts
  class TransformValidator (line 15) | class TransformValidator {
    method validateTransform (line 26) | static validateTransform(

FILE: src/validation/ValidatedElement.ts
  type ValidatedElement (line 17) | interface ValidatedElement<T> {

FILE: src/validation/ValidationContext.ts
  class ValidationContext (line 30) | class ValidationContext {
    method constructor (line 73) | constructor(
    method deriveFromUri (line 106) | deriveFromUri(uri: string): ValidationContext {
    method deriveFromResourceResolver (line 140) | deriveFromResourceResolver(
    method addIssue (line 156) | addIssue(issue: ValidationIssue): void {
    method addExtensionFound (line 160) | addExtensionFound(extension: string) {
    method getExtensionsFound (line 164) | getExtensionsFound(): Set<string> {
    method getResult (line 168) | getResult(): ValidationResult {
    method getResourceResolver (line 172) | getResourceResolver(): ResourceResolver {
    method resolveUri (line 176) | resolveUri(uri: string): string {
    method addActiveTilesetUri (line 182) | addActiveTilesetUri(uri: string) {
    method removeActiveTilesetUri (line 186) | removeActiveTilesetUri(uri: string) {
    method isActiveTilesetUri (line 190) | isActiveTilesetUri(uri: string): boolean {
    method addSemanticMatchingSchema (line 194) | addSemanticMatchingSchema(schema: any) {
    method getSemanticMatchingSchemas (line 198) | getSemanticMatchingSchemas(): any[] {
    method getOptions (line 202) | getOptions(): ValidationOptions {

FILE: src/validation/ValidationContexts.ts
  class ValidationContexts (line 8) | class ValidationContexts {
    method initializeSemanticMatchingSchemas (line 216) | static initializeSemanticMatchingSchemas(
    method addSemanticMatchingSchema (line 253) | private static addSemanticMatchingSchema(

FILE: src/validation/ValidationIssue.ts
  class ValidationIssue (line 9) | class ValidationIssue {
    method constructor (line 57) | constructor(
    method type (line 79) | get type(): string {
    method path (line 92) | get path(): string {
    method message (line 104) | get message(): string {
    method severity (line 113) | get severity(): ValidationIssueSeverity {
    method addCause (line 127) | addCause(cause: ValidationIssue) {
    method causes (line 137) | get causes(): readonly ValidationIssue[] {
    method toJson (line 148) | toJson(): any {
    method fromJson (line 169) | static fromJson(object: any): ValidationIssue {
    method serialize (line 191) | serialize(): string {
    method deserialize (line 204) | static deserialize(jsonString: string): ValidationIssue {

FILE: src/validation/ValidationIssueFilter.ts
  type ValidationIssueFilter (line 15) | type ValidationIssueFilter = (issuesStack: ValidationIssue[]) => boolean;

FILE: src/validation/ValidationIssueFilters.ts
  class ValidationIssueFilters (line 10) | class ValidationIssueFilters {
    method byExcludedTypes (line 19) | static byExcludedTypes(...excludedTypes: string[]): ValidationIssueFil...
    method byIncludedSeverities (line 33) | static byIncludedSeverities(

FILE: src/validation/ValidationIssueSeverity.ts
  type ValidationIssueSeverity (line 7) | enum ValidationIssueSeverity {

FILE: src/validation/ValidationOptionChecks.ts
  class ValidationOptionChecks (line 15) | class ValidationOptionChecks {
    method shouldValidate (line 24) | static async shouldValidate(

FILE: src/validation/ValidationOptions.ts
  class ValidationOptions (line 13) | class ValidationOptions {
    method constructor (line 52) | constructor() {
    method validateContentData (line 65) | get validateContentData(): boolean {
    method validateContentData (line 69) | set validateContentData(value: boolean) {
    method contentValidationIssueSeverity (line 82) | get contentValidationIssueSeverity(): ValidationIssueSeverity {
    method contentValidationIssueSeverity (line 86) | set contentValidationIssueSeverity(value: ValidationIssueSeverity) {
    method includeContentTypes (line 124) | get includeContentTypes(): string[] | undefined {
    method includeContentTypes (line 128) | set includeContentTypes(value: string[] | undefined) {
    method excludeContentTypes (line 140) | get excludeContentTypes(): string[] | undefined {
    method excludeContentTypes (line 144) | set excludeContentTypes(value: string[] | undefined) {
    method semanticSchemaFileNames (line 152) | get semanticSchemaFileNames(): string[] | undefined {
    method semanticSchemaFileNames (line 156) | set semanticSchemaFileNames(value: string[] | undefined) {
    method fromJson (line 167) | static fromJson(json: any): ValidationOptions {

FILE: src/validation/ValidationResult.ts
  class ValidationResult (line 13) | class ValidationResult {
    method create (line 34) | static create(): ValidationResult {
    method constructor (line 43) | private constructor(date: Date) {
    method filter (line 57) | filter(includePredicate: ValidationIssueFilter): ValidationResult {
    method issues (line 66) | get issues(): readonly ValidationIssue[] {
    method add (line 80) | add(issue: ValidationIssue): void {
    method length (line 89) | get length(): number {
    method get (line 100) | get(index: number): ValidationIssue {
    method numErrors (line 110) | get numErrors(): number {
    method numWarnings (line 120) | get numWarnings(): number {
    method numInfos (line 130) | get numInfos(): number {
    method count (line 141) | private count(severity: ValidationIssueSeverity): number {
    method toJson (line 157) | toJson(): any {
    method fromJson (line 181) | static fromJson(object: any) {
    method serialize (line 198) | serialize(): string {
    method deserialize (line 211) | static deserialize(jsonString: string): ValidationResult {

FILE: src/validation/ValidationResults.ts
  class ValidationResults (line 13) | class ValidationResults {
    method filter (line 24) | static filter(
    method filterIssues (line 56) | private static filterIssues(
    method filterCauses (line 89) | private static filterCauses(
    method createSimpleResultString (line 122) | static createSimpleResultString(inputResult: ValidationResult): string {
    method createSimpleIssueString (line 145) | private static createSimpleIssueString(

FILE: src/validation/ValidationState.ts
  type ValidationState (line 14) | type ValidationState = {

FILE: src/validation/Validator.ts
  type Validator (line 9) | interface Validator<T> {

FILE: src/validation/Validators.ts
  class Validators (line 39) | class Validators {
    method createDefaultTilesetValidator (line 55) | static createDefaultTilesetValidator(): TilesetValidator {
    method validateTilesetFile (line 76) | static async validateTilesetFile(
    method validateTilesetFileInternal (line 110) | private static async validateTilesetFileInternal(
    method validateTilesetPackageInternal (line 168) | private static async validateTilesetPackageInternal(
    method validateTileContentFile (line 210) | static async validateTileContentFile(
    method createDefaultSchemaValidator (line 268) | static createDefaultSchemaValidator(): SchemaValidator {
    method validateSchemaFile (line 282) | static async validateSchemaFile(filePath: string): Promise<ValidationR...
    method createDefaultSubtreeValidator (line 302) | static createDefaultSubtreeValidator(
    method validateSubtreeFile (line 327) | static async validateSubtreeFile(
    method parseFromBuffer (line 367) | static parseFromBuffer<T>(delegate: Validator<T>): Validator<Buffer> {
    method createContentValidationInfo (line 411) | static createContentValidationInfo(message: string): Validator<Buffer> {
    method createEmptyValidator (line 438) | static createEmptyValidator<T>(): Validator<T> {
    method registerExtensionValidators (line 456) | private static registerExtensionValidators() {

FILE: src/validation/extensions/BoundingVolumeS2ValidationIssues.ts
  class BoundingVolumeS2ValidationIssues (line 4) | class BoundingVolumeS2ValidationIssues {
    method S2_TOKEN_INVALID (line 5) | static S2_TOKEN_INVALID(path: string, message: string) {

FILE: src/validation/extensions/BoundingVolumeS2Validator.ts
  class BoundingVolumeS2Validator (line 19) | class BoundingVolumeS2Validator implements Validator<any> {
    method validateObject (line 29) | async validateObject(
    method validateBoundingVolumeS2 (line 113) | static validateBoundingVolumeS2(
    method isValidToken (line 226) | private static isValidToken(token: string): boolean {

FILE: src/validation/extensions/ContentGltfValidator.ts
  class ContentGltfValidator (line 13) | class ContentGltfValidator implements Validator<any> {
    method validateObject (line 23) | async validateObject(
    method validateContentGltf (line 65) | static validateContentGltf(

FILE: src/validation/extensions/MaxarContentGeojsonValidator.ts
  class MaxarContentGeojsonValidator (line 14) | class MaxarContentGeojsonValidator implements Validator<any> {
    method validateObject (line 24) | async validateObject(
    method validateMaxarContentGeojson (line 60) | static async validateMaxarContentGeojson(
    method validatePropertiesSchema (line 129) | static async validatePropertiesSchema(
    method validateGeojsonPropertiesSchema (line 182) | static validateGeojsonPropertiesSchema(
    method validateUriFormat (line 260) | static validateUriFormat(
    method validateGeometrySchema (line 295) | static validateGeometrySchema(
    method validatePropertiesArray (line 352) | static validatePropertiesArray(
    method validateUniquePropertyIds (line 410) | static validateUniquePropertyIds(
    method validatePropertySchema (line 451) | static validatePropertySchema(

FILE: src/validation/extensions/MaxarExtentValidator.ts
  class MaxarExtentValidator (line 17) | class MaxarExtentValidator implements Validator<any> {
    method validateObject (line 32) | async validateObject(
    method validateMaxarExtent (line 76) | private static async validateMaxarExtent(
    method validateUriContent (line 139) | private static async validateUriContent(
    method validateSpatialContainment (line 227) | private static async validateSpatialContainment(
    method validateGeometryTypes (line 273) | private static validateGeometryTypes(
    method validateExtentRequirements (line 338) | private static validateExtentRequirements(
    method validatePolygonExtent (line 409) | private static validatePolygonExtent(
    method getUniqueCoordinates (line 468) | private static getUniqueCoordinates(ring: number[][]): number[][] {
    method coordinatesEqual (line 510) | private static coordinatesEqual(
    method findRingSelfIntersection (line 529) | private static findRingSelfIntersection(ring: number[][]): {
    method findMatchingVertexIndex (line 566) | private static findMatchingVertexIndex(
    method segmentsIntersectionFinite (line 589) | private static segmentsIntersectionFinite(
    method extractAllCoordinates (line 652) | private static extractAllCoordinates(geojsonObject: any): number[][] {
    method isCoordinateContained (line 713) | private static isCoordinateContained(
    method isPointInRegion (line 762) | private static isPointInRegion(

FILE: src/validation/extensions/MaxarGridValidator.ts
  class MaxarGridValidator (line 15) | class MaxarGridValidator implements Validator<any> {
    method validateObject (line 25) | async validateObject(
    method validateMaxarGrid (line 62) | static validateMaxarGrid(
    method validateTilesetMaxarGrid (line 119) | static validateTilesetMaxarGrid(
    method validateQuadGrid (line 166) | static validateQuadGrid(
    method validateS2OrGeodGrid (line 230) | static validateS2OrGeodGrid(
    method validateTileMaxarGrid (line 256) | static validateTileMaxarGrid(

FILE: src/validation/extensions/NgaGpmValidator.ts
  type EpsgEcefCodes (line 21) | enum EpsgEcefCodes {
  constant UNIT_VECTOR_LENGTH_EPSILON (line 38) | const UNIT_VECTOR_LENGTH_EPSILON = 0.00001;
  constant ORTHOGONAL_VECTORS_DOT_PRODUCT_EPSILON (line 47) | const ORTHOGONAL_VECTORS_DOT_PRODUCT_EPSILON = 0.01;
  class NgaGpmValidator (line 54) | class NgaGpmValidator implements Validator<any> {
    method validateObject (line 64) | async validateObject(
    method computeNumContentsInRootNode (line 114) | private static computeNumContentsInRootNode(tileset: any) {
    method validateNgaGpm (line 146) | static validateNgaGpm(
    method validateMasterRecord (line 297) | private static validateMasterRecord(
    method validateModelCoordSystem (line 405) | private static validateModelCoordSystem(
    method validateModelCoordSystemEcef (line 470) | private static validateModelCoordSystemEcef(
    method validateEpsgEcef (line 524) | private static validateEpsgEcef(
    method validateModelCoordSystemUtm (line 565) | private static validateModelCoordSystemUtm(
    method validateEpsgUtm (line 629) | private static validateEpsgUtm(
    method validateReferenceSystem (line 677) | private static validateReferenceSystem(
    method validateOrganizationSystemIdPair (line 833) | private static validateOrganizationSystemIdPair(
    method validateModelCoordSystemLsr (line 897) | private static validateModelCoordSystemLsr(
    method validateEcefCoord (line 956) | private static validateEcefCoord(
    method validatePoint3d (line 1009) | private static validatePoint3d(
    method validateUnitVectors (line 1042) | private static validateUnitVectors(
    method computeDotProduct (line 1137) | private static computeDotProduct(
    method computeLength (line 1157) | private static computeLength(v: [number, number, number]): number {
    method validateUnitVector (line 1171) | private static validateUnitVector(
    method validateIdInformation (line 1245) | private static validateIdInformation(
    method validateExtentInformation (line 1302) | private static validateExtentInformation(
    method validateCollectionRecordList (line 1371) | private static validateCollectionRecordList(
    method validateCollectionRecord (line 1420) | private static validateCollectionRecord(
    method validateSensorRecords (line 1491) | private static validateSensorRecords(
    method validateSensorRecord (line 1540) | private static validateSensorRecord(
    method validateCollectionUnitRecords (line 1627) | private static validateCollectionUnitRecords(
    method validateCollectionUnitRecord (line 1676) | private static validateCollectionUnitRecord(
    method validateUnmodeledError (line 1771) | private static validateUnmodeledError(
    method validateRotationThetas (line 1854) | private static validateRotationThetas(
    method validateUnmodeledErrorPosts (line 1886) | private static validateUnmodeledErrorPosts(
    method validateUnmodeledErrorPost (line 1935) | private static validateUnmodeledErrorPost(
    method validateCovarUpperTriangle (line 1990) | private static validateCovarUpperTriangle(
    method validateInterpolationParams (line 2022) | private static validateInterpolationParams(
    method validateThreeDimensionalConformal (line 2125) | private static validateThreeDimensionalConformal(
    method validateThreeDimensionalConformalConsistency (line 2292) | private static validateThreeDimensionalConformalConsistency(
    method validatePpeManifest (line 2358) | private static validatePpeManifest(
    method validateAnchorPointMetadata (line 2434) | private static validateAnchorPointMetadata(

FILE: src/validation/extensions/gpm/NgaGpmValidationIssues.ts
  class NgaGpmValidationIssues (line 9) | class NgaGpmValidationIssues {
    method ARRAY_LENGTH_INCONSISTENT (line 26) | static ARRAY_LENGTH_INCONSISTENT(path: string, message: string) {
    method VECTOR_NOT_UNIT_LENGTH (line 42) | static VECTOR_NOT_UNIT_LENGTH(path: string, message: string) {
    method VECTORS_NOT_ORTHOGONAL (line 58) | static VECTORS_NOT_ORTHOGONAL(path: string, message: string) {
    method PER_POINT_ERROR_SOURCE_VALUES_NOT_UNIQUE (line 73) | static PER_POINT_ERROR_SOURCE_VALUES_NOT_UNIQUE(

FILE: src/validation/extensions/gpm/NgaGpmValidatorCommon.ts
  class NgaGpmValidatorCommon (line 13) | class NgaGpmValidatorCommon {
    method validateCorrelationGroups (line 26) | static validateCorrelationGroups(
    method validateCorrelationGroup (line 75) | static validateCorrelationGroup(
    method validateCorrelationParameters (line 152) | static validateCorrelationParameters(
    method validateSpdcf (line 203) | static validateSpdcf(
    method validatePpeMetadata (line 306) | static validatePpeMetadata(
    method computeTriangularNumber (line 382) | static computeTriangularNumber(n: number): number {
    method isTriangularNumber (line 396) | static isTriangularNumber(n: number): boolean {

FILE: src/validation/extensions/maxar/MaxarValidatorCommon.ts
  class MaxarValidatorCommon (line 14) | class MaxarValidatorCommon {
    method validateSrs (line 23) | static validateSrs(
    method validateCoordinateSystem (line 121) | static validateCoordinateSystem(
    method validateOptionalSrsProperties (line 154) | static validateOptionalSrsProperties(

FILE: src/validation/gltf/Accessors.ts
  class Accessors (line 14) | class Accessors {
    method readScalarAccessorValues (line 27) | static readScalarAccessorValues(
    method readArrayAccessorValues (line 60) | static readArrayAccessorValues(

FILE: src/validation/gltf/GltfData.ts
  type GltfData (line 11) | type GltfData = {

FILE: src/validation/gltf/GltfDataReader.ts
  class GltfDataReader (line 28) | class GltfDataReader {
    method readGltfData (line 43) | static async readGltfData(
    method readBinaryGltfData (line 67) | private static async readBinaryGltfData(
    method resolveBinaryBufferData (line 129) | private static async resolveBinaryBufferData(
    method readBinaryGltfDocument (line 155) | private static async readBinaryGltfDocument(
    method readJsonGltfData (line 188) | private static async readJsonGltfData(
    method readJsonGltfDocument (line 231) | private static async readJsonGltfDocument(

FILE: src/validation/gltf/GltfExtensionValidators.ts
  class GltfExtensionValidators (line 18) | class GltfExtensionValidators {
    method validateGltfExtensions (line 27) | static async validateGltfExtensions(

FILE: src/validation/gltf/ImageData.ts
  type ImageData (line 7) | interface ImageData {

FILE: src/validation/gltf/ImageDataReader.ts
  class ImageDataReader (line 15) | class ImageDataReader {
    method readFromImage (line 32) | static async readFromImage(
    method getValue (line 83) | static getValue(
    method getChannelValue (line 113) | static getChannelValue(
    method readUnchecked (line 137) | static async readUnchecked(imageDataBuffer: Buffer): Promise<ImageData> {

FILE: src/validation/gltf/SamplerValidator.ts
  class SamplerValidator (line 9) | class SamplerValidator {
    method validateSamplerNearest (line 19) | static validateSamplerNearest(
    method validateSamplerNearestOrLinear (line 44) | static validateSamplerNearestOrLinear(
    method validateSampler (line 76) | private static validateSampler(

FILE: src/validation/gltf/TextureValidator.ts
  class TextureValidator (line 12) | class TextureValidator {
    method validateTexCoordDefinition (line 33) | static validateTexCoordDefinition(
    method validateTexCoordForMeshPrimitive (line 74) | static validateTexCoordForMeshPrimitive(
    method validateChannels (line 148) | static validateChannels(
    method validateChannelsForImage (line 208) | static validateChannelsForImage(

FILE: src/validation/gltf/gpmLocal/NgaGpmLocalValidator.ts
  class NgaGpmLocalValidator (line 21) | class NgaGpmLocalValidator {
    method validateGltf (line 32) | static async validateGltf(
    method validateGltfGpmLocal (line 104) | private static validateGltfGpmLocal(
    method validateGltfGpmLocalIndirect (line 168) | private static validateGltfGpmLocalIndirect(
    method validateAnchorPointsIndirect (line 267) | private static validateAnchorPointsIndirect(
    method validateAnchorPointIndirect (line 316) | private static validateAnchorPointIndirect(
    method validateGltfGpmLocalDirect (line 398) | private static validateGltfGpmLocalDirect(
    method validateAnchorPointsDirect (line 498) | private static validateAnchorPointsDirect(
    method validateAnchorPointDirect (line 547) | private static validateAnchorPointDirect(
    method validateCovarianceDirectUpperTriangle (line 609) | private static validateCovarianceDirectUpperTriangle(
    method validateMeshPrimitiveGpmLocal (line 660) | private static validateMeshPrimitiveGpmLocal(
    method validatePpeTextures (line 702) | private static validatePpeTextures(
    method validatePpeTexture (line 758) | private static validatePpeTexture(

FILE: src/validation/gltf/imageOrtho/MaxarImageOrthoValidator.ts
  class MaxarImageOrthoValidator (line 19) | class MaxarImageOrthoValidator {
    method validateGltf (line 30) | static async validateGltf(
    method validateMaxarImageOrtho (line 81) | static validateMaxarImageOrtho(
    method validateTransform (line 133) | static validateTransform(

FILE: src/validation/gltf/instanceFeatures/ExtInstanceFeaturesValidator.ts
  class ExtInstanceFeaturesValidator (line 24) | class ExtInstanceFeaturesValidator {
    method validateGltf (line 35) | static async validateGltf(
    method validateExtInstanceFeatures (line 107) | private static async validateExtInstanceFeatures(
    method validateInstanceFeaturesFeatureId (line 190) | private static async validateInstanceFeaturesFeatureId(
    method validateFeatureIdAttribute (line 252) | private static validateFeatureIdAttribute(

FILE: src/validation/gltf/lightsPunctual/KhrLightsPunctualValidator.ts
  class KhrLightsPunctualValidator (line 20) | class KhrLightsPunctualValidator {
    method validateGltf (line 31) | static async validateGltf(
    method validateLightTemporalTraits (line 91) | private static validateLightTemporalTraits(

FILE: src/validation/gltf/lightsPunctual/MaxarTemporalLightTraits/MaxarTemporalLightTraitsValidator.ts
  class MaxarTemporalLightTraitsValidator (line 14) | class MaxarTemporalLightTraitsValidator {
    method validateTemporalLightTraits (line 23) | static validateTemporalLightTraits(
    method validateFlashing (line 67) | private static validateFlashing(

FILE: src/validation/gltf/meshFeatures/ExtMeshFeaturesValidator.ts
  class ExtMeshFeaturesValidator (line 29) | class ExtMeshFeaturesValidator {
    method validateGltf (line 40) | static async validateGltf(
    method validateExtMeshFeatures (line 105) | private static async validateExtMeshFeatures(
    method validateMeshFeaturesFeatureId (line 191) | private static async validateMeshFeaturesFeatureId(
    method validateFeatureIdAttribute (line 273) | private static validateFeatureIdAttribute(
    method validateFeatureIdTexture (line 353) | private static async validateFeatureIdTexture(
    method validateFeatureIdTextureData (line 474) | private static async validateFeatureIdTextureData(

FILE: src/validation/gltf/meshFeatures/FeatureIdAccessorValidator.ts
  class FeatureIdAccessorValidator (line 16) | class FeatureIdAccessorValidator {
    method validateFeatureIdAccessor (line 32) | static validateFeatureIdAccessor(
    method validateFeatureIdAccessorData (line 114) | private static validateFeatureIdAccessorData(

FILE: src/validation/gltf/meshFeatures/FeatureIdValidator.ts
  class FeatureIdValidator (line 20) | class FeatureIdValidator {
    method validateCommonFeatureId (line 44) | static validateCommonFeatureId(
    method validateFeatureIdSet (line 143) | static validateFeatureIdSet(
    method obtainPropertyTableCount (line 221) | static obtainPropertyTableCount(

FILE: src/validation/gltf/nonvisualGeometry/MaxarNonvisualGeometryValidator.ts
  class MaxarNonvisualGeometryValidator (line 19) | class MaxarNonvisualGeometryValidator {
    method validateGltf (line 30) | static async validateGltf(
    method validateNodeExtension (line 122) | private static validateNodeExtension(
    method validatePrimitiveExtension (line 176) | private static validatePrimitiveExtension(
    method validateShapeCompatibility (line 256) | private static validateShapeCompatibility(

FILE: src/validation/gltf/structuralMetadata/ExtStructuralMetadataValidator.ts
  class ExtStructuralMetadataValidator (line 37) | class ExtStructuralMetadataValidator {
    method validateGltf (line 48) | static async validateGltf(
    method validateTopLevelStructuralMetadata (line 193) | private static async validateTopLevelStructuralMetadata(
    method validateMeshPrimitiveStructuralMetadata (line 319) | private static async validateMeshPrimitiveStructuralMetadata(
    method validatePropertyTablesValues (line 448) | private static validatePropertyTablesValues(

FILE: src/validation/gltf/structuralMetadata/PropertyAttributePropertyModel.ts
  class PropertyAttributePropertyModel (line 10) | class PropertyAttributePropertyModel
    method constructor (line 39) | constructor(
    method getPropertyValue (line 50) | getPropertyValue(index: number): number | number[] {
    method getRawPropertyValue (line 68) | getRawPropertyValue(index: number): number | number[] {

FILE: src/validation/gltf/structuralMetadata/PropertyAttributePropertyValidator.ts
  class PropertyAttributePropertyValidator (line 14) | class PropertyAttributePropertyValidator {
    method validatePropertyAttributeProperty (line 28) | static validatePropertyAttributeProperty(
    method validateClassPropertyForPropertyAttributeProperty (line 112) | static validateClassPropertyForPropertyAttributeProperty(

FILE: src/validation/gltf/structuralMetadata/PropertyAttributeValidator.ts
  class PropertyAttributeValidator (line 28) | class PropertyAttributeValidator {
    method validatePropertyAttribute (line 39) | static validatePropertyAttribute(

FILE: src/validation/gltf/structuralMetadata/PropertyAttributeValuesValidator.ts
  class PropertyAttributeValuesValidator (line 30) | class PropertyAttributeValuesValidator {
    method validatePropertyAttributeValues (line 61) | static async validatePropertyAttributeValues(
    method validatePropertyAttributePropertyValues (line 176) | private static async validatePropertyAttributePropertyValues(

FILE: src/validation/gltf/structuralMetadata/PropertyAttributesDefinitionValidator.ts
  class PropertyAttributesDefinitionValidator (line 14) | class PropertyAttributesDefinitionValidator {
    method validatePropertyAttributesDefinition (line 42) | static validatePropertyAttributesDefinition(

FILE: src/validation/gltf/structuralMetadata/PropertyTableDefinitionValidator.ts
  class PropertyTableDefinitionValidator (line 17) | class PropertyTableDefinitionValidator {
    method validatePropertyTableDefinition (line 41) | static validatePropertyTableDefinition(

FILE: src/validation/gltf/structuralMetadata/PropertyTextureBooleanMetadataPropertyModel.ts
  class PropertyTextureBooleanMetadataPropertyModel (line 16) | class PropertyTextureBooleanMetadataPropertyModel
    method constructor (line 41) | constructor(
    method getPropertyValue (line 52) | getPropertyValue(pixelCoordinates: [number, number]): boolean | boolea...
    method getRawPropertyValue (line 71) | getRawPropertyValue(pixelCoordinates: [number, number]): boolean | boo...

FILE: src/validation/gltf/structuralMetadata/PropertyTextureEnumMetadataPropertyModel.ts
  class PropertyTextureEnumMetadataPropertyModel (line 16) | class PropertyTextureEnumMetadataPropertyModel
    method constructor (line 58) | constructor(
    method getPropertyValue (line 73) | getPropertyValue(pixelCoordinates: [number, number]): string | string[] {
    method getRawPropertyValue (line 88) | getRawPropertyValue(pixelCoordinates: [number, number]): number | numb...

FILE: src/validation/gltf/structuralMetadata/PropertyTextureMetadataPropertyModels.ts
  class PropertyTextureMetadataPropertyModels (line 15) | class PropertyTextureMetadataPropertyModels {
    method createEnum (line 30) | static createEnum(
    method createBoolean (line 55) | static createBoolean(
    method createNumeric (line 76) | static createNumeric(

FILE: src/validation/gltf/structuralMetadata/PropertyTextureNumericMetadataPropertyModel.ts
  class PropertyTextureNumericMetadataPropertyModel (line 16) | class PropertyTextureNumericMetadataPropertyModel
    method constructor (line 41) | constructor(
    method getPropertyValue (line 52) | getPropertyValue(pixelCoordinates: [number, number]): number | number[] {
    method getRawPropertyValue (line 71) | getRawPropertyValue(pixelCoordinates: [number, number]): number | numb...

FILE: src/validation/gltf/structuralMetadata/PropertyTexturePropertyValidator.ts
  class PropertyTexturePropertyValidator (line 22) | class PropertyTexturePropertyValidator {
    method validatePropertyTextureProperty (line 51) | static validatePropertyTextureProperty(
    method validatePropertyTexturePropertyTypeSize (line 217) | static validatePropertyTexturePropertyTypeSize(
    method validateClassPropertyForPropertyTextureProperty (line 364) | static validateClassPropertyForPropertyTextureProperty(

FILE: src/validation/gltf/structuralMetadata/PropertyTextureValidator.ts
  class PropertyTextureValidator (line 30) | class PropertyTextureValidator {
    method validatePropertyTexture (line 43) | static validatePropertyTexture(

FILE: src/validation/gltf/structuralMetadata/PropertyTextureValuesValidator.ts
  class PropertyTextureValuesValidator (line 30) | class PropertyTextureValuesValidator {
    method validatePropertyTextureValues (line 63) | static async validatePropertyTextureValues(
    method validatePropertyTexturePropertyValues (line 176) | private static async validatePropertyTexturePropertyValues(

FILE: src/validation/gltf/structuralMetadata/PropertyTexturesDefinitionValidator.ts
  class PropertyTexturesDefinitionValidator (line 15) | class PropertyTexturesDefinitionValidator {
    method validatePropertyTexturesDefinition (line 43) | static validatePropertyTexturesDefinition(

FILE: src/validation/legacy/BoundingVolumeChecks.ts
  class BoundingVolumeChecks (line 17) | class BoundingVolumeChecks {
    method checkBoundingVolume (line 35) | static checkBoundingVolume(
    method getTransformedBox (line 155) | private static getTransformedBox(box: number[], transform: Matrix4) {
    method getTransformedSphere (line 194) | private static getTransformedSphere(sphere: number[], transform: Matri...
    method regionInsideRegion (line 217) | private static regionInsideRegion(
    method sphereInsideSphere (line 234) | private static sphereInsideSphere(
    method boxInsideBox (line 257) | private static boxInsideBox(boxInner: number[], boxOuter: number[]) {
    method boxInsideSphere (line 316) | private static boxInsideSphere(box: number[], sphere: number[]) {
    method sphereInsideBox (line 352) | private static sphereInsideBox(sphere: number[], box: number[]) {
    method planeFromPoints (line 403) | private static planeFromPoints(
    method createUnitCube (line 421) | private static createUnitCube(): Array<Cartesian3> {

FILE: src/validation/metadata/BinaryPropertyTableDefaultMetadataPropertyModel.ts
  class BinaryPropertyTableDefaultMetadataPropertyModel (line 17) | class BinaryPropertyTableDefaultMetadataPropertyModel
    method constructor (line 43) | constructor(
    method getPropertyValue (line 58) | getPropertyValue(key: number) {
    method getRawPropertyValue (line 76) | getRawPropertyValue(key: number) {

FILE: src/validation/metadata/BinaryPropertyTableEnumMetadataPropertyModel.ts
  class BinaryPropertyTableEnumMetadataPropertyModel (line 16) | class BinaryPropertyTableEnumMetadataPropertyModel
    method constructor (line 46) | constructor(
    method getPropertyValue (line 61) | getPropertyValue(key: number) {
    method getRawPropertyValue (line 74) | getRawPropertyValue(key: number) {

FILE: src/validation/metadata/BinaryPropertyTableValidator.ts
  class BinaryPropertyTableValidator (line 22) | class BinaryPropertyTableValidator {
    method validateBinaryPropertyTable (line 32) | static validateBinaryPropertyTable(
    method validateBinaryPropertyTableProperty (line 117) | private static validateBinaryPropertyTableProperty(
    method validateValuesBufferView (line 215) | private static validateValuesBufferView(
    method validateArrayOffsetsBufferView (line 321) | private static validateArrayOffsetsBufferView(
    method validateStringOffsetsBufferView (line 414) | private static validateStringOffsetsBufferView(
    method validateOffsets (line 506) | private static validateOffsets(
    method validateBufferViewByteOffset (line 567) | private static validateBufferViewByteOffset(
    method validateOffsetBufferViewByteLength (line 629) | private static validateOffsetBufferViewByteLength(
    method validateValuesBufferViewByteLength (line 694) | private static validateValuesBufferViewByteLength(
    method createByteLengthMessage (line 745) | private static createByteLengthMessage(
    method computeNumberOfValues (line 944) | private static computeNumberOfValues(
    method getValidatedArrayOffset (line 1053) | private static getValidatedArrayOffset(
    method getValidatedStringOffset (line 1090) | private static getValidatedStringOffset(

FILE: src/validation/metadata/BinaryPropertyTableValuesValidator.ts
  class BinaryPropertyTableValuesValidator (line 25) | class BinaryPropertyTableValuesValidator {
    method validateBinaryPropertyTableValues (line 35) | static validateBinaryPropertyTableValues(
    method validateBinaryPropertyTablePropertyValues (line 75) | private static validateBinaryPropertyTablePropertyValues(

FILE: src/validation/metadata/ClassPropertySemanticsValidator.ts
  class ClassPropertySemanticsValidator (line 16) | class ClassPropertySemanticsValidator {
    method validateSemantics (line 29) | static validateSemantics(
    method validateSemantic (line 133) | private static validateSemantic(
    method findSemanticMatcher (line 256) | private static findSemanticMatcher(

FILE: src/validation/metadata/ClassPropertyValidator.ts
  class ClassPropertyValidator (line 24) | class ClassPropertyValidator {
    method validateClassProperty (line 35) | static validateClassProperty(
    method validateClassPropertyInternal (line 73) | private static validateClassPropertyInternal(
    method validateClassPropertyValues (line 450) | private static validateClassPropertyValues(

FILE: src/validation/metadata/ClassPropertyValueValidator.ts
  class ClassPropertyValueValidator (line 21) | class ClassPropertyValueValidator {
    method validateMaxMin (line 42) | static validateMaxMin(
    method validateOffsetScale (line 117) | static validateOffsetScale(

FILE: src/validation/metadata/MetadataClassValidator.ts
  class MetadataClassValidator (line 20) | class MetadataClassValidator {
    method validateMetadataClass (line 31) | static validateMetadataClass(

FILE: src/validation/metadata/MetadataEntityValidator.ts
  class MetadataEntityValidator (line 26) | class MetadataEntityValidator {
    method validateMetadataEntity (line 39) | static validateMetadataEntity(
    method validateMetadataEntityPropertyValue (line 181) | private static validateMetadataEntityPropertyValue(

FILE: src/validation/metadata/MetadataEnumValidator.ts
  class MetadataEnumValidator (line 21) | class MetadataEnumValidator {
    method validateMetadataEnum (line 31) | static validateMetadataEnum(
    method validateMetadataEnumValues (line 168) | private static validateMetadataEnumValues(
    method validateUniqueNames (line 244) | private static validateUniqueNames(
    method validateUniqueValues (line 275) | private static validateUniqueValues(
    method validateMetadataEnumValue (line 308) | private static validateMetadataEnumValue(

FILE: src/validation/metadata/MetadataPropertyModel.ts
  type MetadataPropertyModel (line 17) | interface MetadataPropertyModel<K> {

FILE: src/validation/metadata/MetadataPropertyValidator.ts
  class MetadataPropertyValidator (line 16) | class MetadataPropertyValidator {
    method validateOffsetScaleMaxMin (line 36) | static validateOffsetScaleMaxMin(

FILE: src/validation/metadata/MetadataPropertyValuesValidator.ts
  class MetadataPropertyValuesValidator (line 22) | class MetadataPropertyValuesValidator {
    method validateEnumValues (line 40) | static validateEnumValues<T>(
    method validateMinMax (line 109) | public static validateMinMax<T>(
    method validateMin (line 268) | private static validateMin<T>(
    method computeMin (line 322) | private static computeMin<T>(
    method validateMax (line 360) | private static validateMax<T>(
    method computeMax (line 414) | private static computeMax<T>(

FILE: src/validation/metadata/MetadataStructureValidator.ts
  class MetadataStructureValidator (line 22) | class MetadataStructureValidator {
    method validateMetadataStructure (line 49) | static validateMetadataStructure(

FILE: src/validation/metadata/MetadataValidationUtilities.ts
  class MetadataValidationUtilities (line 15) | class MetadataValidationUtilities {
    method computeEnumValueType (line 27) | static computeEnumValueType(
    method computeEnumValueValueNames (line 59) | static computeEnumValueValueNames(
    method computeClassProperty (line 99) | static computeClassProperty(
    method computeValidEnumValueValues (line 139) | static computeValidEnumValueValues(
    method computeMetadataEnum (line 187) | private static computeMetadataEnum(

FILE: src/validation/metadata/MetadataValueValidationMessages.ts
  class MetadataValuesValidationMessages (line 7) | class MetadataValuesValidationMessages {
    method createValueMessagePart (line 24) | static createValueMessagePart(

FILE: src/validation/metadata/MetadataValueValidator.ts
  class MetadataValueValidator (line 23) | class MetadataValueValidator {
    method validateValueStructure (line 54) | static validateValueStructure(
    method validateStringValueStructure (line 123) | private static validateStringValueStructure(
    method validateEnumValueStructure (line 172) | private static validateEnumValueStructure(
    method validateEnumValueName (line 270) | private static validateEnumValueName(
    method validateBooleanValueStructure (line 315) | private static validateBooleanValueStructure(
    method validateNumericValueStructure (line 375) | static validateNumericValueStructure(

FILE: src/validation/metadata/PropertyTablePropertyValidator.ts
  class PropertyTablePropertyValidator (line 19) | class PropertyTablePropertyValidator {
    method validatePropertyTableProperty (line 32) | static validatePropertyTableProperty(

FILE: src/validation/metadata/PropertyTableValidator.ts
  class PropertyTableValidator (line 24) | class PropertyTableValidator {
    method validatePropertyTable (line 36) | static validatePropertyTable(

FILE: src/validation/metadata/PropertyTablesDefinitionValidator.ts
  class PropertyTablesDefinitionValidator (line 16) | class PropertyTablesDefinitionValidator {
    method validatePropertyTablesDefinition (line 45) | static validatePropertyTablesDefinition(

FILE: src/validation/metadata/RangeIterables.ts
  class RangeIterables (line 6) | class RangeIterables {
    method range1D (line 14) | static range1D(size: number): Iterable<number> {
    method range2D (line 35) | static range2D(sizeX: number, sizeY: number): Iterable<[number, number...

FILE: src/validation/metadata/SchemaDefinitionValidator.ts
  class SchemaDefinitionValidator (line 22) | class SchemaDefinitionValidator {
    method validateSchemaDefinition (line 50) | static async validateSchemaDefinition(
    method resolveSchema (line 143) | private static async resolveSchema(

FILE: src/validation/metadata/SchemaValidator.ts
  class SchemaValidator (line 21) | class SchemaValidator implements Validator<Schema> {
    method validateJsonString (line 31) | async validateJsonString(
    method validateObject (line 56) | async validateObject(
    method validateSchema (line 77) | static validateSchema(
Condensed preview — 1189 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (4,458K chars).
[
  {
    "path": ".eslintignore",
    "chars": 39,
    "preview": "/build\n/dist\n/etc\ngenerateThirdParty.js"
  },
  {
    "path": ".eslintrc.json",
    "chars": 397,
    "preview": "{\n  \"extends\": [\"eslint:recommended\", \"plugin:@typescript-eslint/recommended\"],\n  \"parser\": \"@typescript-eslint/parser\","
  },
  {
    "path": ".github/workflows/ci.yml",
    "chars": 495,
    "preview": "name: CI\n\non: [push, pull_request]\n\nenv:\n  CI: true\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n    - name: Ch"
  },
  {
    "path": ".gitignore",
    "chars": 116,
    "preview": "/node_modules\n/build\n/dist\n/coverage\n/.nyc_output\n/.vscode\ntsdoc-metadata.json\npackage-lock.json\n.eslintcache\n*.tgz\n"
  },
  {
    "path": ".npmignore",
    "chars": 274,
    "preview": "/specs\n/demos\n/tools\n/node_modules\n/dist\n/etc\n/coverage\n/.nyc_output\n/.github\n/.vscode\n/bin\n.eslintcache\n.eslintignore\n."
  },
  {
    "path": ".nycrc",
    "chars": 172,
    "preview": "{\n    \"exclude\": [\n        \"specs/**/*.ts\"\n    ],\n    \"include\": [\n        \"**/*.ts\"\n    ],\n    \"reporter\": [\n        \"h"
  },
  {
    "path": ".prettierignore",
    "chars": 112,
    "preview": "*\n!src/**/\n!specs/**/\n!**/*.js\n!**/*.ts\n!**/*.json\nspecs/data/**/\ntsconfig.json\n.prettierrc.json\nThirdParty.json"
  },
  {
    "path": ".prettierrc.json",
    "chars": 2,
    "preview": "{}"
  },
  {
    "path": "CHANGES.md",
    "chars": 12326,
    "preview": "\nVersion 0.6.1 - 2026-01-25\n\n- Added validation for the `3DTILES_content_gltf` extension [#336](https://github.com/Cesiu"
  },
  {
    "path": "IMPLEMENTATION.md",
    "chars": 6777,
    "preview": "# 3D Tiles Validator Implementation Notes\n\nParts of the current implementation may still change. This page is only a sho"
  },
  {
    "path": "LICENSE.md",
    "chars": 11420,
    "preview": "Copyright 2016-2022 CesiumGS, Inc. and Contributors\n\n                                 Apache License\n                   "
  },
  {
    "path": "README.md",
    "chars": 12635,
    "preview": "# 3D Tiles Validator\n\nA validator for [3D Tiles](https://github.com/CesiumGS/3d-tiles).\n\n> **A note about the repository"
  },
  {
    "path": "ThirdParty.json",
    "chars": 1615,
    "preview": "[\n  {\n    \"name\": \"3d-tiles-tools\",\n    \"license\": [\n      \"Apache-2.0\"\n    ],\n    \"version\": \"0.5.0\",\n    \"url\": \"https"
  },
  {
    "path": "api-extractor.jsonc",
    "chars": 2568,
    "preview": "/**\n * Config file for API Extractor.  For more info, please visit: https://api-extractor.com\n */\n{\n  \"$schema\": \"https:"
  },
  {
    "path": "bin/README.md",
    "chars": 597,
    "preview": "The `main` file in this directory is the entry point for the validator application when it is installed from an NPM pack"
  },
  {
    "path": "bin/main",
    "chars": 40,
    "preview": "#!/usr/bin/env node\nrequire('./main.js')"
  },
  {
    "path": "demos/README.md",
    "chars": 777,
    "preview": "\n### Demos\n\nThese are small command-line demos that show how to use various parts of the API.\n\n**Note that not everythin"
  },
  {
    "path": "demos/validationOptionsDemo.ts",
    "chars": 3119,
    "preview": "import { ContentDataTypes } from \"3d-tiles-tools\";\nimport {\n  Validators,\n  ValidationOptions,\n} from \"../src\";\n\n\nasync "
  },
  {
    "path": "demos/validationResultDemos.ts",
    "chars": 5551,
    "preview": "import { ValidationIssue } from \"../src/validation/ValidationIssue\";\nimport { ValidationIssueSeverity } from \"../src/val"
  },
  {
    "path": "etc/3d-tiles-validator.api.md",
    "chars": 4528,
    "preview": "## API Report File for \"3d-tiles-validator\"\n\n> Do not edit this file. It is a report generated by [API Extractor](https:"
  },
  {
    "path": "generateThirdParty.js",
    "chars": 2290,
    "preview": "\"use strict\";\n\nconst fs = require(\"fs\");\nconst path = require(\"path\");\n\nfunction defaultValue(a, b) {\n  if (a !== undefi"
  },
  {
    "path": "package.json",
    "chars": 4477,
    "preview": "{\n  \"name\": \"3d-tiles-validator\",\n  \"version\": \"0.6.1\",\n  \"license\": \"Apache-2.0\",\n  \"description\": \"Tools for validatin"
  },
  {
    "path": "specs/BasicValidatorSpec.ts",
    "chars": 6642,
    "preview": "import { BasicValidator } from \"../src/validation/BasicValidator\";\nimport { ValidationContext } from \"../src/validation/"
  },
  {
    "path": "specs/BinaryBufferStructureSpec.ts",
    "chars": 12332,
    "preview": "import fs from \"fs\";\n\nimport { ResourceResolvers } from \"3d-tiles-tools\";\n\nimport { BinaryBufferStructure } from \"3d-til"
  },
  {
    "path": "specs/ExternalTilesetExtensionsValidationSpec.ts",
    "chars": 3722,
    "preview": "import { Validators } from \"../src/validation/Validators\";\n\n// Note: These test cases use a dummy extension called\n// VE"
  },
  {
    "path": "specs/MetadataSchemaValidationSpec.ts",
    "chars": 27730,
    "preview": "import { Validators } from \"../src/validation/Validators\";\n\ndescribe(\"Metadata schema validation\", function () {\n  it(\"d"
  },
  {
    "path": "specs/SubtreeValidationSpec.ts",
    "chars": 15410,
    "preview": "import { Schema } from \"3d-tiles-tools\";\n\nimport { readJsonUnchecked } from \"../src/base/readJsonUnchecked\";\n\nimport { V"
  },
  {
    "path": "specs/TilesetPackageValidationSpec.ts",
    "chars": 1779,
    "preview": "import { Validators } from \"../src/validation/Validators\";\n\ndescribe(\"Tileset package validation\", function () {\n  it(\"d"
  },
  {
    "path": "specs/TilesetValidationSpec.ts",
    "chars": 47209,
    "preview": "import { ValidationOptions } from \"../src/validation/ValidationOptions\";\nimport { Validators } from \"../src/validation/V"
  },
  {
    "path": "specs/data/Samples/ImplicitTileMetadata/subtrees/1.1/0.0.0.json",
    "chars": 762,
    "preview": "{\n  \"buffers\": [\n    {\n      \"byteLength\": 32,\n      \"uri\": \"../shared.bin\"\n    }\n  ],\n  \"bufferViews\": [\n    {\n      \"b"
  },
  {
    "path": "specs/data/Samples/ImplicitTileMetadata/tileset_1.1.json",
    "chars": 1437,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"schema\": {\n    \"id\": \"ImplicitTileMetadataSchema\",\n    \"classes\": {\n      \"t"
  },
  {
    "path": "specs/data/Samples/PaddingIssues/README.md",
    "chars": 864,
    "preview": "A set of tests for the handling of padding bytes for GLB data in B3DM tiles.\n(Created for https://github.com/CesiumGS/3d"
  },
  {
    "path": "specs/data/Samples/PaddingIssues/tilesetA.json",
    "chars": 271,
    "preview": "{\n  \"asset\" : {\n    \"version\" : \"1.1\"\n  },\n  \"geometricError\" : 2.0,\n  \"root\" : {\n    \"boundingVolume\" : {\n      \"box\" :"
  },
  {
    "path": "specs/data/Samples/PaddingIssues/tilesetB.json",
    "chars": 271,
    "preview": "{\n  \"asset\" : {\n    \"version\" : \"1.1\"\n  },\n  \"geometricError\" : 2.0,\n  \"root\" : {\n    \"boundingVolume\" : {\n      \"box\" :"
  },
  {
    "path": "specs/data/Samples/PaddingIssues/tilesetC.json",
    "chars": 271,
    "preview": "{\n  \"asset\" : {\n    \"version\" : \"1.1\"\n  },\n  \"geometricError\" : 2.0,\n  \"root\" : {\n    \"boundingVolume\" : {\n      \"box\" :"
  },
  {
    "path": "specs/data/Samples/PaddingIssues/tilesetD.json",
    "chars": 271,
    "preview": "{\n  \"asset\" : {\n    \"version\" : \"1.1\"\n  },\n  \"geometricError\" : 2.0,\n  \"root\" : {\n    \"boundingVolume\" : {\n      \"box\" :"
  },
  {
    "path": "specs/data/Samples/PaddingIssues/tilesetE.json",
    "chars": 271,
    "preview": "{\n  \"asset\" : {\n    \"version\" : \"1.1\"\n  },\n  \"geometricError\" : 2.0,\n  \"root\" : {\n    \"boundingVolume\" : {\n      \"box\" :"
  },
  {
    "path": "specs/data/Samples/README.md",
    "chars": 979,
    "preview": "\n- `TilesetOfTilesets` is the original one from https://github.com/CesiumGS/cesium/tree/66e626c0f9d567f58ead7922d965490a"
  },
  {
    "path": "specs/data/Samples/SparseImplicitQuadtree/tileset.json",
    "chars": 543,
    "preview": "{\n  \"asset\" : {\n    \"version\" : \"1.1\"\n  },\n  \"geometricError\" : 1024.0,\n  \"root\" : {\n    \"boundingVolume\" : {\n      \"box"
  },
  {
    "path": "specs/data/Samples/TilesetOfTilesets/tileset.json",
    "chars": 766,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.0\",\n    \"tilesetVersion\": \"1.2.3\"\n  },\n  \"properties\": {\n    \"id\": {\n      \"minimum\": 0"
  },
  {
    "path": "specs/data/Samples/TilesetOfTilesets/tileset2.json",
    "chars": 1641,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.0\"\n  },\n  \"geometricError\": 240,\n  \"root\": {\n    \"boundingVolume\": {\n      \"region\": [\n"
  },
  {
    "path": "specs/data/Samples/TilesetOfTilesets/tileset3/tileset3.json",
    "chars": 341,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.0\"\n  },\n  \"geometricError\": 70,\n  \"root\": {\n    \"boundingVolume\": {\n      \"region\": [\n "
  },
  {
    "path": "specs/data/Samples/TilesetOfTilesetsWithError/tileset.json",
    "chars": 766,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.0\",\n    \"tilesetVersion\": \"1.2.3\"\n  },\n  \"properties\": {\n    \"id\": {\n      \"minimum\": 0"
  },
  {
    "path": "specs/data/Samples/TilesetOfTilesetsWithError/tileset2.json",
    "chars": 1641,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.0\"\n  },\n  \"geometricError\": 240,\n  \"root\": {\n    \"boundingVolume\": {\n      \"region\": [\n"
  },
  {
    "path": "specs/data/Samples/TilesetOfTilesetsWithError/tileset3/tileset3.json",
    "chars": 341,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.0\"\n  },\n  \"geometricError\": 70,\n  \"root\": {\n    \"boundingVolume\": {\n      \"region\": [\n "
  },
  {
    "path": "specs/data/Samples/TilesetWithFullMetadata/tileset.json",
    "chars": 253607,
    "preview": "{\n  \"asset\" : {\n    \"version\" : \"1.1\"\n  },\n  \"schema\" : {\n    \"id\": \"TilesetWithFullMetadataSchema\",\n    \"classes\" : {\n "
  },
  {
    "path": "specs/data/buffers/bufferViewsElementBufferInvalidType.json",
    "chars": 212,
    "preview": "{\n  \"buffers\": [{ \"uri\": \"validBuffer.bin\", \"byteLength\": 16 }],\n  \"bufferViews\": [\n    { \"buffer\": \"NOT_A_NUMBER\", \"byt"
  },
  {
    "path": "specs/data/buffers/bufferViewsElementBufferInvalidValueA.json",
    "chars": 205,
    "preview": "{\n  \"buffers\": [{ \"uri\": \"validBuffer.bin\", \"byteLength\": 16 }],\n  \"bufferViews\": [\n    { \"buffer\": 123.456, \"byteOffset"
  },
  {
    "path": "specs/data/buffers/bufferViewsElementBufferInvalidValueB.json",
    "chars": 200,
    "preview": "{\n  \"buffers\": [{ \"uri\": \"validBuffer.bin\", \"byteLength\": 16 }],\n  \"bufferViews\": [\n    { \"buffer\": -1, \"byteOffset\": 0,"
  },
  {
    "path": "specs/data/buffers/bufferViewsElementBufferInvalidValueC.json",
    "chars": 203,
    "preview": "{\n  \"buffers\": [{ \"uri\": \"validBuffer.bin\", \"byteLength\": 16 }],\n  \"bufferViews\": [\n    { \"buffer\": 12345, \"byteOffset\":"
  },
  {
    "path": "specs/data/buffers/bufferViewsElementByteLengthInvalidType.json",
    "chars": 212,
    "preview": "{\n  \"buffers\": [{ \"uri\": \"validBuffer.bin\", \"byteLength\": 16 }],\n  \"bufferViews\": [\n    { \"buffer\": 0, \"byteOffset\": 0, "
  },
  {
    "path": "specs/data/buffers/bufferViewsElementByteLengthInvalidValueA.json",
    "chars": 205,
    "preview": "{\n  \"buffers\": [{ \"uri\": \"validBuffer.bin\", \"byteLength\": 16 }],\n  \"bufferViews\": [\n    { \"buffer\": 0, \"byteOffset\": 0, "
  },
  {
    "path": "specs/data/buffers/bufferViewsElementByteLengthInvalidValueB.json",
    "chars": 200,
    "preview": "{\n  \"buffers\": [{ \"uri\": \"validBuffer.bin\", \"byteLength\": 16 }],\n  \"bufferViews\": [\n    { \"buffer\": 0, \"byteOffset\": 0, "
  },
  {
    "path": "specs/data/buffers/bufferViewsElementByteOffsetInvalidType.json",
    "chars": 212,
    "preview": "{\n  \"buffers\": [{ \"uri\": \"validBuffer.bin\", \"byteLength\": 16 }],\n  \"bufferViews\": [\n    { \"buffer\": 0, \"byteOffset\": \"NO"
  },
  {
    "path": "specs/data/buffers/bufferViewsElementByteOffsetInvalidValueA.json",
    "chars": 205,
    "preview": "{\n  \"buffers\": [{ \"uri\": \"validBuffer.bin\", \"byteLength\": 16 }],\n  \"bufferViews\": [\n    { \"buffer\": 0, \"byteOffset\": 123"
  },
  {
    "path": "specs/data/buffers/bufferViewsElementByteOffsetInvalidValueB.json",
    "chars": 200,
    "preview": "{\n  \"buffers\": [{ \"uri\": \"validBuffer.bin\", \"byteLength\": 16 }],\n  \"bufferViews\": [\n    { \"buffer\": 0, \"byteOffset\": -1,"
  },
  {
    "path": "specs/data/buffers/bufferViewsElementExceedsBufferLength.json",
    "chars": 203,
    "preview": "{\n  \"buffers\": [{ \"uri\": \"validBuffer.bin\", \"byteLength\": 16 }],\n  \"bufferViews\": [\n    { \"buffer\": 0, \"byteOffset\": 0, "
  },
  {
    "path": "specs/data/buffers/bufferViewsElementInvalidType.json",
    "chars": 165,
    "preview": "{\n  \"buffers\": [{ \"uri\": \"validBuffer.bin\", \"byteLength\": 16 }],\n  \"bufferViews\": [\n    \"NOT_AN_OBJECT\",\n    { \"buffer\":"
  },
  {
    "path": "specs/data/buffers/bufferViewsInvalidLength.json",
    "chars": 87,
    "preview": "{\n  \"buffers\": [{ \"uri\": \"validBuffer.bin\", \"byteLength\": 16 }],\n  \"bufferViews\": []\n}\n"
  },
  {
    "path": "specs/data/buffers/bufferViewsInvalidType.json",
    "chars": 100,
    "preview": "{\n  \"buffers\": [{ \"uri\": \"validBuffer.bin\", \"byteLength\": 16 }],\n  \"bufferViews\": \"NOT_AN_OBJECT\"\n}\n"
  },
  {
    "path": "specs/data/buffers/buffersElementByteLengthInvalidType.json",
    "chars": 211,
    "preview": "{\n  \"buffers\": [{ \"uri\": \"validBuffer.bin\", \"byteLength\": \"NOT_A_NUMBER\" }],\n  \"bufferViews\": [\n    { \"buffer\": 0, \"byte"
  },
  {
    "path": "specs/data/buffers/buffersElementByteLengthInvalidValueA.json",
    "chars": 204,
    "preview": "{\n  \"buffers\": [{ \"uri\": \"validBuffer.bin\", \"byteLength\": 123.456 }],\n  \"bufferViews\": [\n    { \"buffer\": 0, \"byteOffset\""
  },
  {
    "path": "specs/data/buffers/buffersElementByteLengthInvalidValueB.json",
    "chars": 199,
    "preview": "{\n  \"buffers\": [{ \"uri\": \"validBuffer.bin\", \"byteLength\": -1 }],\n  \"bufferViews\": [\n    { \"buffer\": 0, \"byteOffset\": 0, "
  },
  {
    "path": "specs/data/buffers/buffersElementByteLengthMissing.json",
    "chars": 181,
    "preview": "{\n  \"buffers\": [{ \"uri\": \"validBuffer.bin\" }],\n  \"bufferViews\": [\n    { \"buffer\": 0, \"byteOffset\": 0, \"byteLength\": 3 },"
  },
  {
    "path": "specs/data/buffers/buffersElementInvalidType.json",
    "chars": 170,
    "preview": "{\n  \"buffers\": [ \"NOT_AN_OBJECT\" ],\n  \"bufferViews\": [\n    { \"buffer\": 0, \"byteOffset\": 0, \"byteLength\": 3 },\n    { \"buf"
  },
  {
    "path": "specs/data/buffers/buffersElementNameInvalidLength.json",
    "chars": 210,
    "preview": "{\n  \"buffers\": [{ \"uri\": \"validBuffer.bin\", \"name\":\"\", \"byteLength\": 16 }],\n  \"bufferViews\": [\n    { \"buffer\": 0, \"byteO"
  },
  {
    "path": "specs/data/buffers/buffersElementNameInvalidType.json",
    "chars": 216,
    "preview": "{\n  \"buffers\": [{ \"uri\": \"validBuffer.bin\", \"name\": 123.346, \"byteLength\": 16 }],\n  \"bufferViews\": [\n    { \"buffer\": 0, "
  },
  {
    "path": "specs/data/buffers/buffersElementUriInvalidType.json",
    "chars": 189,
    "preview": "{\n  \"buffers\": [{ \"uri\": 123.346, \"byteLength\": 16 }],\n  \"bufferViews\": [\n    { \"buffer\": 0, \"byteOffset\": 0, \"byteLengt"
  },
  {
    "path": "specs/data/buffers/buffersElementUriMissing.json",
    "chars": 173,
    "preview": "{\n  \"buffers\": [{ \"byteLength\": 16 }],\n  \"bufferViews\": [\n    { \"buffer\": 0, \"byteOffset\": 0, \"byteLength\": 3 },\n    { \""
  },
  {
    "path": "specs/data/buffers/buffersInvalidLength.json",
    "chars": 153,
    "preview": "{\n  \"buffers\": [],\n  \"bufferViews\": [\n    { \"buffer\": 0, \"byteOffset\": 0, \"byteLength\": 3 },\n    { \"buffer\": 0, \"byteOff"
  },
  {
    "path": "specs/data/buffers/buffersInvalidType.json",
    "chars": 166,
    "preview": "{\n  \"buffers\": \"NOT_AN_OBJECT\",\n  \"bufferViews\": [\n    { \"buffer\": 0, \"byteOffset\": 0, \"byteLength\": 3 },\n    { \"buffer\""
  },
  {
    "path": "specs/data/extensions/boundingVolumeS2/s2AndInvalidBox.json",
    "chars": 587,
    "preview": "{\n    \"asset\": {\n        \"version\": \"1.1\"\n    },\n    \"extensionsUsed\": [\n        \"3DTILES_bounding_volume_S2\"\n    ],\n   "
  },
  {
    "path": "specs/data/extensions/boundingVolumeS2/s2MaximumHeightInvalidType.json",
    "chars": 519,
    "preview": "{\n  \"asset\": {\n      \"version\": \"1.1\"\n  },\n  \"extensionsUsed\": [\n      \"3DTILES_bounding_volume_S2\"\n  ],\n  \"extensionsRe"
  },
  {
    "path": "specs/data/extensions/boundingVolumeS2/s2MinimumHeightGreaterThanMaximumHeight.json",
    "chars": 509,
    "preview": "{\n  \"asset\": {\n      \"version\": \"1.1\"\n  },\n  \"extensionsUsed\": [\n      \"3DTILES_bounding_volume_S2\"\n  ],\n  \"extensionsRe"
  },
  {
    "path": "specs/data/extensions/boundingVolumeS2/s2MinimumHeightInvalidType.json",
    "chars": 523,
    "preview": "{\n  \"asset\": {\n      \"version\": \"1.1\"\n  },\n  \"extensionsUsed\": [\n      \"3DTILES_bounding_volume_S2\"\n  ],\n  \"extensionsRe"
  },
  {
    "path": "specs/data/extensions/boundingVolumeS2/s2TokenInvalidType.json",
    "chars": 512,
    "preview": "{\n  \"asset\": {\n      \"version\": \"1.1\"\n  },\n  \"extensionsUsed\": [\n      \"3DTILES_bounding_volume_S2\"\n  ],\n  \"extensionsRe"
  },
  {
    "path": "specs/data/extensions/boundingVolumeS2/s2TokenInvalidValue.json",
    "chars": 526,
    "preview": "{\n  \"asset\": {\n      \"version\": \"1.1\"\n  },\n  \"extensionsUsed\": [\n      \"3DTILES_bounding_volume_S2\"\n  ],\n  \"extensionsRe"
  },
  {
    "path": "specs/data/extensions/boundingVolumeS2/s2TokenMissing.json",
    "chars": 522,
    "preview": "{\n    \"asset\": {\n        \"version\": \"1.1\"\n    },\n    \"extensionsUsed\": [\n        \"3DTILES_bounding_volume_S2\"\n    ],\n   "
  },
  {
    "path": "specs/data/extensions/boundingVolumeS2/validTilesetWithS2.json",
    "chars": 556,
    "preview": "{\n    \"asset\": {\n        \"version\": \"1.1\"\n    },\n    \"extensionsUsed\": [\n        \"3DTILES_bounding_volume_S2\"\n    ],\n   "
  },
  {
    "path": "specs/data/extensions/contentGltf/contentGltfExtensionRequiredButNotUsed.json",
    "chars": 511,
    "preview": "{\n  \"extensionsUsed\": [\"3DTILES_content_gltf\"],\n  \"extensions\": {\n    \"3DTILES_content_gltf\": {\n      \"extensionsRequire"
  },
  {
    "path": "specs/data/extensions/contentGltf/contentGltfExtensionsRequiredDuplicateElement.json",
    "chars": 607,
    "preview": "{\n  \"extensionsUsed\": [\"3DTILES_content_gltf\"],\n  \"extensions\": {\n    \"3DTILES_content_gltf\": {\n      \"extensionsUsed\": "
  },
  {
    "path": "specs/data/extensions/contentGltf/contentGltfExtensionsRequiredInvalidArrayLength.json",
    "chars": 474,
    "preview": "{\n  \"extensionsUsed\": [\"3DTILES_content_gltf\"],\n  \"extensions\": {\n    \"3DTILES_content_gltf\": {\n      \"extensionsRequire"
  },
  {
    "path": "specs/data/extensions/contentGltf/contentGltfExtensionsRequiredInvalidElementType.json",
    "chars": 590,
    "preview": "{\n  \"extensionsUsed\": [\"3DTILES_content_gltf\"],\n  \"extensions\": {\n    \"3DTILES_content_gltf\": {\n      \"extensionsUsed\": "
  },
  {
    "path": "specs/data/extensions/contentGltf/contentGltfExtensionsRequiredInvalidType.json",
    "chars": 486,
    "preview": "{\n  \"extensionsUsed\": [\"3DTILES_content_gltf\"],\n  \"extensions\": {\n    \"3DTILES_content_gltf\": {\n      \"extensionsRequire"
  },
  {
    "path": "specs/data/extensions/contentGltf/contentGltfExtensionsUsedDuplicateElement.json",
    "chars": 538,
    "preview": "{\n  \"extensionsUsed\": [\"3DTILES_content_gltf\"],\n  \"extensions\": {\n    \"3DTILES_content_gltf\": {\n      \"extensionsUsed\": "
  },
  {
    "path": "specs/data/extensions/contentGltf/contentGltfExtensionsUsedInvalidArrayLength.json",
    "chars": 470,
    "preview": "{\n  \"extensionsUsed\": [\"3DTILES_content_gltf\"],\n  \"extensions\": {\n    \"3DTILES_content_gltf\": {\n      \"extensionsUsed\": "
  },
  {
    "path": "specs/data/extensions/contentGltf/contentGltfExtensionsUsedInvalidElementType.json",
    "chars": 521,
    "preview": "{\n  \"extensionsUsed\": [\"3DTILES_content_gltf\"],\n  \"extensions\": {\n    \"3DTILES_content_gltf\": {\n      \"extensionsUsed\": "
  },
  {
    "path": "specs/data/extensions/contentGltf/contentGltfExtensionsUsedInvalidType.json",
    "chars": 482,
    "preview": "{\n  \"extensionsUsed\": [\"3DTILES_content_gltf\"],\n  \"extensions\": {\n    \"3DTILES_content_gltf\": {\n      \"extensionsUsed\": "
  },
  {
    "path": "specs/data/extensions/contentGltf/tileset_1_0_withContentGltfRequiredButNotUsed.json",
    "chars": 386,
    "preview": "{\n  \"extensionsRequired\": [\"3DTILES_content_gltf\"],\n  \"asset\" : {\n    \"version\" : \"1.0\"\n  },\n  \"geometricError\" : 2.0,\n "
  },
  {
    "path": "specs/data/extensions/contentGltf/tileset_1_0_withContentGltfUsedButNotFound.json",
    "chars": 420,
    "preview": "{\n  \"extensionsUsed\": [\"3DTILES_content_gltf\"],\n  \"extensionsRequired\": [\"3DTILES_content_gltf\"],\n  \"asset\" : {\n    \"ver"
  },
  {
    "path": "specs/data/extensions/contentGltf/tileset_1_0_withContentGltfUsedButNotRequired.json",
    "chars": 382,
    "preview": "{\n  \"extensionsUsed\": [\"3DTILES_content_gltf\"],\n  \"asset\" : {\n    \"version\" : \"1.0\"\n  },\n  \"geometricError\" : 2.0,\n  \"ro"
  },
  {
    "path": "specs/data/extensions/contentGltf/tileset_1_1_withContentGltfUsedButNotFound.json",
    "chars": 382,
    "preview": "{\n  \"extensionsUsed\": [\"3DTILES_content_gltf\"],\n  \"asset\" : {\n    \"version\" : \"1.1\"\n  },\n  \"geometricError\" : 2.0,\n  \"ro"
  },
  {
    "path": "specs/data/extensions/contentGltf/validTileset_1_0_withExtensionObject.json",
    "chars": 545,
    "preview": "{\n  \"extensionsUsed\": [\"3DTILES_content_gltf\"],\n  \"extensionsRequired\": [\"3DTILES_content_gltf\"],\n  \"extensions\": {\n    "
  },
  {
    "path": "specs/data/extensions/contentGltf/validTileset_1_0_withGltf.json",
    "chars": 432,
    "preview": "{\n  \"extensionsUsed\": [\"3DTILES_content_gltf\"],\n  \"extensionsRequired\": [\"3DTILES_content_gltf\"],\n  \"asset\" : {\n    \"ver"
  },
  {
    "path": "specs/data/extensions/contentGltf/validTileset_1_1_withContentGltfUsedAndFound.json",
    "chars": 507,
    "preview": "{\n  \"extensionsUsed\": [\"3DTILES_content_gltf\"],\n  \"extensions\": {\n    \"3DTILES_content_gltf\": {\n      \"extensionsUsed\": "
  },
  {
    "path": "specs/data/extensions/contentGltf/validTileset_1_1_withGltf.json",
    "chars": 336,
    "preview": "{\n  \"asset\" : {\n    \"version\" : \"1.1\"\n  },\n  \"geometricError\" : 2.0,\n  \"root\" : {\n    \"refine\": \"REPLACE\",\n    \"bounding"
  },
  {
    "path": "specs/data/extensions/gpm/anchorPointMetadataContentIndexInvalidType.json",
    "chars": 5064,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2.0,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolu"
  },
  {
    "path": "specs/data/extensions/gpm/anchorPointMetadataContentIndexInvalidValue.json",
    "chars": 5181,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2.0,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolu"
  },
  {
    "path": "specs/data/extensions/gpm/anchorPointMetadataContentIndexMissing.json",
    "chars": 5024,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2.0,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolu"
  },
  {
    "path": "specs/data/extensions/gpm/anchorPointMetadataPlacementTypeInvalidValue.json",
    "chars": 5049,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2.0,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolu"
  },
  {
    "path": "specs/data/extensions/gpm/anchorPointMetadataPlacementTypeMeshContentWithContentIndex.json",
    "chars": 5047,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2.0,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolu"
  },
  {
    "path": "specs/data/extensions/gpm/anchorPointMetadataPlacementTypeMissing.json",
    "chars": 5007,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2.0,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolu"
  },
  {
    "path": "specs/data/extensions/gpm/collectionRecordCollectionIdInvalidType.json",
    "chars": 5916,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/collectionRecordCollectionIdMissing.json",
    "chars": 5881,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/collectionRecordPlatformIdInvalidType.json",
    "chars": 5918,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/collectionRecordPlatformIdMissing.json",
    "chars": 5885,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/collectionRecordSensorRecordsElementInvalidType.json",
    "chars": 5957,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/collectionRecordSensorRecordsInvalidLength.json",
    "chars": 4407,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/collectionRecordSensorRecordsInvalidType.json",
    "chars": 4420,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/collectionRecordSensorRecordsMissing.json",
    "chars": 4374,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/collectionUnitRecordCollectionUnitIdInvalidType.json",
    "chars": 5925,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/collectionUnitRecordCollectionUnitIdMissing.json",
    "chars": 5878,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/collectionUnitRecordExtentInformationInvalidType.json",
    "chars": 4890,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/collectionUnitRecordExtentInformationMissing.json",
    "chars": 4832,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/collectionUnitRecordPointSourceIdInvalidType.json",
    "chars": 5939,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/collectionUnitRecordPointSourceIdInvalidValue.json",
    "chars": 5931,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/collectionUnitRecordPointSourceIdMissing.json",
    "chars": 5886,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/collectionUnitRecordReferenceDateTimeInvalidType.json",
    "chars": 5910,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/collectionUnitRecordReferenceDateTimeMissing.json",
    "chars": 5862,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/correlationGroupGroupFlagsElementInvalidType.json",
    "chars": 5937,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/correlationGroupGroupFlagsInvalidLengthA.json",
    "chars": 5908,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/correlationGroupGroupFlagsInvalidLengthB.json",
    "chars": 5944,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/correlationGroupGroupFlagsMissing.json",
    "chars": 5834,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/correlationGroupGroupsGroupFlagsInvalidType.json",
    "chars": 5875,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/correlationGroupGroupsParamsInvalidType.json",
    "chars": 5539,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/correlationGroupGroupsParamsMissing.json",
    "chars": 5502,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/correlationGroupParamsElementInvalidType.json",
    "chars": 5825,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/correlationGroupParamsInvalidLengthA.json",
    "chars": 5796,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/correlationGroupParamsInvalidLengthB.json",
    "chars": 6056,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/correlationGroupRotationThetasInvalidType.json",
    "chars": 5884,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/correlationGroupRotationThetasMissing.json",
    "chars": 5839,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/covarUpperTriangleElementInvalidType.json",
    "chars": 5922,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/covarUpperTriangleInvalidLengthA.json",
    "chars": 5892,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/covarUpperTriangleInvalidLengthB.json",
    "chars": 5930,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/extentInformationLsrAxisUnitVectorsElementInvalidType.json",
    "chars": 5824,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/extentInformationLsrAxisUnitVectorsInvalidLengthA.json",
    "chars": 5791,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/extentInformationLsrAxisUnitVectorsInvalidLengthB.json",
    "chars": 6061,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/extentInformationLsrAxisUnitVectorsInvalidType.json",
    "chars": 5529,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/extentInformationLsrAxisUnitVectorsMissing.json",
    "chars": 5480,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/extentInformationLsrLengthsElementInvalidType.json",
    "chars": 5909,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/extentInformationLsrLengthsInvalidLengthA.json",
    "chars": 5895,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/extentInformationLsrLengthsInvalidLengthB.json",
    "chars": 5943,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/extentInformationLsrLengthsInvalidType.json",
    "chars": 5836,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/extentInformationLsrLengthsMissing.json",
    "chars": 5795,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/extentInformationOriginInvalidType.json",
    "chars": 5835,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/extentInformationOriginMissing.json",
    "chars": 5798,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/idInformationDatasetIdInvalidType.json",
    "chars": 5921,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/idInformationDatasetIdMissing.json",
    "chars": 5891,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/idInformationReferenceDateTimeInvalidType.json",
    "chars": 5910,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/idInformationReferenceDateTimeMissing.json",
    "chars": 5872,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/interpolationParamsDampeningParamInvalidType.json",
    "chars": 5937,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/interpolationParamsDampeningParamMissing.json",
    "chars": 5895,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/interpolationParamsInterpNumPostsInvalidType.json",
    "chars": 5939,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/interpolationParamsInterpNumPostsInvalidValueA.json",
    "chars": 5928,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/interpolationParamsInterpNumPostsInvalidValueB.json",
    "chars": 5926,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/interpolationParamsInterpNumPostsMissing.json",
    "chars": 5897,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/interpolationParamsInterpolationModeInvalidType.json",
    "chars": 5926,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/interpolationParamsInterpolationModeInvalidValue.json",
    "chars": 5936,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/interpolationParamsInterpolationModeMissing.json",
    "chars": 5890,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/interpolationParamsInterpolationModeNearestNeighborWithDampeningParam.json",
    "chars": 5909,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/interpolationParamsInterpolationModeNearestNeighborWithInterpNumPoints.json",
    "chars": 5907,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/lsrAxisUnitVectorsNotOrthogonalA.json",
    "chars": 4796,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2.0,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolu"
  },
  {
    "path": "specs/data/extensions/gpm/lsrAxisUnitVectorsNotOrthogonalB.json",
    "chars": 4796,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2.0,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolu"
  },
  {
    "path": "specs/data/extensions/gpm/lsrAxisUnitVectorsNotOrthogonalC.json",
    "chars": 4796,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2.0,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolu"
  },
  {
    "path": "specs/data/extensions/gpm/masterRecordCollectionRecordListElementInvalidType.json",
    "chars": 4291,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/masterRecordCollectionRecordListInvalidLength.json",
    "chars": 3456,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/masterRecordCollectionRecordListInvalidType.json",
    "chars": 3449,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/masterRecordDatasetExtentInformationInvalidType.json",
    "chars": 4406,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/masterRecordIdInformationInvalidType.json",
    "chars": 5022,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/masterRecordIdInformationMissing.json",
    "chars": 4980,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/masterRecordImplementationInvalidType.json",
    "chars": 5102,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/masterRecordImplementationMissing.json",
    "chars": 5069,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/masterRecordModelCoordSystemInvalidType.json",
    "chars": 5023,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/masterRecordModelCoordSystemMissing.json",
    "chars": 4978,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/masterRecordVersionInvalidType.json",
    "chars": 5105,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/masterRecordVersionMissing.json",
    "chars": 5079,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/modelCoordSystemCrsEcefInvalidType.json",
    "chars": 5085,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/modelCoordSystemCrsEcefMissing.json",
    "chars": 5047,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/modelCoordSystemMcsTypeEcefCrsEcefInvalidType.json",
    "chars": 4674,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2.0,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolu"
  },
  {
    "path": "specs/data/extensions/gpm/modelCoordSystemMcsTypeEcefCrsEcefMissing.json",
    "chars": 4636,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2.0,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolu"
  },
  {
    "path": "specs/data/extensions/gpm/modelCoordSystemMcsTypeEcefWithAxisUnitVectors.json",
    "chars": 4831,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2.0,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolu"
  },
  {
    "path": "specs/data/extensions/gpm/modelCoordSystemMcsTypeEcefWithCrsHorizontalUtm.json",
    "chars": 4764,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2.0,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolu"
  },
  {
    "path": "specs/data/extensions/gpm/modelCoordSystemMcsTypeEcefWithCrsVertical.json",
    "chars": 4932,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2.0,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolu"
  },
  {
    "path": "specs/data/extensions/gpm/modelCoordSystemMcsTypeEcefWithOrigin.json",
    "chars": 4840,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2.0,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolu"
  },
  {
    "path": "specs/data/extensions/gpm/modelCoordSystemMcsTypeInvalidType.json",
    "chars": 5105,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/modelCoordSystemMcsTypeInvalidValue.json",
    "chars": 5115,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/modelCoordSystemMcsTypeLsrAxisUnitVectorsInvalidType.json",
    "chars": 4826,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2.0,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolu"
  },
  {
    "path": "specs/data/extensions/gpm/modelCoordSystemMcsTypeLsrAxisUnitVectorsMissing.json",
    "chars": 4780,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2.0,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolu"
  },
  {
    "path": "specs/data/extensions/gpm/modelCoordSystemMcsTypeLsrOriginInvalidType.json",
    "chars": 4808,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2.0,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolu"
  },
  {
    "path": "specs/data/extensions/gpm/modelCoordSystemMcsTypeLsrOriginMissing.json",
    "chars": 4771,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2.0,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolu"
  },
  {
    "path": "specs/data/extensions/gpm/modelCoordSystemMcsTypeLsrWithCrsEcef.json",
    "chars": 4975,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2.0,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolu"
  },
  {
    "path": "specs/data/extensions/gpm/modelCoordSystemMcsTypeLsrWithCrsHorizontalUtm.json",
    "chars": 4985,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2.0,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolu"
  },
  {
    "path": "specs/data/extensions/gpm/modelCoordSystemMcsTypeLsrWithCrsVertical.json",
    "chars": 5153,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2.0,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolu"
  },
  {
    "path": "specs/data/extensions/gpm/modelCoordSystemMcsTypeMissing.json",
    "chars": 5077,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolume"
  },
  {
    "path": "specs/data/extensions/gpm/modelCoordSystemMcsTypeUtmCrsHorizontalUtmInvalidType.json",
    "chars": 4919,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2.0,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolu"
  },
  {
    "path": "specs/data/extensions/gpm/modelCoordSystemMcsTypeUtmCrsHorizontalUtmMissing.json",
    "chars": 4872,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2.0,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolu"
  },
  {
    "path": "specs/data/extensions/gpm/modelCoordSystemMcsTypeUtmCrsVerticalInvalidType.json",
    "chars": 4746,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2.0,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolu"
  },
  {
    "path": "specs/data/extensions/gpm/modelCoordSystemMcsTypeUtmCrsVerticalMissing.json",
    "chars": 4704,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2.0,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolu"
  },
  {
    "path": "specs/data/extensions/gpm/modelCoordSystemMcsTypeUtmWithAxisUnitVectors.json",
    "chars": 5077,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2.0,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolu"
  },
  {
    "path": "specs/data/extensions/gpm/modelCoordSystemMcsTypeUtmWithCrsEcef.json",
    "chars": 5000,
    "preview": "{\n  \"asset\": {\n    \"version\": \"1.1\"\n  },\n  \"geometricError\": 2.0,\n  \"root\": {\n    \"refine\": \"REPLACE\",\n    \"boundingVolu"
  }
]

// ... and 989 more files (download for full content)

About this extraction

This page contains the full source code of the AnalyticalGraphicsInc/3d-tiles-tools GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1189 files (3.9 MB), approximately 1.1M tokens, and a symbol index with 762 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!