Import hangs when using blender assets

When running my modified CI script with the Docker image, the process just hangs/deadlocks, with the job eventually timing out. No errors show up on the console.
Here is my gitlab-ci.yml file:
image: barichello/godot-ci:4.3

cache:
  key: import-assets
  paths:
  - '.godot/imported/'

stages:
  - import-assets
  - test
  - export
  - deploy

variables:
  EXPORT_NAME: makina-mongoose
  GIT_SUBMODULE_STRATEGY: recursive

import-assets:
  stage: import-assets
  script:
  - apt-get update
  - apt-get install -y --no-install-recommends xz-utils
  - wget -nv https://mirrors.iu13.net/blender/release/Blender4.1/blender-4.1.1-linux-x64.tar.xz
  - tar -xf blender-4.1.1-linux-x64.tar.xz
  - cd blender-4.1.1-linux-x64
  - touch .gdignore
  - pwd | sed 's/^/filesystem\/import\/blender\/blender_path = \"/;s/$/"/' >> ~/.config/godot/editor_settings-4.tres
  - cd ..
  - mkdir -p .godot
  - godot --headless --verbose --import
  when: manual

the process just hangs/deadlocks

Can you paste the logs here (up to the point where it hangs)?

Running with gitlab-runner 17.0.0~pre.88.g761ae5dd (761ae5dd)
  on green-6.saas-linux-small-amd64.runners-manager.gitlab.com/default YKxHNyexq, system ID: s_a201ab37b78a
Preparing the "docker+machine" executor 01:14
Using Docker executor with image barichello/godot-ci:4.3 ...
Pulling docker image barichello/godot-ci:4.3 ...
Using docker image sha256:661b09f330d1d838955b2c591cec6e8e114687efec1a86d6a41396770077bbb8 for barichello/godot-ci:4.3 with digest barichello/godot-ci@sha256:0a2fe0263cc6ecd7dc8aba9fbf9b99196ec3ac3c2f20db4e87d5bc1741d48223 ...
Preparing environment 00:04
Running on runner-ykxhnyexq-project-42405178-concurrent-0 via runner-ykxhnyexq-s-l-s-amd64-1725554707-0c477836...
Getting source from Git repository 00:07
Fetching changes with git depth set to 20...
Initialized empty Git repository in /builds/lunarlabs/MakinaMongoose/.git/
Created fresh repository.
Checking out 676c69b6 as detached HEAD (ref is ci-cd)...
Updating/initializing submodules recursively with git depth set to 20...
Submodule 'addons/panku_console' (https://github.com/Ark2000/panku_console) registered for path 'addons/panku_console'
Synchronizing submodule url for 'addons/panku_console'
Cloning into '/builds/lunarlabs/MakinaMongoose/addons/panku_console'...
Submodule path 'addons/panku_console': checked out '9ae6aae741607949155a67193e6501f40e2b9876'
Updated submodules
Synchronizing submodule url for 'addons/panku_console'
Entering 'addons/panku_console'
Entering 'addons/panku_console'
$ git remote set-url origin "${CI_REPOSITORY_URL}"
Restoring cache 00:01
Checking cache for import-assets-non_protected...
WARNING: file does not exist
Failed to extract cache
Executing "step_script" stage of the job script 58:34
Using docker image sha256:661b09f330d1d838955b2c591cec6e8e114687efec1a86d6a41396770077bbb8 for barichello/godot-ci:4.3 with digest barichello/godot-ci@sha256:0a2fe0263cc6ecd7dc8aba9fbf9b99196ec3ac3c2f20db4e87d5bc1741d48223 ...
$ apt-get update
Get:1 http://security.ubuntu.com/ubuntu jammy-security InRelease [129 kB]
Get:2 http://archive.ubuntu.com/ubuntu jammy InRelease [270 kB]
Get:3 http://archive.ubuntu.com/ubuntu jammy-updates InRelease [128 kB]
Get:4 http://security.ubuntu.com/ubuntu jammy-security/universe amd64 Packages [1149 kB]
Get:5 http://archive.ubuntu.com/ubuntu jammy-backports InRelease [127 kB]
Get:6 http://archive.ubuntu.com/ubuntu jammy/universe amd64 Packages [17.5 MB]
Get:7 http://security.ubuntu.com/ubuntu jammy-security/multiverse amd64 Packages [44.7 kB]
Get:8 http://security.ubuntu.com/ubuntu jammy-security/restricted amd64 Packages [2967 kB]
Get:9 http://security.ubuntu.com/ubuntu jammy-security/main amd64 Packages [2224 kB]
Get:10 http://archive.ubuntu.com/ubuntu jammy/restricted amd64 Packages [164 kB]
Get:11 http://archive.ubuntu.com/ubuntu jammy/multiverse amd64 Packages [266 kB]
Get:12 http://archive.ubuntu.com/ubuntu jammy/main amd64 Packages [1792 kB]
Get:13 http://archive.ubuntu.com/ubuntu jammy-updates/restricted amd64 Packages [3045 kB]
Get:14 http://archive.ubuntu.com/ubuntu jammy-updates/universe amd64 Packages [1438 kB]
Get:15 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages [2499 kB]
Get:16 http://archive.ubuntu.com/ubuntu jammy-updates/multiverse amd64 Packages [51.8 kB]
Get:17 http://archive.ubuntu.com/ubuntu jammy-backports/universe amd64 Packages [33.7 kB]
Get:18 http://archive.ubuntu.com/ubuntu jammy-backports/main amd64 Packages [81.4 kB]
Fetched 33.9 MB in 2s (21.7 MB/s)
Reading package lists...
$ apt-get install -y --no-install-recommends xz-utils
Reading package lists...
Building dependency tree...
Reading state information...
The following NEW packages will be installed:
  xz-utils
0 upgraded, 1 newly installed, 0 to remove and 12 not upgraded.
Need to get 84.8 kB of archives.
After this operation, 381 kB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu jammy/main amd64 xz-utils amd64 5.2.5-2ubuntu1 [84.8 kB]
debconf: delaying package configuration, since apt-utils is not installed
Fetched 84.8 kB in 0s (680 kB/s)
Selecting previously unselected package xz-utils.
(Reading database ... 12609 files and directories currently installed.)
Preparing to unpack .../xz-utils_5.2.5-2ubuntu1_amd64.deb ...
Unpacking xz-utils (5.2.5-2ubuntu1) ...
Setting up xz-utils (5.2.5-2ubuntu1) ...
update-alternatives: using /usr/bin/xz to provide /usr/bin/lzma (lzma) in auto mode
update-alternatives: warning: skip creation of /usr/share/man/man1/lzma.1.gz because associated file /usr/share/man/man1/xz.1.gz (of link group lzma) doesn't exist
update-alternatives: warning: skip creation of /usr/share/man/man1/unlzma.1.gz because associated file /usr/share/man/man1/unxz.1.gz (of link group lzma) doesn't exist
update-alternatives: warning: skip creation of /usr/share/man/man1/lzcat.1.gz because associated file /usr/share/man/man1/xzcat.1.gz (of link group lzma) doesn't exist
update-alternatives: warning: skip creation of /usr/share/man/man1/lzmore.1.gz because associated file /usr/share/man/man1/xzmore.1.gz (of link group lzma) doesn't exist
update-alternatives: warning: skip creation of /usr/share/man/man1/lzless.1.gz because associated file /usr/share/man/man1/xzless.1.gz (of link group lzma) doesn't exist
update-alternatives: warning: skip creation of /usr/share/man/man1/lzdiff.1.gz because associated file /usr/share/man/man1/xzdiff.1.gz (of link group lzma) doesn't exist
update-alternatives: warning: skip creation of /usr/share/man/man1/lzcmp.1.gz because associated file /usr/share/man/man1/xzcmp.1.gz (of link group lzma) doesn't exist
update-alternatives: warning: skip creation of /usr/share/man/man1/lzgrep.1.gz because associated file /usr/share/man/man1/xzgrep.1.gz (of link group lzma) doesn't exist
update-alternatives: warning: skip creation of /usr/share/man/man1/lzegrep.1.gz because associated file /usr/share/man/man1/xzegrep.1.gz (of link group lzma) doesn't exist
update-alternatives: warning: skip creation of /usr/share/man/man1/lzfgrep.1.gz because associated file /usr/share/man/man1/xzfgrep.1.gz (of link group lzma) doesn't exist
$ wget -nv https://mirrors.iu13.net/blender/release/Blender4.1/blender-4.1.1-linux-x64.tar.xz
2024-09-05 17:02:01 URL:https://mirrors.iu13.net/blender/release/Blender4.1/blender-4.1.1-linux-x64.tar.xz [297954552/297954552] -> "blender-4.1.1-linux-x64.tar.xz" [1]
$ tar -xf blender-4.1.1-linux-x64.tar.xz
$ cd blender-4.1.1-linux-x64
$ touch .gdignore
$ pwd | sed 's/^/filesystem\/import\/blender\/blender_path = \"/;s/$/"/' >> ~/.config/godot/editor_settings-4.tres
$ cd ..
$ mkdir -p .godot
$ godot --headless --verbose --import
Godot Engine v4.3.stable.official.77dcf97d8 - https://godotengine.org/
TextServer: Added interface "Dummy"
TextServer: Added interface "ICU / HarfBuzz / Graphite (Built-in)"
JoypadLinux: udev enabled and loaded successfully.
Using "default" pen tablet driver...
TextServer: Primary interface set to: "ICU / HarfBuzz / Graphite (Built-in)".
CORE API HASH: 966092234
EDITOR API HASH: 444927587
EditorSettings: Load OK!
EditorTheme: Generating new theme for the config '66886095'.
EditorTheme: Generating new icons.
EditorTheme: Generating new fonts.
EditorTheme: Generating new styles.
Regenerating editor help cache
Class 'AbstractPolygon2DEditor' is not exposed, skipping.
Class 'AbstractPolygon2DEditorPlugin' is not exposed, skipping.
Class 'ActionMapEditor' is not exposed, skipping.
Class 'AnchorPresetPicker' is not exposed, skipping.
Class 'AnimationBezierTrackEdit' is not exposed, skipping.
Class 'AnimationLibraryEditor' is not exposed, skipping.
Class 'AnimationNodeBlendSpace1DEditor' is not exposed, skipping.
Class 'AnimationNodeBlendSpace2DEditor' is not exposed, skipping.
Class 'AnimationNodeBlendTreeEditor' is not exposed, skipping.
Class 'AnimationNodeStateMachineEditor' is not exposed, skipping.
Class 'AnimationPlayerEditor' is not exposed, skipping.
Class 'AnimationPlayerEditorPlugin' is not exposed, skipping.
Class 'AnimationTimelineEdit' is not exposed, skipping.
Class 'AnimationTrackEditDefaultPlugin' is not exposed, skipping.
Class 'AnimationTrackEditPlugin' is not exposed, skipping.
Class 'AnimationTrackEditor' is not exposed, skipping.
Class 'AnimationTrackKeyEditEditorPlugin' is not exposed, skipping.
Class 'AnimationTreeEditor' is not exposed, skipping.
Class 'AnimationTreeEditorPlugin' is not exposed, skipping.
Class 'AnimationTreeNodeEditorPlugin' is not exposed, skipping.
Class 'AssetLibraryEditorPlugin' is not exposed, skipping.
Class 'AtlasMergingDialog' is not exposed, skipping.
Class 'AtlasTileProxyObject' is not exposed, skipping.
Class 'AudioBusesEditorPlugin' is not exposed, skipping.
Class 'AudioStreamEditorPlugin' is not exposed, skipping.
Class 'AudioStreamImportSettingsDialog' is not exposed, skipping.
Class 'AudioStreamInteractiveEditorPlugin' is not exposed, skipping.
Class 'AudioStreamInteractiveTransitionEditor' is not exposed, skipping.
Class 'AudioStreamPlayerInternal' is not exposed, skipping.
Class 'AudioStreamPreviewGenerator' is not exposed, skipping.
Class 'AudioStreamRandomizerEditorPlugin' is not exposed, skipping.
Class 'BackgroundProgress' is not exposed, skipping.
Class 'BitMapEditorPlugin' is not exposed, skipping.
Class 'BoneMapEditorPlugin' is not exposed, skipping.
Class 'CPUParticles2DEditorPlugin' is not exposed, skipping.
Class 'CPUParticles3DEditor' is not exposed, skipping.
Class 'CPUParticles3DEditorPlugin' is not exposed, skipping.
Class 'CSGShape3DGizmoPlugin' is not exposed, skipping.
Class 'Camera3DEditorPlugin' is not exposed, skipping.
Class 'CanvasItemEditor' is not exposed, skipping.
Class 'CanvasItemEditorPlugin' is not exposed, skipping.
Class 'CanvasItemEditorViewport' is not exposed, skipping.
Class 'CanvasItemMaterialConversionPlugin' is not exposed, skipping.
Class 'Cast2DEditor' is not exposed, skipping.
Class 'Cast2DEditorPlugin' is not exposed, skipping.
Class 'CollisionPolygon2DEditor' is not exposed, skipping.
Class 'CollisionPolygon2DEditorPlugin' is not exposed, skipping.
Class 'CollisionShape2DEditor' is not exposed, skipping.
Class 'CollisionShape2DEditorPlugin' is not exposed, skipping.
Class 'ConnectDialog' is not exposed, skipping.
Class 'ConnectDialogBinds' is not exposed, skipping.
Class 'ConnectionsDock' is not exposed, skipping.
Class 'ControlEditorPlugin' is not exposed, skipping.
Class 'ControlEditorPopupButton' is not exposed, skipping.
Class 'ControlEditorPresetPicker' is not exposed, skipping.
Class 'ControlEditorToolbar' is not exposed, skipping.
Class 'CreateDialog' is not exposed, skipping.
Class 'CurveEditorPlugin' is not exposed, skipping.
Class 'CurvePreviewGenerator' is not exposed, skipping.
Class 'DebugAdapterParser' is not exposed, skipping.
Class 'DebugAdapterServer' is not exposed, skipping.
Class 'DebuggerEditorPlugin' is not exposed, skipping.
Class 'DefaultThemeEditorPreview' is not exposed, skipping.
Class 'DependencyEditor' is not exposed, skipping.
Class 'DependencyEditorOwners' is not exposed, skipping.
Class 'DependencyErrorDialog' is not exposed, skipping.
Class 'DependencyRemoveDialog' is not exposed, skipping.
Class 'DirectoryCreateDialog' is not exposed, skipping.
Class 'DockContextPopup' is not exposed, skipping.
Class 'DockSplitContainer' is not exposed, skipping.
Class 'DynamicFontImportSettingsData' is not exposed, skipping.
Class 'DynamicFontImportSettingsDialog' is not exposed, skipping.
Class 'EditorAbout' is not exposed, skipping.
Class 'EditorAssetLibrary' is not exposed, skipping.
Class 'EditorAudioBuses' is not exposed, skipping.
Class 'EditorAudioStreamPreviewPlugin' is not exposed, skipping.
Class 'EditorAudioStreamTooltipPlugin' is not exposed, skipping.
Class 'EditorAutoloadSettings' is not exposed, skipping.
Class 'EditorBitmapPreviewPlugin' is not exposed, skipping.
Class 'EditorBottomPanel' is not exposed, skipping.
Class 'EditorBuildProfileManager' is not exposed, skipping.
Class 'EditorDebuggerInspector' is not exposed, skipping.
Class 'EditorDebuggerNode' is not exposed, skipping.
Class 'EditorDebuggerRemoteObject' is not exposed, skipping.
Class 'EditorDebuggerTree' is not exposed, skipping.
Class 'EditorDirDialog' is not exposed, skipping.
Class 'EditorDockManager' is not exposed, skipping.
Class 'EditorExport' is not exposed, skipping.
Class 'EditorExportGDScript' is not exposed, skipping.
Class 'EditorFeatureProfileManager' is not exposed, skipping.
Class 'EditorFileServer' is not exposed, skipping.
Class 'EditorFileSystemImportFormatSupportQueryBlend' is not exposed, skipping.
Class 'EditorFontPreviewPlugin' is not exposed, skipping.
Class 'EditorGradientPreviewPlugin' is not exposed, skipping.
Class 'EditorHelpBit' is not exposed, skipping.
Class 'EditorHelpSearch' is not exposed, skipping.
Class 'EditorImagePreviewPlugin' is not exposed, skipping.
Class 'EditorImportBlendRunner' is not exposed, skipping.
Class 'EditorInspectorDefaultPlugin' is not exposed, skipping.
Class 'EditorInspectorParticleProcessMaterialPlugin' is not exposed, skipping.
Class 'EditorInspectorPlugin3DTexture' is not exposed, skipping.
Class 'EditorInspectorPluginAnimationTrackKeyEdit' is not exposed, skipping.
Class 'EditorInspectorPluginAudioStream' is not exposed, skipping.
Class 'EditorInspectorPluginAudioStreamInteractive' is not exposed, skipping.
Class 'EditorInspectorPluginBitMap' is not exposed, skipping.
Class 'EditorInspectorPluginBoneMap' is not exposed, skipping.
Class 'EditorInspectorPluginControl' is not exposed, skipping.
Class 'EditorInspectorPluginCurve' is not exposed, skipping.
Class 'EditorInspectorPluginFontPreview' is not exposed, skipping.
Class 'EditorInspectorPluginFontVariation' is not exposed, skipping.
Class 'EditorInspectorPluginGradient' is not exposed, skipping.
Class 'EditorInspectorPluginGradientTexture2D' is not exposed, skipping.
Class 'EditorInspectorPluginInputEvent' is not exposed, skipping.
Class 'EditorInspectorPluginLayeredTexture' is not exposed, skipping.
Class 'EditorInspectorPluginMaterial' is not exposed, skipping.
Class 'EditorInspectorPluginMesh' is not exposed, skipping.
Class 'EditorInspectorPluginPackedScene' is not exposed, skipping.
Class 'EditorInspectorPluginSkeleton' is not exposed, skipping.
Class 'EditorInspectorPluginStyleBox' is not exposed, skipping.
Class 'EditorInspectorPluginSubViewportPreview' is not exposed, skipping.
Class 'EditorInspectorPluginSystemFont' is not exposed, skipping.
Class 'EditorInspectorPluginTexture' is not exposed, skipping.
Class 'EditorInspectorPluginTextureRegion' is not exposed, skipping.
Class 'EditorInspectorPluginTileData' is not exposed, skipping.
Class 'EditorInspectorRootMotionPlugin' is not exposed, skipping.
Class 'EditorInspectorVisualShaderModePlugin' is not exposed, skipping.
Class 'EditorJSONSyntaxHighlighter' is not exposed, skipping.
Class 'EditorLayoutsDialog' is not exposed, skipping.
Class 'EditorLocaleDialog' is not exposed, skipping.
Class 'EditorLog' is not exposed, skipping.
Class 'EditorMaterialPreviewPlugin' is not exposed, skipping.
Class 'EditorMeshPreviewPlugin' is not exposed, skipping.
Class 'EditorNativeShaderSourceVisualizer' is not exposed, skipping.
Class 'EditorNode' is not exposed, skipping.
Class 'EditorOBJImporter' is not exposed, skipping.
Class 'EditorObjectSelector' is not exposed, skipping.
Class 'EditorPackedScenePreviewPlugin' is not exposed, skipping.
Class 'EditorPerformanceProfiler' is not exposed, skipping.
Class 'EditorPluginCSG' is not exposed, skipping.
Class 'EditorPluginSettings' is not exposed, skipping.
Class 'EditorProfiler' is not exposed, skipping.
Class 'EditorPropertyInteger' is not exposed, skipping.
Class 'EditorPropertyNameProcessor' is not exposed, skipping.
Class 'EditorPropertyPath' is not exposed, skipping.
Class 'EditorPropertyVector2i' is not exposed, skipping.
Class 'EditorPropertyVectorN' is not exposed, skipping.
Class 'EditorQuickOpen' is not exposed, skipping.
Class 'EditorRunBar' is not exposed, skipping.
Class 'EditorRunNative' is not exposed, skipping.
Class 'EditorSceneExporterGLTFSettings' is not exposed, skipping.
Class 'EditorSceneFormatImporterCollada' is not exposed, skipping.
Class 'EditorSceneFormatImporterESCN' is not exposed, skipping.
Class 'EditorSceneTabs' is not exposed, skipping.
Class 'EditorScriptPreviewPlugin' is not exposed, skipping.
Class 'EditorSettingsDialog' is not exposed, skipping.
Class 'EditorTexturePreviewPlugin' is not exposed, skipping.
Class 'EditorTextureTooltipPlugin' is not exposed, skipping.
Class 'EditorTheme' is not exposed, skipping.
Class 'EditorTitleBar' is not exposed, skipping.
Class 'EditorToaster' is not exposed, skipping.
Class 'EditorValidationPanel' is not exposed, skipping.
Class 'EditorVisualProfiler' is not exposed, skipping.
Class 'EditorZoomWidget' is not exposed, skipping.
Class 'EventListenerLineEdit' is not exposed, skipping.
Class 'ExportTemplateManager' is not exposed, skipping.
Class 'FBXImporterManager' is not exposed, skipping.
Class 'FileSystemList' is not exposed, skipping.
Class 'FindInFiles' is not exposed, skipping.
Class 'FindInFilesDialog' is not exposed, skipping.
Class 'FindInFilesPanel' is not exposed, skipping.
Class 'FindReplaceBar' is not exposed, skipping.
Class 'FogMaterialConversionPlugin' is not exposed, skipping.
Class 'FontEditorPlugin' is not exposed, skipping.
Class 'GDScriptEditorTranslationParserPlugin' is not exposed, skipping.
Class 'GDScriptLanguageServer' is not exposed, skipping.
Class 'GDScriptNativeClass' is not exposed, skipping.
Class 'GDScriptSyntaxHighlighter' is not exposed, skipping.
Class 'GLTFDocumentExtensionPhysics' is not exposed, skipping.
Class 'GLTFDocumentExtensionTextureKTX' is not exposed, skipping.
Class 'GLTFDocumentExtensionTextureWebP' is not exposed, skipping.
Class 'GPUParticles2DEditorPlugin' is not exposed, skipping.
Class 'GPUParticles3DEditor' is not exposed, skipping.
Class 'GPUParticles3DEditorBase' is not exposed, skipping.
Class 'GPUParticles3DEditorPlugin' is not exposed, skipping.
Class 'GPUParticlesCollisionSDF3DEditorPlugin' is not exposed, skipping.
Class 'Gizmo3DHelper' is not exposed, skipping.
Class 'GodotNavigationServer2D' is not exposed, skipping.
Class 'GodotPhysicsServer2D' is not exposed, skipping.
Class 'GodotPhysicsServer3D' is not exposed, skipping.
Class 'GradientEditorPlugin' is not exposed, skipping.
Class 'GradientTexture2DEditorPlugin' is not exposed, skipping.
Class 'GraphEditFilter' is not exposed, skipping.
Class 'GraphEditMinimap' is not exposed, skipping.
Class 'GridMapEditor' is not exposed, skipping.
Class 'GridMapEditorPlugin' is not exposed, skipping.
Class 'GroupSettingsEditor' is not exposed, skipping.
Class 'GroupsEditor' is not exposed, skipping.
Class 'HistoryDock' is not exposed, skipping.
Class 'IPUnix' is not exposed, skipping.
Class 'ImportDefaultsEditor' is not exposed, skipping.
Class 'ImportDefaultsEditorSettings' is not exposed, skipping.
Class 'ImportDock' is not exposed, skipping.
Class 'ImportDockParameters' is not exposed, skipping.
Class 'InputEventConfigurationDialog' is not exposed, skipping.
Class 'InputEventEditorPlugin' is not exposed, skipping.
Class 'InspectorDock' is not exposed, skipping.
Class 'LightOccluder2DEditor' is not exposed, skipping.
Class 'LightOccluder2DEditorPlugin' is not exposed, skipping.
Class 'LightmapGIEditorPlugin' is not exposed, skipping.
Class 'Line2DEditor' is not exposed, skipping.
Class 'Line2DEditorPlugin' is not exposed, skipping.
Class 'LocalizationEditor' is not exposed, skipping.
Class 'MaterialEditorPlugin' is not exposed, skipping.
Class 'MeshEditorPlugin' is not exposed, skipping.
Class 'MeshInstance3DEditor' is not exposed, skipping.
Class 'MeshInstance3DEditorPlugin' is not exposed, skipping.
Class 'MeshLibraryEditor' is not exposed, skipping.
Class 'MeshLibraryEditorPlugin' is not exposed, skipping.
Class 'MovieWriterMJPEG' is not exposed, skipping.
Class 'MovieWriterPNGWAV' is not exposed, skipping.
Class 'MultiMeshEditor' is not exposed, skipping.
Class 'MultiMeshEditorPlugin' is not exposed, skipping.
Class 'MultiplayerEditorDebugger' is not exposed, skipping.
Class 'MultiplayerEditorPlugin' is not exposed, skipping.
Class 'NavigationLink2DEditor' is not exposed, skipping.
Class 'NavigationLink2DEditorPlugin' is not exposed, skipping.
Class 'NavigationMeshEditor' is not exposed, skipping.
Class 'NavigationMeshEditorPlugin' is not exposed, skipping.
Class 'NavigationObstacle2DEditor' is not exposed, skipping.
Class 'NavigationObstacle2DEditorPlugin' is not exposed, skipping.
Class 'NavigationObstacle3DEditor' is not exposed, skipping.
Class 'NavigationObstacle3DEditorPlugin' is not exposed, skipping.
Class 'NavigationPolygonEditor' is not exposed, skipping.
Class 'NavigationPolygonEditorPlugin' is not exposed, skipping.
Class 'Node3DEditor' is not exposed, skipping.
Class 'Node3DEditorPlugin' is not exposed, skipping.
Class 'Node3DEditorViewport' is not exposed, skipping.
Class 'Node3DEditorViewportContainer' is not exposed, skipping.
Class 'NodeDock' is not exposed, skipping.
Class 'NoiseEditorInspectorPlugin' is not exposed, skipping.
Class 'NoiseEditorPlugin' is not exposed, skipping.
Class 'ORMMaterial3DConversionPlugin' is not exposed, skipping.
Class 'OccluderInstance3DEditorPlugin' is not exposed, skipping.
Class 'OrphanResourcesDialog' is not exposed, skipping.
Class 'PackedSceneEditorPlugin' is not exposed, skipping.
Class 'PackedSceneEditorTranslationParserPlugin' is not exposed, skipping.
Class 'PanoramaSkyMaterialConversionPlugin' is not exposed, skipping.
Class 'ParallaxBackgroundEditorPlugin' is not exposed, skipping.
Class 'ParticleProcessMaterialConversionPlugin' is not exposed, skipping.
Class 'Path2DEditor' is not exposed, skipping.
Class 'Path2DEditorPlugin' is not exposed, skipping.
Class 'Path3DEditorPlugin' is not exposed, skipping.
Class 'Path3DGizmoPlugin' is not exposed, skipping.
Class 'PhysicalBone3DEditorPlugin' is not exposed, skipping.
Class 'PhysicalSkyMaterialConversionPlugin' is not exposed, skipping.
Class 'PluginConfigDialog' is not exposed, skipping.
Class 'Polygon2DEditor' is not exposed, skipping.
Class 'Polygon2DEditorPlugin' is not exposed, skipping.
Class 'Polygon3DEditor' is not exposed, skipping.
Class 'Polygon3DEditorPlugin' is not exposed, skipping.
Class 'PostImportPluginSkeletonRenamer' is not exposed, skipping.
Class 'PostImportPluginSkeletonRestFixer' is not exposed, skipping.
Class 'PostImportPluginSkeletonTrackOrganizer' is not exposed, skipping.
Class 'ProceduralSkyMaterialConversionPlugin' is not exposed, skipping.
Class 'ProgressDialog' is not exposed, skipping.
Class 'ProjectExportDialog' is not exposed, skipping.
Class 'ProjectExportTextureFormatError' is not exposed, skipping.
Class 'ProjectSettingsEditor' is not exposed, skipping.
Class 'PropertySelector' is not exposed, skipping.
Class 'RenameDialog' is not exposed, skipping.
Class 'ReparentDialog' is not exposed, skipping.
Class 'ReplicationEditor' is not exposed, skipping.
Class 'ResourceFormatImporterSaver' is not exposed, skipping.
Class 'ResourcePreloaderEditor' is not exposed, skipping.
Class 'ResourcePreloaderEditorPlugin' is not exposed, skipping.
Class 'RunInstancesDialog' is not exposed, skipping.
Class 'SceneCacheInterface' is not exposed, skipping.
Class 'SceneCreateDialog' is not exposed, skipping.
Class 'SceneExporterGLTFPlugin' is not exposed, skipping.
Class 'SceneImportSettingsData' is not exposed, skipping.
Class 'SceneImportSettingsDialog' is not exposed, skipping.
Class 'SceneRPCInterface' is not exposed, skipping.
Class 'SceneReplicationInterface' is not exposed, skipping.
Class 'SceneTileProxyObject' is not exposed, skipping.
Class 'SceneTreeDialog' is not exposed, skipping.
Class 'SceneTreeDock' is not exposed, skipping.
Class 'SceneTreeEditor' is not exposed, skipping.
Class 'ScreenSelect' is not exposed, skipping.
Class 'ScriptEditorDebugger' is not exposed, skipping.
Class 'ScriptEditorPlugin' is not exposed, skipping.
Class 'SectionedInspector' is not exposed, skipping.
Class 'SectionedInspectorFilter' is not exposed, skipping.
Class 'ShaderCreateDialog' is not exposed, skipping.
Class 'ShaderEditorPlugin' is not exposed, skipping.
Class 'ShaderFileEditor' is not exposed, skipping.
Class 'ShaderFileEditorPlugin' is not exposed, skipping.
Class 'ShaderGlobalsEditor' is not exposed, skipping.
Class 'ShaderGlobalsEditorInterface' is not exposed, skipping.
Class 'SizeFlagPresetPicker' is not exposed, skipping.
Class 'Skeleton2DEditor' is not exposed, skipping.
Class 'Skeleton2DEditorPlugin' is not exposed, skipping.
Class 'Skeleton3DEditorPlugin' is not exposed, skipping.
Class 'Skeleton3DGizmoPlugin' is not exposed, skipping.
Class 'SkeletonIK3DEditorPlugin' is not exposed, skipping.
Class 'SnapDialog' is not exposed, skipping.
Class 'SplitContainerDragger' is not exposed, skipping.
Class 'Sprite2DEditor' is not exposed, skipping.
Class 'Sprite2DEditorPlugin' is not exposed, skipping.
Class 'SpriteFramesEditor' is not exposed, skipping.
Class 'SpriteFramesEditorPlugin' is not exposed, skipping.
Class 'StandardMaterial3DConversionPlugin' is not exposed, skipping.
Class 'StyleBoxEditorPlugin' is not exposed, skipping.
Class 'SubViewportPreviewEditorPlugin' is not exposed, skipping.
Class 'SurfaceUpgradeDialog' is not exposed, skipping.
Class 'SurfaceUpgradeTool' is not exposed, skipping.
Class 'Texture3DEditorPlugin' is not exposed, skipping.
Class 'TextureEditorPlugin' is not exposed, skipping.
Class 'TextureLayeredEditorPlugin' is not exposed, skipping.
Class 'TextureRegionEditor' is not exposed, skipping.
Class 'TextureRegionEditorPlugin' is not exposed, skipping.
Class 'ThemeContext' is not exposed, skipping.
Class 'ThemeEditor' is not exposed, skipping.
Class 'ThemeEditorPlugin' is not exposed, skipping.
Class 'ThemeEditorPreview' is not exposed, skipping.
Class 'ThemeItemEditorDialog' is not exposed, skipping.
Class 'ThemeItemImportTree' is not exposed, skipping.
Class 'ThemeTypeDialog' is not exposed, skipping.
Class 'ThemeTypeEditor' is not exposed, skipping.
Class 'TileAtlasView' is not exposed, skipping.
Class 'TileMapEditorPlugin' is not exposed, skipping.
Class 'TileMapLayerEditor' is not exposed, skipping.
Class 'TileMapLayerEditorTerrainsPlugin' is not exposed, skipping.
Class 'TileMapLayerEditorTilesPlugin' is not exposed, skipping.
Class 'TileProxiesManagerDialog' is not exposed, skipping.
Class 'TileSetAtlasSourceEditor' is not exposed, skipping.
Class 'TileSetAtlasSourceProxyObject' is not exposed, skipping.
Class 'TileSetEditor' is not exposed, skipping.
Class 'TileSetEditorPlugin' is not exposed, skipping.
Class 'TileSetScenesCollectionProxyObject' is not exposed, skipping.
Class 'TileSetScenesCollectionSourceEditor' is not exposed, skipping.
Class 'TileSourceInspectorPlugin' is not exposed, skipping.
Class 'TilesEditorUtils' is not exposed, skipping.
Class 'UVEditDialog' is not exposed, skipping.
Class 'VersionControlEditorPlugin' is not exposed, skipping.
Class 'ViewPanner' is not exposed, skipping.
Class 'ViewportNavigationControl' is not exposed, skipping.
Class 'ViewportRotationControl' is not exposed, skipping.
Class 'VisualShaderConversionPlugin' is not exposed, skipping.
Class 'VoxelGIEditorPlugin' is not exposed, skipping.
Class 'WindowWrapper' is not exposed, skipping.
Loaded system CA certificates
EditorSettings: Save OK!
WARNING: Detected another project.godot at res://build. The folder will be ignored.
     at: _should_skip_directory (editor/editor_file_system.cpp:2828)
ERROR: Unable to open file: res://.godot/imported/menu.svg-15ef2ef76b3f6c0e7fc0168d1ac05d38.ctex.
   at: _load_data (scene/resources/compressed_texture.cpp:41)
ERROR: Failed loading resource: res://.godot/imported/menu.svg-15ef2ef76b3f6c0e7fc0168d1ac05d38.ctex. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Failed loading resource: res://addons/panku_console/res/icons2/menu.svg. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Unable to open file: res://.godot/imported/fold-svgrepo-com.svg-6f951c0c7f0583013a7f3fa96d045e61.ctex.
   at: _load_data (scene/resources/compressed_texture.cpp:41)
ERROR: Failed loading resource: res://.godot/imported/fold-svgrepo-com.svg-6f951c0c7f0583013a7f3fa96d045e61.ctex. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Failed loading resource: res://addons/panku_console/res/icons2/fold-svgrepo-com.svg. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Unable to open file: res://.godot/imported/pop-out-svgrepo-com.svg-54bb73635d5759933a88bbec8ed6aca8.ctex.
   at: _load_data (scene/resources/compressed_texture.cpp:41)
ERROR: Failed loading resource: res://.godot/imported/pop-out-svgrepo-com.svg-54bb73635d5759933a88bbec8ed6aca8.ctex. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Failed loading resource: res://addons/panku_console/res/icons2/pop-out-svgrepo-com.svg. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Unable to open file: res://.godot/imported/close.svg-3a85a46ed81631640c7e8cd4342c98f0.ctex.
   at: _load_data (scene/resources/compressed_texture.cpp:41)
ERROR: Failed loading resource: res://.godot/imported/close.svg-3a85a46ed81631640c7e8cd4342c98f0.ctex. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Failed loading resource: res://addons/panku_console/res/icons2/close.svg. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Unable to open file: res://.godot/imported/square_shadow.png-0b7f91b74dd24247868957be13db72f4.ctex.
   at: _load_data (scene/resources/compressed_texture.cpp:41)
ERROR: Failed loading resource: res://.godot/imported/square_shadow.png-0b7f91b74dd24247868957be13db72f4.ctex. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Failed loading resource: res://addons/panku_console/res/effect/square_shadow.png. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Unable to open file: res://.godot/imported/resize-svgrepo-com.svg-cd0763e17be8b93faf6e99fda452ac2a.ctex.
   at: _load_data (scene/resources/compressed_texture.cpp:41)
ERROR: Failed loading resource: res://.godot/imported/resize-svgrepo-com.svg-cd0763e17be8b93faf6e99fda452ac2a.ctex. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Failed loading resource: res://addons/panku_console/res/icons2/resize-svgrepo-com.svg. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Unable to open file: res://.godot/imported/close.svg-3a85a46ed81631640c7e8cd4342c98f0.ctex.
   at: _load_data (scene/resources/compressed_texture.cpp:41)
ERROR: Failed loading resource: res://.godot/imported/close.svg-3a85a46ed81631640c7e8cd4342c98f0.ctex. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Failed loading resource: res://addons/panku_console/res/icons2/close.svg. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Unable to open file: res://.godot/imported/favorite.svg-94e3b968ddcfab82f19abf606a6cd9bb.ctex.
   at: _load_data (scene/resources/compressed_texture.cpp:41)
ERROR: Failed loading resource: res://.godot/imported/favorite.svg-94e3b968ddcfab82f19abf606a6cd9bb.ctex. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Failed loading resource: res://addons/panku_console/res/icons2/favorite.svg. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Unable to open file: res://.godot/imported/remove.svg-76a0d91c4b08193a23093f3f0fc3dcaf.ctex.
   at: _load_data (scene/resources/compressed_texture.cpp:41)
ERROR: Failed loading resource: res://.godot/imported/remove.svg-76a0d91c4b08193a23093f3f0fc3dcaf.ctex. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Failed loading resource: res://addons/panku_console/res/icons2/remove.svg. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Unable to open file: res://.godot/imported/add.svg-2a06068ce10412da423766fee4b6d4aa.ctex.
   at: _load_data (scene/resources/compressed_texture.cpp:41)
ERROR: Failed loading resource: res://.godot/imported/add.svg-2a06068ce10412da423766fee4b6d4aa.ctex. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Failed loading resource: res://addons/panku_console/res/icons2/add.svg. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Unable to open file: res://.godot/imported/info2.svg-c9ea3dad2575e3684098e5112249010d.ctex.
   at: _load_data (scene/resources/compressed_texture.cpp:41)
ERROR: Failed loading resource: res://.godot/imported/info2.svg-c9ea3dad2575e3684098e5112249010d.ctex. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Failed loading resource: res://addons/panku_console/res/icons2/info2.svg. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Unable to open file: res://.godot/imported/reply.svg-198ceccf73b6dc82a4737a0814707430.ctex.
   at: _load_data (scene/resources/compressed_texture.cpp:41)
ERROR: Failed loading resource: res://.godot/imported/reply.svg-198ceccf73b6dc82a4737a0814707430.ctex. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Failed loading resource: res://addons/panku_console/res/icons2/reply.svg. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Unable to open file: res://.godot/imported/swap_horiz.svg-3fa7c06ee39a243e7a12b5915f37a894.ctex.
   at: _load_data (scene/resources/compressed_texture.cpp:41)
ERROR: Failed loading resource: res://.godot/imported/swap_horiz.svg-3fa7c06ee39a243e7a12b5915f37a894.ctex. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Failed loading resource: res://addons/panku_console/res/icons2/swap_horiz.svg. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Unable to open file: res://.godot/imported/remove.svg-76a0d91c4b08193a23093f3f0fc3dcaf.ctex.
   at: _load_data (scene/resources/compressed_texture.cpp:41)
ERROR: Failed loading resource: res://.godot/imported/remove.svg-76a0d91c4b08193a23093f3f0fc3dcaf.ctex. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Failed loading resource: res://addons/panku_console/res/icons2/remove.svg. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Unable to open file: res://.godot/imported/add.svg-2a06068ce10412da423766fee4b6d4aa.ctex.
   at: _load_data (scene/resources/compressed_texture.cpp:41)
ERROR: Failed loading resource: res://.godot/imported/add.svg-2a06068ce10412da423766fee4b6d4aa.ctex. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Failed loading resource: res://addons/panku_console/res/icons2/add.svg. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Unable to open file: res://.godot/imported/open_with.svg-4c7b4bea2cb5c0a1af405d61d3d85fa3.ctex.
   at: _load_data (scene/resources/compressed_texture.cpp:41)
ERROR: Failed loading resource: res://.godot/imported/open_with.svg-4c7b4bea2cb5c0a1af405d61d3d85fa3.ctex. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Failed loading resource: res://addons/panku_console/res/icons2/open_with.svg. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Unable to open file: res://.godot/imported/info2.svg-c9ea3dad2575e3684098e5112249010d.ctex.
   at: _load_data (scene/resources/compressed_texture.cpp:41)
ERROR: Failed loading resource: res://.godot/imported/info2.svg-c9ea3dad2575e3684098e5112249010d.ctex. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Failed loading resource: res://addons/panku_console/res/icons2/info2.svg. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Unable to open file: res://.godot/imported/chevron_right.svg-2c66815dcd12ccc3ba2562028a236330.ctex.
   at: _load_data (scene/resources/compressed_texture.cpp:41)
ERROR: Failed loading resource: res://.godot/imported/chevron_right.svg-2c66815dcd12ccc3ba2562028a236330.ctex. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Failed loading resource: res://addons/panku_console/res/icons2/chevron_right.svg. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Unable to open file: res://.godot/imported/expand_more.svg-156eef34c01d1545ad526cf0292ef120.ctex.
   at: _load_data (scene/resources/compressed_texture.cpp:41)
ERROR: Failed loading resource: res://.godot/imported/expand_more.svg-156eef34c01d1545ad526cf0292ef120.ctex. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Failed loading resource: res://addons/panku_console/res/icons2/expand_more.svg. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
SCRIPT ERROR: Parse Error: Could not preload resource file "res://addons/panku_console/res/icons2/chevron_right.svg".
          at: GDScript::reload (res://addons/panku_console/modules/data_controller/exporter/row_group_button.gd:3)
SCRIPT ERROR: Parse Error: Could not preload resource file "res://addons/panku_console/res/icons2/expand_more.svg".
          at: GDScript::reload (res://addons/panku_console/modules/data_controller/exporter/row_group_button.gd:4)
ERROR: Failed to load script "res://addons/panku_console/modules/data_controller/exporter/row_group_button.gd" with error "Parse error".
   at: load (modules/gdscript/gdscript.cpp:2936)
ERROR: Unable to open file: res://.godot/imported/chevron_right.svg-2c66815dcd12ccc3ba2562028a236330.ctex.
   at: _load_data (scene/resources/compressed_texture.cpp:41)
ERROR: Failed loading resource: res://.godot/imported/chevron_right.svg-2c66815dcd12ccc3ba2562028a236330.ctex. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Failed loading resource: res://addons/panku_console/res/icons2/chevron_right.svg. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Unable to open file: res://.godot/imported/play-1001-svgrepo-com.svg-6dda54bd1afb4351b91dc74d89d43c7f.ctex.
   at: _load_data (scene/resources/compressed_texture.cpp:41)
ERROR: Failed loading resource: res://.godot/imported/play-1001-svgrepo-com.svg-6dda54bd1afb4351b91dc74d89d43c7f.ctex. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Failed loading resource: res://addons/panku_console/res/icons2/play-1001-svgrepo-com.svg. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Unable to open file: res://.godot/imported/check-svgrepo-com.svg-034d6c5925c00dc6c3cf6966293ed643.ctex.
   at: _load_data (scene/resources/compressed_texture.cpp:41)
ERROR: Failed loading resource: res://.godot/imported/check-svgrepo-com.svg-034d6c5925c00dc6c3cf6966293ed643.ctex. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Failed loading resource: res://addons/panku_console/res/icons2/check-svgrepo-com.svg. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Unable to open file: res://.godot/imported/close.svg-3a85a46ed81631640c7e8cd4342c98f0.ctex.
   at: _load_data (scene/resources/compressed_texture.cpp:41)
ERROR: Failed loading resource: res://.godot/imported/close.svg-3a85a46ed81631640c7e8cd4342c98f0.ctex. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Failed loading resource: res://addons/panku_console/res/icons2/close.svg. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Unable to open file: res://.godot/imported/rename-svgrepo-com.svg-5ec15595e7d5857527ce81e8c9082a28.ctex.
   at: _load_data (scene/resources/compressed_texture.cpp:41)
ERROR: Failed loading resource: res://.godot/imported/rename-svgrepo-com.svg-5ec15595e7d5857527ce81e8c9082a28.ctex. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Failed loading resource: res://addons/panku_console/res/icons2/rename-svgrepo-com.svg. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Unable to open file: res://.godot/imported/arrow-up-md-svgrepo-com.svg-0d7dc8f9b4626627fc89d656dd6522e5.ctex.
   at: _load_data (scene/resources/compressed_texture.cpp:41)
ERROR: Failed loading resource: res://.godot/imported/arrow-up-md-svgrepo-com.svg-0d7dc8f9b4626627fc89d656dd6522e5.ctex. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Failed loading resource: res://addons/panku_console/res/icons2/arrow-up-md-svgrepo-com.svg. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Unable to open file: res://.godot/imported/arrow-down-svgrepo-com.svg-38ccb799fe0295b6eb8e51628325ac00.ctex.
   at: _load_data (scene/resources/compressed_texture.cpp:41)
ERROR: Failed loading resource: res://.godot/imported/arrow-down-svgrepo-com.svg-38ccb799fe0295b6eb8e51628325ac00.ctex. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Failed loading resource: res://addons/panku_console/res/icons2/arrow-down-svgrepo-com.svg. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Unable to open file: res://.godot/imported/bin-cancel-delete-remove-trash-garbage-svgrepo-com.svg-b7f02697b5af6027969d40533290cf43.ctex.
   at: _load_data (scene/resources/compressed_texture.cpp:41)
ERROR: Failed loading resource: res://.godot/imported/bin-cancel-delete-remove-trash-garbage-svgrepo-com.svg-b7f02697b5af6027969d40533290cf43.ctex. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Failed loading resource: res://addons/panku_console/res/icons2/bin-cancel-delete-remove-trash-garbage-svgrepo-com.svg. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Unable to open file: res://.godot/imported/add.svg-2a06068ce10412da423766fee4b6d4aa.ctex.
   at: _load_data (scene/resources/compressed_texture.cpp:41)
ERROR: Failed loading resource: res://.godot/imported/add.svg-2a06068ce10412da423766fee4b6d4aa.ctex. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Failed loading resource: res://addons/panku_console/res/icons2/add.svg. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Unable to open file: res://.godot/imported/play-1001-svgrepo-com.svg-6dda54bd1afb4351b91dc74d89d43c7f.ctex.
   at: _load_data (scene/resources/compressed_texture.cpp:41)
ERROR: Failed loading resource: res://.godot/imported/play-1001-svgrepo-com.svg-6dda54bd1afb4351b91dc74d89d43c7f.ctex. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Failed loading resource: res://addons/panku_console/res/icons2/play-1001-svgrepo-com.svg. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Unable to open file: res://.godot/imported/pause-1010-svgrepo-com.svg-8a4549394af5099adcc9e7d6754d8258.ctex.
   at: _load_data (scene/resources/compressed_texture.cpp:41)
ERROR: Failed loading resource: res://.godot/imported/pause-1010-svgrepo-com.svg-8a4549394af5099adcc9e7d6754d8258.ctex. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Failed loading resource: res://addons/panku_console/res/icons2/pause-1010-svgrepo-com.svg. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Unable to open file: res://.godot/imported/chevron_right.svg-2c66815dcd12ccc3ba2562028a236330.ctex.
   at: _load_data (scene/resources/compressed_texture.cpp:41)
ERROR: Failed loading resource: res://.godot/imported/chevron_right.svg-2c66815dcd12ccc3ba2562028a236330.ctex. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Failed loading resource: res://addons/panku_console/res/icons2/chevron_right.svg. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Unable to open file: res://.godot/imported/expand_more.svg-156eef34c01d1545ad526cf0292ef120.ctex.
   at: _load_data (scene/resources/compressed_texture.cpp:41)
ERROR: Failed loading resource: res://.godot/imported/expand_more.svg-156eef34c01d1545ad526cf0292ef120.ctex. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Failed loading resource: res://addons/panku_console/res/icons2/expand_more.svg. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
SCRIPT ERROR: Parse Error: Could not preload resource file "res://addons/panku_console/res/icons2/play-1001-svgrepo-com.svg".
          at: GDScript::reload (res://addons/panku_console/modules/expression_monitor/monitor_group_ui.gd:7)
SCRIPT ERROR: Parse Error: Could not preload resource file "res://addons/panku_console/res/icons2/pause-1010-svgrepo-com.svg".
          at: GDScript::reload (res://addons/panku_console/modules/expression_monitor/monitor_group_ui.gd:8)
SCRIPT ERROR: Parse Error: Could not preload resource file "res://addons/panku_console/res/icons2/chevron_right.svg".
          at: GDScript::reload (res://addons/panku_console/modules/expression_monitor/monitor_group_ui.gd:9)
SCRIPT ERROR: Parse Error: Could not preload resource file "res://addons/panku_console/res/icons2/expand_more.svg".
          at: GDScript::reload (res://addons/panku_console/modules/expression_monitor/monitor_group_ui.gd:10)
SCRIPT ERROR: Compile Error:
          at: GDScript::reload (res://addons/panku_console/modules/expression_monitor/monitor_groups_ui.gd:-1)
ERROR: Failed to load script "res://addons/panku_console/modules/expression_monitor/monitor_groups_ui.gd" with error "Parse error".
   at: load (modules/gdscript/gdscript.cpp:2936)
ERROR: Unable to open file: res://.godot/imported/add.svg-2a06068ce10412da423766fee4b6d4aa.ctex.
   at: _load_data (scene/resources/compressed_texture.cpp:41)
ERROR: Failed loading resource: res://.godot/imported/add.svg-2a06068ce10412da423766fee4b6d4aa.ctex. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Failed loading resource: res://addons/panku_console/res/icons2/add.svg. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Unable to open file: res://.godot/imported/logo.svg-5c6f042742ccac523c072414b9eb3caf.ctex.
   at: _load_data (scene/resources/compressed_texture.cpp:41)
ERROR: Failed loading resource: res://.godot/imported/logo.svg-5c6f042742ccac523c072414b9eb3caf.ctex. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
ERROR: Failed loading resource: res://addons/panku_console/logo.svg. Make sure resources have been imported by opening the project in the editor at least once.
   at: _load (core/io/resource_loader.cpp:283)
[Panku Console] initialized! Project page: https://github.com/Ark2000/PankuConsole
Terminated
WARNING: step_script could not run to completion because the timeout was exceeded. For more control over job and script timeouts see: https://docs.gitlab.com/ee/ci/runners/configure_runners.html#set-script-and-after_script-timeouts
ERROR: Job failed: execution took longer than 1h0m0s seconds


ModelState.IsValid reports valid model while it is null

Possibly a dupe of https://github.com/aspnet/Mvc/issues/4607 but since it seemed to be (somehow) resolved there, I thought it smart to file another issue to validate if there is a difference.
Relevant bits:
public async Task<IActionResult> Login([FromBody]LoginViewModel model)
{
    if (ModelState.IsValid)
    {
        var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, true, lockoutOnFailure: false);
        if (result.Succeeded)
        {
            _logger.LogInformation(1, "User logged in.");
            return Json(User.Identity.Name);
        }
        else
        {
            return BadRequest("Invalid login attempt.");
        }
    }
    else if (HttpContext.User.Identity.IsAuthenticated)
    {
        return Json(User.Identity.Name);
    }
    return BadRequest("Cannot login.");
}

public class LoginViewModel
{
    [Required]
    [EmailAddress]
    public string Email { get; set; }

    [Required]
    [DataType(DataType.Password)]
    public string Password { get; set; }
}

services.AddMvc().AddJsonOptions(options =>
{
    options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
    options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
    options.SerializerSettings.Converters.Add(new VersionConverter());
});

When calling the method without any parameters in the body, the model rightfully becomes null. I can make this a manual check of course, but it seems if there is a model state, that has parameters that are null but contain properties with the required attribute, that the model state shouldn't succeed.
Thoughts? Easy to circumvent with an extra null check, but it feels a bit counter intuitive (maybe I'm missing something though!)

since it seemed to be (somehow) resolved there

?  #4607 remains open.
In any case, I believe your request is for validating properties of null values in the model tree. Is that correct? If yes, where should validation stop?

It is, but the discussion seemed to venture more into 'documenting and error reporting'.
My line of thinking would be that if I have a model that has required properties, if I would feed it one property it 'fails' because it doesn't have the other.
So, with above code, the following fails/succeeds:
Body: '' (empty)
ModelState.IsValid: true
Body: '{}'
ModelState.IsValid: false
Body: '{"email": "jp@example.com","password": "12345677Asasd"}'
ModelState.IsValid: true
The first one just doesn't make sense to me, if it 'works' when I'm feeding it an empty object, I think it should also 'work' while I (or an external party) feed it an empty body, since it is not fulfilling the required properties, at all.
I'm not sure where it should stop? I feel that certainly for API's having one way of describing required props and therefore errors makes it incredibly easy to pass these over to other people and maintain the same error quality. I'm probably missing complexities in the implementation and other consequences, but this is how I see it for the use cases I have.

The cases you've described sound correct. The JSON deserializer returned null when the body was completely empty but created an uninitialized LoginViewModel when the body contained {}. Validation checks only properties of created objects.

Sweet, so code wise it is correct. Do you see the more abstracted 'issue' though? Not looking to what actually happens under the hood, but simply what happens in the controller?
I have a model that I want to be validated. There are multiple entries (no body, empty json object, object with missing, false or correct email, missing, false or correct password)... All of which I think are reasonable to expect the validation to error. Currently the model state reports valid while it obviously isn't, unless you take the hood off and look below and see that it only checks if an object isn't null (or something alike).
So to maybe put it in straight words, I'd expect Validation to also check if an object actually exists if it has things like required on one or more of it's properties.

If you add [BindRequired] does it help?
If it does, there is another reason why BindRequired should be the default.
you can see here how to apply it application-wise: https://github.com/aspnet/Mvc/issues/2615#issuecomment-106583661

@Bartmax just tested, the same issue persists with BindRequired.

you did apply the BindRequired configuration and then
public async Task<IActionResult> Login([FromBody][Required]LoginViewModel model)

right?

No, I added BindRequired to the Class and properties (in all possible configs).
Just tried your full suggestion, but it threw an error in
if (context.PropertyAttributes.OfType<RequiredAttribute>().Any())

That I had to change to
if (context.PropertyAttributes != null && context.PropertyAttributes.OfType<RequiredAttribute>().Any())

since somehow it noted that LoginViewModel didn't have any property attributes (At least on one pass through). Obviously after this it didn't work either since it simply always skipped it ;)
See screenshot, no attributes but correct model.

That's unfortunate :( ok ... well ... it was worth a shot

@janpieterz are you using RC2 or 1.0.0? You may be now hitting #4652. That was fixed in 1.0.0.

1.0.0

MVC does not perform validation (of any kind) for parameters unless they are bound. This behaviour hasn't changed in forever as far as I know. (My mention of #4652 was wrong; that's not relevant here.)
@janpieterz should we turn this issue into a request for at least [BindRequired] and [Required] enforcement on parameters?
Could also change [BindRequired] and the underlying [BindingBehavior] to support AttributeTargets.Parameter but that seems optional. Do you agree?
One potential workaround would be to check model == null in the action. That should only be true when the input formatter is not called or fails. Since validation will of course occur when model != null, (model == null || !ModelState.IsValid) covers all the errors.

I'm curious to know if anyone would ever want [FromBody] Person person == null to ever not be a validation error.

Personally, I wish C# generally didn't allow nulls unless I went out of my way to allow for them, so when it comes to validation, I think at the least it should default to not null and maybe provide an option for allowing null.  In the case of [FromBody], I can see a poorly designed API allowing for null values.  😄

I'm happy turning this issue into something else @dougbu, but agree with @rynowak and I'm really curious to the use cases for it not being a validation error. I surely understand that it means diverting from previous ways (seems like a perfect moment to do it now), I get that it might rip open abstraction layers that are put in place (seems like 'new' insight shows they might need to be different), or any other kind of annoying / unpleasant consequence.
For me as an API developer using this, and probably everyone else, I had to find this out the hard way, and now have to extend the validation myself (the errors are not automatically generated etc etc).
I'd prefer to not have to change anything in my code in the above example to get it to work. If this really is impossible something like BindRequired enforcing this so it's at least as simple as throwing that on a parameter certainly will work!
As a side note, I just made a new project to look at the templates and even the default templates don't seem to take this into account. Most actions (AccountController for individual accounts) seem to omit this at all. I don't have the time to test currently, but it seems from glancing over it that these will have problems too.

Cleared the Investigate label.
@Triage the decisions here are whether to make a change, whether validation of a null parameter should be opt-in or implicit with [FromBody] (a slight behaviour breaking change), and when.
See #4971 for a few cases where ModelState.IsValid though parameters are left null. In still more IsValid cases, objects and collections are created for parameters but left uninitialized or empty.
/cc @danroth27 @Eilon

Cleared assignee to make it clear @danroth27 needs to have a look.

BTW this is how it worked in Web API 2.

BTW, if you like the sound of null-body-is-validation-error you can step into that alternate universe pretty easily like so:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ApplicationModels;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.Mvc.ModelBinding;

namespace MvcSandbox
{
    public class FromBodyRequiredConvention : IActionModelConvention
    {
        public void Apply(ActionModel action)
        {
            var parameterName = action.Parameters
                .Where(p => p.BindingInfo?.BindingSource.CanAcceptDataFrom(BindingSource.Body) ?? false)
                .Select(p => p.ParameterName)
                .SingleOrDefault();

            if (parameterName != null)
            {
                action.Filters.Add(new FromBodyRequiredActionFilter(parameterName));
            }
        }

        private class FromBodyRequiredActionFilter : IActionFilter
        {
            private readonly string _parameterName;

            public FromBodyRequiredActionFilter(string parameterName)
            {
                _parameterName = parameterName;
            }

            public void OnActionExecuting(ActionExecutingContext context)
            {
                object value;
                context.ActionArguments.TryGetValue(_parameterName, out value);

                if (value == null)
                {
                    // Now uncomment one of these depending on what you want to do.
                    //
                    // This will return a 400 with an error in json.
                    //context.Result = new BadRequestObjectResult(new { message = "The body is required" });

                    // This will add a validation error and let the action decide what to do
                    //context.ModelState.AddModelError(_parameterName, "The body is required");
                }
            }

            public void OnActionExecuted(ActionExecutedContext context)
            {
            }
        }
    }
}

@rynowak / @dougbu what is your proposal that we do here?

@rynowak @Eilon my proposal is to update DefaultControllerArgumentBinder.BindModelAsync() to do the Right Thing:tm: when !IsModelSet. May be necessary to futz with a couple of the arguments to IObjectModelValidator.Validate() and will probably need to handle [BindRequired] separately. Otherwise, fairly straightforward.

Let's add a new setting, bool MvcOptions.BodyRequired { get; set; }, which is off by default (to preserve current behavior), but can be enabled in Startup to change the behavior of whether the body is required or not.

@Eilon Could you clarify what the BodyRequired option should do? Is it equivalent to adding the FromBodyRequiredConvention that @rynowak posted above, set to do an AddModelError for any [FromBody] parameter that receives null? That seems like a valid app configuration, but doesn't help in the case where in some places you want to enforce nonnullness and other places you don't.
Or:

Do we want to differentiate between [FromBody] [Required] and just [FromBody]? As an uninformed bystander, I would have expected [FromBody] [Required] to have validated that we got a nonnull value, even in the default case where you didn't set any special BodyRequired flag since the intent is quite clear, but currently it does nothing (i.e., it's the same as just [FromBody] on its own).
What about @dougbu's suggestion about doing the Right Thing™? What is the Right Thing™? Is it respecting [Required] on an action method parameter, or something else?

Also I'm not sure what role [BindRequired] plays in this - is it intended just a synonym for [Required]? If not, what behavioural difference (vs [Required]) is the name meant to convey? Others are finding the difference hard to see too.

I think it's fine if we also add BodyRequired option to make [FromBody] default to required, but there needs to also be a per-action way to disable it (e.g., [BindingBehavior(BindingBehavior.Optional)]?), otherwise it becomes a trap you get stuck in.

The global flag as required = true doesn't get you into a trap.
You annotate your bindings as Required or BindRequired and that's it.

One more thing, [FromBody] doesn't perform any validation per se but required a valid body content (which is a common pitfall people run into). So making a request of application/json with an empty body won't be valid but with a content with { } will be valid.

A few clarifications:

@Eilon's suggestion feels like an answer to @rynowak's question: Nobody would ever want [FromBody] to succeed when no body was provided. But, we need to hide the new behaviour behind a flag to avoid breaking changes.
My suggestion was about us not validating anything at the top level i.e. MVC ignores [Required] on a parameter. IOW a tangent to the main issue here.
@Bartmax's description of the current behaviour seems about right. In a quick read, the only thing I noticed is that [FromHeader] is not a default binding source.
If the answer to @rynowak's question is actually "yes, people want to require data some places", simplest thing to do is add [BindRequired] support in BodyModelBinder. Would copy what's in SimpleTypeModelBinder.

Following a quick discussion just now, we're going to ensure that if you use [BindRequired] on classes bound with [FromBody], that an empty POST/PUT body (or whatever makes the InputFormatter believe there was no input) registers a ModelState error, so that ModelState.IsValid would be false. It's kind of strange that [BindRequired] doesn't already have this effect on [FromBody]-bound params, so this is a gap we want to plug.
As a secondary goal, if it turns out that we can also extend BindRequiredAttribute so that you can use it on parameters, we'll also do that and will again treat this as a validation failure if there's no input when you have a [FromBody] [BindRequired] parameter.
This is the raw ingredient that will let you control whether or not POST/PUT bodies are actually required (versus it being legit to supply no input, making the parameter value is null, as we do today). Based on this, if you want to implement an IActionModelConvention that dynamically adds a [BindRequired] to all [FromBody] parameters as a global convention, it will be straightforward to do so.

@SteveSandersonMS I didn't mention IActionModelConvention for the final point. Better (more straightforward) to implement IBindingMetadataProvider and change BindingMetadata.IsBindingRequired. That controls ModelMetadata.IsBindingRequired which is what ComplexTypeModelBinder checks (and BodyModelBinder does not -- today). Have a look at DataMemberRequiredBindingMetadataProvider for a related IBindingMetadataProvider implementation.

I realize that I missed the discussion about this, but I have bone to pick over:

which is off by default (to preserve current behavior)

I don't think the current behavior is in any way reasonable or useful and the reactions on my comment corroborate this. No one has put forth a scenario where an API has a optional body.
This is 2.0.0 so we should make the default experience be what we think is the best for our users.

Also FYI for the discussion around [Required] there's currently no way for validation attributes to be set on a parameter. It just doesn't exist in the plumbing. We could do something gross here to hack it, but it's never been supported in MVC, which is surprising to some.

I'd be ok with having this be on by default. I think this is an acceptable breaking change, and there's a way to turn it off.

there's currently no way for validation attributes to be set on a parameter

Slight clarification @rynowak: It's entirely possible to associate most validation attributes with a parameter; their [AttributeUsage]s usually include the Parameter target. However, MVC currently ignores such associations.
(Separately, [Required] would almost never be enforced for a parameter because the ComplexTypeModelBinder creates an uninitialized instance before validation starts. I.e. if we validated parameters, [Required] might only work in a [FromBody] case. So, one surprise is likely to remain.)
But, we're not changing anything about [Required] or other ValidationAttributes for this issue.

OK, having started on implementation, I see that we're not currently in a position to have per-usage-site overrides for this, because:

[BindRequired] on the class corresponding to the [FromBody] property won't work, because DefaultBindingMetadataProvider only reads it when it's on a property, not on a type.

Technically we could change that, but I don't think it would be a good design. It makes sense to control on a per-property or per-parameter level whether input is required, but not on a per-type level (the type itself doesn't know who's going to use it, or whether they have a use case for null). I suppose that's why DefaultBindingMetadataProvider doesn't already read it from types.

[BindRequired] on the parameter being bound doesn't work either. As @rynowak has repeatedly told us, there's no mechanism for this. IModelMetadataProvider declares methods GetMetadataForType and GetMetadataForProperties, but no corresponding method for getting metadata from properties.

Again, we can extend the metadata system to allow for metadata on parameters if we want, but that would be a much bigger feature than this.

Controlling it using something like [FromBody(Behavior = FromBodyBehavior.Optional)] doesn't work either, because IBindingSourceMetadata is just a way of setting properties on BindingInfo. By the time binding actually happens, we don't have access to the FromBodyAttribute. There's no place for this information to go on BindingInfo.

Similarly, we could extend BindingInfo to have a property like BodyBindingIsOptional. That's not too bad, but is a bit awkward in that it's very specific to one kind of binder.

Proposal
Since virtually all cases, we think people will want to just keep the default behaviour on all actions (and the new default behaviour will be "[FromBody] means body is required"), we probably don't desperately need per-usage-site overrides right now. So I just propose to do the flag on MvcOptions, and have that control all instances of [FromBody].
In the future, if we implement parameter-level model metadata, then it would be trivial to use that to control [FromBody] behaviour per-usage-site. So I suggest we leave this open as a possible future enhancement.

I think this is perfectly acceptable, considering that it's all we initially wanted 😄 It's unfortunate that there's no straightforward way to make it per-usage, but I won't lose sleep over that.

Sounds sad but reasonable.
Will [BindRequired] at least work on [FromBody] properties when the global option is off?

Will [BindRequired] at least work on [FromBody] properties when the global option is off?

If you mean properties on the type that is being bound via [FromBody], then you'd need to use [Required] (not [BindRequired]) in that case.

Remove 1 - Ready and add 3 - Done label to indicate the work item was completed (it's used for the release notes).

Ah I see. Done!

hi all. i have problem. i hope everybody can help me. i want validate for each attribute of a object and notifi error for each attribute. thanks you!

@minhhuynh1812 please open a new issue if you have a specific scenario that is not working as you wish. You may want to start by reviewing the docs e.g. https://docs.microsoft.com/en-us/aspnet/core/mvc/models/model-binding or asking a question on https://stackoverflow.com. In fact, your question may match something already asked, perhaps in the https://stackoverflow.com/questions/tagged/asp.net-core-mvc tag.

I found this link and I hope it can guide you in the right direction:
https://stackoverflow.com/questions/43694106/asp-net-core-webapi-modelstate-not-working


Fix helm linting errors in Lokomotive

I did a helm lint in various charts we have in lokomotive and they failed with following errors:
Contour:
$ cd ./assets/components/contour/ && helm lint .
/home/surajd/lokomotive
==> Linting .
[ERROR] templates/: template: contour/templates/02-service-envoy.yaml:22:11: executing "contour/templates/02-service-envoy.yaml" at <eq .Values.envoy.serviceType "NodePort">: error calling eq: invalid type for comparison

Error: 1 chart(s) linted, 1 chart(s) failed

Calico Host Protection for Packet:
$ cd ./assets/lokomotive-kubernetes/packet/flatcar-linux/kubernetes/calico-host-protection/ && helm lint .
/home/surajd/lokomotive
==> Linting .
[INFO] Chart.yaml: icon is recommended
[ERROR] Chart.yaml: chart type is not valid in apiVersion 'v1'. It is valid in apiVersion 'v2'
[ERROR] templates/: template: calico-host-protection/templates/NOTES.txt:1:3: executing "calico-host-protection/templates/NOTES.txt" at <include "calico.validateValues" .>: error calling include: template: calico-host-protection/templates/_helpers.tpl:15:51: executing "calico.validateValues" at <fail>: error calling fail:
VALUES VALIDATION:
calico:managementCIDRs
    You must set at least on management CIDR.
    Please set the.managementCIDRs parameter (--set.managementCIDRs={})
calico:clusterCIDRs
    You must set at least on management CIDR.
    Please set the.clusterCIDRs parameter (--set.clusterCIDRs={})

Error: 1 chart(s) linted, 1 chart(s) failed

kube-apiserver:
$ cd ./assets/lokomotive-kubernetes/bootkube/resources/charts/kube-apiserver/ && helm lint .
/home/surajd/lokomotive
==> Linting .
[INFO] Chart.yaml: icon is recommended
[ERROR] Chart.yaml: chart type is not valid in apiVersion 'v1'. It is valid in apiVersion 'v2'

Error: 1 chart(s) linted, 1 chart(s) failed

kubelet:
$ cd ./assets/lokomotive-kubernetes/bootkube/resources/charts/kubelet/ && helm lint .
/home/surajd/lokomotive
==> Linting .
[INFO] Chart.yaml: icon is recommended
[ERROR] Chart.yaml: chart type is not valid in apiVersion 'v1'. It is valid in apiVersion 'v2'

Error: 1 chart(s) linted, 1 chart(s) failed

kubernetes:
$ cd ./assets/lokomotive-kubernetes/bootkube/resources/charts/kubernetes/ && helm lint .
/home/surajd/lokomotive
==> Linting .
[INFO] Chart.yaml: icon is recommended
[ERROR] Chart.yaml: chart type is not valid in apiVersion 'v1'. It is valid in apiVersion 'v2'

Error: 1 chart(s) linted, 1 chart(s) failed

pod-checkpointer:
$ cd ./assets/lokomotive-kubernetes/bootkube/resources/charts/pod-checkpointer/ && helm lint .
/home/surajd/lokomotive
==> Linting .
[INFO] Chart.yaml: icon is recommended
[ERROR] Chart.yaml: chart type is not valid in apiVersion 'v1'. It is valid in apiVersion 'v2'

Error: 1 chart(s) linted, 1 chart(s) failed

rook-ceph:
$ cd ./assets/components/rook-ceph/ && helm lint .
/home/surajd/lokomotive
==> Linting .
[ERROR] templates/: template: rook-ceph/templates/clusterrole.yaml:286:37: executing "rook-ceph/templates/clusterrole.yaml" at <.Values.agent.mountSecurityMode>: nil pointer evaluating interface {}.mountSecurityMode

Error: 1 chart(s) linted, 1 chart(s) failed

Not sure how to label that. Bug? Tech debt? Enhancement? Any ideas? Maybe we could just have label Quality :smile:

For cert-manager, created PR upstream


bug in breaking encoded mimewords into individual lines

Test code:
var e = new (require('./mailcomposer').MailComposer);
console.log(e._encodeMimeWord('INFO: Uživatel XXXXXX XěXXX přidal...', 'Q', 50).replace(/ /g, '\r\n'));

This produces following output:
=?UTF-8?Q?INFO:_U=C5=BEivatel_XXXXXX_X=C4=9BXXX_p=?=
=?UTF-8?Q?C5=99idal...?=

That lone = (part of =C5 byte) on first line, when put in subject header, causes Thunderbird to consider the whole encoding as invalid and display the subject as plaintext instead of decoding it. Another (webmail) client can parse most of it, but result is "INFO: Uživatel XXXXXX X=C5XXX přidal..." which is not right either.
This patch is probably somewhat inefficient with all the string copying and spliting, but at least all mail clients I tried understand it's output.

Thanks for noticing, I'm not sure how this bug got in, since I was aware of the RFC2047 requirements:

Each 'encoded-word' MUST encode an integral number of octets.  The
'encoded-text' in each 'encoded-word' must be well-formed according
to the encoding specified; the 'encoded-text' may not be continued in
the next 'encoded-word'.  (For example, "=?charset?Q?=?=
=?charset?Q?AB?=" would be illegal, because the two hex digits "AB"
must follow the "=" in the same 'encoded-word'.)

I created a slightly more complex solution with 4f555ef41524af4d219957e700575d403a47046c than you provided, since I also wanted to keep unicode character sequences in one part.


It also doesn't make sense to have it enabled by default.
For the next release, we will disable it during the update process, but once that release is pushed I'll enable the old behavior of copying the current setting

Oh, why did we even have it enabled?

I haven't a clue, I'm assuming it was an oversight


Some Text color secondary (epub, pdf, zip) are linked to text color

Type of installation
Portable (.zip)
Steps to reproduce

Change the secondary text color to another color.
Some button styled epub, zip, pdf that are in location tab, settings menu are not linked to text color secondary, but are linked to font color.

https://github.com/mienaiyami/yomikiru/assets/127277950/d2496e83-f918-43ba-ab6e-9381ba531065
✔ Expected Behavior
For the epub, zip, pdf that are in location tab, settings tab, to be linked to text color secondary.
❌ Actual Behavior
They are linked to text color.

I did that in https://github.com/mienaiyami/yomikiru/issues/217#issuecomment-1655649420 because size wasnt the problem.

As you can see that they are hard to read, even with same size.
If you have any suggestion, then do mention. Otherwise, I think I might revert the changes because its just a "bad theme" thing (even thought I made that theme).

What I meant to say is, I intentionally made it to use font color in settings because they aren't really small, https://github.com/mienaiyami/yomikiru/issues/217#issuecomment-1655649420, they just have a bad match up of color in case of "theme2" and "secondary text color". The contrast ratio is bad and I couldn't think of a better way to fix this.
Before https://github.com/mienaiyami/yomikiru/issues/217#issuecomment-1655649420, and even now (outside settings) they use came color as text beside them.
Because they are used in places where both "font color" and "secondary font color" are, I decided not to give it its own variable for color because it can make it stand out a lot in some place.


Not Compatible with Babylon React Native

Description
I am working on React Native Project where I use Babylon React Native (https://github.com/BabylonJS/BabylonReactNative) for 3d stuff and skia as well. Skia does not seem be compatible with that, I can use either of the library.
I had this problem before but one of the skia version (0.1.157) was working fine with Rn 0.70.10
But since I have decided to update update the RN to 0.71 that skia version((0.1.157)) is not supported and updating the skia version brings the same problem that either skia or babylon can be used.
Version
0.1.197
Steps to reproduce
Create a New RN 0.71.0 project
Add react-native-skia and react-native-babylon that comes with following dependencies
 "@babylonjs/core": "5.42.2",     "@babylonjs/loaders": "5.42.2",     "@babylonjs/materials": "5.42.2",     "@babylonjs/react-native": "1.6.1",     "@babylonjs/react-native-iosandroid-0-71": "1.6.1",     "@babylonjs/react-native-windows-0-71": "1.6.1",
Snack, code example, screenshot, or link to a repository
<Group>       <Group transform={ [{ scale: SampleScale }, { rotate: rotation }] }>         <Path           path={ SamplePath }           color={ SampleColor }           style={ style }           strokeWidth={ strokeWidth }/>       </Group>       <Text         text={ SampleText() }         color={ textColor }         font={ font }         x={ SamplePosition.x }         y={ SamplePosition.y } />     </Group>
and add some Babylon scene as well

Hi, @nmongiya - could you please provide some more information about errors etc?

Hi @chrfalch
I am having this issue on Android only. NO issues on ios.
Couple of interesting things:
When Metro is connected : Skia component is available but Babylon is not
When Metro is NOT connected: Babylon is visible on screen but skia is not
I thought it could be a race condition to get the canvas and I tried to load Babylon component after couple of seconds of timeout and both works fine in that case even when metro is connected, and here is what I can see in android logcat

I/SurfaceView: onWindowVisibilityChanged(0) true android.view.SurfaceView{f45f322 V.E...... ......I. 0,0-0,0} of ViewRootImpl@9e07a49[MainActivity]
I/SurfaceView: onWindowVisibilityChanged(0) false android.view.SurfaceView{f2911b3 I.E...... ......I. 0,0-0,0} of ViewRootImpl@9e07a49[MainActivity]
I/SurfaceControl: nativeRelease nativeObject s[526794639040]
I/SurfaceControl: nativeRelease nativeObject e[526794639040]
I/SurfaceControl: assignNativeObject: nativeObject = 0 Surface(name=null)/@0x8c0dc8b / android.view.SurfaceControl.readFromParcel:1117 android.view.IWindowSession$Stub$Proxy.relayout:1820 android.view.ViewRootImpl.relayoutWindow:9005 android.view.ViewRootImpl.performTraversals:3360 android.view.ViewRootImpl.doTraversal:2618 android.view.ViewRootImpl$TraversalRunnable.run:9971 android.view.Choreographer$CallbackRecord.run:1010 android.view.Choreographer.doCallbacks:809 android.view.Choreographer.doFrame:744 android.view.Choreographer$FrameDisplayEventReceiver.run:995
I/SurfaceControl: nativeRelease nativeObject s[526792490368]
I/SurfaceControl: nativeRelease nativeObject e[526792490368]
I/SurfaceControl: nativeRelease nativeObject s[526793921536]
I/SurfaceControl: nativeRelease nativeObject e[526793921536]
I/ViewRootImpl@9e07a49[MainActivity]: Relayout returned: old=(0,0,1920,1200) new=(0,0,1920,1200) req=(1920,1200)0 dur=11 res=0x1 s={true<PHONE_NUMBER>68} ch=false fn=194
I/SurfaceView: surfaceCreated 1 https://github.com/BabylonJS/BabylonReactNative/pull/8 android.view.SurfaceView{f45f322 V.E...... ......ID 0,0-1917,1002}
I/SurfaceView: surfaceChanged (1917,1002) 1 https://github.com/BabylonJS/BabylonReactNative/pull/8 android.view.SurfaceView{f45f322 V.E...... ......ID 0,0-1917,1002}
I/SurfaceView: applySurfaceTransforms: t = android.view.SurfaceControl$Transaction@b534370 surfaceControl = Surface(name=SurfaceView - com.emesent/com.emesent.MainActivity@f45f322@0)/@0x9a006e9 frame = 194
I/ReactNativeJS: BJS - [13:49:01]: Babylon Native (v5.42.2) launched

Hi @chrfalch
I am having this issue on Android only. NO issues on ios.
Couple of interesting things:
When Metro is connected : Skia component is available but Babylon is not
When Metro is NOT connected: Babylon is visible on screen but skia is not
I thought it could be a race condition to get the canvas and I tried to load Babylon component after couple of seconds of timeout and both works fine in that case even when metro is connected, and here is what I can see in android logcat

I/SurfaceView: onWindowVisibilityChanged(0) true android.view.SurfaceView{f45f322 V.E...... ......I. 0,0-0,0} of ViewRootImpl@9e07a49[MainActivity]
I/SurfaceView: onWindowVisibilityChanged(0) false android.view.SurfaceView{f2911b3 I.E...... ......I. 0,0-0,0} of ViewRootImpl@9e07a49[MainActivity]
I/SurfaceControl: nativeRelease nativeObject s[526794639040]
I/SurfaceControl: nativeRelease nativeObject e[526794639040]
I/SurfaceControl: assignNativeObject: nativeObject = 0 Surface(name=null)/@0x8c0dc8b / android.view.SurfaceControl.readFromParcel:1117 android.view.IWindowSession$Stub$Proxy.relayout:1820 android.view.ViewRootImpl.relayoutWindow:9005 android.view.ViewRootImpl.performTraversals:3360 android.view.ViewRootImpl.doTraversal:2618 android.view.ViewRootImpl$TraversalRunnable.run:9971 android.view.Choreographer$CallbackRecord.run:1010 android.view.Choreographer.doCallbacks:809 android.view.Choreographer.doFrame:744 android.view.Choreographer$FrameDisplayEventReceiver.run:995
I/SurfaceControl: nativeRelease nativeObject s[526792490368]
I/SurfaceControl: nativeRelease nativeObject e[526792490368]
I/SurfaceControl: nativeRelease nativeObject s[526793921536]
I/SurfaceControl: nativeRelease nativeObject e[526793921536]
I/ViewRootImpl@9e07a49[MainActivity]: Relayout returned: old=(0,0,1920,1200) new=(0,0,1920,1200) req=(1920,1200)0 dur=11 res=0x1 s={true<PHONE_NUMBER>68} ch=false fn=194
I/SurfaceView: surfaceCreated 1 https://github.com/BabylonJS/BabylonReactNative/pull/8 android.view.SurfaceView{f45f322 V.E...... ......ID 0,0-1917,1002}
I/SurfaceView: surfaceChanged (1917,1002) 1 https://github.com/BabylonJS/BabylonReactNative/pull/8 android.view.SurfaceView{f45f322 V.E...... ......ID 0,0-1917,1002}
I/SurfaceView: applySurfaceTransforms: t = android.view.SurfaceControl$Transaction@b534370 surfaceControl = Surface(name=SurfaceView - com.emesent/com.emesent.MainActivity@f45f322@0)/@0x9a006e9 frame = 194
I/ReactNativeJS: BJS - [13:49:01]: Babylon Native (v5.42.2) launched

Please find attached a screen recording illustrating how Skia and Babylon Native are fighting for (canvas?) resources.
The foreground red square in the top left corner is the Skia component and the Babylon 3D scene is in the background.
As you'll see in the video, when I don't interact with the Skia component, Babylon just works fine - I can rotate around the scene in Babylon and start the XR (camera video stream). However as soon as I tap the Skia component, the Babylon component freezes. I need to toggle the Babylon window to restore it.
Another interesting thing is, when the Skia component takes control and I attempt to start the XR, it opens the camera video stream in the Skia component (instead of Babylon) until I reset it back by toggling the Babylon view.
https://github.com/Shopify/react-native-skia/assets/24381573/e9c441b6-c1b9-45fb-8e79-cbd81455a651

Hi, thanks again for the input. This looks like a problem with Babylon using SurfaceView on Android. It is a view that is less suitable to combine with other views and uses a special form of rendering on Android built for performance - but not for interoperability with other views. RNSkia uses TextureViews on Android - both is based on OpenGL rendering.
What happens if you use multiple Babylon views at the same time?

Did you try the transparency trick mentioned in the issue you posted? (https://github.com/BabylonJS/BabylonReactNative/issues/585).

I've tried to create a reproduction here, but it is a bit hard due to some issues setting up and getting a reliable Babylon.js example up and running.
In addition I've read the limitations described in the Babylon.js React Native docs here that says that only single views are supported - this makes me believe that the problem lies in the Babylon.js tool and not RN Skia?
I created another test to see if RN Skia plays nice with other OpenGL based libraries - installed Expo-gl and made a test that shows that we can display both Expo-GL views and RN Skia views at the same time without any issues. (repo can be found here: https://github.com/chrfalch/ExpoGLAndSkia)
I'll close this one for now since Babylon.js clearly states that it only supports a single view and RN Skia works well with other OpenGL views.
A test you can do is to see if Expo-GL works well with Babylon.js.


HKG: steering temporarily unavailable (90 degree steering unlock didn't work?)

Describe the bug
Was testing e2e behavior and made a left turn at intersection (stop light). On green light it began to go slowly, so I pressed accel manually, and OP began turning. The wheel suddenly jumped back to normal position (to 0 degrees/straight), "Steering Temporarily Unavailable" showed up on the UI, and I took control.
https://user-images.githubusercontent.com/21319730/197001150-9e52cf6e-31b8-41c5-8d8d-0b3dcc273590.mp4
Which car does this affect?
Hyundai Elantra Hybrid 2021
Provide a route where the issue occurs
eb5a50f9e98f50b9|2022-10-20--08-12-57--26
openpilot version
0.8.17-master-ci
Additional info
No response

I've never seen a fault from our Sonata or Optima, applying torque for very long periods of time with this fix. Can you try to reproduce this again to make sure the EPS is not respecting our workaround for the 90 degree fault?
For testing only, you can modify latActive to ignore active, and allow all messages in panda safety. Then you can sit in park with the wheel turned past 90 for a while.

haven't found the time to test constant steering using OP, but it occurred again. funny enough it happened at the exact intersection. eb5a50f9e98f50b9|2022-10-25--17-32-43--13
https://user-images.githubusercontent.com/21319730/198123080-3dc81253-46ad-4085-b73b-92f07b20858c.mp4

Can you try this PR and let me know how it goes? https://github.com/commaai/openpilot/pull/26275
How often has this happened so far? Just twice in a week so far?

it's happened every time on that intersection. I can't reproduce it anywhere else
will test today

separate issue, but the branch change menu/feature on the UI put my C3 out of commission for now

separate issue, but the branch change menu/feature on the UI put my C3 out of commission for now

What do you mean?

it's fixed now, but hereMs what I did while on master-ci:

switched branches on the UI menu
selected the branch from the show list
pressed download
pressed install
rebooted and it got stuck on comma logo

I SSH'd to see what's up and none of the submodules were initialized. couldn't check out another branch because the submodules were configured weird. I just a fresh pull of OP to fix it 😅

@tecandrew so far you said this has happened every time at that same intersection? How many times is that? Has the 3-frame fix worked?

here's what I did while on master-ci:

switched branches on the UI menu
selected the branch from the shown list
pressed download
pressed install
rebooted and it got stuck on comma logo when it powered on

I SSH'd to see what's up and none of the submodules were initialized. couldn't check out another branch because the submodules were configured weird. I just did a fresh pull of OP to fix it sweat_smile

Have you done anything weird with your git config or anything like that? Were you switching between branches with and without submodules?

@sshane I actually just tried it and it faulted in a similar manner on a different area (right turn this time). eb5a50f9e98f50b9|2022-10-31--12-44-32--1

How many times is that?

It's only happened twice that I've mentioned it here.
https://user-images.githubusercontent.com/21319730/199114201-4236375d-5dc1-486e-b771-233fd58c0df3.mp4

@adeebshihadeh I haven't done much other than keep a separate directory for master-ci. After the switch-branch hiccup I SSH'd to see what's up then tried to switch back to master-ci manually and couldn't.
I usually just SSH to see if it's on my network; development is done on my linux machine.
comma@tici:/data$ ls -l
total 200
-rwxr-xr-x   1 comma comma     63 Aug 31 09:22 continue.sh
drwxrwx---   3 root  root    4096 Apr 21  2022 data
drwxr-xr-x   4 root  root    4096 Oct 31 14:31 etc
drwxr-xr-x   2 comma comma 126976 Oct 31 14:24 log
drwxr-xr-x   4 comma comma   4096 Aug 31 09:26 media
drwxr-xr-x   3 root  root    4096 Apr 21  2022 misc
drwxr-xr-x  21 comma comma   4096 Oct 31 13:34 openpilot
drwxr-xr-x  20 comma comma   4096 Oct 30 11:26 openpilot.master-ci
drwxr-xr-x   3 comma comma   4096 Oct 31 14:32 params
drwx------   4 root  root    4096 Apr 21  2022 persist
lrwxrwxrwx   1 comma comma     15 Oct 31 13:33 pythonpath -> /data/openpilot
drwxr-xr-x   5 comma comma   4096 Oct 31 13:34 safe_staging
drwxr-xr-x 259 comma comma   4096 Oct 25 18:08 scons_cache
drwxr-xr-x   2 comma comma   4096 Apr 21  2022 ssh
drwxr-xr-x   2 comma comma  20480 Oct 31 14:31 stats
drwxr-xr-x   3 comma comma   4096 Apr 21  2022 tmp

@adeebshihadeh I encountered the branch-change bug again. Filed a separate issue here #26314

@tecandrew have you experienced the steering workaround code failing at all recently?

haven't experienced the steering unavailable lately on master-ci 🤔 I just went on the same route/intersection as the one in the initial report and experienced only the steering/torque max warning

User reported that the EPS still faulted with his 2019 Hyundai Ioniq when his car tried to steer over 90 degrees. Even though the EPS faulted multiple times during that turn, it was still able to continue to command torque past 90 degrees.

012c95f06918eca4|2023-01-13--22-00-59--3

@sshane User reported that the EPS still faulted with his 2019 Hyundai Ioniq when his car tried to steer over 90 degrees. Even though the EPS faulted multiple times during that turn, it was still able to continue to command torque past 90 degrees.

012c95f06918eca4|2023-01-13--22-00-59--3

@sshane  The EPS still faulted when steer over 90 degrees then openpilot can control over 90 degrees

012c95f06918eca4|2023-01-14--12-08-04--6

012c95f06918eca4|2023-01-14--12-08-04
The current frequency works for this car to a certain point it seems:

@sshane older hkg can't unlock steer fault but i try it many times

012c95f06918eca4|2023-01-20--15-49-52--4
https://streamable.com/eu3aks

@andy741217 do you want to test this branch? Your car's EPS faulted earlier than our fault workaround expected. Please avoid touching the wheel as there is a different bug for overriding when above 90 deg that you may now hit easier with these limits.
https://github.com/commaai/openpilot/tree/h90d-legacy
Installer URL: https://installer.comma.ai/commaai/h90d-legacy

When I install h90d-legacy then reboot it.I got "openpilot failed to build"

@sshane h90d-legacy always show openpilot fail to build,so i install master-ci and motify it,

012c95f06918eca4|2023-01-21--10-39-50--3
steer can 90degree  but will show warning

bug occurred again on the latest version of master-ci:
eb5a50f9e98f50b9|2023-02-07--18-49-24--12

i don't have the render tools on hand atm to create the video with overlay.

https://user-images.githubusercontent.com/21319730/218649274-bae019dc-e04e-4a78-b5ca-2ddd60c03519.mov
Recent fix to connect.comma.ai allowed me to get a decent screen grab of the behavior.

another occurence: eb5a50f9e98f50b9|2022-12-22--18-16-18--28
https://user-images.githubusercontent.com/21319730/218653943-e1e8303b-5b38-458c-b26e-f7e726942149.mov


Update NextJS examples and docuamentation for new App Directory

Description
NextJS 13 introduced a new directory layout with the app folder. Some extra configuration is needed to make Yoga working compared to previous legacy pages directory layout.
This PR aims to update examples and integration documentation with this new layout.
fixes #2696
TODO:

[x] Update documentation
[x] Update example

I tried to add Context via the following code to this example but foo always came as null. My main purpose is to put the session created by NextAuth credential provider in context.
All examples I found so far show graphql under pages/api/graphql.ts . Not App/api/graphql/route.ts. Is it not possible?
const { handleRequest } = createYoga({
schema: createSchema({
typeDefs: /* GraphQL */       type Query {         greetings: String       }    ,
resolvers: {
Query: {
greetings: (_, _args, context:any) =>{
console.log(context.foo)
return 'This is the greetings field of the root Query type'
}
},
},
}),
context: async ({ request }) => {
// get custom header value
const foo = request.headers.get('next-auth.session-token') ?? null
return { foo }
},
// While using Next.js file convention for routing, we need to configure Yoga to use the correct endpoint
graphqlEndpoint: '/api/graphql',
// Yoga needs to know how to create a valid Next response
fetchAPI: { Response },
})


Add driverJarDirectory parameter to JdbcIO.

Add driverJarDirectory parameter to JdbcIO.
Thank you for your contribution! Follow this checklist to help us incorporate your contribution quickly and easily:

[ ] Mention the appropriate issue in your description (for example: addresses #123), if applicable. This will automatically add a link to the pull request in the issue. If you would like the issue to automatically close on merging the pull request, comment fixes #<ISSUE NUMBER> instead.
[ ] Update CHANGES.md with noteworthy changes.
[ ] If this contribution is large, please file an Apache Individual Contributor License Agreement.

See the Contributor Guide for more tips on how to make review process smoother.
To check the build health, please visit https://github.com/apache/beam/blob/master/.test-infra/BUILD_STATUS.md
GitHub Actions Tests Status (on master branch)

See CI.md for more information about GitHub Actions CI.

This change allows users to use driver jars saved in a local directory in the worker. With this change, Dataflow templates will be able to migrate to JdbcIO instead of DynamicJdbcIO.

R: @johnjcasey

Does setDriverClassName work? This is the way to set jdbc driver for jdbcIO. It also works for xlang jdbcio. imo the jar should be available in classpath which should be handled by the build system instead of the IO connector. CC: @chamikaramj may have an idea.

I changed the implementation to accept a comma separated list of driver Jars. These files will be saved locally and passed to the Datasource using a URL classloader

Retest this please

Please fix spotless:
Execution failed for task ':sdks:java:io:jdbc:spotlessJavaCheck'.
16:20:23 > The following files had format violations:
16:20:23       sdks/java/io/jdbc/src/main/java/org/apache/beam/sdk/io/jdbc/JdbcIO.java
16:20:23           @@ -451,6 +451,7 @@

Run Python PreCommit

LGTM


Fix miss type

The average block time is 4.5 and mentioned in the sentence above. Also the calculation is wrong with 4.25

 Thank you for your submission! We really appreciate it. Like many open source projects, we ask that you sign our Contributor License Agreement before we can accept your contribution.You have signed the CLA already but the status is still pending? Let us recheck it.

Yeh understood. The calculation was also incorrect with 4.25


Adding polyfill for CustomEvents and fixing lint warnings

This polyfill was already in the code in the past but it was removed by mistake.
I also removed some lint warnings which were being logged during the test.

Coverage decreased (-0.005%) to 42.292% when pulling 72b68eca8c9b1626faf1b02185a8461508dbe359 on brunoalvesdefaria:master into 0c740c5604625680e5be818bdd8f84e2db55c72b on chafey:master.

Thanks!