Skip to content

Conversation

@JaroslavTulach
Copy link
Member

@JaroslavTulach JaroslavTulach commented Sep 23, 2025

Pull Request Description

Checklist

Please ensure that the following checklist has been satisfied before submitting the PR:

@JaroslavTulach JaroslavTulach self-assigned this Sep 23, 2025
@JaroslavTulach JaroslavTulach added the CI: No changelog needed Do not require a changelog entry for this PR. label Sep 23, 2025
@JaroslavTulach
Copy link
Member Author

JaroslavTulach commented Sep 23, 2025

  • @AdRiley, I am trying to verify this change is correct. However doing:
corepack pnpm i
corepack pnpm compile
corepack pnpm dev:gui
image
  • and then I can run (and fail) the tests:
enso$ ENSO_LAUNCHER=native sbt buildEngineDistribution

    - [FAILED] can read multiple sheets - error case - With_New_Column - no valid sheets [297ms]
        Reason: An unexpected panic was thrown: (Unsupported_Argument_Types.Error [] 'Cannot convert \'CredentialReference[secretId=secret-3360Yd1PR0XaCGaifwwFOJrqb3d, serviceName
    - [FAILED] can read multiple sheets - error case - With_New_Column - no valid sheets [297ms]
        Reason: An unexpected panic was thrown: (Unsupported_Argument_Types.Error [] 'Cannot convert \'CredentialReference[secretId=secret-3360Yd1PR0XaCGaifwwFOJrqb3d, serviceName=Google]\'(language: Java, type: com.oracle.truffle.polyglot.PolyglotMap) to Java type \'org.enso.base.enso_cloud.ExternalLibraryCredentialHelper$CredentialReference\': Unsupported target type.')
        at <enso> case_branch(/home/devel/NetBeansProjects/enso/enso/distribution/lib/Standard/Google/0.0.0-dev/src/Google_Sheets_Workbook.enso:177:13-93)
        at <enso> Google_Sheets_Workbook._wrap_credentials(/home/devel/NetBeansProjects/enso/enso/distribution/lib/Standard/Google/0.0.0-dev/src/Google_Sheets_Workbook.enso:175-182)
        at <enso> Google_Sheets_Workbook.type.new<arg-1>(/home/devel/NetBeansPro
    - [FAILED] can read multiple sheets - error case - With_New_Column - no valid sheets [297ms]
        Reason: An unexpected panic was thrown: (Unsupported_Argument_Types.Error [] 'Cannot convert \'CredentialReference[secretId=secret-3360Yd1PR0XaCGaifwwFOJrqb3d, serviceName=Google]\'(language: Java, type: com.oracle.truffle.polyglot.PolyglotMap) to Java type \'org.enso.base.enso_cloud.ExternalLibraryCredentialHelper$CredentialReference\': Unsupported target type.')
        at <enso> case_branch(/home/devel/NetBeansProjects/enso/enso/distribution/lib/Standard/Google/0.0.0-dev/src/Google_Sheets_Workbook.enso:177:13-93)
        at <enso> Google_Sheets_Workbook._wrap_credentials(/home/devel/NetBeansProjects/enso/enso/distribution/lib/Standard/Google/0.0.0-dev/src/Google_Sheets_Workbook.enso:175-182)
        at <enso> Google_Sheets_Workbook.type.new<arg-1>(/home/devel/NetBeansProjects/enso/enso/distribution/lib/Standard/Google/0.0.0-dev/src/Google_Sheets_Workbook.enso:45:47-75)
        at <enso> Google_Sheets_Workbook.type.new(/home/devel/NetBeansProjects/enso/enso/distribution/lib/Standard/Google/0.0.0-dev/src/Google_Sheets_Workbook.enso:45:19-76)
        at <enso> Google_Sheets.read(/home/devel/NetBeansProjects/enso/enso/distribution/lib/Standard/Google/0.0.0-dev/src/Google_Sheets.enso:15:9-57)
        at <enso> Main.add_specs.Main.add_specs<arg-1>(/home/devel/NetBeansProjects/enso/enso/test/Google_Test/src/Main.enso:311:18-115)
        at <enso> case_branch.case <internal-1178>(/home/devel/NetBeansProjects/enso/enso/distribution/lib/Standard/Test/0.0.0-dev/src/Group.enso:37:61-64)
        at <enso> Helpers.execute_spec_code<arg-1>(/home/devel/NetBeansProjects/enso/enso/distribution/lib/Standard/Test/0.0.0-dev/src/Helpers.enso:56:18-34)
   jects/enso/enso/distribution/lib/Standard/Google/0.0.0-dev/src/Google_Sheets_Workbook.enso:45:47-75)
        at <enso> Google_Sheets_Workbook.type.new(/home/devel/NetBeansProjects/enso/enso/distribution/lib/Standard/Google/0.0.0-dev/src/Google_Sheets_Workbook.enso:45:19-76)
        at <enso> Google_Sheets.read(/home/devel/NetBeansProjects/enso/enso/distrib
    - [FAILED] can read multiple sheets - error case - With_New_Column - no valid sheets [297ms]
        Reason: An unexpected panic was thrown: (Unsupported_Argument_Types.Error [] 'Cannot convert \'CredentialReference[secretId=secret-3360Yd1PR0XaCGaifwwFOJrqb3d, serviceName=Google]\'(language: Java, type: com.oracle.truffle.polyglot.PolyglotMap) to Java type \'org.enso.base.enso_cloud.ExternalLibraryCredentialHelper$CredentialReference\': Unsupported target type.')
        at <enso> case_branch(/home/devel/NetBeansProjects/enso/enso/distribution/lib/Standard/Google/0.0.0-dev/src/Google_Sheets_Workbook.enso:177:13-93)
        at <enso> Google_Sheets_Workbook._wrap_credentials(/home/devel/NetBeansProjects/enso/enso/distribution/lib/Standard/Google/0.0.0-dev/src/Google_Sheets_Workbook.enso:175-182)
        at <enso> Google_Sheets_Workbook.type.new<arg-1>(/home/devel/NetBeansProjects/enso/enso/distribution/lib/Standard/Google/0.0.0-dev/src/Google_Sheets_Workbook.enso:45:47-75)
        at <enso> Google_Sheets_Workbook.type.new(/home/devel/NetBeansProjects/enso/enso/distribution/lib/Standard/Google/0.0.0-dev/src/Google_Sheets_Workbook.enso:45:19-76)
        at <enso> Google_Sheets.read(/home/devel/NetBeansProjects/enso/enso/distribution/lib/Standard/Google/0.0.0-dev/src/Google_Sheets.enso:15:9-57)
        at <enso> Main.add_specs.Main.add_specs<arg-1>(/home/devel/NetBeansProjects/enso/enso/test/Google_Test/src/Main.enso:311:18-115)
        at <enso> case_branch.case <internal-1178>(/home/devel/NetBeansProjects/enso/enso/distribution/lib/Standard/Test/0.0.0-dev/src/Group.enso:37:61-64)
        at <enso> Helpers.execute_spec_code<arg-1>(/home/devel/NetBeansProjects/enso/enso/distribution/lib/Standard/Test/0.0.0-dev/src/Helpers.enso:56:18-34)
   ution/lib/Standard/Google/0.0.0-dev/src/Google_Sheets.enso:15:9-57)
        at <enso> Main.add_specs.Main.add_specs<arg-1>(/home/devel/NetBeansProjects/enso/enso/test/Google_Test/src/Main.enso:311:18-115)
        at <enso> case_branch.case <internal-1178>(/home/devel/NetBeansProjects/enso/enso/distribution/lib/Standard/Test/0.0.0-dev/src/Group.enso:37:61-64)
        at <enso> Helpers.execute_spec_code<arg-1>(/home/devel/NetBeansProjects/enso/enso/distribution/lib/Standard/Test/0.0.0-dev/src/Helpers.enso:56:18-34)
   =Google]\'(language: Java, type: com.oracle.truffle.polyglot.PolyglotMap) to Java type \'org.enso.base.enso_cloud.ExternalLibraryCredentialHelper$CredentialReference\': Unsupported target type.')
        at <enso> case_branch(/home/devel/NetBeansProjects/enso/enso/distribution/lib/Standard/Google/0.0.0-dev/src/Google_Sheets_Workbook.enso:177:13-93)
        at <enso> Google_Sheets_Workbook._wrap_credentials(/home/devel/NetBeansProjects/enso/enso/distribution/lib/Standard/Google/0.0.0-dev/src/Google_Sheets_Workbook.enso:175-182)
        at <enso> Google_Sheets_Workbook.type.new<arg-1>(/home/devel/NetBeansProjects/enso/enso/distribution/lib/Standard/Google/0.0.0-dev/src/Google_Sheets_Workbook.enso:45:47-75)
        at <enso> Google_Sheets_Workbook.type.new(/home/devel/NetBeansProjects/enso/enso/distribution/lib/Standard/Google/0.0.0-dev/src/Google_Sheets_Workbook.enso:45:19-76)
        at <enso> Google_Sheets.read(/home/devel/NetBeansProjects/enso/enso/distribution/lib/Standard/Google/0.0.0-dev/src/Google_Sheets.enso:15:9-57)
        at <enso> Main.add_specs.Main.add_specs<arg-1>(/home/devel/NetBeansProjects/enso/enso/test/Google_Test/src/Main.enso:311:18-115)
        at <enso> case_branch.case <internal-1178>(/home/devel/NetBeansProjects/enso/enso/distribution/lib/Standard/Test/0.0.0-dev/src/Group.enso:37:61-64)
        at <enso> Helpers.execute_spec_code<arg-1>(/home/devel/NetBeansProjects/enso/enso/distribution/lib/Standard/Test/0.0.0-dev/src/Helpers.enso:56:18-34)

@JaroslavTulach
Copy link
Member Author

JaroslavTulach commented Oct 7, 2025

I have all the setup to execute the tests in regular JVM mode:

enso$ sbt
sbt:enso> runEngineDistribution --run test/Google_Test
48 tests succeeded.
0 tests failed.
0 tests skipped.
0 groups skipped.
[success] Total time: 102 s (01:42), completed 7. 10. 2025 11:12:50

now onto running the same tests in dual JVM mode. With bc03db6 there is eleven remaining failures:

sbt:enso> runEngineDistribution --run test/Google_Test 
  --vm.D=polyglot.enso.classLoading=Standard.Google:guest,enso_dev.Google_Test:guest,hosted

37 tests succeeded.
11 tests failed.
0 tests skipped.
0 groups skipped.
[success] Total time: 105 s (01:45), completed 7. 10. 2025 17:18:47

we are on track to get the dual JVM mode working for Standard.Google library!

@JaroslavTulach JaroslavTulach added the CI: Clean build required CI runners will be cleaned before and after this PR is built. label Oct 7, 2025
var emptySheetError = emptySheetType.invokeMember("Error");
var errorType = EnsoMeta.getType("Standard.Base.Error", "Error");
var error = errorType.invokeMember("throw", emptySheetError);
throw error.throwException();
Copy link
Member Author

@JaroslavTulach JaroslavTulach Oct 7, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • cdbf8fb is a solution to dual exceptions problem, @AdRiley
  • rather than throwing Java exception and then trying to convert it to Empty_Sheet.Error
  • let's directly throw Empty_Sheet.Error!
  • the getSheetRange method returns Table - as such we need to throw it as Panic (hence error.throwException()
    • otherwise just return error; to propagate the value as (dataflow) Error
  • because we throw Panic we have Panic.recover in the Enso code
  • if we returned (dataflow) Error - we could delete the Enso conversion code completely!

Copy link
Member Author

@JaroslavTulach JaroslavTulach Oct 8, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • we can go even further with this approach, @jdunkerley
  • if we just return error; then there is no need to do anything special on the Enso side
  • as de343f3 illustrates, it is possible to remove Empty_Sheet.handle_java_exception
  • the only drawback of the de343f3 is the change of function return type to Object
    • we need to return either Table or Value and Object is the only common superclass
  • the throw error.throwException() solution workarounds this by returning via an exception (at the cost of necessary handler on the Enso side)

@JaroslavTulach
Copy link
Member Author

Right now we have:

  • failing JUnit tests because of changes to DataflowError.throwException():
[error] (runtime-language-epb / Test / test) sbt.TestsFailedException: Tests unsuccessful
[error] (runtime-integration-tests / Test / test) sbt.TestsFailedException: Tests unsuccessful
  • one API change because of adding default Java class argument to as_credential_reference
  • intermittent(?) stalled(?) test on Windows

Other than that we are ready to move on. Heuréka!

error!("Current API vs Old API: {}", err);
error!("If you wish to overwrite the current API in the directory {}, run the following command {},
error!("If you wish to overwrite the current API in the directory {}, run the following command
sbt \"runEngineDistribution --no-ir-caches --docs=api --in-project {}\"
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This change, @AdRiley, @GregoryTravis, @jdunkerley, will print:

index 8b63b3d24d..f2c90e184d 100644
--- home/devel/NetBeansProjects/enso/enso/distribution/lib/Standard/Table/0.0.0-dev/docs/api/Errors.md
+++ home/devel/NetBeansProjects/enso/enso/built-distribution/enso-engine-2025.3.1-dev-linux-amd64/enso-2025.3.1-dev/lib/Standard/Table/2025.3.1-dev/docs/api/Errors.md
@@ -43,7 +43,7 @@
     - to_display_text self -> Standard.Base.Any.Any
 - type Empty_Sheet
     - Error
-    - handle_java_exception -> Standard.Base.Any.Any
+    - handle_java_exception ~action:Standard.Base.Any.Any -> Standard.Base.Any.Any
     - to_display_text self -> Standard.Base.Any.Any
 - type Existing_Column
     - Error column_name:Standard.Base.Any.Any

ERROR main_internal: enso_build::engine::context: If you wish to overwrite the current API in the directory distribution/lib/Standard/Table/0.0.0-dev/docs/api, run the following command 
  sbt "runEngineDistribution --no-ir-caches --docs=api --in-project distribution/lib/Standard/Table/0.0.0-dev"
  and commit the modified files
ERROR main_internal: enso_build_cli: error=API check failed for library Standard.Table
 INFO main_internal: enso_build_cli: close
Error: API check failed for library Standard.Table

in case of API check failure. Which I can then directly copy and run the regenerator:

enso$ sbt "runEngineDistribution --no-ir-caches --docs=api --in-project distribution/lib/Standard/Table/0.0.0-dev"

Please note the --no-ir-caches flag added for your convenience as the actionable applied after recent complains.

@JaroslavTulach JaroslavTulach force-pushed the wip/jtulach/DualGoogle branch from c1f5e6e to 53f1b1a Compare October 8, 2025 06:57
}

public Table getSheetRange(
public Object getSheetRange(
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@JaroslavTulach JaroslavTulach marked this pull request as ready for review October 8, 2025 17:13
@JaroslavTulach JaroslavTulach changed the title Run Standard.Google in dual JVM mode Run Standard.Google in dual JVM mode Oct 8, 2025
@enso-bot
Copy link

enso-bot bot commented Oct 9, 2025

Jaroslav Tulach reports a new STANDUP for yesterday (2025-10-08):

Progress: .

@JaroslavTulach
Copy link
Member Author

sbt:enso> runEngineDistribution --run test/Google_Test 
  --vm.D=polyglot.enso.classLoading=Standard.Google:guest,enso_dev.Google_Test:guest,hosted

There is now a last remaining failure:

    - [FAILED] can read multiple sheets - one sheet [2192ms]
        Reason: An unexpected panic was thrown: (Unsupported_Argument_Types.Error [OtherJvmObject{id=1537}, true, , JavaObject[org.enso.table.problems.ProblemAggregator@6fa60e24 (org.enso.table.problems.ProblemAggregator)]] 'Cannot convert \'org.enso.table.data.table.Table@684bfebc\'(language: Enso Polyglot Bridge, type: org.enso.table.data.table.Table) to Java type \'org.enso.table.data.table.Table\': Unsupported target type.')
        at <enso> In_Memory_Table_Implementation.zip.new_java_table(/home/devel/NetBeansProjects/enso/enso/distribution/lib/Standard/Table/0.0.0-dev/src/Internal/In_Memory_Table_Implementation.enso:555:17-143)
        at <enso> Java_Problems.with_problem_aggregator(/home/devel/NetBeansProjects/enso/enso/distribution/lib/Standard/Table/0.0.0-dev/src/Internal/Java_Problems.enso:120:14-25)
        at <enso> In_Memory_Table_Implementation.zip<arg-1>(/home/devel/NetBeansProjects/enso/enso/distribution/lib/Standard/Table/0.0.0-dev/src/Internal/In_Memory_Table_Implementation.enso:554-555)
        at <enso> case_branch(/home/devel/NetBeansProjects/enso/enso/distribution/lib/Standard/Base/0.0.0-dev/src/Errors/Problem_Behavior.enso:88-89)
        at <enso> Problem_Behavior.attach_problems_before(/home/devel/NetBeansProjects/enso/enso/distribution/lib/Standard/Base/0.0.0-dev/src/Errors/Problem_Behavior.enso:84-92)
        at <enso> In_Memory_Table_Implementation.zip(/home/devel/NetBeansProjects/enso/enso/distribution/lib/Standard/Table/0.0.0-dev/src/Internal/In_Memory_Table_Implementation.enso:553-556)
        at <enso> Table.zip(/home/devel/NetBeansProjects/enso/enso/distribution/lib/Standard/Table/0.0.0-dev/src/Table.enso:3113:9-93)
        at <enso> case_branch<arg-2>(/home/devel/NetBeansProjects/enso/enso/distribution/lib/Standard/Google/0.0.0-dev/src/Google_Sheets_Workbook.enso:114:21-124)
        at <enso> case_branch(/home/devel/NetBeansProjects/enso/enso/distribution/lib/Standard/Google/0.0.0-dev/src/Google_Sheets_Workbook.enso:110-114)
        at <enso> Google_Sheets_Workbook.read_many(/home/devel/NetBeansProjects/enso/enso/distribution/lib/Standard/Google/0.0.0-dev/src/Google_Sheets_Workbook.enso:102-114)
        at <enso> Main.add_specs.Main.add_specs<arg-1>(/home/devel/NetBeansProjects/enso/enso/test/Google_Test/src/Main.enso:223:18-48)

it should probably be mitigated by using the same technique as in 51366e2

@JaroslavTulach
Copy link
Member Author

... mitigated by using the same technique - done in 2a39d26

sbt:enso> runEngineDistribution --run test/Google_Test --vm.D=polyglot.enso.classLoading=Standard.Google:guest,enso_dev.Google_Test:guest,hosted

48 tests succeeded.
0 tests failed.
0 tests skipped.
0 groups skipped.

[success] Total time: 111 s (01:51), completed 9. 10. 2025 6:18:10

I believe we are ready! @AdRiley please review and verify my claims. Thank you.

raw_table = self.internal_java_table
if raw_table.is_a table_class then raw_table else
# coming from the other JVM and deserves conversion
new_columns = raw_table.getColumns.map c-> column_class.new c.getName c.getStorage
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • using same technique as in 51366e2
  • e.g. converting via ColumnStorage (which is an interface)
  • and creating new Table for Column (of the right class) delegating to proxy of the interface

private static Value getBindings() {
return Context.getCurrent().getBindings("enso");
var ctx = Context.getCurrent();
var bindings = ctx.getPolyglotBindings().getMember("ensoBindings");
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • With these changes we can now access Enso classes even from dual JVM

Convert a Java problem into its Enso equivalent.
translate_problem p = case p of
_ : InvalidAggregation ->
translate_problem p = case p.problemType of
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Introduction of Problem.problemType() allow us to translate_problem regardless from which JVM it origins


```bash
enso$ ./run ide build
enso$ ls ./dist/ide/enso-linux-*.AppImage
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • this would be very nice to automate, @otulach, @PabloBuchu!
  • first of all we need to run the IDE and create the GoogleSheet credential via playwright
  • then we need to execute the Google_Tests from CLI

@AdRiley
Copy link
Member

AdRiley commented Oct 9, 2025

image

Testing Google Sheets is showing an error...

@JaroslavTulach
Copy link
Member Author

Testing Google Sheets is showing an error...

  • Yes, that's typical dual JVM problem.
  • I used a fix like this at one place: 2a39d26
  • The fix is of this problem is likely to be the same. Just somewhere else.

@AdRiley
Copy link
Member

AdRiley commented Oct 9, 2025

Further testing indicates this error only happens in the IDE. If we extend the test to

image

and then run from command line. We get back the data from google sheets as we expect

image

@enso-bot
Copy link

enso-bot bot commented Oct 10, 2025

Jaroslav Tulach reports a new STANDUP for yesterday (2025-10-09):

Progress: .

Discord
Discord is great for playing games and chilling with friends, or even building a worldwide community. Customize your own space to talk, play, and hang out.
Discord
Discord is great for playing games and chilling with friends, or even building a worldwide community. Customize your own space to talk, play, and hang out.
Discord
Discord is great for playing games and chilling with friends, or even building a worldwide community. Customize your own space to talk, play, and hang out.

@enso-bot
Copy link

enso-bot bot commented Oct 11, 2025

Jaroslav Tulach reports a new STANDUP for yesterday (2025-10-10):

Progress: .

@enso-bot
Copy link

enso-bot bot commented Oct 12, 2025

Jaroslav Tulach reports a new STANDUP for yesterday (2025-10-11):

Progress: .

@AdRiley
Copy link
Member

AdRiley commented Oct 14, 2025

Updating the test project to this

google_sheets_workbook1 = Google_Sheets.read '1yKs-vGmxpo5oEKzhk7HN2xF40ux1q07RuzZn_7PQDDI' (Enso_Secret.get 'enso://Users/AdRiley/GS')
node1 = google_sheets_workbook1.read 'Sheet2' ..No_Headers
# node1 = Table.new [['A', ['S2A']], ['B', ['S2B']], ['C', ['S2C']]]
node4 = node1.pretty
node3 = IO.println node4
test = Standard.Visualization.Table.Visualization.prepare_visualization node1
IO.println test

Causes a new error
image

@JaroslavTulach
Copy link
Member Author

Updating the test project to this

Thanks @AdRiley for the testing. Now, we other tasks like #14019 being integrated, let's move this PR on. I am getting following error:

obrazek

when trying your code. Obviously, I don't have access to your credentials. But on a general note: How can projects referencing secrets be made transferable between different people?

try {
polyglotJava = createPolyglotJava(ctx);
} catch (Throwable t) {
logger.log(Level.ERROR, "Cannot create polyglotJava", t);
Copy link
Member Author

@JaroslavTulach JaroslavTulach Oct 30, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

INFO: Initializing OtherJvm support!
SEVERE: Cannot create polyglotJava
java.lang.AssertionError: Error creating JVM: -5
       at org.enso.jvm.channel/org.enso.jvm.channel.JVM.initializeEnv(JVM.java:114)
       at org.enso.jvm.channel/org.enso.jvm.channel.JVM.env(JVM.java:87)
       at org.enso.jvm.channel/org.enso.jvm.channel.Channel.create(Channel.java:161)
       at org.enso.jvm.interop/org.enso.jvm.interop.api.OtherJvmClassLoader.createImpl(OtherJvmClassLoader.java:129)
       at org.enso.jvm.interop/org.enso.jvm.interop.api.OtherJvmClassLoader.create(OtherJvmClassLoader.java:76)
       at org.enso.interpreter.epb.JavaPolyglotNode.create(JavaPolyglotNode.java:21)
       at org.enso.interpreter.epb.ForeignEvalNode.parseJava(ForeignEvalNode.java:124)

Creation of multiple VMs in a single process is not supported.

  • one should probably read the specification more carefully before getting too optimistic

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

Labels

-libs-API-change-Base Marks a PR that changes the public API of Standard.Base CI: Clean build required CI runners will be cleaned before and after this PR is built. CI: No changelog needed Do not require a changelog entry for this PR.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants