Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Realtime Database Emulator crashes with "An unexpected error has occurred." error #4454

Closed
leonardoraele opened this issue Apr 18, 2022 · 2 comments · Fixed by #4489
Closed

Comments

@leonardoraele
Copy link

Environment

Operation System:

$ uname -a
Linux DESKTOP-K3U372K 5.4.72-microsoft-standard-WSL2 #1 SMP Wed Oct 28 23:40:43 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

Windows: (Host)

Edition	Windows 10 Pro
Version	21H1
Installed on	‎19/‎11/‎2020
OS build	19043.1586
Experience	Windows Feature Experience Pack 120.2212.4170.0

Browser version: N/A

Firebase version:

$ npx firebase --version
10.6.0
$ npm ls firebase
newproject@1.0.0 /home/leonardoraele/Workspace/newproject
├─┬ firebase-tools@10.6.0
│ └── firebase@7.24.0 extraneous
└── firebase@9.6.11

Java:

$ java --version
openjdk 17.0.2 2022-01-18
OpenJDK Runtime Environment (build 17.0.2+8-Ubuntu-120.04)
OpenJDK 64-Bit Server VM (build 17.0.2+8-Ubuntu-120.04, mixed mode, sharing)

Firebase Product: emulators + database

Problem

Realtime Database Emulator crashes with the error below whenever I make a change to the rules file if there is any error in the json (which always happen as soon as I start typing, unless I paste an already well formated json so that there's no intermidiate state).

i  database: Change detected, updating rules for undefined-default-rtdb...

Error: An unexpected error has occurred.

Having trouble? Try again or contact support with contents of firebase-debug.log

Steps to reproduce:

Here is the sequence of commands executed to reproduce the issue on a new project:

$ mkdir newproject
$ cd newproject
$ npm init -y
$ npm i -D firebase firebase-tools
$ npx firebase init
? Which Firebase features do you want to set up for this directory? Realtime Database, Emulators
? What file should be used for Realtime Database Security Rules? database.rules.json
? Which Firebase emulators do you want to set up? Press Space to select emulators, then Enter to confirm your choices. Database Emulator
? Which port do you want to use for the database emulator? 9000
? Would you like to enable the Emulator UI? Yes
? Which port do you want to use for the Emulator UI (leave empty to use any available port)? 4000
? Would you like to download the emulators now? Yes
$ npx firebase emulators:start

After going through the steps above, the emulator starts running correctly, but it stops with an error when I start making changes to the rules file database.rules.json and there's an error in the json.

Example:

// This is how the file initially is
{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null"
  }
}
{
  "rules": {
    ".read": "", // Error: An unexpected error has occurred.
    ".write": "auth != null"
  }
}
{
  "rules": {
    ".read": "true", // Now it's well formated again, but the emulator is no longer running (I'm not sure which breaks)
    ".write": "auth != null"
  }
}

If I try to start the emulator again, there is a port error:

$ npx firebase emulators:start
i  emulators: Starting emulators: database
i  emulators: Shutting down emulators.
⚠  database: Port 9000 is not open on 127.0.0.1, could not start Database Emulator.
⚠  database: To select a different host/port, specify that host/port in a firebase.json config file:
      {
        // ...
        "emulators": {
          "database": {
            "host": "HOST",
            "port": "PORT"
          }
        }
      }
i  emulators: Shutting down emulators.

Error: Could not start Database Emulator, port taken.

Expected Behavior: The error should happen, since the file has to go through an intermediary invalid state as I type, but the emulator process should remain running until I finish typing a well formated json.

Logs

database-debug.log

05:55:58.154 [NamespaceSystem-akka.actor.default-dispatcher-4] INFO akka.event.slf4j.Slf4jLogger - Slf4jLogger started
05:55:58.231 [main] INFO com.firebase.server.forge.App$ - Listening at 127.0.0.1:9000

firebase-debug.log

[debug] [2022-04-18T08:55:56.407Z] ----------------------------------------------------------------------
[debug] [2022-04-18T08:55:56.408Z] Command:       /home/leonardoraele/.nvm/versions/node/v17.6.0/bin/node /home/leonardoraele/Workspace/newproject/node_modules/.bin/firebase emulators:start
[debug] [2022-04-18T08:55:56.408Z] CLI Version:   10.6.0
[debug] [2022-04-18T08:55:56.408Z] Platform:      linux
[debug] [2022-04-18T08:55:56.408Z] Node Version:  v17.6.0
[debug] [2022-04-18T08:55:56.408Z] Time:          Mon Apr 18 2022 05:55:56 GMT-0300 (Brasilia Standard Time)
[debug] [2022-04-18T08:55:56.408Z] ----------------------------------------------------------------------
[debug] 
[debug] [2022-04-18T08:55:56.440Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
[debug] [2022-04-18T08:55:56.441Z] > authorizing via signed-in user (leonardoraele@gmail.com)
[debug] [2022-04-18T08:55:56.464Z] openjdk version "17.0.2" 2022-01-18
OpenJDK Runtime Environment (build 17.0.2+8-Ubuntu-120.04)

[debug] [2022-04-18T08:55:56.465Z] OpenJDK 64-Bit Server VM (build 17.0.2+8-Ubuntu-120.04, mixed mode, sharing)

[debug] [2022-04-18T08:55:56.467Z] Parsed Java major version: 17
[info] i  emulators: Starting emulators: database {"metadata":{"emulator":{"name":"hub"},"message":"Starting emulators: database"}}
[debug] [2022-04-18T08:55:56.470Z] > refreshing access token with scopes: []
[debug] [2022-04-18T08:55:56.471Z] >>> HTTP REQUEST POST https://www.googleapis.com/oauth2/v3/token  
 <request body omitted>
[debug] [2022-04-18T08:55:56.823Z] <<< HTTP RESPONSE 200 {"expires":"Mon, 01 Jan 1990 00:00:00 GMT","date":"Mon, 18 Apr 2022 08:55:57 GMT","cache-control":"no-cache, no-store, max-age=0, must-revalidate","pragma":"no-cache","content-type":"application/json; charset=utf-8","vary":"X-Origin, Referer, Origin,Accept-Encoding","server":"scaffolding on HTTPServer2","x-xss-protection":"0","x-frame-options":"SAMEORIGIN","x-content-type-options":"nosniff","alt-svc":"h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000,h3-Q050=\":443\"; ma=2592000,h3-Q046=\":443\"; ma=2592000,h3-Q043=\":443\"; ma=2592000,quic=\":443\"; ma=2592000; v=\"46,43\"","accept-ranges":"none","transfer-encoding":"chunked"}
[debug] [2022-04-18T08:55:56.834Z] >>> [apiv2][query] GET https://firebase.googleapis.com/v1beta1/projects/undefined [none]
[debug] [2022-04-18T08:55:57.552Z] <<< [apiv2][status] GET https://firebase.googleapis.com/v1beta1/projects/undefined 403
[debug] [2022-04-18T08:55:57.552Z] <<< [apiv2][body] GET https://firebase.googleapis.com/v1beta1/projects/undefined {"error":{"code":403,"message":"The caller does not have permission","status":"PERMISSION_DENIED"}}
[debug] [2022-04-18T08:55:57.553Z] HTTP Error: 403, The caller does not have permission
[debug] [2022-04-18T08:55:57.553Z] Failed to retrieve default database instance: {"name":"FirebaseError","children":[],"exit":2,"message":"Failed to get Firebase project undefined. Please make sure the project exists and your account has permission to access it.","original":{"name":"FirebaseError","children":[],"context":{"body":{"error":{"code":403,"message":"The caller does not have permission","status":"PERMISSION_DENIED"}},"response":{"statusCode":403}},"exit":1,"message":"HTTP Error: 403, The caller does not have permission","status":403},"status":500} {"metadata":{"emulator":{"name":"database"},"message":"Failed to retrieve default database instance: {\"name\":\"FirebaseError\",\"children\":[],\"exit\":2,\"message\":\"Failed to get Firebase project undefined. Please make sure the project exists and your account has permission to access it.\",\"original\":{\"name\":\"FirebaseError\",\"children\":[],\"context\":{\"body\":{\"error\":{\"code\":403,\"message\":\"The caller does not have permission\",\"status\":\"PERMISSION_DENIED\"}},\"response\":{\"statusCode\":403}},\"exit\":1,\"message\":\"HTTP Error: 403, The caller does not have permission\",\"status\":403},\"status\":500}"}}
[debug] [2022-04-18T08:55:57.553Z] database rules config:  [{"instance":"undefined-default-rtdb","rules":"/home/leonardoraele/Workspace/newproject/database.rules.json"}]
[debug] [2022-04-18T08:55:57.556Z] Ignoring unsupported arg: projectId {"metadata":{"emulator":{"name":"database"},"message":"Ignoring unsupported arg: projectId"}}
[debug] [2022-04-18T08:55:57.556Z] Ignoring unsupported arg: auto_download {"metadata":{"emulator":{"name":"database"},"message":"Ignoring unsupported arg: auto_download"}}
[debug] [2022-04-18T08:55:57.556Z] Ignoring unsupported arg: rules {"metadata":{"emulator":{"name":"database"},"message":"Ignoring unsupported arg: rules"}}
[debug] [2022-04-18T08:55:57.556Z] Starting Database Emulator with command {"binary":"java","args":["-Djava.net.preferIPv4Stack=true","-Duser.language=en","-jar","/home/leonardoraele/.cache/firebase/emulators/firebase-database-emulator-v4.7.3.jar","--host","127.0.0.1","--port",9000],"optionalArgs":["port","host","functions_emulator_port","functions_emulator_host"],"joinArgs":false} {"metadata":{"emulator":{"name":"database"},"message":"Starting Database Emulator with command {\"binary\":\"java\",\"args\":[\"-Djava.net.preferIPv4Stack=true\",\"-Duser.language=en\",\"-jar\",\"/home/leonardoraele/.cache/firebase/emulators/firebase-database-emulator-v4.7.3.jar\",\"--host\",\"127.0.0.1\",\"--port\",9000],\"optionalArgs\":[\"port\",\"host\",\"functions_emulator_port\",\"functions_emulator_host\"],\"joinArgs\":false}"}}
[info] i  database: Database Emulator logging to database-debug.log {"metadata":{"emulator":{"name":"database"},"message":"Database Emulator logging to \u001b[1mdatabase-debug.log\u001b[22m"}}
[debug] [2022-04-18T08:55:58.155Z] 05:55:58.154 [NamespaceSystem-akka.actor.default-dispatcher-4] INFO akka.event.slf4j.Slf4jLogger - Slf4jLogger started
 {"metadata":{"emulator":{"name":"database"},"message":"05:55:58.154 [NamespaceSystem-akka.actor.default-dispatcher-4] INFO akka.event.slf4j.Slf4jLogger - Slf4jLogger started\n"}}
[debug] [2022-04-18T08:55:58.231Z] 05:55:58.231 [main] INFO com.firebase.server.forge.App$ - Listening at 127.0.0.1:9000
 {"metadata":{"emulator":{"name":"database"},"message":"05:55:58.231 [main] INFO com.firebase.server.forge.App$ - Listening at 127.0.0.1:9000\n"}}
[warn] ⚠  emulators: The Emulator UI requires a project ID to start. Configure your default project with 'firebase use' or pass the --project flag. {"metadata":{"emulator":{"name":"hub"},"message":"The Emulator UI requires a project ID to start. Configure your default project with 'firebase use' or pass the --project flag."}}
[debug] [2022-04-18T08:55:58.318Z] >>> HTTP REQUEST PUT http://127.0.0.1:9000/.settings/rules.json?ns=undefined-default-rtdb  
 {
  "rules": {
    ".read": "true",
    ".write": "auth != null"
  }
}
[debug] [2022-04-18T08:55:58.502Z] <<< HTTP RESPONSE 200 {"content-length":"15","content-type":"application/json; charset=utf-8","access-control-allow-origin":"*","cache-control":"no-cache","x-firebase-project-id":"undefined-default-rtdb","x-firebase-project-number":"123456789","x-firebase-uuid":"1f630beb-087f-4145-8fcd-d013d7ee032d"}
[info] 
┌─────────────────────────────────────────────────────────────┐
│ ✔  All emulators ready! It is now safe to connect your app. │
└─────────────────────────────────────────────────────────────┘

┌──────────┬────────────────┐
│ Emulator │ Host:Port      │
├──────────┼────────────────┤
│ Database │ 127.0.0.1:9000 │
└──────────┴────────────────┘
  Emulator Hub not running.
  Other reserved ports: 4500

Issues? Report them at https://github.com/firebase/firebase-tools/issues and attach the *-debug.log files.
 

@yuchenshi
Copy link
Member

Please try running the emulators again with firebase emulators:start --debug and keep it open, change the rules, until you've hit the Change detected situation. Are there any additional logs before and after that error?

@leonardoraele
Copy link
Author

@yuchenshi

This is the entire cli output when the emulator is started (tried on a new project), following the same steps as I described previously:

$ npx firebase --version
10.7.1
$ npx firebase emulators:start --debug
[2022-04-22T03:09:28.604Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
[2022-04-22T03:09:28.605Z] > authorizing via signed-in user (leonardoraele@gmail.com)
[2022-04-22T03:09:28.631Z] openjdk version "17.0.2" 2022-01-18
OpenJDK Runtime Environment (build 17.0.2+8-Ubuntu-120.04)

[2022-04-22T03:09:28.632Z] OpenJDK 64-Bit Server VM (build 17.0.2+8-Ubuntu-120.04, mixed mode, sharing)

[2022-04-22T03:09:28.634Z] Parsed Java major version: 17
i  emulators: Starting emulators: database {"metadata":{"emulator":{"name":"hub"},"message":"Starting emulators: database"}}
[2022-04-22T03:09:28.637Z] >>> [apiv2][query] GET https://firebase.googleapis.com/v1beta1/projects/undefined [none]
[2022-04-22T03:09:29.923Z] <<< [apiv2][status] GET https://firebase.googleapis.com/v1beta1/projects/undefined 403
[2022-04-22T03:09:29.923Z] <<< [apiv2][body] GET https://firebase.googleapis.com/v1beta1/projects/undefined {"error":{"code":403,"message":"The caller does not have permission","status":"PERMISSION_DENIED"}}
[2022-04-22T03:09:29.923Z] HTTP Error: 403, The caller does not have permission
[2022-04-22T03:09:29.924Z] Failed to retrieve default database instance: {"name":"FirebaseError","children":[],"exit":2,"message":"Failed to get Firebase project undefined. Please make sure the project exists and your account has permission to access it.","original":{"name":"FirebaseError","children":[],"context":{"body":{"error":{"code":403,"message":"The caller does not have permission","status":"PERMISSION_DENIED"}},"response":{"statusCode":403}},"exit":1,"message":"HTTP Error: 403, The caller does not have permission","status":403},"status":500} {"metadata":{"emulator":{"name":"database"},"message":"Failed to retrieve default database instance: {\"name\":\"FirebaseError\",\"children\":[],\"exit\":2,\"message\":\"Failed to get Firebase project undefined. Please make sure the project exists and your account has permission to access it.\",\"original\":{\"name\":\"FirebaseError\",\"children\":[],\"context\":{\"body\":{\"error\":{\"code\":403,\"message\":\"The caller does not have permission\",\"status\":\"PERMISSION_DENIED\"}},\"response\":{\"statusCode\":403}},\"exit\":1,\"message\":\"HTTP Error: 403, The caller does not have permission\",\"status\":403},\"status\":500}"}}
[2022-04-22T03:09:29.924Z] database rules config:  [{"instance":"undefined-default-rtdb","rules":"/home/leonardoraele/Workspace/delete.me/database.rules.json"}]
[2022-04-22T03:09:29.928Z] Ignoring unsupported arg: projectId {"metadata":{"emulator":{"name":"database"},"message":"Ignoring unsupported arg: projectId"}}
[2022-04-22T03:09:29.928Z] Ignoring unsupported arg: auto_download {"metadata":{"emulator":{"name":"database"},"message":"Ignoring unsupported arg: auto_download"}}
[2022-04-22T03:09:29.928Z] Ignoring unsupported arg: rules {"metadata":{"emulator":{"name":"database"},"message":"Ignoring unsupported arg: rules"}}
[2022-04-22T03:09:29.928Z] Starting Database Emulator with command {"binary":"java","args":["-Djava.net.preferIPv4Stack=true","-Duser.language=en","-jar","/home/leonardoraele/.cache/firebase/emulators/firebase-database-emulator-v4.7.3.jar","--host","127.0.0.1","--port",9000],"optionalArgs":["port","host","functions_emulator_port","functions_emulator_host"],"joinArgs":false} {"metadata":{"emulator":{"name":"database"},"message":"Starting Database Emulator with command {\"binary\":\"java\",\"args\":[\"-Djava.net.preferIPv4Stack=true\",\"-Duser.language=en\",\"-jar\",\"/home/leonardoraele/.cache/firebase/emulators/firebase-database-emulator-v4.7.3.jar\",\"--host\",\"127.0.0.1\",\"--port\",9000],\"optionalArgs\":[\"port\",\"host\",\"functions_emulator_port\",\"functions_emulator_host\"],\"joinArgs\":false}"}}
i  database: Database Emulator logging to database-debug.log {"metadata":{"emulator":{"name":"database"},"message":"Database Emulator logging to \u001b[1mdatabase-debug.log\u001b[22m"}}
[2022-04-22T03:09:30.515Z] 00:09:30.514 [NamespaceSystem-akka.actor.default-dispatcher-4] INFO akka.event.slf4j.Slf4jLogger - Slf4jLogger started
 {"metadata":{"emulator":{"name":"database"},"message":"00:09:30.514 [NamespaceSystem-akka.actor.default-dispatcher-4] INFO akka.event.slf4j.Slf4jLogger - Slf4jLogger started\n"}}
[2022-04-22T03:09:30.591Z] 00:09:30.591 [main] INFO com.firebase.server.forge.App$ - Listening at 127.0.0.1:9000
 {"metadata":{"emulator":{"name":"database"},"message":"00:09:30.591 [main] INFO com.firebase.server.forge.App$ - Listening at 127.0.0.1:9000\n"}}
⚠  emulators: The Emulator UI requires a project ID to start. Configure your default project with 'firebase use' or pass the --project flag. {"metadata":{"emulator":{"name":"hub"},"message":"The Emulator UI requires a project ID to start. Configure your default project with 'firebase use' or pass the --project flag."}}
[2022-04-22T03:09:30.692Z] >>> HTTP REQUEST PUT http://127.0.0.1:9000/.settings/rules.json?ns=undefined-default-rtdb  
 {
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null"
  }
}
[2022-04-22T03:09:30.875Z] <<< HTTP RESPONSE 200 {"content-length":"15","content-type":"application/json; charset=utf-8","access-control-allow-origin":"*","cache-control":"no-cache","x-firebase-project-id":"undefined-default-rtdb","x-firebase-project-number":"123456789","x-firebase-uuid":"6f9085c4-8160-4a00-bb8c-794473af560c"}

┌─────────────────────────────────────────────────────────────┐
│ ✔  All emulators ready! It is now safe to connect your app. │
└─────────────────────────────────────────────────────────────┘

┌──────────┬────────────────┐
│ Emulator │ Host:Port      │
├──────────┼────────────────┤
│ Database │ 127.0.0.1:9000 │
└──────────┴────────────────┘
  Emulator Hub not running.
  Other reserved ports: 4500

Issues? Report them at https://github.com/firebase/firebase-tools/issues and attach the *-debug.log files.

Then, after I change database.rules.json:

  • Before
{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null"
  }
}
  • After
{
  "rules": {
    ".read": "true",
    ".write": "auth != null"
  }
}
  • Emulator output:
i  database: Change detected, updating rules for undefined-default-rtdb... {"metadata":{"emulator":{"name":"database"},"message":"Change detected, updating rules for undefined-default-rtdb..."}}
[2022-04-22T03:09:40.055Z] >>> HTTP REQUEST PUT http://127.0.0.1:9000/.settings/rules.json?ns=undefined-default-rtdb  
 {
  "rules": {
    ".read": "tr",
    ".write": "auth != null"
  }
}
[2022-04-22T03:09:40.065Z] <<< HTTP RESPONSE 400 {"content-length":"49","content-type":"application/json; charset=utf-8","access-control-allow-origin":"*","cache-control":"no-cache","x-firebase-project-id":"undefined-default-rtdb","x-firebase-project-number":"123456789","x-firebase-uuid":"6f9085c4-8160-4a00-bb8c-794473af560c"}
[2022-04-22T03:09:40.065Z] <<< HTTP RESPONSE BODY {
  "error" : "3:15: Unknown variable 'tr'.\n"
}

[2022-04-22T03:09:40.066Z] TypeError: error.trim is not a function
    at DatabaseEmulator.prettyPrintRulesError (/home/leonardoraele/Workspace/delete.me/node_modules/firebase-tools/lib/emulator/databaseEmulator.js:139:51)
    at FSWatcher.<anonymous> (/home/leonardoraele/Workspace/delete.me/node_modules/firebase-tools/lib/emulator/databaseEmulator.js:45:73)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)

Error: An unexpected error has occurred.
i  database: Change detected, updating rules for undefined-default-rtdb... {"metadata":{"emulator":{"name":"database"},"message":"Change detected, updating rules for undefined-default-rtdb..."}}
[2022-04-22T03:09:40.165Z] >>> HTTP REQUEST PUT http://127.0.0.1:9000/.settings/rules.json?ns=undefined-default-rtdb  
 {
  "rules": {
    ".read": "tru",
    ".write": "auth != null"
  }
}
[2022-04-22T03:09:40.171Z] <<< HTTP RESPONSE 400 {"content-length":"50","content-type":"application/json; charset=utf-8","access-control-allow-origin":"*","cache-control":"no-cache","x-firebase-project-id":"undefined-default-rtdb","x-firebase-project-number":"123456789","x-firebase-uuid":"6f9085c4-8160-4a00-bb8c-794473af560c"}
[2022-04-22T03:09:40.171Z] <<< HTTP RESPONSE BODY {
  "error" : "3:15: Unknown variable 'tru'.\n"
}

[2022-04-22T03:09:40.172Z] TypeError: error.trim is not a function
    at DatabaseEmulator.prettyPrintRulesError (/home/leonardoraele/Workspace/delete.me/node_modules/firebase-tools/lib/emulator/databaseEmulator.js:139:51)
    at FSWatcher.<anonymous> (/home/leonardoraele/Workspace/delete.me/node_modules/firebase-tools/lib/emulator/databaseEmulator.js:45:73)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)

Error: An unexpected error has occurred.
i  database: Change detected, updating rules for undefined-default-rtdb... {"metadata":{"emulator":{"name":"database"},"message":"Change detected, updating rules for undefined-default-rtdb..."}}
[2022-04-22T03:09:40.296Z] >>> HTTP REQUEST PUT http://127.0.0.1:9000/.settings/rules.json?ns=undefined-default-rtdb  
 {
  "rules": {
    ".read": "true",
    ".write": "auth != null"
  }
}
[2022-04-22T03:09:40.302Z] <<< HTTP RESPONSE 200 {"content-length":"15","content-type":"application/json; charset=utf-8","access-control-allow-origin":"*","cache-control":"no-cache","x-firebase-project-id":"undefined-default-rtdb","x-firebase-project-number":"123456789","x-firebase-uuid":"6f9085c4-8160-4a00-bb8c-794473af560c"}
✔  database: Rules updated. {"metadata":{"emulator":{"name":"database"},"message":"Rules updated."}}

At this point, the emulator stops with exit code 2:

$ echo $?
2

But I think the database is still running in the background because port 9000 is occupied. I cannot start the emulators again because of port conflicts, unless I run something like fuser -k 9000/tcp.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants