diff --git a/.azure-pipelines/ci.yml b/.azure-pipelines/ci.yml new file mode 100644 index 00000000..7602a73e --- /dev/null +++ b/.azure-pipelines/ci.yml @@ -0,0 +1,70 @@ +name: $(Date:yyyyMMdd).$(Rev:r) +variables: + - name: Codeql.Enabled + value: true +resources: + repositories: + - repository: self + type: git + ref: refs/heads/main + - repository: 1esPipelines + type: git + name: 1ESPipelineTemplates/1ESPipelineTemplates + ref: refs/tags/release +trigger: + branches: + include: + - main +extends: + template: v1/1ES.Unofficial.PipelineTemplate.yml@1esPipelines + parameters: + pool: + os: linux + name: 1ES_JavaTooling_Pool + image: 1ES_JavaTooling_Ubuntu-2004 + sdl: + sourceAnalysisPool: + name: 1ES_JavaTooling_Pool + image: 1ES_JavaTooling_Windows_2022 + os: windows + customBuildTags: + - MigrationTooling-mseng-VSJava-9181-Tool + stages: + - stage: Build + jobs: + - job: Job_1 + displayName: VSCode-Java-Debug-CI + templateContext: + outputs: + - output: pipelineArtifact + artifactName: vsix + targetPath: $(Build.ArtifactStagingDirectory)/vsix + displayName: "Publish Artifact: vsix" + steps: + - checkout: self + fetchTags: true + - task: JavaToolInstaller@0 + displayName: Use Java 17 + inputs: + versionSpec: "17" + jdkArchitectureOption: x64 + jdkSourceOption: PreInstalled + - task: Npm@1 + displayName: npm install + inputs: + verbose: false + - task: CmdLine@2 + displayName: build server + inputs: + script: |- + git clone https://github.com/microsoft/java-debug ../java-debug + npm run build-server + - task: CmdLine@2 + displayName: vsce package + inputs: + script: npx @vscode/vsce@latest package + - task: CopyFiles@2 + displayName: "Copy Files to: $(Build.ArtifactStagingDirectory)/vsix" + inputs: + Contents: "*.vsix" + TargetFolder: $(Build.ArtifactStagingDirectory)/vsix diff --git a/.azure-pipelines/nightly.yml b/.azure-pipelines/nightly.yml new file mode 100644 index 00000000..c3bde437 --- /dev/null +++ b/.azure-pipelines/nightly.yml @@ -0,0 +1,125 @@ +name: $(Date:yyyyMMdd).$(Rev:r) +variables: + - name: Codeql.Enabled + value: true +schedules: + - cron: 0 7 * * 1,2,3,4,5 + branches: + include: + - refs/heads/main +resources: + pipelines: + - pipeline: microsoft.java-debug.signjars.nightly + source: microsoft.java-debug.signjars.nightly + trigger: + branches: + include: + - refs/heads/main + repositories: + - repository: self + type: git + ref: refs/heads/main + - repository: CustomPipelineTemplates + type: git + name: 1ESPipelineTemplates/MicroBuildTemplate + ref: refs/tags/release +trigger: none +extends: + template: azure-pipelines/MicroBuild.1ES.Official.yml@CustomPipelineTemplates + parameters: + pool: + name: VSEng-MicroBuildVSStable + stages: + - stage: Build + jobs: + - job: Job_1 + displayName: VSCode-Java-Debug-Nightly + templateContext: + mb: + signing: + enabled: true + signType: real + signWithProd: true + zipSources: false + feedSource: 'https://mseng.pkgs.visualstudio.com/DefaultCollection/_packaging/MicroBuildToolset/nuget/v3/index.json' + outputs: + - output: pipelineArtifact + artifactName: vsix + targetPath: $(Build.ArtifactStagingDirectory)/vsix + displayName: "Publish Artifact: vsix" + steps: + - checkout: self + fetchTags: false + - task: NodeTool@0 + displayName: Use Node 20.x + inputs: + versionSpec: 20.x + - task: DownloadBuildArtifacts@1 + displayName: Download Build Artifacts + inputs: + buildType: specific + project: a4d27ce2-a42d-4b71-8eef-78cee9a9728e + definition: "16485" + specificBuildWithTriggering: true + downloadType: specific + itemPattern: plugin/jars/com.microsoft.java.debug.plugin-*.jar + extractTars: false + - task: CopyFiles@2 + displayName: 'cp plugin.jar to server' + inputs: + SourceFolder: '$(System.ArtifactsDirectory)/plugin/jars' + Contents: 'com.microsoft.java.debug.plugin-*.jar' + TargetFolder: $(Build.SourcesDirectory)/server + - task: Npm@1 + displayName: npm install + inputs: + verbose: false + - task: CmdLine@2 + displayName: Update nightly vsix version + inputs: + script: node scripts/build/prepare-nightly-build.js + - task: CmdLine@2 + displayName: Replace AI key + inputs: + script: npx json@9.0.6 -I -f package.json -e "this.aiKey=\"%AI_KEY%\"" + - task: CmdLine@2 + displayName: vsce package --pre-release -o extension.vsix + inputs: + script: npx @vscode/vsce@latest package --pre-release -o extension.vsix + ### Copy files for APIScan + - task: CopyFiles@2 + displayName: "Copy Files for APIScan" + inputs: + Contents: "*.vsix" + TargetFolder: $(Agent.TempDirectory)/APIScanFiles + condition: and(succeeded(), ne(variables['DisableAPIScan'], 'true')) + ### Run latest version of APIScan listed at https://www.1eswiki.com/wiki/APIScan_Build_Task + - task: APIScan@2 + displayName: Run APIScan + inputs: + softwareFolder: $(Agent.TempDirectory)/APIScanFiles + softwareName: "vscode-java-debug" + softwareVersionNum: "$(Build.BuildId)" + isLargeApp: false + toolVersion: "Latest" + condition: and(succeeded(), ne(variables['DisableAPIScan'], 'true')) + env: + AzureServicesAuthConnectionString: runAs=App;AppId=$(ApiScanClientId);TenantId=$(ApiScanTenant);AppKey=$(ApiScanSecret) + - script: npx @vscode/vsce@latest generate-manifest -i extension.vsix -o extension.manifest + displayName: 'Generate extension manifest' + - script: copy extension.manifest extension.signature.p7s + displayName: 'Prepare manifest for signing' + - task: CmdLine@2 + displayName: Sign extension + inputs: + script: dotnet %MBSIGN_APPFOLDER%/ddsignfiles.dll /file:extension.signature.p7s /certs:4014052 + env: + SYSTEM_ACCESSTOKEN: $(System.AccessToken) + - task: CopyFiles@2 + displayName: "Copy Files to: $(Build.ArtifactStagingDirectory)/vsix" + inputs: + Contents: | + extension.vsix + extension.manifest + extension.signature.p7s + TargetFolder: $(Build.ArtifactStagingDirectory)/vsix \ No newline at end of file diff --git a/.azure-pipelines/rc.yml b/.azure-pipelines/rc.yml new file mode 100644 index 00000000..38c0c188 --- /dev/null +++ b/.azure-pipelines/rc.yml @@ -0,0 +1,123 @@ +name: $(Date:yyyyMMdd).$(Rev:r) +variables: + - name: Codeql.Enabled + value: true +resources: + pipelines: + - pipeline: microsoft.java-debug.signjars.rc + source: microsoft.java-debug.signjars.rc + trigger: + branches: + include: + - main + repositories: + - repository: self + type: git + ref: refs/heads/main + - repository: CustomPipelineTemplates + type: git + name: 1ESPipelineTemplates/MicroBuildTemplate + ref: refs/tags/release +trigger: none +extends: + template: azure-pipelines/MicroBuild.1ES.Official.yml@CustomPipelineTemplates + parameters: + pool: + name: VSEng-MicroBuildVSStable + stages: + - stage: Build + jobs: + - job: Job_1 + displayName: VSCode-Java-Debug-RC + templateContext: + mb: + signing: + enabled: true + signType: real + signWithProd: true + zipSources: false + feedSource: 'https://mseng.pkgs.visualstudio.com/DefaultCollection/_packaging/MicroBuildToolset/nuget/v3/index.json' + outputs: + - output: pipelineArtifact + artifactName: vsix + targetPath: $(Build.ArtifactStagingDirectory)/vsix + displayName: "Publish Artifact: vsix" + steps: + - checkout: self + fetchTags: true + - task: NodeTool@0 + displayName: Use Node 20.x + inputs: + versionSpec: 20.x + - task: DownloadBuildArtifacts@1 + displayName: Download Build Artifacts + inputs: + buildType: specific + project: a4d27ce2-a42d-4b71-8eef-78cee9a9728e + definition: "16486" + specificBuildWithTriggering: true + downloadType: specific + itemPattern: m2/com.microsoft.java.debug.plugin/com.microsoft.java.debug.plugin-*.jar + extractTars: false + - task: CopyFiles@2 + displayName: 'cp plugin.jar to server' + inputs: + SourceFolder: '$(System.ArtifactsDirectory)/m2/com.microsoft.java.debug.plugin' + Contents: | + com.microsoft.java.debug.plugin-*.jar + TargetFolder: $(Build.SourcesDirectory)/server + - task: CmdLine@2 + displayName: Delete sources.jar and javadoc.jar from server + inputs: + script: | + del server\com.microsoft.java.debug.plugin-*-sources.jar + del server\com.microsoft.java.debug.plugin-*-javadoc.jar + - task: Npm@1 + displayName: npm install + inputs: + verbose: false + - task: CmdLine@2 + displayName: Replace AI key + inputs: + script: npx json@9.0.6 -I -f package.json -e "this.aiKey=\"%AI_KEY%\"" + - task: CmdLine@2 + displayName: vsce package + inputs: + script: npx @vscode/vsce@latest package -o extension.vsix + ### Copy files for APIScan + - task: CopyFiles@2 + displayName: "Copy Files for APIScan" + inputs: + Contents: "*.vsix" + TargetFolder: $(Agent.TempDirectory)/APIScanFiles + condition: and(succeeded(), ne(variables['DisableAPIScan'], 'true')) + ### Run latest version of APIScan listed at https://www.1eswiki.com/wiki/APIScan_Build_Task + - task: APIScan@2 + displayName: Run APIScan + inputs: + softwareFolder: $(Agent.TempDirectory)/APIScanFiles + softwareName: "vscode-java-debug" + softwareVersionNum: "$(Build.BuildId)" + isLargeApp: false + toolVersion: "Latest" + condition: and(succeeded(), ne(variables['DisableAPIScan'], 'true')) + env: + AzureServicesAuthConnectionString: runAs=App;AppId=$(ApiScanClientId);TenantId=$(ApiScanTenant);AppKey=$(ApiScanSecret) + - script: npx @vscode/vsce@latest generate-manifest -i extension.vsix -o extension.manifest + displayName: 'Generate extension manifest' + - script: copy extension.manifest extension.signature.p7s + displayName: 'Prepare manifest for signing' + - task: CmdLine@2 + displayName: Sign extension + inputs: + script: dotnet %MBSIGN_APPFOLDER%/ddsignfiles.dll /file:extension.signature.p7s /certs:4014052 + env: + SYSTEM_ACCESSTOKEN: $(System.AccessToken) + - task: CopyFiles@2 + displayName: "Copy Files to: $(Build.ArtifactStagingDirectory)/vsix" + inputs: + Contents: | + extension.vsix + extension.manifest + extension.signature.p7s + TargetFolder: $(Build.ArtifactStagingDirectory)/vsix diff --git a/.azure-pipelines/release-nightly.yml b/.azure-pipelines/release-nightly.yml new file mode 100644 index 00000000..119d9e1f --- /dev/null +++ b/.azure-pipelines/release-nightly.yml @@ -0,0 +1,55 @@ +# This pipeline is used to release the VS Code Java Debug extension from the nightly/stable build. +# It contains following steps: +# 1. Download the plugin artifact from the nightly/stable build pipeline. +# 2. Publish the plugin to the marketplace. + +name: $(Date:yyyyMMdd).$(Rev:r) # Use the current date and a revision number for the build name. + +variables: + - name: Codeql.Enabled + value: true +resources: + repositories: + - repository: self + type: git + ref: refs/heads/main + - repository: 1esPipelines + type: git + name: 1ESPipelineTemplates/1ESPipelineTemplates + ref: refs/tags/release +trigger: none +extends: + template: v1/1ES.Official.PipelineTemplate.yml@1esPipelines + parameters: + pool: + os: linux + name: 1ES_JavaTooling_Pool + image: 1ES_JavaTooling_Ubuntu-2004 + stages: + - stage: Release + jobs: + - job: Job + displayName: Release VS Code Java Debug Extension + templateContext: + type: releaseJob + isProduction: true + inputs: + - input: pipelineArtifact + buildType: specific + project: $(AzDo.ProjectId) # Azure DevOps project ID + definition: $(AzDo.BuildPipelineId) # artifact build pipeline ID + artifactName: vsix + downloadType: specific + targetPath: '$(Build.SourcesDirectory)' + steps: + - task: UseNode@1 + displayName: 'Use Node.js 20.x' + inputs: + version: '20.x' + - task: AzureCLI@2 + displayName: 'Publish Extension' + inputs: + azureSubscription: 'VSCode-Ext-Publishing' + scriptType: pscore + scriptLocation: inlineScript + inlineScript: 'npx @vscode/vsce@latest publish -i ''$(Build.SourcesDirectory)/extension.vsix'' --manifestPath ''$(Build.SourcesDirectory)/extension.manifest'' --signaturePath ''$(Build.SourcesDirectory)/extension.signature.p7s'' --azure-credential' \ No newline at end of file diff --git a/.azure-pipelines/release.yml b/.azure-pipelines/release.yml new file mode 100644 index 00000000..119d9e1f --- /dev/null +++ b/.azure-pipelines/release.yml @@ -0,0 +1,55 @@ +# This pipeline is used to release the VS Code Java Debug extension from the nightly/stable build. +# It contains following steps: +# 1. Download the plugin artifact from the nightly/stable build pipeline. +# 2. Publish the plugin to the marketplace. + +name: $(Date:yyyyMMdd).$(Rev:r) # Use the current date and a revision number for the build name. + +variables: + - name: Codeql.Enabled + value: true +resources: + repositories: + - repository: self + type: git + ref: refs/heads/main + - repository: 1esPipelines + type: git + name: 1ESPipelineTemplates/1ESPipelineTemplates + ref: refs/tags/release +trigger: none +extends: + template: v1/1ES.Official.PipelineTemplate.yml@1esPipelines + parameters: + pool: + os: linux + name: 1ES_JavaTooling_Pool + image: 1ES_JavaTooling_Ubuntu-2004 + stages: + - stage: Release + jobs: + - job: Job + displayName: Release VS Code Java Debug Extension + templateContext: + type: releaseJob + isProduction: true + inputs: + - input: pipelineArtifact + buildType: specific + project: $(AzDo.ProjectId) # Azure DevOps project ID + definition: $(AzDo.BuildPipelineId) # artifact build pipeline ID + artifactName: vsix + downloadType: specific + targetPath: '$(Build.SourcesDirectory)' + steps: + - task: UseNode@1 + displayName: 'Use Node.js 20.x' + inputs: + version: '20.x' + - task: AzureCLI@2 + displayName: 'Publish Extension' + inputs: + azureSubscription: 'VSCode-Ext-Publishing' + scriptType: pscore + scriptLocation: inlineScript + inlineScript: 'npx @vscode/vsce@latest publish -i ''$(Build.SourcesDirectory)/extension.vsix'' --manifestPath ''$(Build.SourcesDirectory)/extension.manifest'' --signaturePath ''$(Build.SourcesDirectory)/extension.signature.p7s'' --azure-credential' \ No newline at end of file diff --git a/.editorconfig b/.editorconfig index d24a06ef..d1be8048 100644 --- a/.editorconfig +++ b/.editorconfig @@ -10,7 +10,7 @@ indent_size = 4 # The indent size used in the `package.json` file cannot be changed # https://github.com/npm/npm/pull/3180#issuecomment-16336516 -[{.travis.yml,npm-shrinkwrap.json,package.json}] +[{.github/workflows/build.yml,npm-shrinkwrap.json,package.json}] indent_size = 2 [vendor/**.js] diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 00000000..0fffee03 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1 @@ +* @testforstephen @jdneo @wenytang-ms @chagong \ No newline at end of file diff --git a/.github/llms.md b/.github/llms.md new file mode 100644 index 00000000..f0c0521e --- /dev/null +++ b/.github/llms.md @@ -0,0 +1,43 @@ +# Extension Pack for Java + +Extension Pack for Java is a collection of popular extensions that can help write, test and debug Java applications in Visual Studio Code. By installing Extension Pack for Java, the following extensions are installed: + +- [📦 Language Support for Java™ by Red Hat](https://marketplace.visualstudio.com/items?itemName=redhat.java) + - Code Navigation + - Auto Completion + - Refactoring + - Code Snippets +- [📦 Debugger for Java](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-debug) + - Debugging +- [📦 Test Runner for Java](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-test) + - Run & Debug JUnit/TestNG Test Cases +- [📦 Maven for Java](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-maven) + - Project Scaffolding + - Custom Goals +- [📦 Gradle for Java](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-gradle) + - View Gradle tasks and project dependencies + - Gradle file authoring + - Import Gradle projects via [Gradle Build Server](https://github.com/microsoft/build-server-for-gradle) +- [📦 Project Manager for Java](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-dependency) + - Manage Java projects, referenced libraries, resource files, packages, classes, and class members +- [📦 Visual Studio IntelliCode](https://marketplace.visualstudio.com/items?itemName=VisualStudioExptTeam.vscodeintellicode) + - AI-assisted development + - Completion list ranked by AI + +## Label + +When labeling an issue, follow the rules below per label category: + +### General Rules + +- Analyze if the issue is related with the scope of using extensions for Java development. If not, STOP labelling IMMEDIATELY. +- Assign label per category. +- If a category is not applicable or you're unsure, you may skip it. +- Do not assign multiple labels within the same category, unless explicitly allowed as an exception. + +### Issue Type Labels + +- [bug]: Primary label for real bug issues +- [enhancement]: Primary label for enhancement issues +- [documentation]: Primary label for documentation issues +- [question]: Primary label for question issues diff --git a/.github/no-response.yml b/.github/no-response.yml deleted file mode 100644 index d34a2c5e..00000000 --- a/.github/no-response.yml +++ /dev/null @@ -1,4 +0,0 @@ -daysUntilClose: 14 -responseRequiredLabel: needs more info -closeComment: > - This issue has been closed automatically because it needs more information and has not had recent activity. Please reach out if you have or find the answers we need so that we can investigate further. \ No newline at end of file diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 00000000..e5747134 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,126 @@ +name: CI + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +jobs: + linux: + name: Linux + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - uses: actions/checkout@v5 + + - name: Setup Build Environment + run: | + sudo apt-get update + sudo apt-get install -y libxkbfile-dev pkg-config libsecret-1-dev libxss1 dbus xvfb libgtk-3-0 libgbm1 + sudo /usr/bin/Xvfb :99 -screen 0 1024x768x24 > /dev/null 2>&1 & + sleep 3 + + - name: Set up JDK 21 + uses: actions/setup-java@v5 + with: + java-version: '21' + distribution: 'temurin' + + - name: Setup Node.js environment + uses: actions/setup-node@v5 + with: + node-version: 20 + + - name: Install Node.js modules + run: npm install + + - name: Install build tools + run: npm install -g @vscode/vsce typescript + + - name: Lint + run: npm run tslint + + - name: Package + run: vsce package + + - name: Test extension + run: DISPLAY=:99 npm test + + - name: Print language server Log if job failed + if: ${{ failure() }} + run: find $HOME/.config/Code/User/workspaceStorage/*/redhat.java/jdt_ws/.metadata/.log -print -exec cat '{}' \;; + + windows: + name: Windows + runs-on: windows-latest + timeout-minutes: 30 + steps: + - uses: actions/checkout@v5 + + - name: Set up JDK 21 + uses: actions/setup-java@v5 + with: + java-version: '21' + distribution: 'temurin' + + - name: Setup Node.js environment + uses: actions/setup-node@v5 + with: + node-version: 20 + + - name: Install Node.js modules + run: npm install + + - name: Install build tools + run: npm install -g @vscode/vsce typescript --force + + - name: Lint + run: npm run tslint + + - name: Package + run: vsce package + + - name: Test extension + run: npm test + + - name: Print language server Log if job failed + if: ${{ failure() }} + run: Get-ChildItem -Path $env:APPDATA/Code/User/workspaceStorage/*/redhat.java/jdt_ws/.metadata/.log | cat + + darwin: + name: macOS + runs-on: macos-latest + timeout-minutes: 30 + steps: + - uses: actions/checkout@v5 + + - name: Set up JDK 21 + uses: actions/setup-java@v5 + with: + java-version: '21' + distribution: 'temurin' + + - name: Setup Node.js environment + uses: actions/setup-node@v5 + with: + node-version: 20 + + - name: Install Node.js modules + run: npm install + + - name: Install build tools + run: npm install -g @vscode/vsce typescript + + - name: Lint + run: npm run tslint + + - name: Package + run: vsce package + + - name: Test extension + run: npm test + + - name: Print language server Log if job failed + if: ${{ failure() }} + run: find $HOME/Library/Application\ Support/Code/User/workspaceStorage/*/redhat.java/jdt_ws/.metadata/.log -print -exec cat '{}' \;; diff --git a/.github/workflows/no-response.yml b/.github/workflows/no-response.yml new file mode 100644 index 00000000..4cc4c9fc --- /dev/null +++ b/.github/workflows/no-response.yml @@ -0,0 +1,26 @@ +name: No Response + +# **What it does**: Closes issues where the original author doesn't respond to a request for information. +# **Why we have it**: To remove the need for maintainers to remember to check back on issues periodically to see if contributors have responded. +# **Who does it impact**: Everyone that works on docs or docs-internal. + +on: + issue_comment: + types: [created] + schedule: + # every morning at 00:00 am + - cron: '0 0 * * *' + +jobs: + noResponse: + runs-on: ubuntu-latest + permissions: + issues: write + steps: + - uses: lee-dohm/no-response@9bb0a4b5e6a45046f00353d5de7d90fb8bd773bb #v0.5.0 + with: + token: ${{ github.token }} + daysUntilClose: 14 # Number of days of inactivity before an Issue is closed for lack of response + responseRequiredLabel: "needs more info" # Label indicating that a response from the original author is required + closeComment: > + This issue has been closed automatically because it needs more information and has not had recent activity. Please reach out if you have or find the answers we need so that we can investigate further. diff --git a/.github/workflows/triage-agent.yml b/.github/workflows/triage-agent.yml new file mode 100644 index 00000000..0e0cb45e --- /dev/null +++ b/.github/workflows/triage-agent.yml @@ -0,0 +1,126 @@ +name: AI Triage + +on: + issues: + types: [opened] + workflow_dispatch: + inputs: + issue_number: + description: 'Issue number to triage (manual run). e.g. 123' + required: true + +run-name: >- + AI Triage for Issue #${{ github.event.issue.number || github.event.inputs.issue_number }} + +permissions: + issues: write + contents: read + +jobs: + label_and_comment: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Get issue data + id: get_issue + uses: actions/github-script@v6 + with: + script: | + const eventName = context.eventName; + let issue; + if (eventName === 'workflow_dispatch') { + const inputs = context.payload.inputs || {}; + const issueNumber = inputs.issue_number || inputs.issueNumber; + if (!issueNumber) core.setFailed('Input issue_number is required for manual run.'); + const { data } = await github.rest.issues.get({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: parseInt(issueNumber, 10), + }); + issue = data; + } else if (context.payload.issue) { + issue = context.payload.issue; + } else { + core.setFailed('No issue information found in the event payload.'); + } + core.setOutput('id', String(issue.number)); + core.setOutput('user', String((issue.user && issue.user.login) || '')); + core.setOutput('title', String(issue.title || '')); + core.setOutput('body', String(issue.body || '')); + const labelNames = (issue.labels || []).map(label => label.name); + core.setOutput('labels', JSON.stringify(labelNames)); + + - name: Call Azure Function + id: call_azure_function + env: + PAYLOAD: >- + { + "authToken": "${{ secrets.GITHUB_TOKEN }}", + "repoId": "microsoft/vscode-java-debug", + "issueData": { + "id": ${{ steps.get_issue.outputs.id }}, + "user": ${{ toJson(steps.get_issue.outputs.user) }}, + "title": ${{ toJson(steps.get_issue.outputs.title) }}, + "body": ${{ toJson(steps.get_issue.outputs.body) }}, + "labels": ${{ steps.get_issue.outputs.labels }} + }, + "mode": "DirectUpdate" + } + + run: | + # Make the HTTP request with improved error handling and timeouts + echo "Making request to triage agent..." + + # Add timeout handling and better error detection + set +e # Don't exit on curl failure + response=$(timeout ${{ vars.TRIAGE_AGENT_TIMEOUT }} curl \ + --max-time 0 \ + --connect-timeout 30 \ + --fail-with-body \ + --silent \ + --show-error \ + --write-out "HTTPSTATUS:%{http_code}" \ + --header "Content-Type: application/json" \ + --request POST \ + --data "$PAYLOAD" \ + ${{ secrets.TRIAGE_FUNCTION_LINK }} 2>&1) + + curl_exit_code=$? + set -e # Re-enable exit on error + + echo "Curl exit code: $curl_exit_code" + + # Check if curl command timed out or failed + if [ $curl_exit_code -eq 124 ]; then + echo "❌ Request timed out after 650 seconds" + exit 1 + elif [ $curl_exit_code -ne 0 ]; then + echo "❌ Curl command failed with exit code: $curl_exit_code" + echo "Response: $response" + exit 1 + fi + + # Extract HTTP status code and response body + http_code=$(echo "$response" | grep -o "HTTPSTATUS:[0-9]*" | cut -d: -f2) + response_body=$(echo "$response" | sed 's/HTTPSTATUS:[0-9]*$//') + + echo "HTTP Status Code: $http_code" + + # Validate HTTP status code + if [ -z "$http_code" ]; then + echo "❌ Failed to extract HTTP status code from response" + echo "Raw response: $response" + exit 1 + fi + + # Check if the request was successful + if [ "$http_code" -ge 200 ] && [ "$http_code" -lt 300 ]; then + echo "✅ Azure Function call succeeded" + else + echo "❌ Azure Function call failed with status code: $http_code" + echo "Response: $response_body" + exit 1 + fi diff --git a/.github/workflows/triage-all-open-issues.yml b/.github/workflows/triage-all-open-issues.yml new file mode 100644 index 00000000..f2600deb --- /dev/null +++ b/.github/workflows/triage-all-open-issues.yml @@ -0,0 +1,145 @@ +name: AI Triage - Process All Open Issues +on: + workflow_dispatch: + inputs: + dry_run: + description: 'Dry run mode - only list issues without processing' + required: false + default: false + type: boolean + max_issues: + description: 'Maximum number of issues to process (0 = all)' + required: false + default: '0' + type: string + +permissions: + issues: write + contents: read + actions: write + +jobs: + get_open_issues: + runs-on: ubuntu-latest + outputs: + issue_numbers: ${{ steps.get_issues.outputs.issue_numbers }} + total_count: ${{ steps.get_issues.outputs.total_count }} + + steps: + - name: Get all open issues + id: get_issues + uses: actions/github-script@v6 + with: + script: | + // Use Search API to filter issues at API level + const { data } = await github.rest.search.issuesAndPullRequests({ + q: `repo:${context.repo.owner}/${context.repo.repo} is:issue is:open -label:ai-triaged -label:invalid`, + sort: 'created', + order: 'desc', + per_page: 100 + }); + + const actualIssues = data.items; + + let issuesToProcess = actualIssues; + const maxIssues = parseInt('${{ inputs.max_issues }}' || '0'); + + if (maxIssues > 0 && actualIssues.length > maxIssues) { + issuesToProcess = actualIssues.slice(0, maxIssues); + console.log(`Limiting to first ${maxIssues} issues out of ${actualIssues.length} total`); + } + + const issueNumbers = issuesToProcess.map(issue => issue.number); + const totalCount = issuesToProcess.length; + + console.log(`Found ${actualIssues.length} open issues, processing ${totalCount}:`); + issuesToProcess.forEach(issue => { + console.log(` #${issue.number}: ${issue.title}`); + }); + + core.setOutput('issue_numbers', JSON.stringify(issueNumbers)); + core.setOutput('total_count', totalCount); + + process_issues: + runs-on: ubuntu-latest + needs: get_open_issues + if: needs.get_open_issues.outputs.total_count > 0 + + strategy: + # Process issues one by one (max-parallel: 1) + max-parallel: 1 + matrix: + issue_number: ${{ fromJSON(needs.get_open_issues.outputs.issue_numbers) }} + + steps: + - name: Log current issue being processed + run: | + echo "🔄 Processing issue #${{ matrix.issue_number }}" + echo "Total issues to process: ${{ needs.get_open_issues.outputs.total_count }}" + + - name: Check if dry run mode + if: inputs.dry_run == true + run: | + echo "🔍 DRY RUN MODE: Would process issue #${{ matrix.issue_number }}" + echo "Skipping actual triage processing" + + - name: Trigger triage workflow for issue + if: inputs.dry_run != true + uses: actions/github-script@v6 + with: + script: | + const issueNumber = '${{ matrix.issue_number }}'; + + try { + console.log(`Triggering triage workflow for issue #${issueNumber}`); + + const response = await github.rest.actions.createWorkflowDispatch({ + owner: context.repo.owner, + repo: context.repo.repo, + workflow_id: 'triage-agent.yml', + ref: 'main', + inputs: { + issue_number: issueNumber + } + }); + + console.log(`✅ Successfully triggered triage workflow for issue #${issueNumber}`); + + } catch (error) { + console.error(`❌ Failed to trigger triage workflow for issue #${issueNumber}:`, error); + core.setFailed(`Failed to process issue #${issueNumber}: ${error.message}`); + } + + - name: Wait for workflow completion + if: inputs.dry_run != true + run: | + echo "⏳ Waiting for triage workflow to complete for issue #${{ matrix.issue_number }}..." + echo "Timeout: ${{ vars.TRIAGE_AGENT_TIMEOUT }} seconds" + sleep ${{ vars.TRIAGE_AGENT_TIMEOUT }} # Wait for triage workflow completion + + summary: + runs-on: ubuntu-latest + needs: [get_open_issues, process_issues] + if: always() + + steps: + - name: Print summary + run: | + echo "## Triage Processing Summary" + echo "Total open issues found: ${{ needs.get_open_issues.outputs.total_count }}" + + if [ "${{ inputs.dry_run }}" == "true" ]; then + echo "Mode: DRY RUN (no actual processing performed)" + else + echo "Mode: FULL PROCESSING" + fi + + if [ "${{ needs.process_issues.result }}" == "success" ]; then + echo "✅ All issues processed successfully" + elif [ "${{ needs.process_issues.result }}" == "failure" ]; then + echo "❌ Some issues failed to process" + elif [ "${{ needs.process_issues.result }}" == "skipped" ]; then + echo "⏭️ Processing was skipped (no open issues found)" + else + echo "⚠️ Processing completed with status: ${{ needs.process_issues.result }}" + fi diff --git a/.gitignore b/.gitignore index bd88768d..98790543 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,6 @@ server node_modules .vscode-test/ vscode-java-debug-*.vsix -packages/ \ No newline at end of file +packages/ +dist +.DS_Store \ No newline at end of file diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index ccbefc4d..00000000 --- a/.travis.yml +++ /dev/null @@ -1,26 +0,0 @@ -language: node_js - -node_js: -- '--lts' - -os: -- linux -- osx - -before_install: -- if [ $TRAVIS_OS_NAME == "linux" ]; then - export CXX="g++-4.9" CC="gcc-4.9" DISPLAY=:99.0; - sh -e /etc/init.d/xvfb start; - sleep 3; - fi - -install: -- npm install -g vsce -- npm install -g typescript -- npm install -g gulp -- npm install - -script: -- gulp tslint -- vsce package -- npm test --silent diff --git a/.vscode/launch.json b/.vscode/launch.json index cd6b87bd..0ac35d26 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -10,19 +10,24 @@ "args": ["--extensionDevelopmentPath=${workspaceRoot}" ], "stopOnEntry": false, "sourceMaps": true, - "outFiles": [ "${workspaceRoot}/out/src/**/*.js" ], - "preLaunchTask": "npm" + "outFiles": [ "${workspaceRoot}/dist/**/*.js" ], + "preLaunchTask": "npm: watch", + "env": { + "DEBUG_VSCODE_JAVA":"true" + } }, { - "name": "Launch Tests", + "name": "Extension Tests", "type": "extensionHost", "request": "launch", "runtimeExecutable": "${execPath}", - "args": ["--extensionDevelopmentPath=${workspaceRoot}", "--extensionTestsPath=${workspaceRoot}/out/test" ], - "stopOnEntry": false, + "args": [ + "--extensionDevelopmentPath=${workspaceFolder}", + "--extensionTestsPath=${workspaceFolder}/out/test/suite/index" + ], "sourceMaps": true, - "outFiles": [ "${workspaceRoot}/out/test/**/*.js" ], - "preLaunchTask": "npm" - } + "outFiles": ["${workspaceFolder}/out/test/**/*.js"], + "preLaunchTask": "npm: compile" + } ] } diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 99d84d1d..114cae50 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -9,27 +9,34 @@ // A task runner that calls a custom npm script that compiles the extension. { "version": "2.0.0", - - // we want to run npm - "command": "npm", - - // the command is a shell script - "type": "shell", - - // show the output window only if unrecognized errors occur. - "presentation": { - "echo": true, - "reveal": "silent", - "focus": false, - "panel": "shared" - }, - - // we run the custom script "compile" as defined in package.json - "args": ["run", "compile", "--loglevel", "silent"], - - // The tsc compiler is started in watching mode - "isBackground": true, - - // use the standard tsc in watch mode problem matcher to find compile problems in the output. - "problemMatcher": "$tsc-watch" + "tasks": [ + { + "type": "npm", + "script": "watch", + "problemMatcher": { + "owner": "typescript", + "pattern": [ + { + "regexp": "\\[tsl\\] ERROR", + "file": 1, + "location": 2, + "message": 3 + } + ], + "background": { + "activeOnStart": true, + "beginsPattern": "Compiler '[^']+' starting", + "endsPattern": "Compiler '[^']+' finished" + } + }, + "isBackground": true, + "presentation": { + "reveal": "never" + }, + "group": { + "kind": "build", + "isDefault": true + } + } + ] } \ No newline at end of file diff --git a/.vscodeignore b/.vscodeignore index 49df7ba2..9c5a198b 100644 --- a/.vscodeignore +++ b/.vscodeignore @@ -1,13 +1,21 @@ .vscode/** .vscode-test/** -out/test/** +out/** test/** src/** **/*.map tsconfig.json -gulpfile.js +scripts/build/** .gitignore -images/** +images/docs/** testprojects/** TestPlan.md -.github/** \ No newline at end of file +.github/** +tsconfig.json +tslint.json +packages +package-lock.json +node_modules +webpack.config.js +.DS_Store +.azure-pipelines/** \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 8779cc2c..c2638cc9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,516 @@ # Change Log All notable changes to the "vscode-java-debugger" extension will be documented in this file. -The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) -and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## 0.58.5 - 2026-01-06 +### Fixed +- Fix `lspFrame.source.path` is null. [java-debug#618](https://github.com/microsoft/java-debug/pull/618). + +## 0.58.4 - 2025-12-09 +### Added +- Add command to manage breakpoint exception types in command palette. [#1566](https://github.com/microsoft/vscode-java-debug/pull/1566). Thanks to [Roland Schaer](https://github.com/roele) for contribution. + +### Fixed +- Fix `lspFrame.source` NPE on stackTrace request. [java-debug#616](https://github.com/microsoft/java-debug/pull/616). Thanks to [Mathias Fußenegger](https://github.com/mfussenegger) for contribution. +- Handle unavailable sources in compliance with DAP spec. [java-debug#609](https://github.com/microsoft/java-debug/pull/609), [java-debug#614](https://github.com/microsoft/java-debug/pull/614). Thanks to [Karl-Erik Enkelmann](https://github.com/playdohface) for contribution. + + +## 0.58.3 - 2025-11-03 +### Added +- No config debug [[#1530](https://github.com/microsoft/vscode-java-debug/issues/1530)] + +## 0.58.2 - 2025-04-28 +### Fixed +- Provide graceful shutdown on debug stop action. [#1274](https://github.com/microsoft/vscode-java-debug/issues/1274). Thanks to [Dave Syer](https://github.com/dsyer) for contribution. + +### Changed +- Update Apache Commons IO from 2.11.0 to 2.19.0. [java-debug#585](https://github.com/microsoft/java-debug/pull/585). Thanks to [Roland Grunberg](https://github.com/rgrunber) for contribution. + +## 0.58.1 - 2024-10-31 +### Added +- The launch config `envFile` now supports an array of env files. [#1505](https://github.com/microsoft/vscode-java-debug/issues/1505). Thanks to [Ed Hillmann](https://github.com/hildo) for contribution. + +### Fixed +- Fail to debug with java 23 - Unrecognized option: -Xnoagent. [java-debug#561](https://github.com/microsoft/java-debug/issues/561). + +## 0.58.0 - 2024-06-27 +### Fixed +- Latest Gradle Language Support extension cause hot code replace to fail. [#1402](https://github.com/microsoft/vscode-java-debug/issues/1402). +- Hot Code Replace returns "Cannot find any changed classes for hot replace!" message. [#1481](https://github.com/microsoft/vscode-java-debug/issues/1481). + +## 0.57.0 - 2024-03-26 +### Added +- Add support for running Java 21 "Unnamed classes and Instance main method". [#1444](https://github.com/microsoft/vscode-java-debug/issues/1444). + +## 0.56.2 - 2024-02-28 +### Changed +- Move 'Run/Debug Java' menus to the same group as the other Java menus within File Explorer. [#1447](https://github.com/microsoft/vscode-java-debug/pull/1447). + +## 0.56.1 - 2024-02-19 +### Fixed +- Fix the java.lang.NoClassDefFoundError when triggering code completion in DEBUG CONSOLE. See [java-debug#534](https://github.com/microsoft/java-debug/issues/534). + +## 0.56.0 - 2024-01-31 +### Fixed +- Breakpoint doesn't work on lambdas which returns a generic type. See [java-debug#498](https://github.com/microsoft/java-debug/issues/498), [#1413](https://github.com/microsoft/vscode-java-debug/issues/1413) and [#1414](https://github.com/microsoft/vscode-java-debug/issues/1414). +- Breakpoint with inline lambdas work only with last one. See [#1410](https://github.com/microsoft/vscode-java-debug/issues/1410). +- StepInto method target doesn't work if the method is part of wrapped expression. See [java-debug#519](https://github.com/microsoft/java-debug/issues/519). + + Thanks to [Gayan Perera](https://github.com/gayanper) for contribution in fixing multiple bugs. + +## 0.55.0 - 2023-11-01 +### Changed +- Don't duplicate build reference projects when building a Gradle project managed by Build Server. [java-debug#511](https://github.com/microsoft/java-debug/pull/511). + +### Fixed +- Cannot find Java process when using "Attach by Process ID". [#1388](https://github.com/microsoft/vscode-java-debug/issues/1388). Thanks to [owl-from-hogvarts](https://github.com/owl-from-hogvarts) for contribution. + +## 0.54.0 - 2023-08-29 +### Added +- Code completion in DEBUG CONSOLE now adds fully qualified names for unimported classes. See [#1246](https://github.com/microsoft/vscode-java-debug/issues/1246). +- Code completion in DEBUG CONSOLE now displays package names for suggested types. See [java-debug#505](https://github.com/microsoft/java-debug/pull/505). +- Integrate the build support for Gradle build server project. See [#1372](https://github.com/microsoft/vscode-java-debug/pull/1372), [java-debug#503](https://github.com/microsoft/java-debug/pull/503) + +### Changed +- Respect the setting 'java.debug.settings.forceBuildBeforeLaunch' even if autobuild is disabled. See [#1380](https://github.com/microsoft/vscode-java-debug/pull/1380). + +## 0.53.0 - 2023-08-01 +### Added +- Automatically refresh the CALL STACK view when the attached sources for frames have changed. See [#1370](https://github.com/microsoft/vscode-java-debug/pull/1370). + +### Changed +- Remove marketplace preview flag. See [#1369](https://github.com/microsoft/vscode-java-debug/pull/1369). + +## 0.52.0 - 2023-06-30 +### Added +- Use the setting `java.debug.settings.debugSupportOnDecompiledSource` to enable/disable debugging support on the decompiled source code. This feature requires [Language Support for Java by Red Hat](https://marketplace.visualstudio.com/items?itemName=redhat.java)@1.20.0 or higher. See [#1356](https://github.com/microsoft/vscode-java-debug/pull/1356). + +## 0.51.0 - 2023-05-31 +### Fixed +- NPE when adding lambda breakpoints in reactive projects. See [java-debug#477](https://github.com/microsoft/java-debug/issues/477). Thanks to [Gayan Perera](https://github.com/gayanper) for contribution. +- Lambda breakpoint on the first line of a method does not work. See [java-debug#488](https://github.com/microsoft/java-debug/issues/488). Thanks to [Gayan Perera](https://github.com/gayanper) for contribution. + +## 0.50.0 - 2023-04-26 +### Added +- Support specifying the exception types you want to break on. See [#1175](https://github.com/microsoft/vscode-java-debug/issues/1175) and [#295](https://github.com/microsoft/vscode-java-debug/issues/295). + +## 0.49.1 - 2023-03-28 +### Added +- Add context menus "Auto/Manual Expand Lazy Variables" to Variables view to auto show 'toString()' value. See [#1316](https://github.com/microsoft/vscode-java-debug/pull/1316). + +### Fixed +- Fix the error 'compareVersions is not a function'. See [#1307](https://github.com/microsoft/vscode-java-debug/pull/1307). + +## 0.49.0 - 2023-02-28 +### Added +- Enable Hot Code Replace when autobuild is disabled. See [#1296](https://github.com/microsoft/vscode-java-debug/pull/1296), [#1302](https://github.com/microsoft/vscode-java-debug/pull/1302). + +### Changed +- Display the running launch config name in progress bar for transparency. See [#1299](https://github.com/microsoft/vscode-java-debug/pull/1299). +- launch previously launched application if the current file isn't executable. See [#1036](https://github.com/microsoft/vscode-java-debug/issues/1036). + +## 0.48.0 - 2023-02-01 +### Changed +- Reject invalid DAP request. See [java-debug#466](https://github.com/microsoft/java-debug/pull/466). + +### Fixed +- Prioritize lookup the project source code during debugging. See [#1215](https://github.com/microsoft/vscode-java-debug/issues/1215). Thanks to [mozhuanzuojing](https://github.com/mozhuanzuojing) for contribution. + +## 0.47.0 - 2022-11-29 +### Changed +- Optimize the build error report of "Build failed, do you want to continue?". [#1214](https://github.com/microsoft/vscode-java-debug/issues/1214). + +### Fixed +- Use the system encoding to generate the *.argfile. [#1112](https://github.com/microsoft/vscode-java-debug/issues/1112). +- "shortenCommandLine": "argfile|auto" should include "vmArgs". [#1254](https://github.com/microsoft/vscode-java-debug/issues/1254). + +## 0.46.0 - 2022-11-02 +### Added +- Add "Step Into Target" feature to allow stepping directly into a specific function call when paused on a line. See [#1192](https://github.com/microsoft/vscode-java-debug/issues/1192). Thanks to [Gayan Perera](https://github.com/gayanper) for contribution. + +### Changed +- Exclude **/node_modules/** from .vscode/launch.json searches. See [#1234](https://github.com/microsoft/vscode-java-debug/pull/1234). Thanks to [Brandon Cheng](https://github.com/gluxon) for contribution. + +### Fixed +- Conditional Breakpoint got error code in reply:504. See [#1250](https://github.com/microsoft/vscode-java-debug/issues/1250). + +## 0.45.0 - 2022-10-12 +### Added +- Visualize the inline breakpoint locations. See [#1193](https://github.com/microsoft/vscode-java-debug/issues/1193). +- Show an extra column cursor when an inline breakpoint is hit. See [#1202](https://github.com/microsoft/vscode-java-debug/issues/1202). +- Support JEP 425: Virtual Threads (JDK 19). See [#1159](https://github.com/microsoft/vscode-java-debug/issues/1159). + +### Changed +- Enable async jdwp based on network latency for auto mode. See [java-debug#447](https://github.com/microsoft/java-debug/pull/447). + +### Fixed +- NPE when stopping JDT.LS. See [java-debug#448](https://github.com/microsoft/java-debug/issues/448). + +## 0.44.0 - 2022-09-01 +### Added +- **Experimental**: Support processing JDWP commands asynchronously to improve response speed of remote debugging. It's only enabled by default on VS Code Insiders. You can also opt-in by setting `java.debug.settings.jdwp.async`. See [#1208](https://github.com/microsoft/vscode-java-debug/pull/1208) and [java-debug#436](https://github.com/microsoft/java-debug/pull/436). +- Add support to specify Java executable via the property `javaExec` in launch.json. See [#1198](https://github.com/microsoft/vscode-java-debug/pull/1198). Thanks to [Gayan Perera](https://github.com/gayanper) for contribution. +- Add support for lambda breakpoints. See [java-debug#427](https://github.com/microsoft/java-debug/pull/427). Thanks to [Gayan Perera](https://github.com/gayanper) for contribution. + +## 0.43.0 - 2022-07-27 +### Added +- Support adding function breakpoints from the editor gutter. [java-debug#426](https://github.com/microsoft/java-debug/pull/426). Thanks to [Gayan Perera](https://github.com/gayanper) for contribution. + +### Changed +- Show target VM exceptions as result in evaluate requests. [java-debug#428](https://github.com/microsoft/java-debug/pull/428). Thanks to [Mathias Fußenegger](https://github.com/mfussenegger) for contribution. + +## 0.42.0 - 2022-06-29 +### Added +- Support function breakpoints, see [#258](https://github.com/microsoft/vscode-java-debug/issues/258). The current version support adding a function breakpoint with the syntax as `FullyQualifiedClassName#methodName` (e.g. `java.util.ArrayList#add`). Thanks to [Gayan Perera](https://github.com/gayanper) for contribution. + +### Changed +- Mark native frames and unavailable methods as subtle. [java-debug#409](https://github.com/microsoft/java-debug/pull/409). Thanks to [Mathias Fußenegger](https://github.com/mfussenegger) for contribution. + +### Fixed +- fix artifactId typo in Troubleshooting.md. [#1180](https://github.com/microsoft/vscode-java-debug/pull/1180). Thanks to [btoo](https://github.com/btoo) for contribution. + +## 0.41.0- 2022-06-01 +### Added +- Provide "Stop Java" button when triggering "Run Java" action. [#1166](https://github.com/microsoft/vscode-java-debug/issues/1166). +- [API] Support DAP request `processId` and event `processid` to get the exact pid of current running Java process. [java-debug#413](https://github.com/microsoft/java-debug/pull/413). + +### Changed +- Naming Java terminals with different names. [#1164](https://github.com/microsoft/vscode-java-debug/issues/1164). +- Enable Java terminal link provider on all terminals. [#1168](https://github.com/microsoft/vscode-java-debug/pull/1168). +- Disable HCR button when running Java without debugging. [#1167](https://github.com/microsoft/vscode-java-debug/pull/1167). + +## 0.40.1- 2022-04-15 +### Fixed +- Update command id to 'java.project.addToSourcePath.command'. [#1152](https://github.com/microsoft/vscode-java-debug/issues/1152). + +## 0.40.0 - 2022-03-28 +### Fixed +- Fix extension version. [#1146](https://github.com/microsoft/vscode-java-debug/pull/1146). + +## 0.39.0 - 2022-03-28 +### Added +- Support lazy loading object values from toString(). [java-debug#401](https://github.com/microsoft/java-debug/pull/401). +- API - Provide an api to query the processId of the debugging Java process. [java-debug#399](https://github.com/microsoft/java-debug/pull/399). + +### Changed +- Print logpoints to debug console. [#710](https://github.com/microsoft/vscode-java-debug/issues/710). Thanks to [James Clark](https://github.com/sbj42) for contribution. + +### Fixed +- VM launch failure doesn't report a useful error. [java-debug#397](https://github.com/microsoft/java-debug/issues/397). Thanks to [Karl von Randow](https://github.com/karlvr) for contribution. +- Engineering - Fix problemMatcher patterns for the watch task. [#1137](https://github.com/microsoft/vscode-java-debug/pull/1137). Thanks to [James Clark](https://github.com/sbj42) for contribution. + +## 0.38.0 - 2022-01-26 +### Added +- Thanks for the contribution from [Mu-Tsun Tsai](https://github.com/MuTsunTsai). Add zh-tw locale. [#1087](https://github.com/microsoft/vscode-java-debug/pull/1087). + +### Changed +- Change the inline button to debug icon. [#1108](https://github.com/microsoft/vscode-java-debug/pull/1108). + +### Fixed +- Improve the search performance of resolving main class. [java-debug#395](https://github.com/microsoft/java-debug/pull/395). +- If mainClass not specified, it will find main classes not belonging to current workspace. [#1098](https://github.com/microsoft/vscode-java-debug/issues/1098). +- Update CONTRIBUTING docs. [#1105](https://github.com/microsoft/vscode-java-debug/issues/1105). + +## 0.37.0 - 2021-11-24 +### Added +- Troubleshooting Guide for Encoding Issues on Windows. See [Troubleshooting_encoding](https://github.com/microsoft/vscode-java-debug/blob/main/Troubleshooting_encoding.md). + +### Fixed +- Address encoding issues on Windows. [#1077](https://github.com/microsoft/vscode-java-debug/pull/1077). +- Encoding - launcher.bat could not pass on redirected input into the java program being debugged. [microsoft/vscode-java-pack#756](https://github.com/microsoft/vscode-java-pack/issues/756). +- Encoding - Launching BAT for UTF-8 fix is incompatible with Security Policies disallowing BAT execution. [#646](https://github.com/microsoft/vscode-java-debug/issues/646). +- Encoding - Non-ASCII char support for Windows terminals. [#622](https://github.com/microsoft/vscode-java-debug/issues/622). +- Encoding - [Windows non-ASCII folder] Error: Could not find or load main class. [#623](https://github.com/microsoft/vscode-java-debug/issues/623). +- Step filter in the settings.json is not working. [#1085](https://github.com/microsoft/vscode-java-debug/issues/1085). +- Contribution from [ +John Grant](https://github.com/cyrfer): Support multiline values in envFile. [#1061](https://github.com/microsoft/vscode-java-debug/issues/1061). +- Contribution from [ +Adrien Piquerez](https://github.com/adpi2). Fix NPE when using step filter. [microsoft/java-debug#387](https://github.com/microsoft/java-debug/pull/387). +- Contribution from [Douglas M. Barcellos](https://github.com/dougmbarcellos). Update telemetry setting declaration in README. [#1084](https://github.com/microsoft/vscode-java-debug/pull/1084). + +## 0.36.0 - 2021-09-23 +### Changed +- Adopt new createStatusBarItem API for id and name properties. [#1020](https://github.com/microsoft/vscode-java-debug/issues/1020). + +### Fixed +- Unicode character in class name will fail to run. [#780](https://github.com/microsoft/vscode-java-debug/issues/780). +- Launching apps which require both a modulepath and a classpath doesn't work with shortenCommandLine="argfile". [#1047](https://github.com/microsoft/vscode-java-debug/issues/1047). +- Debugger fails to load variable values due to java.lang.OutOfMemoryError. [#1044](https://github.com/microsoft/vscode-java-debug/issues/1044). +- Fix privacy in the logger. [PR#1048](https://github.com/microsoft/vscode-java-debug/pull/1048). + +## 0.35.0 - 2021-07-28 +### Changed +- Add link to check detatils while reporting debugging progress. [PR#1034](https://github.com/microsoft/vscode-java-debug/pull/1034). + +### Fixed +- Catch up build errors before running a Java application. [#949](https://github.com/microsoft/vscode-java-debug/issues/949). + +## 0.34.0 - 2021-05-26 +### Changed +- Allow customizing the "classPaths" and "modulePaths" configurations via launch.json. See [#93](https://github.com/microsoft/vscode-java-debug/issues/93), [#980](https://github.com/microsoft/vscode-java-debug/issues/980). + +## 0.33.1 - 2021-04-30 +### Fixed +- HotFix: After upgrade from vscode-java v0.77.0 to v0.78.0 can't debug tests. [#995](https://github.com/microsoft/vscode-java-debug/issues/995). + +## 0.33.0 - 2021-04-28 +### Added +- Support inline values feature. [PR#977](https://github.com/microsoft/vscode-java-debug/pull/977). +- Show VARIABLES with different data views. [PR#982](https://github.com/microsoft/vscode-java-debug/pull/982). +- Adopt new APIs from vscode-tas-client. [#974](https://github.com/microsoft/vscode-java-debug/pull/974). +- Adopt workspaceTrust in package.json. [PR#988](https://github.com/microsoft/vscode-java-debug/pull/988). + +### Changed +- Engineering: Clean up deprecated logs. [PR#987](https://github.com/microsoft/vscode-java-debug/pull/987). + +### Fixed +- Breakpoints inside record methods don't work. [#973](https://github.com/microsoft/vscode-java-debug/issues/973). +- Support environment variable for port number in launch.json debug configuration. [#962](https://github.com/microsoft/vscode-java-debug/issues/962). +- Thanks for the contribution from [ZingBlue](https://github.com/ZingBlue): Spelling fix. [#968](https://github.com/microsoft/vscode-java-debug/pull/968). + +## 0.32.1 - 2021-03-23 +### Fixed +- Cannot launch debug session using JDK 16. [#970](https://github.com/microsoft/vscode-java-debug/issues/970). + +## 0.32.0 - 2021-03-12 +### Added +- Adopt TAS client for A/B testing. [PR#959](https://github.com/microsoft/vscode-java-debug/pull/959). + +### Changed +- Update to new product logo. [PR#952](https://github.com/microsoft/vscode-java-debug/pull/952). +- Adopt new 'run' menu in editor title. [PR#956](https://github.com/microsoft/vscode-java-debug/pull/956),[PR#960](https://github.com/microsoft/vscode-java-debug/pull/960). +- Engineering - Enable GitHub Actions. [PR#951](https://github.com/microsoft/vscode-java-debug/pull/951). + +## 0.31.0 - 2021-02-02 +### Added +- Support envFile option in launch.json. [#523](https://github.com/microsoft/vscode-java-debug/issues/523). + +### Fixed +- Git bash failed to execute Run/Debug when Windows username have blank space. [#678](https://github.com/microsoft/vscode-java-debug/issues/678). +- TEMP folder with spaces breaks debugger process. [#822](https://github.com/microsoft/vscode-java-debug/issues/822). +- The sort of completion list in DEBUG CONSOLE is different from that in editor. [#909](https://github.com/microsoft/vscode-java-debug/issues/909). +- The program failed to run in terminal if clicking run button several times in succession. [#924](https://github.com/microsoft/vscode-java-debug/issues/924). +- Fix vulnerabilities. [#935](https://github.com/microsoft/vscode-java-debug/issues/935), [#936](https://github.com/microsoft/vscode-java-debug/issues/936). + +## 0.30.0 - 2020-12-16 +### Added +- Add run button as inline button in Java Project Explorer. [PR#900](https://github.com/microsoft/vscode-java-debug/pull/900). +- Use progress to hint the current build status whenever you trigger the Run and Debug features. [PR#919](https://github.com/microsoft/vscode-java-debug/pull/919). +- Thanks for the contribution from [pablojimpas](https://github.com/pablojimpas): Spanish localization support. [PR#904](https://github.com/microsoft/vscode-java-debug/pull/904). + +### Changed +- Make the run buttons in editor toolbar more context-aware. [PR#898](https://github.com/microsoft/vscode-java-debug/pull/898). +- Update the group name of the Run and Debug menus registered in the Java Project Explorer. [PR#908](https://github.com/microsoft/vscode-java-debug/pull/908). +- Simplify the name label of the launch configuration. [PR#921](https://github.com/microsoft/vscode-java-debug/pull/921). +- Debt: Enable more tslint rules. [PR#914](https://github.com/microsoft/vscode-java-debug/pull/914),[PR#918](https://github.com/microsoft/vscode-java-debug/pull/918). + +### Fixed +- Find Java version from release file. [#910](https://github.com/microsoft/vscode-java-debug/issues/910). + +## 0.29.0 - 2020-10-16 +### Added +- Jump to source when clicking the stack trace printed to the terminal. [PR#890](https://github.com/microsoft/vscode-java-debug/pull/890). +- Contribute `Run` and `Debug` menus to Project Explorer. [#878](https://github.com/microsoft/vscode-java-debug/pull/878). +- Provide a user setting `java.debug.settings.vmArgs` to set the default VM arguments to launch your program. [#220](https://github.com/microsoft/vscode-java-debug/issues/220),[#876](https://github.com/microsoft/vscode-java-debug/issues/876). +- Provide a user setting `java.debug.settings.onBuildFailureProceed` to force the debug session to proceed when build fails. [#888](https://github.com/microsoft/vscode-java-debug/issues/888). + +### Changed +- Allow cancelling the outdated codelens job. [PR#881](https://github.com/microsoft/vscode-java-debug/pull/881). + +### Fixed +- Fix the wrong auto-completion result when typing the evaluation expression in DEBUG CONSOLE. [#880](https://github.com/microsoft/vscode-java-debug/issues/880). +- Fix the error 'UNC path is missing sharename: \\\\java'. [#882](https://github.com/microsoft/vscode-java-debug/issues/882). +- Use the correct runtime to validate the JVM versions between the debugger and debuggee. [PR#353](https://github.com/microsoft/java-debug/pull/353). + +## 0.28.0 - 2020-08-27 +### Added +- Add run/debug buttons to editor title bar for single file debugging. [#834](https://github.com/microsoft/vscode-java-debug/issues/834). +- Add user settings `java.debug.settings.jdwp.limitOfVariablesPerJdwpRequest` and `java.debug.settings.jdwp.requestTimeout` to control JDWP request. [#862](https://github.com/microsoft/vscode-java-debug/pull/862),[#863](https://github.com/microsoft/vscode-java-debug/pull/863). + +### Changed +- Reduce the frequency of JDWP requests to improve performance when expanding VARIABLES view. [#347](https://github.com/microsoft/java-debug/pull/347). +- Migrate the legacy log to the telemetry wrapper. [#866](https://github.com/microsoft/vscode-java-debug/pull/866). + +### Fixed +- Fix Hot Code Replace error "Cannot find any changed classes for hot replace!". [#855](https://github.com/microsoft/vscode-java-debug/issues/855). + +## 0.27.1 - 2020-07-21 +### Fixed +- Hot Code Replace always reports "Cannot find any changed classes for hot replace!". [#850](https://github.com/microsoft/vscode-java-debug/issues/850). + +## 0.27.0 - 2020-07-17 +### Added +- Break on exception for "just my code". [#756](https://github.com/microsoft/vscode-java-debug/issues/756). +- Support step "just my code". [#628](https://github.com/microsoft/vscode-java-debug/issues/628). +- Show return value of a method. [#660](https://github.com/microsoft/vscode-java-debug/issues/660). +- Support "copy value" from Variable viewlet. [#819](https://github.com/microsoft/vscode-java-debug/issues/819). +- From upstream jdt: support using lambda and reference expressions in debug evaluation. [#281](https://github.com/microsoft/vscode-java-debug/issues/281). +- From upstream jdt: support evaluating local variables in the lambda body. [#754](https://github.com/microsoft/vscode-java-debug/issues/754). + +### Changed +- Always give UI feedback whenever you click ⚡ button to apply code changes. [#833](https://github.com/microsoft/vscode-java-debug/pull/833). +- Automatically add -XX:+ShowCodeDetailsInExceptionMessages when launching your program with Java 14. [#797](https://github.com/microsoft/vscode-java-debug/issues/797). +- Adopt the new resolveVariable API. [#750](https://github.com/microsoft/vscode-java-debug/issues/750). +- Adopt DebugAdapterDescriptorFactor API. [#751](https://github.com/microsoft/vscode-java-debug/issues/751). + +### Fixed +- Give a response when you trigger debugging in LightWeight mode. [#841](https://github.com/microsoft/vscode-java-debug/issues/841). +- Failed to get variables. Reason: com.sun.jdi.InvalidStackFrameException. [#767](https://github.com/microsoft/vscode-java-debug/issues/767). +- Render the source link for stack trace from Java modules. [#824](https://github.com/microsoft/vscode-java-debug/issues/824). + +## 0.26.0 - 2020-05-13 +### Added +- Support picking a Java process to auto attach. [#759](https://github.com/microsoft/vscode-java-debug/issues/759). + +### Fixed +- When running the Gradle application, the test scope is not filtered out. [#715](https://github.com/microsoft/vscode-java-debug/issues/715). +- Conditional breakpoint fails in the multi thread scenario. [#782](https://github.com/microsoft/vscode-java-debug/issues/782). +- Show a warning message about the Unsupported JDK error. [#789](https://github.com/microsoft/vscode-java-debug/issues/789). +- vmArgs in launch.json does not accept an array of strings. [#778](https://github.com/microsoft/vscode-java-debug/issues/778). +- Activate the extension before execute Java extension commands. [#775](https://github.com/microsoft/vscode-java-debug/pull/775). + +### Changed +- Contribution from [Mathias Fußenegger](https://github.com/mfussenegger): Extend readme with basic low level usage instructions. [java-debug#327](https://github.com/microsoft/java-debug/pull/327). + +Thank [Mathias Fußenegger](https://github.com/mfussenegger) for contribution. + +## 0.25.1 - 2020-03-06 +### Fixed +- Fix the Error: Could not find or load main class @x.y.z.argfile. [#769](https://github.com/microsoft/vscode-java-debug/issues/769). +- Cannot hit breakpoint at the class using Java 13 Text Blocks. [#773](https://github.com/microsoft/vscode-java-debug/issues/773). + +## 0.25.0 - 2020-02-20 +### Added +- Provide context menu to continue/pause all/other threads. [#748](https://github.com/microsoft/vscode-java-debug/pull/748). +- Contribution from [bhoppeadoy](https://github.com/bhoppeadoy): Add user setting `java.debug.settings.numericPrecision` to set the numeric precision when formatting doubles in "Variables" or "Debug Console" viewlet. [#745](https://github.com/microsoft/vscode-java-debug/issues/745). + +### Fixed +- Use project's Java runtime to launch the application. [#753](https://github.com/microsoft/vscode-java-debug/issues/753). +- Restart stop but not start the program. [#752](https://github.com/microsoft/vscode-java-debug/issues/752). +- Contribution from [xiaoyinl](https://github.com/xiaoyinl): Use HTTPS wherever possible. [#732](https://github.com/microsoft/vscode-java-debug/pull/732). + +## 0.24.0 - 2019-12-25 +### Added +- Support breaking when value changes (a.k.a. Data Breakpoints). [#654](https://github.com/microsoft/vscode-java-debug/issues/654). + +### Changed +- Improve "Run Java" experience: `F5` will run the current file without generating launch.json. [#724](https://github.com/microsoft/vscode-java-debug/issues/724). + +### Fixed +- Debug console will hang on Java exception stack trace. [#719](https://github.com/microsoft/vscode-java-debug/issues/719). +- Debug console won't automatically append `()` if selecting a method in completion list. [#711](https://github.com/microsoft/vscode-java-debug/issues/711), [#691](https://github.com/microsoft/vscode-java-debug/issues/691). +- Cannot pass `vmArgs` array to Java 13 project. [#703](https://github.com/microsoft/vscode-java-debug/issues/703). + +## 0.23.0 - 2019-10-29 +### Added +- Provide "Fix..." suggestions when "Build failed" occurs during launching the application. [#358](https://github.com/microsoft/vscode-java-debug/issues/358). +- Prompt to add the folder to source path if the running file isn't on classpath. [#470](https://github.com/microsoft/vscode-java-debug/issues/470). +- Provide samples for the commonly used debug configuration. See the [doc](https://github.com/microsoft/vscode-java-debug/blob/master/Configuration.md). + +### Fixed +- It's safe to keep running the run/debug codelens if the debug configuration fails to save into the launch.json. [PR#673](https://github.com/microsoft/vscode-java-debug/pull/673). +- Improve the error handling when running the file via the context "run" or "debug" menu. [PR#679](https://github.com/microsoft/vscode-java-debug/pull/679). +- Support searching main classes from the workspace invisible project. [PR#305](https://github.com/microsoft/java-debug/pull/305). + +### Changed +- Update troubleshooting doc for class not found error. See the [doc](https://github.com/microsoft/vscode-java-debug/blob/master/Troubleshooting.md#program-error-could-not-find-or-load-main-class-x). +- Update troubleshooting doc for build failed error. See the [doc](https://github.com/microsoft/vscode-java-debug/blob/master/Troubleshooting.md#build-failed-do-you-want-to-continue). + +## 0.22.0 - 2019-09-24 +### Added +- Show Run/Debug buttons when hover on a main method. [#657](https://github.com/microsoft/vscode-java-debug/issues/657). + +### Fixed +- Debugger just broken with git bash as the default shell on Windows. [#642](https://github.com/microsoft/vscode-java-debug/issues/642). +- [Mac] Failed to launch debuggee in terminal with TimeoutException. [#637](https://github.com/microsoft/vscode-java-debug/issues/637), [#651](https://github.com/microsoft/vscode-java-debug/issues/651). +- Pop an error message when click ⚡ HCR button in the Run mode. [PR#665](https://github.com/microsoft/vscode-java-debug/pull/665). +- Don't escape single quote of the program args. [PR#668](https://github.com/microsoft/vscode-java-debug/pull/668). + +## 0.21.0 - 2019-08-26 +### Added +- Add menu entries to `Run` and `Debug` a Java application when you right click a Java file in file explorer or opened editor. [#626](https://github.com/microsoft/vscode-java-debug/issues/626). + +### Changed +- Remove hard dependency of redhat.java. [PR#617](https://github.com/microsoft/vscode-java-debug/pull/617). +- Change the default console to integrated terminal. [#605](https://github.com/microsoft/vscode-java-debug/issues/605). + +### Fixed +- Java language server is activated by mistake when debugging a non-Java project. [#238](https://github.com/microsoft/vscode-java-debug/issues/238). +- [Windows] `integratedTerminal` console does not showing unicode characters. [#524](https://github.com/microsoft/vscode-java-debug/issues/524). +- Contribution from [pi1024e](https://github.com/pi1024e): Fix UI typos. [PR#630](https://github.com/microsoft/vscode-java-debug/pull/630). + +Thank [pi1024e](https://github.com/pi1024e) for contribution. + +## 0.20.0 - 2019-07-01 +### Fixed +- Fix: Adding wrong jar version to the classpath. [#566](https://github.com/microsoft/vscode-java-debug/issues/566). +- Fix: Adding wrong classpath at runtime for multi modules maven projects. [#584](https://github.com/microsoft/vscode-java-debug/issues/584). +- Contribution from [tom-shan](https://github.com/tom-shan): Should break earlier when destroying temporary launch file. [PR#280](https://github.com/microsoft/java-debug/pull/280). + +Thank [tom-shan](https://github.com/tom-shan) for contribution. + +## 0.19.0 - 2019-05-31 +### Added +- Add a debug toolbar button to apply the changed classes to the running application. [#559](https://github.com/microsoft/vscode-java-debug/issues/559). +- Show toString() values in Variable window and hover tooltip. [#315](https://github.com/microsoft/vscode-java-debug/issues/315), [#364](https://github.com/microsoft/vscode-java-debug/issues/364). +- Add a global user setting `java.debug.settings.console` to specify the default console to launch your program. [PR#594](https://github.com/microsoft/vscode-java-debug/pull/594). + +### Fixed +- Fix: The debug toolbar doesn't close after the program running in external terminal exits. [#582](https://github.com/microsoft/vscode-java-debug/issues/582). +- Fix: Cannot stop the debugging process automatically in attach mode. [java-debug#273](https://github.com/microsoft/java-debug/issues/273). + +## 0.18.0 - 2019-04-23 +### Added +- Enable "Logical Structure" view for Map and Collection variables. [#227](https://github.com/Microsoft/vscode-java-debug/issues/227). +- Add the source hyperlinks for the stack traces in the Debug Console output. [#490](https://github.com/Microsoft/vscode-java-debug/issues/490), [#506](https://github.com/Microsoft/vscode-java-debug/issues/506). +- Automatically add `--enable-preview` to vmArgs when necessary. [#553](https://github.com/Microsoft/vscode-java-debug/issues/553). + +### Changed +- Disable `java.debug.settings.showStaticVariables` by default to not show the static fields. + +### Fixed +- Fix: Debug Console does not support autocomplete when a .class file is open. [#535](https://github.com/Microsoft/vscode-java-debug/issues/535). + +## 0.17.0 - 2019-03-06 +### Added +- Popup the exception details via a UI widget when an exception breakpoint is hit. [#522](https://github.com/Microsoft/vscode-java-debug/issues/522). + +### Changed +- Reduce the extension load time by using webpack. [#492](https://github.com/Microsoft/vscode-java-debug/issues/492), [#517](https://github.com/Microsoft/vscode-java-debug/issues/517). + +### Fixed +- Add a new debug configuration `shortenCommandLine` to fix the issue "CreateProcess error=206, The filename or extension is too long". [#110](https://github.com/Microsoft/vscode-java-debug/issues/110). + +## 0.16.0 - 2018-12-12 +### Added +- Provide Chinese localized settings page for Java debugger, including launch.json configuration and user settings. [#472](https://github.com/Microsoft/vscode-java-debug/issues/472), [#477](https://github.com/Microsoft/vscode-java-debug/issues/477). +- Add new user settings `java.debug.settings.forceBuildBeforeLaunch` to control whether to build the workspace before Run/Debug. [#462](https://github.com/Microsoft/vscode-java-debug/issues/462). +- F5 will auto launch the current Java file if `mainClass` in launch.json is set to the variable `${file}`. [#431](https://github.com/Microsoft/vscode-java-debug/issues/431) + +### Changed +- Simplify generated launch.json. [#476](https://github.com/Microsoft/vscode-java-debug/issues/476). +- Remove the emoji before Run/Debug CodeLens. [#475](https://github.com/Microsoft/vscode-java-debug/issues/475). +- Use `vscode.open` api instead of `opn` library. [#479](https://github.com/Microsoft/vscode-java-debug/issues/479). + +### Fixed +- Fix the main class isn't unique issue. [#420](https://github.com/Microsoft/vscode-java-debug/issues/420). + +## 0.15.0 - 2018-11-01 +### Added +- Contribution from [Thad House](https://github.com/ThadHouse): Add new user settings `java.debug.settings.enableRunDebugCodeLens` to enable/disable Run|Debug Code Lenses on main methods. [#464](https://github.com/Microsoft/vscode-java-debug/issues/464). +- Contribution from [Julien Russo](https://github.com/Dotpys): Add italian translation for extension configuration. [PR#463](https://github.com/Microsoft/vscode-java-debug/pull/463). + +Thank [Thad House](https://github.com/ThadHouse) and [Julien Russo](https://github.com/Dotpys) for contribution. + +## 0.14.0 - 2018-10-10 +### Fixed +- Fix: Code Lenses for Run/Debug links on main methods don't show up immediately. [#438](https://github.com/Microsoft/vscode-java-debug/issues/438). +- Fix: It throws "ConfigError: 'mymodule/App' is not a valid class name." for java 9 program. [#437](https://github.com/Microsoft/vscode-java-debug/issues/437). +- Fix: Cannot run from src/test anymore. [#413](https://github.com/Microsoft/vscode-java-debug/issues/413). +- Fix: It throws InvalidStackFrameException during evaluating on conditional breakpoint. [#369](https://github.com/Microsoft/vscode-java-debug/issues/369). +- Fix: The launch command for internalConsole is different from integratedTerminal. [#440](https://github.com/Microsoft/vscode-java-debug/issues/440). ## 0.13.0 - 2018-9-19 ### Added diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index aa02a24f..cae7a2a0 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -25,10 +25,10 @@ javaDebugger/ ``` ### Prerequisites -- [JDK](http://www.oracle.com/technetwork/java/javase/downloads/index.html), (version 1.8.0 or later) -- [VS Code](https://code.visualstudio.com/), (version 1.19.0 or later) -- [Node.JS](https://nodejs.org/en/), (>= 8.9.1, < 9.0.0) -- [Language Support for Java by Red Hat](https://marketplace.visualstudio.com/items?itemName=redhat.java), (version 0.14.0 or later) +- [JDK](http://www.oracle.com/technetwork/java/javase/downloads/index.html), (version 11 or later) +- [VS Code](https://code.visualstudio.com/), (version 1.44.0 or later) +- [Node.JS](https://nodejs.org/en/), (>= 12.8.1) +- [Language Support for Java by Red Hat](https://marketplace.visualstudio.com/items?itemName=redhat.java), (version 0.60.0 or later) Install all the dependencies using `npm` (supposed to be installed together with [Node.JS](https://nodejs.org/en/)). ```bash @@ -38,11 +38,11 @@ npm install ### Build and Run #### Build the Debug Server -For convenience, there is task `build_server` defined in `gulpfile.js`. It builds the Java Debug Server and then copies the .jar file into folder `vscode-java-debug/server`. +For convenience, there is a build script `buildJdtlsExt.js` defined in `scripts/build`. It builds the Java Debug Server and then copies the .jar file into folder `vscode-java-debug/server`. ```bash -npx gulp build_server +npm run build-server ``` -**NOTE**: If you didn't follow the steps to check out [vscode-java-debug](https://github.com/Microsoft/vscode-java-debug) and [java-debug](https://github.com/Microsoft/java-debug) in the same folder, please specify a correct `server_dir` in your [gulpfile.js](https://github.com/Microsoft/vscode-java-debug/blob/master/gulpfile.js#L5). +**NOTE**: If you didn't follow the steps to check out [vscode-java-debug](https://github.com/Microsoft/vscode-java-debug) and [java-debug](https://github.com/Microsoft/java-debug) in the same folder, please specify a correct `server_dir` in your [buildJdtlsExt.js](https://github.com/Microsoft/vscode-java-debug/blob/master/scripts/build/buildJdtlsExt.js#L8). #### Debug the Extension Open folder `vscode-java-debug` in VS Code, or simply execute following commands if you have `code` in your system PATH. @@ -61,4 +61,4 @@ Since we have checked in a valid [launch.json](https://github.com/Microsoft/java ## Pull Requests Before we can accept a pull request from you, you'll need to sign a [Contributor License Agreement (CLA)](https://github.com/Microsoft/vscode/wiki/Contributor-License-Agreement). It is an automated process and you only need to do it once. -To enable us to quickly review and accept your pull requests, always create one pull request per issue and [link the issue in the pull request](https://github.com/blog/957-introducing-issue-mentions). \ No newline at end of file +To enable us to quickly review and accept your pull requests, always create one pull request per issue and [link the issue in the pull request](https://github.com/blog/957-introducing-issue-mentions). diff --git a/Configuration.md b/Configuration.md new file mode 100644 index 00000000..12e07c21 --- /dev/null +++ b/Configuration.md @@ -0,0 +1,411 @@ +# Java Debug Configuration + +## Table of Contents +* [Auto generate the launch.json](#auto-generate-the-launchjson) +* [Modify the launch.json](#modify-the-launchjson) + * [Main](#main) + * mainClass + * projectName + * [Arguments](#arguments) + * args + * vmArgs + * [Environment](#environment) + * console + * env + * [Don't step into the specified classes or methods](#dont-step-into-the-specified-classes-or-methods) + * stepFilters + * [Attach to a debuggee](#attach-to-a-debuggee) + * hostName + * port + * [Attach to mvn task](#attach-to-mvn-task) + * [Attach to embedded maven tomcat server](#attach-to-embedded-maven-tomcat-server) + * [Use javac as the builder and attach to java process](#use-javac-as-the-builder-and-attach-to-java-process) +* [Modify the settings.json (User Setting)](#modify-the-settingsjson-user-setting) + * java.debug.settings.console + * java.debug.settings.forceBuildBeforeLaunch + * java.debug.settings.onBuildFailureProceed + * java.debug.settings.hotCodeReplace + * java.debug.settings.enableRunDebugCodeLens +* [FAQ](#faq) + + +The debugger provides two kinds of configuration: *launch.json* and *settings.json* (User Settings), see the [README](https://github.com/Microsoft/vscode-java-debug#options) for the supported configuration list. launch.json is used to control the configuration per debug session, and the user setting is shared by the whole workspace or VS Code. + +## Auto generate the launch.json +When you run the program via `Run|Debug` CodeLens or `Run`/`Debug` context menu, the debugger automatically generates the launching configuration for you. +![runMenu](https://user-images.githubusercontent.com/14052197/67181889-715bb380-f410-11e9-9aef-c27ce697daa0.gif) + +## Modify the launch.json +If you don't see `.vscode/launch.json` in your VS Code window, you can go to "Run and Debug" viewlet to create an initial launch.json. +![create launch.json](https://user-images.githubusercontent.com/14052197/172300183-7758eb9b-5e61-485b-b238-a63a98a9fb11.png) + +On the other hand, the debugger provides multiple configuration templates to help you to easily add a new configuration. When you type `"java"` or `""` in launch.json, it will trigger auto-completion suggestions. +![launchConfig](https://user-images.githubusercontent.com/14052197/67182212-3908a500-f411-11e9-9467-48ba2f6e0e39.gif) + +In case you want to manually edit the configuration, below are the explanation and samples about the common debug configurations. +### Main +* `mainClass` - mainClass is used to define your program entry, and it's the most important configuration. The debugger provides three options to help you configure this key, see the samples below. + * `"mainClass": ""` + If you have no idea about what to set here, just leave it empty. The debugger will search all possible main classes from the workspace, then prompt you the list to choose for launch. +![emptyMainClass](https://user-images.githubusercontent.com/14052197/67261011-25bd0e80-f4d1-11e9-966d-3e82a4e261ce.gif) + + * `"mainClass": "${file}"` + If you have multiple main Java files, use this to auto switch to your current focus program. The debugger will resolve the main class from current active Java file, and set it as the launching main class. +![currentFile](https://user-images.githubusercontent.com/14052197/67183367-d7960580-f413-11e9-9773-7df735710054.gif) + + * `"mainClass": "com.microsoft.app.myApp"` + The fully qualified class name, generally it's filled by the debugger's auto generation. +![mainClass](https://user-images.githubusercontent.com/14052197/67190742-17181e00-f423-11e9-98ab-1c568f220ba7.gif) + +* `projectName` - The preferred project in which the debugger searches for classes. It's required for the evaluation feature. Most of the time, the debugger will auto generate the configuration for you. In case you want to manually configure it, here are the rules. + * When you open a maven project, the project name is the `artifactId`. + * When you open a gradle project, the project name is the `baseName` or the root folder name. + * When you open other Java files, leave the launch.json empty and allow the debugger auto generates the project name for you. + + > Pro Tip: The easiest way to get the project name is to install [Java Dependency Viewer](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-dependency) extension, the top node in the JAVA DEPENDENCIES view is your project name. +![java-dependency-viewer](https://user-images.githubusercontent.com/14052197/67185034-7cfea880-f417-11e9-8a3b-a3af1a9e86bb.png) + +### Arguments +* `args` - Program arguments which are used to pass application configuration to your program, and they are accessible via "args" String array parameter in your main method `public static void main(String[] args)`. It accepts three kinds of value, see the samples below. + * `"args": "arg0 arg1"` + Space separated String value. + ![programArgs](https://user-images.githubusercontent.com/14052197/67191536-5abf5780-f424-11e9-9664-6cc5805225bb.gif) + + * `"args": ["arg0", "arg1"]` + An array of String. + * `"args": "${command:SpecifyProgramArgs}"` + The debugger will prompt you with an input box to type the args value before launching the program. This is convenient when you have a program running against multiple data set. + ![specifyArgs](https://user-images.githubusercontent.com/14052197/67191890-0ff20f80-f425-11e9-8df2-5fd98e61c204.gif) + +* `vmArgs` - VM arguments are used to configure JVM options and platform properties. Most of these arguments have a prefix (-D, -X, -XX). For example, *-Xms256m* arguments defines the initial Java heap size to 256MB. And you can also use *-DpropertyName=propertyValue* to configure system properties for your program. These properties are read via API *System.getProperty(propertyName)*. It accepts a String or an array of String, see the samples below. + * `"vmArgs": "-Xms256m -Xmx1g -Dserver=production"` + Space separated String value. + * `"vmArgs": ["-Xms256m", "-Xmx1g", "-Dserver=production"]` + An array of String. + +### Environment +- `console` - The specified console to launch the current program. Current default value is `integratedTerminal`. You could customize it via the global user setting `java.debug.settings.console` for the whole workspace, or `console` in launch.json for each debug session. The `console` option in launch.json (if provided) takes precedence over `java.debug.settings.console` in user settings. + * `"console": "internalConsole"` + VS Code debug console (input stream not supported). If you're developing backend application, `internalConsole` is recommended. + ![internalConsole](https://user-images.githubusercontent.com/14052197/67193516-fef6cd80-f427-11e9-8a97-9014470c3a4d.gif) + + * `"console": "integratedTerminal"` + VS Code integrated terminal. If you're developing console application with io input requirements, you must use the terminal to accept user input. For example, use *Scanner* class for user input. + ![integratedTerminal](https://user-images.githubusercontent.com/14052197/67195762-251e6c80-f42c-11e9-89d0-9545560beea9.gif) + + * `"console": "externalTerminal"` + External terminal that can be configured in user settings. The user scenario is same as integrated terminal. The difference is opening an external terminal window to run your program. + ![externalTerminal](https://user-images.githubusercontent.com/14052197/67196194-eccb5e00-f42c-11e9-9d4c-6baa5eec18bc.gif) + +- `env` - The extra environment variables for the program. It's accessible via `System.getenv(key)`. It accepts key-value pairs. + ```json + { + "version": "0.2.0", + "configurations": [ + { + "type": "java", + "name": "Launch Hello", + "request": "launch", + "env": { + "HOST": "127.0.0.1", + "PORT": 8080 + } + } + ] + } + ``` + +- `envFile` - Absolute path to a file containing environment variable definitions. Multiple files can be specified by providing an array of absolute paths + ```json + { + "version": "0.2.0", + "configurations": [ + { + "type": "java", + "name": "Launch Hello", + "request": "launch", + "envFile": "${workspaceFolder}/.env" + } + ] + } + ``` + +### Don't step into the specified classes or methods + +- `stepFilters` - Skip the specified classes or methods you don't want to step into. Class names should be fully qualified. Wildcard is supported. + - Skip the class loader. + ```json + { + "version": "0.2.0", + "configurations": [ + { + "type": "java", + "name": "Launch Hello", + "request": "launch", + "stepFilters": { + "skipClasses": [ + "java.lang.ClassLoader", + ] + } + } + ] + } + ``` + ![skipClassLoader](https://user-images.githubusercontent.com/14052197/67254877-ff3bab00-f4b1-11e9-8da0-22b49935bd57.gif) + + - Skip the JDK classes. + ```json + { + "version": "0.2.0", + "configurations": [ + { + "type": "java", + "name": "Launch Hello", + "request": "launch", + "stepFilters": { + "skipClasses": [ + "$JDK" + ] + } + } + ] + } + ``` + ![skipJDK](https://user-images.githubusercontent.com/14052197/67255028-9dc80c00-f4b2-11e9-9113-bef0c0bdf5cb.gif) + + - Skip the constructors and the synthetic methods. + ```json + { + "version": "0.2.0", + "configurations": [ + { + "type": "java", + "name": "Launch Hello", + "request": "launch", + "stepFilters": { + "skipSynthetics": true, + "skipStaticInitializers": true, + "skipConstructors": true + } + } + ] + } + ``` + ![skipMethods](https://user-images.githubusercontent.com/14052197/67255209-83daf900-f4b3-11e9-8533-70f6ff941e8d.gif) + +### Attach to a debuggee +- `hostName` - The host name or ip address of the debuggee you want to attach. +- `port` - The port of the debuggee you want to attach. + +Before attaching to a debuggee, your debuggee program must be started with debug mode. The standard command line for debug mode is like `java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005 -cp bin MyApp`, and then the debug port of your debuggee is *5005*. +```json +{ + "type": "java", + "name": "Debug (Attach)", + "request": "attach", + "hostName": "localhost", + "port": 5005 +} +``` + +In some cases, you may want to start your program with the external builder and launcher, then you can configure these jobs in [tasks.json](https://code.visualstudio.com/docs/editor/tasks) and attach to it. For example, launching springboot application via mvn command, and then attach a debugger. +#### Attach to mvn task +1) Configure your command in .vscode/tasks.json - The mvn task is a background task, you should use *problemMatcher* filter to tell VS Code it's ready. + ```json + { + "label": "mvnDebug", + "type": "shell", + "command": "mvn spring-boot:run -Dspring-boot.run.jvmArguments=\"-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005\"", + "isBackground": true, + "problemMatcher": [{ + "pattern": [{ + "regexp": "\\b\\B", + "file": 1, + "location": 2, + "message": 3 + }], + "background": { + "activeOnStart": true, + "beginsPattern": "^.*Attaching agents:.*", + "endsPattern": "^.*Listening for transport dt_socket at address.*" + } + }] + } + ``` +2) Configure `preLaunchTask` and the debug port in .vscode/launch.json. + ```json + { + "type": "java", + "name": "Debug (Attach)", + "request": "attach", + "hostName": "localhost", + "port": 5005, + "preLaunchTask": "mvnDebug" + } + ``` +3) F5 will launch the mvn task, and attach the debugger. See the demo. +![attachToMvn](https://user-images.githubusercontent.com/14052197/67262705-4f2d6880-f4d8-11e9-9e2d-9c35a6613c08.gif) + +#### Attach to embedded maven tomcat server + - pom.xml sample for embedded tomcat server. + ```xml + ... + + org.apache.tomcat.maven + tomcat7-maven-plugin + 2.2 + + ... + ``` + - The steps to attach to the embedded maven tomcat server. + 1) Use .vscode/tasks.json to configure *run-tomcat* and *stop-tomcat* tasks. + ```json + { + "version": "2.0.0", + "tasks": [ + { + "label": "run-tomcat", + "type": "shell", + "command": "MAVEN_OPTS=\"$MAVEN_OPTS -agentlib:jdwp=transport=dt_socket,address=5005,server=y,suspend=n\" ./mvnw tomcat7:run", + "group": "build", + "isBackground": true, + "problemMatcher": [{ + "pattern": [{ + "regexp": "\\b\\B", + "file": 1, + "location": 2, + "message": 3 + }], + "background": { + "activeOnStart": true, + "beginsPattern": "^.*Listening for", + "endsPattern": "^.*transport dt_socket at address.*" + } + }] + }, + { + "label": "stop-tomcat", + "type": "shell", + "command": "echo ${input:terminate}}", + "problemMatcher": [] + } + ], + "inputs": [ + { + "id": "terminate", + "type": "command", + "command": "workbench.action.tasks.terminate", + "args": "run-tomcat" + } + ] + } + ``` + 2) Use .vscode/launch.json to configure the attach configuration. Use `preLaunchTask` to run tomcat before the attach, and `postDebugTask` to stop tomcat after the debug ends. + ```json + { + "version": "0.2.0", + "configurations": [ + { + "type": "java", + "name": "Debug (Attach)", + "request": "attach", + "hostName": "localhost", + "port": 5005, + "preLaunchTask": "run-tomcat", + "postDebugTask": "stop-tomcat" + } + ] + } + ``` + 3) F5 will auto start the tomcat server and attach the debugger. The demo below will show how to debug spring mvc in tomcat. + ![attachToEmbeddedTomcat](https://user-images.githubusercontent.com/14052197/67541153-80957680-f71a-11e9-9d59-e9aaa752fe33.gif) + + > If you want to try to debug your Java webapps in a standalone tomcat server, please try VS Code [Tomcat for Java](https://marketplace.visualstudio.com/items?itemName=adashen.vscode-tomcat) extension. + + > If you want to try to debug embedded tomcat server with gradle plugin, see the [gradle sample](https://github.com/microsoft/vscode-java-debug/issues/140#issuecomment-343656398). + +#### Use javac as the builder and attach to java process +1) Configure the javac builder and java runner jobs in .vscode/tasks.json. + ```json + { + "version": "2.0.0", + "tasks": [ + { + "label": "build", + "type": "shell", + "command": "javac -g -sourcepath ./**/*.java -d ./bin" + }, + { + "label": "debug", + "dependsOn": "build", + "type": "shell", + "command": "java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005 -cp bin app.SimpleCalc", + "isBackground": true, + "problemMatcher": [{ + "pattern": [{ + "regexp": "\\b\\B", + "file": 1, + "location": 2, + "message": 3 + }], + "background": { + "activeOnStart": true, + "beginsPattern": "^.*Listening for", + "endsPattern": "^.*transport dt_socket at address.*" + } + }] + } + ] + } + ``` +2) Configure `preLaunchTask` and the debug port in .vscode/launch.json. + ```json + { + "version": "0.2.0", + "configurations": [ + { + "type": "java", + "name": "Debug (Attach)", + "request": "attach", + "hostName": "localhost", + "port": 5005, + "preLaunchTask": "debug" + } + ] + } + ``` +3) F5 will run the tasks and attach the debugger. See the demo. +![attachToJava](https://user-images.githubusercontent.com/14052197/67263956-3cb52e00-f4dc-11e9-9c78-6e66cb3d7c2b.gif) + +## Modify the settings.json (User Setting) +- `java.debug.settings.console` - The specified console to launch Java program, defaults to `integratedTerminal`. If you want to customize the console for a specific debug session, please use `console` option in launch.json instead. + ![terminal](https://user-images.githubusercontent.com/14052197/67256063-cf8fa180-f4b7-11e9-9455-77daad2f0ec9.gif) + +- `java.debug.settings.forceBuildBeforeLaunch` - Force building the workspace before launching java program, defaults to `true`. Sometimes you may be bothered with the message *"Build failed, do you want to continue?"*, you could disable this setting to suppress the message. + +- `java.debug.settings.onBuildFailureProceed` - Sometimes you may be bothered with the message *"Build failed, do you want to continue?"*, you could use this setting to suppress the message and proceed. + +- `java.debug.settings.hotCodeReplace` - Reload the changed Java classes during debugging, defaults to `manual`. It supports `manual`, `auto`, `never`. + - `manual` - Click the toolbar to apply the changes. + ![hcr](https://user-images.githubusercontent.com/14052197/67256313-f5697600-f4b8-11e9-9db6-54540b6350ad.png) + - `auto` - Automatically apply the changes after saved. + - `never` - Never apply the changes. + +- `java.debug.settings.enableRunDebugCodeLens` - Enable the code lens provider for the *Run* and *Debug* buttons over main entry points, defaults to `true`. + - `true` - Show the code lens. + ![codelens](https://user-images.githubusercontent.com/14052197/67256585-83922c00-f4ba-11e9-883f-2b3de3db2dfa.png) + - `false` - Show the Run/Debug link in the hover. + ![hover](https://user-images.githubusercontent.com/14052197/67256539-2ac29380-f4ba-11e9-8a5b-e5e1d0a27f0e.png) + +## FAQ +### 1. No way to take input. +If you are using *Scanner(System.in)* to get the user input, you need change the user setting `java.debug.settings.console` to `integratedTerminal` or `externalTerminal`. + +### 2. Code output is not in the DEBUG CONSOLE panel but Terminal. +By default, the debugger uses the terminal to launch your program for better accepting user input. And you will see the original command line is displayed at the top of the terminal. If you want a cleaner console to show your code output, you could try to change the user setting `java.debug.settings.console` to `internalConsole`. Please notice that the internal console (VS Code built-in DEBUG CONSOLE) doesn't support user input. + +### 3. The classpath changed when using terminal. +In order to avoid the command line being too long, the debugger will shorten your classpath into classpath.jar (for JDK 8 only) or argsfile (for JDK 9 and above) by default. If your program need read the original classpath value (for example, *System.getProperty("java.class.path")*), you could try to change the console to `internalConsole`, or use a higher JDK (9 and above) to launch your program. + +### 4. Failed to launch debuggee in terminal with TransportTimeoutException. +When launching failed in terminal, then you could try to change the user setting `java.debug.settings.console` to `internalConsole`. diff --git a/README.md b/README.md index 921c1ee5..767764ad 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Debugger for Java [![Gitter](https://badges.gitter.im/Microsoft/vscode-java-debug.svg)](https://gitter.im/Microsoft/vscode-java-debug) -[![Travis CI](https://travis-ci.org/Microsoft/vscode-java-debug.svg?branch=master)](https://travis-ci.org/Microsoft/vscode-java-debug) +[![GitHub Actions](https://img.shields.io/github/actions/workflow/status/microsoft/vscode-java-debug/build.yml)](https://github.com/microsoft/vscode-java-debug/actions/workflows/build.yml?query=branch%3Amain) ## Overview A lightweight Java Debugger based on [Java Debug Server](https://github.com/Microsoft/java-debug) which extends the [Language Support for Java by Red Hat](https://marketplace.visualstudio.com/items?itemName=redhat.java). It allows users to debug Java code using Visual Studio Code (VS Code). Here's a list of features: @@ -17,6 +17,8 @@ A lightweight Java Debugger based on [Java Debug Server](https://github.com/Micr - Debug console - Evaluation - Hot Code Replace +- No-Config Debug (debug Java apps without launch.json) +- **[AI]** AI-Assisted Debugging (GitHub Copilot integration) ## Requirements - JDK (version 1.8.0 or later) @@ -35,49 +37,114 @@ ext install vscode-java-debug ## Use - Launch VS Code -- Open a Java project (Maven/Gradle/Eclipse) +- Open a Java project (Maven/Gradle/Eclipse/Single Java file) - Open a Java file to activate the extensions -- Add debug configurations and edit launch.json - - To launch: specify `mainClass` - - To attach: specify `hostName` and `port` -- Press F5 +- Press `F5` Please also check the documentation of [Language Support for Java by Red Hat](https://marketplace.visualstudio.com/items?itemName=redhat.java) if you have trouble setting up your project. +## No-Config Debug + +You can now debug Java applications without creating a `launch.json` file! Simply open a terminal in VS Code and use the `debugjava` command: + +```bash +# Debug a main class +debugjava -cp bin com.example.Main + +# Debug a JAR file +debugjava -jar target/myapp.jar + +# Debug with arguments +debugjava -cp bin com.example.Main arg1 arg2 +``` + +The debugger will automatically attach. See [No-Config Debug Documentation](bundled/scripts/noConfigScripts/README.md) for more details. + +## AI-Assisted Debugging + +When using GitHub Copilot Chat, you can now ask AI to help you debug Java applications! The extension provides a Language Model Tool that enables natural language debugging: + +- "Debug my Spring Boot application" +- "Debug the Main class in this project" +- "Debug Calculator with arguments 10 and 5" + +The AI will automatically: +1. Detect your project type (Maven/Gradle/VS Code) +2. Build/compile your project +3. Start debugging with appropriate configuration + +See [Language Model Tool Documentation](bundled/agents/README.md) for more details. + ## Options ### Launch -- `mainClass` (required) - The main class of the program (fully qualified name, e.g. [mymodule/]com.xyz.MainClass). -- `args` - The command line arguments passed to the program. Use `"${command:SpecifyProgramArgs}"` to prompt for program arguments. It accepts a string or an array of string. +- `mainClass` - The fully qualified name of the class containing the main method. If not specified, the debugger automatically resolves the possible main class from current project. + - `${file}` - Current Java file. + - `com.mypackage.Main` - The fully qualified class name. + - `com.java9.mymodule/com.mypackage.Main` - The fully qualified module name and class name. + - `/path/to/Main.java` - The file path of the main class. +- `args` - The command line arguments passed to the program. + - `"${command:SpecifyProgramArgs}"` - Prompt user for program arguments. + - A space-separated string or an array of string. - `sourcePaths` - The extra source directories of the program. The debugger looks for source code from project settings by default. This option allows the debugger to look for source code in extra directories. -- `modulePaths` - The modulepaths for launching the JVM. If not specified, the debugger will automatically resolve from current project. -- `classPaths` - The classpaths for launching the JVM. If not specified, the debugger will automatically resolve from current project. -- `encoding` - The `file.encoding` setting for the JVM. If not specified, 'UTF-8' will be used. Possible values can be found in http://docs.oracle.com/javase/8/docs/technotes/guides/intl/encoding.doc.html. +- `modulePaths` - The modulepaths for launching the JVM. If not specified, the debugger will automatically resolve from current project. If multiple values are specified, the debugger will merge them together. + - `$Auto` - Automatically resolve the modulepaths of current project. + - `$Runtime` - The modulepaths within 'runtime' scope of current project. + - `$Test` - The modulepaths within 'test' scope of current project. + - `!/path/to/exclude` - Exclude the specified path from modulepaths. + - `/path/to/append` - Append the specified path to the modulepaths. +- `classPaths` - The classpaths for launching the JVM. If not specified, the debugger will automatically resolve from current project. If multiple values are specified, the debugger will merge them together. + - `$Auto` - Automatically resolve the classpaths of current project. + - `$Runtime` - The classpaths within 'runtime' scope of current project. + - `$Test` - The classpaths within 'test' scope of current project. + - `!/path/to/exclude` - Exclude the specified path from classpaths. + - `/path/to/append` - Append the specified path to the classpaths. +- `encoding` - The `file.encoding` setting for the JVM. Possible values can be found in https://docs.oracle.com/javase/8/docs/technotes/guides/intl/encoding.doc.html. - `vmArgs` - The extra options and system properties for the JVM (e.g. -Xms\ -Xmx\ -D\=\), it accepts a string or an array of string. - `projectName` - The preferred project in which the debugger searches for classes. There could be duplicated class names in different projects. This setting also works when the debugger looks for the specified main class when launching a program. It is required when the workspace has multiple java projects, otherwise the expression evaluation and conditional breakpoint may not work. -- `cwd` - The working directory of the program. +- `cwd` - The working directory of the program. Defaults to `${workspaceFolder}`. - `env` - The extra environment variables for the program. +- `envFile` - Absolute path to a file containing environment variable definitions. Multiple files can be specified by providing an array of absolute paths - `stopOnEntry` - Automatically pause the program after launching. -- `console` - The specified console to launch the program. Defaults to `internalConsole`. +- `console` - The specified console to launch the program. If not specified, use the console specified by the `java.debug.settings.console` user setting. - `internalConsole` - VS Code debug console (input stream not supported). - `integratedTerminal` - VS Code integrated terminal. - `externalTerminal` - External terminal that can be configured in user settings. +- `shortenCommandLine` - When the project has long classpath or big VM arguments, the command line to launch the program may exceed the maximum command line string limitation allowed by the OS. This configuration item provides multiple approaches to shorten the command line. Defaults to `auto`. + - `none` - Launch the program with the standard command line 'java [options] classname [args]'. + - `jarmanifest` - Generate the classpath parameters to a temporary classpath.jar file, and launch the program with the command line 'java -cp classpath.jar classname [args]'. + - `argfile` - Generate the classpath parameters to a temporary argument file, and launch the program with the command line 'java @argfile [args]'. This value only applies to Java 9 and higher. + - `auto` - Automatically detect the command line length and determine whether to shorten the command line via an appropriate approach. - `stepFilters` - Skip specified classes or methods when stepping. - - `classNameFilters` - Skip the specified classes when stepping. Class names should be fully qualified. Wildcard is supported. + - `classNameFilters` - [**Deprecated** - replaced by `skipClasses`] Skip the specified classes when stepping. Class names should be fully qualified. Wildcard is supported. + - `skipClasses` - Skip the specified classes when stepping. + - `$JDK` - Skip the JDK classes from the default system bootstrap classpath, such as rt.jar, jrt-fs.jar. + - `$Libraries` - Skip the classes from application libraries, such as Maven, Gradle dependencies. + - `java.*` - Skip the specified classes. Wildcard is supported. + - `java.lang.ClassLoader` - Skip the classloaders. - `skipSynthetics` - Skip synthetic methods when stepping. - `skipStaticInitializers` - Skip static initializer methods when stepping. - `skipConstructors` - Skip constructor methods when stepping. +- `javaExec` - The path to java executable to use. By default, the project JDK's java executable is used. ### Attach -- `hostName` (required) - The host name or IP address of remote debuggee. -- `port` (required) - The debug port of remote debuggee. +- `hostName` (required, unless using `processId`) - The host name or IP address of remote debuggee. +- `port` (required, unless using `processId`) - The debug port of remote debuggee. +- `processId` - Use process picker to select a process to attach, or Process ID as integer. + - `${command:PickJavaProcess}` - Use process picker to select a process to attach. + - an integer pid - Attach to the specified local process. - `timeout` - Timeout value before reconnecting, in milliseconds (default to 30000ms). - `sourcePaths` - The extra source directories of the program. The debugger looks for source code from project settings by default. This option allows the debugger to look for source code in extra directories. - `projectName` - The preferred project in which the debugger searches for classes. There could be duplicated class names in different projects. It is required when the workspace has multiple java projects, otherwise the expression evaluation and conditional breakpoint may not work. - `stepFilters` - Skip specified classes or methods when stepping. - - `classNameFilters` - Skip the specified classes when stepping. Class names should be fully qualified. Wildcard is supported. + - `classNameFilters` - [**Deprecated** - replaced by `skipClasses`] Skip the specified classes when stepping. Class names should be fully qualified. Wildcard is supported. + - `skipClasses` - Skip the specified classes when stepping. + - `$JDK` - Skip the JDK classes from the default system bootstrap classpath, such as rt.jar, jrt-fs.jar. + - `$Libraries` - Skip the classes from application libraries, such as Maven, Gradle dependencies. + - `java.*` - Skip the specified classes. Wildcard is supported. + - `java.lang.ClassLoader` - Skip the classloaders. - `skipSynthetics` - Skip synthetic methods when stepping. - `skipStaticInitializers` - Skip static initializer methods when stepping. - `skipConstructors` - Skip constructor methods when stepping. @@ -86,13 +153,57 @@ Please also check the documentation of [Language Support for Java by Red Hat](ht - `java.debug.logLevel`: minimum level of debugger logs that are sent to VS Code, defaults to `warn`. - `java.debug.settings.showHex`: show numbers in hex format in "Variables" viewlet, defaults to `false`. -- `java.debug.settings.showStaticVariables`: show static variables in "Variables" viewlet, defaults to `true`. +- `java.debug.settings.showStaticVariables`: show static variables in "Variables" viewlet, defaults to `false`. - `java.debug.settings.showQualifiedNames`: show fully qualified class names in "Variables" viewlet, defaults to `false`. +- `java.debug.settings.showLogicalStructure`: show the logical structure for the Collection and Map classes in "Variables" viewlet, defaults to `true`. +- `java.debug.settings.showToString`: show 'toString()' value for all classes that override 'toString' method in "Variables" viewlet, defaults to `true`. - `java.debug.settings.maxStringLength`: the maximum length of string displayed in "Variables" or "Debug Console" viewlet, the string longer than this length will be trimmed, defaults to `0` which means no trim is performed. -- `java.debug.settings.enableHotCodeReplace`: enable hot code replace for Java code. Make sure the auto build is not disabled for [VSCode Java](https://github.com/redhat-developer/vscode-java). See the [wiki page](https://github.com/Microsoft/vscode-java-debug/wiki/Hot-Code-Replace) for more information about usages and limitations. +- `java.debug.settings.numericPrecision`: the precision when formatting doubles in "Variables" or "Debug Console" viewlet. +- `java.debug.settings.hotCodeReplace`: Reload the changed Java classes during debugging, defaults to `manual`. See the [wiki page](https://github.com/Microsoft/vscode-java-debug/wiki/Hot-Code-Replace) for more information about usages and limitations. + - `manual` - Click the toolbar to apply the changes. + - `auto` - Automatically apply the changes after compilation. This only works when `'java.autobuild.enabled'` is on. + - `never` - Never apply the changes. +- `java.debug.settings.enableRunDebugCodeLens`: enable the code lens provider for the run and debug buttons over main entry points, defaults to `true`. +- `java.debug.settings.forceBuildBeforeLaunch`: force building the workspace before launching java program, defaults to `true`. +- `java.debug.settings.onBuildFailureProceed`: Force to proceed when build fails, defaults to false. +- `java.debug.settings.console`: The specified console to launch Java program, defaults to `integratedTerminal`. If you want to customize the console for a specific debug session, please modify the 'console' config in launch.json. + - `internalConsole` - VS Code debug console (input stream not supported). + - `integratedTerminal` - VS Code integrated terminal. + - `externalTerminal` - External terminal that can be configured in user settings. +- `java.debug.settings.exceptionBreakpoint.exceptionTypes`: Specifies a set of exception types you want to break on, e.g. `java.lang.NullPointerException`. A specific exception type and its subclasses can be selected for caught exceptions, uncaught exceptions, or both can be selected. +- `java.debug.settings.exceptionBreakpoint.allowClasses`: Specifies the allowed locations where the exception breakpoint can break on. Wildcard is supported, e.g. `java.*`, `*.Foo`. +- `java.debug.settings.exceptionBreakpoint.skipClasses`: Skip the specified classes when breaking on exception. + - `$JDK` - Skip the JDK classes from the default system bootstrap classpath, such as rt.jar, jrt-fs.jar. + - `$Libraries` - Skip the classes from application libraries, such as Maven, Gradle dependencies. + - `java.*` - Skip the specified classes. Wildcard is supported. + - `java.lang.ClassLoader` - Skip the classloaders. +- `java.debug.settings.stepping.skipClasses`: Skip the specified classes when stepping. + - `$JDK` - Skip the JDK classes from the default system bootstrap classpath, such as rt.jar, jrt-fs.jar. + - `$Libraries` - Skip the classes from application libraries, such as Maven, Gradle dependencies. + - `java.*` - Skip the specified classes. Wildcard is supported. + - `java.lang.ClassLoader` - Skip the classloaders. +- `java.debug.settings.stepping.skipSynthetics`: Skip synthetic methods when stepping. +- `java.debug.settings.stepping.skipStaticInitializers`: Skip static initializer methods when stepping. +- `java.debug.settings.stepping.skipConstructors`: Skip constructor methods when stepping. +- `java.debug.settings.jdwp.limitOfVariablesPerJdwpRequest`: The maximum number of variables or fields that can be requested in one JDWP request. The higher the value, the less frequently debuggee will be requested when expanding the variable view. Also a large number can cause JDWP request timeout. Defaults to 100. +- `java.debug.settings.jdwp.requestTimeout`: The timeout (ms) of JDWP request when the debugger communicates with the target JVM. Defaults to 3000. +- `java.debug.settings.jdwp.async`: Experimental: Controls whether the debugger is allowed to send JDWP commands asynchronously. Async mode can improve remote debugging response speed on high-latency networks. Defaults to `auto`, and automatically switch to async mode when the latency of a single jdwp request exceeds 15ms during attach debugging. + - `auto` (Default) + - `on` + - `off` +- `java.debug.settings.vmArgs`: The default VM arguments to launch the Java program. Eg. Use '-Xmx1G -ea' to increase the heap size to 1GB and enable assertions. If you want to customize the VM arguments for a specific debug session, please modify the 'vmArgs' config in launch.json. +- `java.debug.settings.debugSupportOnDecompiledSource`: [Experimental]: Enable debugging support on the decompiled source code. Be aware that this feature may affect the loading speed of Call Stack Viewlet. You also need [Language Support for Java by Red Hat](https://marketplace.visualstudio.com/items?itemName=redhat.java)@1.20.0 or higher to use this feature. +- `java.debug.settings.suspendAllThreads`: Suspend all threads when hitting a breakpoint or stopping for an exception. Takes effect only for new debug sessions; changes during a running session don’t apply. +- `java.silentNotification`: Controls whether notifications can be used to report progress. If true, use status bar to report progress instead. Defaults to `false`. + +> Pro Tip: The documentation [Configuration.md](https://github.com/microsoft/vscode-java-debug/blob/master/Configuration.md) provides lots of samples to demonstrate how to use these debug configurations, recommend to take a look. ## Troubleshooting -Reference the [troubleshooting guide](https://github.com/Microsoft/vscode-java-debug/blob/master/Troubleshooting.md) for common errors. +Reference the [Troubleshooting Guide](https://github.com/Microsoft/vscode-java-debug/blob/master/Troubleshooting.md) for common errors. +Reference the [Troubleshooting Guide for Encoding Issues](https://github.com/Microsoft/vscode-java-debug/blob/master/Troubleshooting_encoding.md) for encoding issues. + +## Contributing +If you are interested in fixing issues and contributing directly to the code base, please see the document [How to Contribute](https://github.com/microsoft/vscode-java-debug/blob/main/CONTRIBUTING.md). ## Feedback and Questions You can find the full list of issues at [Issue Tracker](https://github.com/Microsoft/vscode-java-debug/issues). You can submit a [bug or feature suggestion](https://github.com/Microsoft/vscode-java-debug/issues/new), and participate community driven [![Gitter](https://badges.gitter.im/Microsoft/vscode-java-debug.svg)](https://gitter.im/Microsoft/vscode-java-debug) @@ -101,4 +212,4 @@ You can find the full list of issues at [Issue Tracker](https://github.com/Micro This extension is licensed under [MIT License](https://github.com/Microsoft/vscode-java-debug/blob/master/LICENSE.txt). ## Data/Telemetry -VS Code collects usage data and sends it to Microsoft to help improve our products and services. Read our [privacy statement](https://go.microsoft.com/fwlink/?LinkID=528096&clcid=0x409) to learn more. If you don't wish to send usage data to Microsoft, you can set the `telemetry.enableTelemetry` setting to `false`. Learn more in our [FAQ](https://code.visualstudio.com/docs/supporting/faq#_how-to-disable-telemetry-reporting). +VS Code collects usage data and sends it to Microsoft to help improve our products and services. Read our [privacy statement](https://go.microsoft.com/fwlink/?LinkID=528096&clcid=0x409) to learn more. If you don't wish to send usage data to Microsoft, you can set the `telemetry.telemetryLevel` setting to `"off"`. Learn more in our [FAQ](https://code.visualstudio.com/docs/supporting/faq#_how-to-disable-telemetry-reporting). diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 00000000..e138ec5d --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,41 @@ + + +## Security + +Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/). + +If you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://aka.ms/opensource/security/definition), please report it to us as described below. + +## Reporting Security Issues + +**Please do not report security vulnerabilities through public GitHub issues.** + +Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://aka.ms/opensource/security/create-report). + +If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://aka.ms/opensource/security/pgpkey). + +You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://aka.ms/opensource/security/msrc). + +Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue: + + * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.) + * Full paths of source file(s) related to the manifestation of the issue + * The location of the affected source code (tag/branch/commit or direct URL) + * Any special configuration required to reproduce the issue + * Step-by-step instructions to reproduce the issue + * Proof-of-concept or exploit code (if possible) + * Impact of the issue, including how an attacker might exploit the issue + +This information will help us triage your report more quickly. + +If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://aka.ms/opensource/security/bounty) page for more details about our active programs. + +## Preferred Languages + +We prefer all communications to be in English. + +## Policy + +Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://aka.ms/opensource/security/cvd). + + diff --git a/TestPlan.md b/TestPlan.md deleted file mode 100644 index 7efec2d9..00000000 --- a/TestPlan.md +++ /dev/null @@ -1,459 +0,0 @@ -# Test Plan -## Hello World - - 1. Create a new folder `helloworld`, create a file named `App.java` in this folder and filling the following codes: -
-public class App 
-{
-    public static void main( String[] args )
-    {        
-        System.out.println( "Hello World!" );
-    }
-}
-
- -2. Set BP on println -3. Press F5, verify for launch.json generated with right `mainClass` -4. Press F5, verify for BP to be hit, verify variable args shows like `String[0] (id=%d)` -5. Add watch `args.toString() + " test"`, verify the result like `[Ljava.lang.String;@726f3b58 test` -6. Input `args.toString() + " test"` in debug console, verify the same result in debug console and it is expandable. -7. Verify stack with thread list and on paused thread and one stack: - `App.main(String[]) (App.java:5)` -8. Press F10, verify `Hello World!` in debug console. -9. Press F5, verify program terminates. - -## Call Stack -1. Open test project `2.callstack` -2. Open `Bar.java`, set BP on line 3 -1. Press F5, verify for launch.json generated with right `projectName` and `mainClass` -4. Press F5, verify for BP to be hit, verify variable args shows `i: 20` and `this: Bar (id=^d)` - -1. Verify the stackframe shows: -
-    Bar.testBar(int) (Bar.java:3)
-    Foo.testFoo(int) (Foo.java:6)
-    CallStack.main(String[]) (CallStack.java:4)
-    
-1. Click the testFoo line in the call stack view, verify vscode views verify variable args shows `j: 10` and `this: Foo (id=^d)` and `this` is expandable with only member `bar: Bar (id=^d)`, the bar should not be expandable. -1. Change `j` to `32` and switch to stackframe `Bar.testBar(int) (Bar.java:3)` and switch back to `Foo.testFoo(int) (Foo.java:6)`, input `j + 1` in debug console and verify `33` is diplayed. -1. Add watch `this.bar.toString()` and verify the result `"Bar@^d" (id=^d)` -1. Add watch `"test" + new Bar().hashCode()` and verify the result `"test^d" (id=^d)` -1. Add watch `bar.testBar(j + 10)` and verify there is a message `This is test method in bar.` printed in debug console. -9. Press F5, verify program terminates. - -## Call Stack -1. Open test project `2.callstack` -2. Open `Bar.java`, set BP on line 3 -1. Press F5, verify for launch.json generated with right `projectName` and `mainClass` -4. Press F5, verify for BP to be hit, verify variable args shows `i: 20` and `this: Bar (id=^d)` - -1. Verify the stackframe shows: -
-    Bar.testBar(int) (Bar.java:3)
-    Foo.testFoo(int) (Foo.java:6)
-    CallStack.main(String[]) (CallStack.java:4)
-    
-1. Click the testFoo line in the call stack view, verify vscode views verify variable args shows `j: 10` and `this: Foo (id=^d)` and `this` is expandable with only member `bar: Bar (id=^d)`, the bar should not be expandable. -1. Change `j` to `32` and switch to stackframe `Bar.testBar(int) (Bar.java:3)` and switch back to `Foo.testFoo(int) (Foo.java:6)`, input `j + 1` in debug console and verify `33` is diplayed. -1. Add watch `this.bar.toString()` and verify the result `"Bar@^d" (id=^d)` -1. Add watch `"test" + new Bar().hashCode()` and verify the result `"test^d" (id=^d)` -1. Add watch `bar.testBar(j + 10)` and verify there is a message `This is test method in bar.` printed in debug console. -9. Press F5, verify program terminates. - -## Variables -1. Open test project `4.variable` - -1. Set BP on the last statement of `VariableTest#test` -1. Press F5 to generate `launch.json` and press F5 again to start debug and wait for BP to be hit -1. Verify - 1. `i` should be `111` - 1. `nullstr` should be `null` - 1. `str` should be full displayed with 1000 `a` - 1. `object` should be `Object (id=^d)` and not expandable - 1. `test` should be `VariableTest (id=^d)` and expandable with `x (VariableTest): 100`, `i:19099` and `x (Foo): 0` - 1. `a` is not expandable - 1. `b` is displayed as `Class (A) (id=^d)` and expand `b->classLoader`, there should be no errors on logs - 1. `intarray` should have 3 integers `1, 2, 3` - 1. `strList` should have children `size: 2` and expandable `elementData`, expand `elementData`, a long string `string test aaaaaaa...` should be displayed - 1. `map` should have `size: 1` and expandable `table` with a `HashMap$Node` child. - 1. `t` should have one element `hello` - 1. `genericArray` should be displayed `String[10][] (id=^d)` with first non-empty element - 1. `multi` should be displayed `String[5][][] (id=^d)` and two levels expandable tree nodes. - 1. `d` should not be expandable - 1. `dd` should be displayed as `GenericsFoo (id=^d)` and should have one child `x: Foo (id=^d)` with only one child `x: 0` - 1. `list` should have only one element of `int[1] (id=^d)` at index `0` - 1. `this` variable should be displayed -1. -1. set value on `test->x (VariableTest)`, input value `1`, verify `this->x (VariableTest)` has also been changed to `1` - -1. Open user settings and set -
"java.debug.settings.showHex": true,
-    "java.debug.settings.maxStringLength": 10,
-    "java.debug.settings.showQualifiedNames": true,
-    "java.debug.settings.showStaticVariables": false, 
-1. verify - 1. numbers are displayed in hex, and static variable is hiden and class names have been changed to fully qualified, `str` should be changed to `"string ..." (id=0x^d)` -2. add watch `this.hashCode()` verify the result should be hex format. -1. add watch `str + str.length()` in debug console, verify the result `"string ..." (id=0x^d)` -1. Press F5, verify program terminates. - -## Big stack frame -1. Open test project `6. recursivefunction` -2. Open `RecursiveTest.java`, and set BP on line 8: return 1 -1. Press F5 to generate `launch.json` and press F5 again to start debug and wait for BP to be hit -1. Add watch `number + 100` and verify the call stack list is a long list, and you can switch between them freely with changed arguments number and changed watch values -1. click on the Load More Stack Frames button, verify you can click on it continually. (The total stack frame count is 1000, and vscode will load 20 of them in one page, so you can click Load More Stack Frames button about 50 times), verify there is no PERFORMANCE issue (no delay more than 1 second during the test steps). -1. Press F5, verify program terminates. - -## Breakpoint and innner class -1. Open test project `5.breakpoint` -1. Change the code to: -``` -class A { - - void m() { - System.out.println("outer"); - } - - String n() { - return "outer"; - } -} - -public class BreakPointTest { - public static void main(String[] args) { - new BreakPointTest().go(); - int j = 0; - new A() { - @Override - void m() { - System.out.println("anonymous"); - } - }.m(); - for (int i = 1; i <= 100; i++) { - if (i <= 99) { - j++; - } else { - System.out.println(j); - } - - } - } - - void go() { - new A().m(); - class A { - String n() { - return "inner"; - } - - void m() { - System.out.println("inner"); - } - } - new A().m(); - } - - static class A { - String n() { - return "middle"; - } - - void m() { - System.out.println("middle"); - } - } -} -``` - -1. Set BP on each `println` statement -1. Add watch `new A().n()` -1. Press F5 to start debug, verify the line `System.out.println("middle");` is hit, verify the watch result is `middle` -1. Press F5 again, verify the line `System.out.println("inner");` is hit, verify the watch result is displayed with red error message -1. press F5 again and verify the line `System.out.println("anonymous");` is hit and the watch result is `middle` -1. press F5 again and verify the line `System.out.println(j);` is hit and the watch result is `middle` -1. Press F5, verify the program stops, verify no error in logs. -1. verify the following messages in debug console
-middle
-inner
-anonymous
-99
-
- -## Variable Performance Test -1. Open test project `7.variableperformance` -2. Open `TooManyVariables.java`, and set BP on `System.out.println("variable perf test.")` -1. Press F5 to generate `launch.json` and press F5 again to start debug -1. Open debug view and expand the ‘this’ variable in variable view. -1. Verify the time for expanding are less than 5 seconds -1. Press F5, verify program terminates. - -## No Debug Information Test -1. Open test project `8.nosource` -1. Open `NoSourceTest.java`, and set breakpoint on line 4: `System.out.println(i+10);` -1. Press F5 to generate `launch.json` and press F5 again to start debug, verify the BP is hit -1. Verify the following stack frames: -
-    NoSourceTest.lambda$0(Integer) (NoSourceTest.java:4)
-    ^d.accept(Object) (Unknown Source:-1)
-    Foo.bar(int,int,Consumer) (Unknown Source:-1)
-    NoSourceTest.main(String[]) (NoSourceTest.java:3)
-    
-1. Select stack frame `Foo.bar(int,int,Consumer) (Unknown Source:-1)`, add watch `this.hashCode() - arg0` and verify an integer as the result, verify watch `new Foo()` results in `Foo (id=^d)` -1. Press F5, verify program terminates. - -## Maven Test -1. Open cmd.exe and create an empty folder and run `mvn archetype:generate –DarchetypeArtifactId:maven-archetype-quickstart` - 1. On `Define value for property 'groupId'` please input `com.ms.samples` - 1. On `Define value for property 'artifactId'` please input `simple-app` - 1. For other options, press Enter -1. Open generated `simple-app` folder using vscode -1. Wait and verify `.project` and `.classpath` files and `target` folder are generated. -1. Set BP on the `println` -1. Press F5 to generate `launch.json` and press F5 again to start debug, verify the BP is hit -1. Press F5, verify program terminates with output `Hello World!` - -## Gradle Test -1. create a new folder and create file `build.gradle` with the following text: -
-    apply plugin: 'java'
-
-    // Redefine where to look for app and test code 
-    // In this example, our code is structured as:
-    // project
-    //   └── src
-    //       ├── main
-    //       │   ├── java
-    //       │   └── resources
-    sourceSets {
-        main.java.srcDirs = ['src/main/java']     
-    }
-    
-1. copy the src/main folder from prevous test case `Maven Test` to this folder. -1. Set BP on the `println` -1. Press F5 to generate `launch.json` and press F5 again to start debug, verify the BP is hit -1. Press F5, verify program terminates with output `Hello World!` - -## PetClinic -1. Clone code from `https://github.com/spring-projects/spring-petclinic.git` -1. Open the cloned project and verify `.project` and `.classpath` files and `target` folder are generated. -1. Set BP on `WelcomeController.java` on line `return "welcome";` and `main` on `PetClinicApplication.java` -1. Press F5 to generate `launch.json` and press F5 again to start debug, verify the BP on `main` is hit. -1. Press F5 and verify the BP on `main` is hit again. -1. Wait for output `2017-11-23 20:23:25.230 INFO 9448 --- [ restartedMain] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http) -` -1. Open IE and navigate to `http://localhost:8080`, verify the `welcome` method is hit -1. Press F5 and verify page like `spring-petclinic/target/classes/templates/welcome.html` is displayed on IE with `bad` css. -1. STOP debug and do the test again from step 4 - -## TODO application -1. Clone code from `https://github.com/Microsoft/todo-app-java-on-azure.git` -1. Open the cloned project and verify `.project` and `.classpath` files and `target` folder are generated. -1. Open file `todo-app-java-on-azure\src\main\resources\application.properties` and replaces it with a test configuration(see my email attachment) -1. Set BP on `TodoListController.java` on `addNewTodoItem(@RequestBody TodoItem item)` and `main` on `TodoApplication.java` -1. Press F5 to generate `launch.json` and press F5 again to start debug, verify the BP on `main` is hit. -1. Press F5 to continue, open IE and open `http://localhost:8080/#/TodoList` and add a todo, press Button `Add` and verify the BP on addNewTodoItem is hit, wait a little time to load the stack frame. -1. Press F10 and then Press F5, verify the todo item is added. - - -## Single file build -1. Open file in folder `21.single-file`.(`Open folder` or `Open file`) -2. Press F5, make sure it debugs well. -3. update the src to introduce a compilation error. For example, change `String s = "1";` to `String s = 1;`. Then hit F5, check whether vscode pop out an error message "Build fails, do you want to proceed", click `abort`, make sure there is no more error message. - -## Console application - -1. Open project `23.console-app` in vscode. -2. Press `F5` choose java and make sure `launch.json` is generated. -3. Press `F5` again to start debug. -4. See VSCode `DEBUG CONSOLE` view, verify the program is blocking at the line `Please input your name:`. -5. Terminate debugger. -6. Go to `launch.json`, change the option `console` to `integratedTerminal`. -7. Press `F5` again. -8. See VSCode `TERMINAL` view, and user can input his/her name there and the program continue to run. -9. Terminate debugger. -10.Go to `launch.json`, change the option `console` to `externalTerminal`. -11. Press `F5` again, and the debugger will pop up an external terminal (e.g. cmd.exe). -12. User can input his/her name there and the program continue to run. - -## Java 9 modular application - -1. In your PC, install latest java 9 JDK, configure `JAVA_HOME`. -2. Open project `19.java9-app` in vscode. -3. Press `F5` choose java and verify `launch.json` is auto generated. -4. Press `F5` to start debug. -5. Verify `breakpoint` and `step` work. -6. Click `Call Stack`, it will open the associated source file in VSCode correctly. - -## Multi-root - -1. Clone code from https://github.com/spring-projects/spring-petclinic.git -2. Clone code https://github.com/Microsoft/todo-app-java-on-azure.git -3. Open both above projects in the same VSCode windows under workspace features -4. Navigate to the Debug view -5. Generate configuration for sprintclinic -6. Generate configuration for TODO -7. Check both launch.json to see the selected project's main are generated. - -# Step Filters - -1. Open project `19.java9-app` in vscode. -2. Follow gif to verify step filters feature. -![stepfilter](images/33868694-673f14b0-df3f-11e7-9983-b3cff5842020.gif) - -The new gif: -![stepfilters](images/34507770-69597114-f074-11e7-8f32-027ad1d7a4fd.gif) - -## Hot Code Replace - -1. Open project `24.hotCodeReplace` in vscode. -2. Set breakpoints: NameProvider.java line 12; Person.java line 13 -3. Press `F5` to start debug. -4. The program stopped at the Person.java line 13 -5. Change the value of the line "old" to "new" -5. Save the document to trigger HCR. Check the breakpoint will stop at line 12 -6. Click F10 to step over, check the value of `res` on the debug view of local variable which should be `new` - -## Conditional Breakpoints - -1. Open project `simple-java` in vscode, write the following code: -
-package com.ms.samples;
-
-/**
- * Hello world!
- *
- */
-public class App
-{
-    public static void main( String[] args )
-    {
-        int i = 0;
-        for (; i <= 1000; i++) {
-            if (i == 1000)  {
-                System.out.println( "Hello World!" );        
-            }
-        }
-        System.out.println( "Hello World!" );
-    }
-}  
-
-
- -2. set conditional breakpoint on line 13 with condition `i ==1000`, F5 and wait the breakpoint to be hit - -![java-conditional-bp-demo](images/37269785-0ffef8e6-2607-11e8-955f-93548ad5a0ad.gif) - -3. verify i equals 1000 in variable window. -4. F5 and wait for program to exit. - -## Restart Frame - -1. Open project `25.restartFrame` in vscode. -2. Set breakpoint: Person.java line 28 -3. Press `F5` to start debug. -4. The program stopped at the Person.java line 28 -5. Open the debug view, find the call stack of current breakpoint -6. Right click the `HelloWorld$1.run()`, choose `Restart Frame`. Result: It should fail with error message in the right corner. -7. Right click the `Persona.getInternalName()`, choose `Restart Frame`. Result: The program stop at the entry of getInternalName -7. Right click the `Persona.getName()`, choose `Restart Frame`. Result: The program stop at the entry of getName. The above call stacks are popped. - -## Encoding Test for project under chinese directory - -1. Find some project under chinese characters directory. -2. Open it in vscode. -3. Press `F5` to start debug. -4. Verify the program can be launched normally. - - -## Encoding Test for text file encoding - -1. Open a hello world project, and print `System.out.println("中文字符3323")`. -2. Press F5 to start debug. -3. Verify the output in DEBUG CONSOLE view is correctly displayed. - - -## Caught and Uncaught exceptions test - -1. Open project `simple-java` in vscode, change code from line12 to line16 with following code: -``` -for (; i <= 1000; i++) { - if (i == 1) { - throw new IllegalStateException(); - } - } -``` -2. Open debug view and tick both Uncaught exceptions and Caught exeptions -3. Press F5, verify progress stop at line 14 -4. Press F5 again, verify following messages in debug console -``` -Exception in thread "main" java.lang.IllegalStateException - at com.ms.samples.App.main(App.java:14) -``` - - -## Restart Frame - -1. Open project `25.restartFrame` in vscode. -2. Set breakpoint: Person.java line 28 -3. Press `F5` to start debug. -4. The program stopped at the Person.java line 28 -5. Open the debug console, input `s` or `g` , the auto complete window will pop up with intellisense support. - -## Logpoint - -1. Open a project in vscode, and add a logpoint. The log message is the simple text message. If you want to print the expression, you need wrap it with a curly bracket `{ javaExpression }`. -2. Launch java debugger and continue your program. -3. When the logpoint code branch is hit, it just log the message to the console and doesn't stop your program. - -![logpoint](images/41949312-77627a40-79f3-11e8-9fd2-def4fa06e28d.gif) - - -## Start without debugging -1. Open a Hello world project in VS Code. -2. Set a breakpoint. -3. Press Ctrl+F5 to start without debugging. -4. Verify that the program starts without hitting the breakpoint. -5. Open a spring-boot project in VS Code. -6. Press Ctrl+F5 to start without debugging. -7. Verify that the program starts, and there is no information in "watch" and "callstack" view. -8. Click the "pause" button in the toolbar, it should NOT pause the program. -9. Click the "stop" button in the toolbar, it should stop the program. - - -## Environment Variables -1. Open `26.environmentVariables` in vscode. -2. Press F5 to start. -3. Verify the output in Debug Console should be as following: - ``` - CustomEnv: This env is for test plan. - SystemPath: - ``` - -## Runtime classpath entry -1. Open `27.runtimeClassEntry` in vscode. -2. Press F5 to start. -3. Verify the output in Debug Console should be as following: - ``` - Tomcat started on port(s): 8080 (http) - ``` - - - -## Resolve Variables -1. Open `17.argstest` in vscode. -2. Change the launch.json as following: -``` -"mainClass": "test.${fileBasenameNoExtension}", -"args": [ "\"${execPath}\"", - "${env:APPDATA}", - "${fileExtname}", - "${workspaceRootFolderName}"] -] -``` -3. Make a BP at line one of main method, Keep ArgsTest.java open and press F5 to start. -3. Verify the `args` has the values: - - "C:\Users\andxu\AppData\Local\Programs\Microsoft VS Code\Code.exe" - - "C:\Users\andxu\AppData\Roaming" - - ".json" - - "17.argstest" diff --git a/ThirdPartyNotices.txt b/ThirdPartyNotices.txt new file mode 100644 index 00000000..063da394 --- /dev/null +++ b/ThirdPartyNotices.txt @@ -0,0 +1,174 @@ +vscode-java-debug + +THIRD-PARTY SOFTWARE NOTICES AND INFORMATION +Do Not Translate or Localize + +This project incorporates components from the projects listed below. The original copyright notices and the licenses under which Microsoft received such components are set forth below. Microsoft reserves all rights not expressly granted herein, whether by implication, estoppel or otherwise. + +1. omichelsen/compare-versions (https://github.com/omichelsen/compare-versions) +2. motdotla/dotenv (https://github.com/motdotla/dotenv) +3. lodash/lodash (https://github.com/lodash/lodash) +4. uuidjs/uuid (https://github.com/uuidjs/uuid) +5. Eskibear/vscode-extension-telemetry-wrapper (https://github.com/Eskibear/vscode-extension-telemetry-wrapper) +6. Microsoft/vscode-languageserver-node (https://github.com/Microsoft/vscode-languageserver-node) + + +%% omichelsen/compare-versions NOTICES AND INFORMATION BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2015-2017 Ole Michelsen + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF omichelsen/compare-versions NOTICES AND INFORMATION + +%% motdotla/dotenv NOTICES AND INFORMATION BEGIN HERE +========================================= +BSD-2-Clause License + +Copyright (c) 2015, Scott Motte +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +========================================= +END OF motdotla/dotenv NOTICES AND INFORMATION + +%% lodash/lodash NOTICES AND INFORMATION BEGIN HERE +========================================= +The MIT License + +Copyright JS Foundation and other contributors + +Based on Underscore.js, copyright Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/lodash/lodash + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code displayed within the prose of the +documentation. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +Files located in the node_modules and vendor directories are externally +maintained libraries used by this software which have their own +licenses; we recommend you read them, as their terms may differ from the +terms above. +========================================= +END OF lodash/lodash NOTICES AND INFORMATION + +%% uuidjs/uuid NOTICES AND INFORMATION BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2010-2020 Robert Kieffer and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF uuidjs/uuid NOTICES AND INFORMATION + +%% Eskibear/vscode-extension-telemetry-wrapper NOTICES AND INFORMATION BEGIN HERE +========================================= +MIT License + +Copyright 2018 Yan Zhang + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF Eskibear/vscode-extension-telemetry-wrapper NOTICES AND INFORMATION + +%% Microsoft/vscode-languageserver-node NOTICES AND INFORMATION BEGIN HERE +========================================= +Copyright (c) Microsoft Corporation + +All rights reserved. + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, +modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT +OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF Microsoft/vscode-languageserver-node NOTICES AND INFORMATION \ No newline at end of file diff --git a/Troubleshooting.md b/Troubleshooting.md index c8966585..b47793cb 100644 --- a/Troubleshooting.md +++ b/Troubleshooting.md @@ -10,42 +10,75 @@ The debugger works with [Language Support for Java(TM) by Red Hat](https://marke ### Try: 1. If you get the error *"The JAVA_HOME environment variable points to a missing folder"* or *"Java runtime could not be located"*, please make sure that the environment variable JAVA_HOME points to a valid JDK. Otherwise, ignore this step. 2. Open your Maven *pom.xml* file or Gradle *build.gradle* file, then run VS Code command *"Java: Update project configuration"* to force the language server to update the project configuration/classpath. -3. Try cleaning the stale workspace cache. Quit all VS Code processes and clean the following cache directory: -- Windows : %APPDATA%\Code\User\workspaceStorage\ -- MacOS : $HOME/Library/Application Support/Code/User/workspaceStorage/ -- Linux : $HOME/.config/Code/User/workspaceStorage/ +3. Run VS Code command *"Java: Clean the Java language server workspace"* to clean the stale workspace cache. 4. Try more [troubleshooting guide](https://github.com/redhat-developer/vscode-java/wiki/Troubleshooting) from the language server product site. -## Failed to resolve classpath: +## Build failed, do you want to continue? ### Reason: -Below are the common failure reasons. -- 'C:\demo\org\microsoft\app\Main.java' is not a valid class name. -- Main class 'org.microsoft.app.Main' doesn't exist in the workspace. -- Main class 'org.microsoft.app.Main' isn't unique in the workspace. -- The project 'demo' is not a valid java project. +The error indicates your workspace has build errors. There are two kinds of build errors. One is compilation error for source code, the other is project error. -In launch mode, the debugger resolves the classpaths automatically based on the given `mainClass` and `projectName`. It looks for the class specified by `mainClass` as the entry point for launching an application. If there are multiple classes with the same name in the current workspace, the debugger uses the one inside the project specified by `projectName`. +### Try: +1. Open VS Code PROBLEMS View, and fix the errors there. +2. Run VS Code command *"Java: Open Java language server log file"*, search keyword `build/building workspace` to find more details for the build errors. +3. If still cannot find out what errors, then reference the [language server troubleshooting](#try) paragraph to [2]update project configuration, and [3]clean workspace cache. + +## x.java isn't on the classpath. Only syntax errors will be reported +### Reason: +This error indicates the Java file you opened isn't on the classpath of any project, and no .class file will be generated because Java language server only auto builds Java source files on the project classpath. If you try to run or debug this Java file, you may get the error "Could not find or load main class". ### Try: -1. Check whether the class name specified in `mainClass` exists and is in the right form. The debugger only works with fully qualified class names, e.g. `org.microsoft.app.Main`. -2. Check whether the `projectName` is correct. The actual project name is not always the same to the folder name you see in the File Explorer. Please check the value specified by `projectDescription/name` in the *.project* file, or the `artificatId` in the *pom.xml* for maven project, or the folder name for gradle project. -3. If the problem persists, please try to use the debugger to regenerate the debug configurations in *launch.json*. Remove the existing *launch.json* file and press F5. The debugger will automatically generate a new *launch.json* with the right debug configurations. +1. Go to *File Explorer*, right click the folder containing your Java file, and run the menu *"Add Folder to Java Source Path"* to mark the containing folder as a Java source root. +2. Run VS Code command *"Java: List all Java source paths"* to check whether the containing folder is added as a Java source root. -## Request type "xyz" is not supported. Only "launch" and "attach" are supported. +## Program Error: Could not find or load main class x ### Reason: -The value specified in `request` option of *launch.json* is incorrect. +You configure the incorrect main class name in `mainClass` of *launch.json*, or your Java file is not on the classpath. ### Try: -1. Reference the VS Code official document [launch configurations](https://code.visualstudio.com/docs/editor/debugging#_launch-configurations) about how to configure *launch.json*. -2. Try to use the debugger to regenerate the debug configurations in *launch.json*. Remove the existing *launch.json* file and press F5. The debugger will automatically generate a new *launch.json* with the right debug configurations. +1. Check whether the class name specified in `mainClass` exists and is in the right form. +2. Run VS Code command *"Java: List all Java source paths"* to show all source paths recognized by the workspace. +3. Check the Java file you are running is under any source path? If not, go to *File Explorer*, right click the folder containing your Java file, and run the menu *"Add Folder to Java Source Path"* to mark the containing folder as a Java source root. +4. Run VS Code command *"Java: Force Java compilation"* to rebuild your workspace. +5. If the problem persists, it's probably because the language server doesn't load your project correctly. Please reference the [language server troubleshooting](#try) paragraph for more troubleshooting info. + +## Program throws ClassNotFoundException +### Reason: +This error indicates your application attempts to reference some classes which are not found in the entire classpaths. + +### Try: +1. Check whether you configure the required libraries in the dependency settings file (e.g. *pom.xml*). +2. If you have recently modified the *pom.xml* or *build.gradle* config file, you need right click on *pom.xml* or *build.gradle* file and then run the menu *"Update project configuration"* to force the language server to update the project configuration/classpath. +3. Run VS Code command *"Java: Force Java compilation"* to force the language server to rebuild the current project. +4. If the problem persists, it's probably because the language server doesn't load your project correctly. Please reference the [language server troubleshooting](#try) paragraph for more troubleshooting info. + +## Program throws UnsupportedClassVersionError +Below is a typical error message. + +![image](https://user-images.githubusercontent.com/14052197/78854443-ed47c780-7a53-11ea-8317-d8b097dfba99.png) + +### Reason: +The compiled classes are not compatible with the runtime JDK. + +The class file version `57.65535` stands for Java 13 preview, where the major version `57` stands for Java 13, the minor version `65535` stands for preview feature. Similarly `58.65535` stands for Java 14 preview. + +The error says the compiled class is `57.65535`, but the runtime JDK only recognizes class file version `58.65535`. That's because the preview feature is not backward compatible, i.e. JVM 14 doesn't support 13 preview feature. The [openjdk](https://openjdk.java.net/jeps/12) website has claimed the reason that it would be costly for JDK 14 to support preview features from JDK 13 which were changed or dropped in response to feedback. + +One possible root cause for this error is your runtime JDK is the latest JDK but the upstream [Language Support for Java](https://marketplace.visualstudio.com/items?itemName=redhat.java) extension doesn't catch up the support yet. + +### Try: +1. Try to update [Language Support for Java](https://marketplace.visualstudio.com/items?itemName=redhat.java) to the latest, and then try step 3 to rebuild the workspace. +2. If it doesn't work, then try to install an older JDK version, set its installation folder to "java.home" user setting in _.vscode/settings.json_ and reopen your VS Code workspace. +3. Click **F1** -> **Java: Force Java compilation** -> **Full** to rebuild the workspace. +4. If it still doesn't work, then try **F1** -> **Java: Clean the Java language server workspace** to clean the cache. ## Failed to complete hot code replace: ### Reason: This error indicates you are doing `Hot Code Replace`. The `Hot Code Replace` feature depends on the underlying JVM implementation. If you get this error, that indicates the new changes cannot be hot replaced by JVM. ### Try: -1. Restart your application to apply the new changes. Or ignore the message, and continue to debug. -2. You can disable the hot code replace feature by changing the user setting `"java.debug.settings.enableHotCodeReplace": false`. +1. Check the HCR limitation from the [wiki](https://github.com/microsoft/vscode-java-debug/wiki/Hot-Code-Replace). +2. Restart your application to apply the new changes. Or ignore the message, and continue to debug. +3. You can disable the hot code replace feature by changing the user setting `"java.debug.settings.hotCodeReplace": "never"`. ## Please specify the host name and the port of the remote debuggee in the launch.json. ### Reason: @@ -65,35 +98,41 @@ There are two possible reasons for this error. 1. For Reason 1, try to add a breakpoint and stop your program there, then evaluate the expression. 2. For Reason 2, try to change the `console` option in the *launch.json* to `externalTerminal` or `integratedTerminal`. This is the official solution for program console input. -## The DEBUG CONSOLE throws Error: Could not find or load main class xyz +## Cannot find a class with the main method ### Reason: -You configure the incorrect main class name in `mainClass` of *launch.json*. +When the `mainClass` is unconfigured in the *launch.json*, the debugger will resolve a class with main method automatically. This error indicates the debugger doesn't find any main class in the whole workspace. ### Try: -1. Check whether the class name specified in `mainClass` exists and is in the right form. -2. If the problem persists, it's probably because the language server doesn't load your project correctly. Please reference the [language server troubleshooting](#try) paragraph for more troubleshooting info. +1. Check at least one main class exists in your workspace. +2. If no main class exists, please create a main class first. Otherwise, it's probably because the language server fails to start. Please reference the [language server troubleshooting](#try) paragraph for more troubleshooting info. -## The DEBUG CONSOLE throws ClassNotFoundException +## No delegateCommandHandler for vscode.java.startDebugSession when starting Debugger ### Reason: -This error indicates your application attempts to reference some classes which are not found in the entire classpaths. +Cause of error is for now unknown, but something caused vscode java support and debugger to not be configured correctly. ### Try: -1. Check whether you configure the required libraries in the dependency settings file (e.g. *pom.xml*). -2. Run VS Code command *"Java: Force Java compilation"* to force the language server to rebuild the current project. -3. If the problem persists, it's probably because the language server doesn't load your project correctly. Please reference the [language server troubleshooting](#try) paragraph for more troubleshooting info. +1. Restart VS Code and the issue should disappear +2. If it continues to error try restart again, and if still a problem open an issue at [vscode-java-debug](https://github.com/Microsoft/vscode-java-debug) -## Cannot find a class with the main method +## Failed to resolve classpath: ### Reason: -When the `mainClass` is unconfigured in the *launch.json*, the debugger will resolve a class with main method automatically. This error indicates the debugger doesn't find any main class in the whole workspace. +Below are the common failure reasons. +- 'C:\demo\com\microsoft\app\Main.java' is not a valid class name. +- Main class 'com.microsoft.app.Main' doesn't exist in the workspace. +- Main class 'com.microsoft.app.Main' isn't unique in the workspace. +- The project 'demo' is not a valid java project. + +In launch mode, the debugger resolves the classpaths automatically based on the given `mainClass` and `projectName`. It looks for the class specified by `mainClass` as the entry point for launching an application. If there are multiple classes with the same name in the current workspace, the debugger uses the one inside the project specified by `projectName`. ### Try: -1. Check at least one main class exists in your workspace. -2. If no main class exists, please create a main class first. Otherwise, it's probably because the language server fails to start. Please reference the [language server troubleshooting](#try) paragraph for more troubleshooting info. +1. Check whether the class name specified in `mainClass` exists and is in the right form. The debugger only works with fully qualified class names, e.g. `com.microsoft.app.Main`. +2. Check whether the `projectName` is correct. The actual project name is not always the same to the folder name you see in the File Explorer. Please check the value specified by `projectDescription/name` in the *.project* file, or the `artifactId` in the *pom.xml* for maven project, or the folder name for gradle project. +3. If the problem persists, please try to use the debugger to regenerate the debug configurations in *launch.json*. Remove the existing *launch.json* file and press F5. The debugger will automatically generate a new *launch.json* with the right debug configurations. -## Build failed, do you want to continue? +## Request type "xyz" is not supported. Only "launch" and "attach" are supported. ### Reason: -The error indicates your workspace has build errors. There are two kinds of build errors. One is compilation error for source code, the other is project error. +The value specified in `request` option of *launch.json* is incorrect. ### Try: -1. Open VS Code PROBLEMS View, and fix the errors there. -2. If no errors are found in the PROBLEMS View, reference the [language server troubleshooting](#try) paragraph to update project configuration, and clean workspace cache. +1. Reference the VS Code official document [launch configurations](https://code.visualstudio.com/docs/editor/debugging#_launch-configurations) about how to configure *launch.json*. +2. Try to use the debugger to regenerate the debug configurations in *launch.json*. Remove the existing *launch.json* file and press F5. The debugger will automatically generate a new *launch.json* with the right debug configurations. diff --git a/Troubleshooting_encoding.md b/Troubleshooting_encoding.md new file mode 100644 index 00000000..834d3972 --- /dev/null +++ b/Troubleshooting_encoding.md @@ -0,0 +1,84 @@ +# Troubleshooting Guide for Encoding Issues + +This document provides a guide mostly for Windows users to solve common Java encoding issues. + +## 1. Background +Computers can only understand the binary data such as 0 and 1, and it uses charset to encode/decode the data into real-world characters. When two processes interact with each other for I/O, they have to use the compatible charset for encoding and decoding, otherwise garbled characters will probably appear. macOS and Linux use UTF-8 everywhere and encoding is not a problem for them. For Windows, however, the default charset is not UTF-8 and is platform-dependent, which can lead to inconsistent encoding between different tools. + +## 2. Common Problems +Below are the typical encoding problems when running a Java program on Windows terminal. + +2.1) The file or directory name contains unicode characters, Java launcher cannot find the corresponding classpath or main class well. +``` +C:\Test>java -cp 中文目录 Hello +Error: Could not find or load main class Hello +``` + +``` +C:\Test>java -cp ./Exercises 练习 +Error: Could not find or load main class ?? +Caused by: java.lang.ClassNotFoundException: ?? +``` + +2.2) The string literals with unicode characters appear garbled when printed to the terminal. +```java +public class Hello { + public static void main(String[] args) { + System.out.println("你好!"); + } +} +``` + +``` +C:\Test>java -cp ./Exercises Hello +??! +``` + +2.3) Garbled characters when Java program interacts with terminal for I/O. + +```java +import java.util.Scanner; + +public class Hello { + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + System.out.println(scanner.nextLine()); + } +} +``` + +``` +C:\Test>chcp +65001 + +C:\Test>java -Dfile.encoding=UTF-8 -cp ./Exercises Hello +你好 +�� +``` + +## 3.Troubleshooting Suggestions +The following diagram shows the parts of encoding that may be involved when writing and running Java in VS Code. +

+ encoding_diagram +
+ Encoding on Windows +

+ +- During the compilation phase, VS Code Java extension uses the file encoding from VS Code settings to read .java source files and compile .class files. Encoding is consistent between editor and Java extension. + +- During the run/debug phase, Java extension launches the application in the terminal by default. Most encoding problems occur because the terminal and JVM use incompatible charsets for data processing, or use charsets that do not support the target unicode characters. + - JVM - Uses a default charset compatible with the system locale of Windows platform, and you can change it by using the JVM argument `"-Dfile.encoding"`, or by using `"encoding"` setting in launch.json when running through Java debugger extension. + - Windows Terminals - Uses code page to handle encoding, and you can use `"chcp"` command to view and change the code page. + +To solve the encoding problems, the straightforward idea is to use UTF-8 in all toolchains. But unfortunately Windows terminals (such as cmd) do not support UTF-8 perfectly. Therefore, the alternative idea is to let the terminal and JVM use compatible character sets for data processing. + +### 3.1) Fix Suggestion : Change system locale to the target language. + +On Windows, when you change the system locale, the default Java charset will be changed to one compatible with the system locale, and the terminal's (e.g. cmd) code page will be automatically updated to be consistent as well. Therefore, changing system locale to the target language can solve most encoding issues on Windows. This is also suggested by Java site https://www.java.com/en/download/help/locale.html. + +The following screenshot shows how to change the system locale in Windows. for example, if I want to use a terminal to enter Chinese characters into a Java program, I can set the Windows system locale to Chinese. The default Java charset will be `"GBK"` and the cmd codepage will be `"936"`, which will support Chinese characters nicely. +

+ change_system_locale +
+ Change System Locale +

diff --git a/bundled/agents/README.md b/bundled/agents/README.md new file mode 100644 index 00000000..3dab2c1d --- /dev/null +++ b/bundled/agents/README.md @@ -0,0 +1,195 @@ +# Java Debug Agent + +The Java Debug Agent is an AI-powered debugging assistant that integrates with GitHub Copilot Chat to help you debug Java applications using natural language. + +## Overview + +Instead of manually setting breakpoints and inspecting variables, you can simply describe your debugging task in natural language. The agent will: + +1. Analyze your code to form hypotheses +2. Set targeted breakpoints +3. Inspect variables and evaluate expressions +4. Find the root cause of bugs + +## Requirements + +- VS Code 1.95.0 or later +- [Language Support for Java by Red Hat](https://marketplace.visualstudio.com/items?itemName=redhat.java) +- [Debugger for Java](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-debug) +- GitHub Copilot Chat extension + +## Getting Started + +### 1. Open Copilot Chat + +Press `Ctrl+Shift+I` (Windows/Linux) or `Cmd+Shift+I` (macOS) to open Copilot Chat. + +### 2. Switch to JavaDebug Agent Mode + +In the Copilot Chat panel, click on the agent selector (usually shows "Copilot" or current agent name) and select **JavaDebug** from the dropdown list. + +![Select Agent](images/javadebug.png) + + +### 3. Enter Your Debugging Request + +Once in JavaDebug mode, simply type your debugging request: + +``` +Why am I getting a NullPointerException in OrderService? +``` + +![Invoke Agent](images/invoke-agent.png) + + +### 4. Let the Agent Work + +The agent will: +- Read relevant code files +- Form a hypothesis about the bug +- Set breakpoints at strategic locations +- Start or attach to a debug session +- Inspect variables to verify the hypothesis +- Report the root cause + +![Agent Working](images/agent-working.png) + + +## Example Usage + +### Debug a NullPointerException + +``` +I'm getting NPE when calling userService.getUser() +``` + +The agent will: +1. Read `UserService.java` +2. Hypothesize which variable might be null +3. Set a breakpoint before the NPE +4. Check variable values +5. Report: "The `user` variable is null because `findById()` returns null when ID doesn't exist" + +### Debug Wrong Calculation Result + +``` +The calculateTotal() method returns wrong value +``` + +### Debug with Specific Input + +``` +Debug processOrder with orderId=456 +``` + +### Debug Multi-threaded Issues + +``` +I suspect a race condition in the worker threads +``` + +## Agent Capabilities + +| Capability | Description | +|------------|-------------| +| **Start Debug Session** | Launch or attach to Java applications | +| **Set Breakpoints** | Set conditional or unconditional breakpoints | +| **Inspect Variables** | View local variables, fields, and objects | +| **Evaluate Expressions** | Execute Java expressions in debug context | +| **Step Through Code** | Step over, step into, step out | +| **Multi-thread Support** | Debug concurrent applications | +| **Stack Trace Analysis** | View and navigate call stacks | + +## How It Works + +The agent uses **hypothesis-driven debugging**: + +``` +┌─────────────────────────────────────────┐ +│ 1. STATIC ANALYSIS │ +│ Read code, understand the problem │ +└─────────────────┬───────────────────────┘ + ↓ +┌─────────────────────────────────────────┐ +│ 2. FORM HYPOTHESIS │ +│ "Variable X is null at line Y" │ +└─────────────────┬───────────────────────┘ + ↓ +┌─────────────────────────────────────────┐ +│ 3. SET BREAKPOINT │ +│ At the location to verify │ +└─────────────────┬───────────────────────┘ + ↓ +┌─────────────────────────────────────────┐ +│ 4. VERIFY │ +│ Check if hypothesis is correct │ +│ ├─ YES → Report root cause │ +│ └─ NO → Form new hypothesis │ +└─────────────────────────────────────────┘ +``` + +## Tips for Best Results + +### Stay in Agent Mode + +Make sure you're in **JavaDebug** agent mode (check the agent selector in Chat panel). If you switch back to default Copilot mode, the debugging tools won't be available. + +### Be Specific + +``` +✅ Good: "Why does getUserById return null when id=123?" +❌ Vague: "Something is wrong" +``` + +### Mention the Error + +``` +✅ Good: "Getting ArrayIndexOutOfBoundsException in processItems()" +❌ Vague: "Debug processItems" +``` + +### Provide Context + +``` +✅ Good: "The order total is $0 instead of $150 for order 456" +❌ Vague: "Wrong calculation" +``` + +## Troubleshooting + +### Agent Can't Find the File + +Make sure the Java project is properly loaded. Check that: +- The Java extension is activated (look for Java icon in status bar) +- The project is imported (check Java Projects view) + +### Debug Session Won't Start + +Ensure: +- Your project compiles successfully +- No other debug session is running +- The main class can be found + +### Breakpoint Not Hit + +The agent will tell you to trigger the scenario. You need to: +1. Run the part of your application that executes the code +2. The breakpoint will be hit when the code path is executed + +## Limitations + +- Requires an active Java project with proper configuration +- Cannot debug remote applications without proper attach configuration +- Performance may vary with large codebases + +## Feedback + +If you encounter issues or have suggestions, please: +- File an issue on [GitHub](https://github.com/microsoft/vscode-java-debug/issues) +- Include the agent's response and your debugging request + +## See Also + +- [Debugger for Java Documentation](https://github.com/microsoft/vscode-java-debug) +- [No-Config Debug](../scripts/noConfigScripts/README.md) +- [Troubleshooting Guide](../../Troubleshooting.md) diff --git a/bundled/agents/debug.agent.md b/bundled/agents/debug.agent.md new file mode 100644 index 00000000..168dd465 --- /dev/null +++ b/bundled/agents/debug.agent.md @@ -0,0 +1,723 @@ +--- +description: An expert Java debugging assistant that uses hypothesis-driven debugging to find root causes systematically +tools: ['execute/getTerminalOutput', 'execute/runInTerminal', 'read/problems', 'read/readFile', 'read/terminalLastCommand', 'search', 'vscjava.vscode-java-debug/debugJavaApplication', 'vscjava.vscode-java-debug/setJavaBreakpoint', 'vscjava.vscode-java-debug/debugStepOperation', 'vscjava.vscode-java-debug/getDebugVariables', 'vscjava.vscode-java-debug/getDebugStackTrace', 'vscjava.vscode-java-debug/evaluateDebugExpression', 'vscjava.vscode-java-debug/getDebugThreads', 'vscjava.vscode-java-debug/removeJavaBreakpoints', 'vscjava.vscode-java-debug/stopDebugSession', 'vscjava.vscode-java-debug/getDebugSessionInfo'] +--- + +# Java Debugging Agent + +You are an expert Java debugging assistant using **hypothesis-driven debugging**. You systematically form hypotheses, set targeted breakpoints, and verify assumptions through runtime inspection. + +## ⚠️ CRITICAL RULES + +1. **NO BREAKPOINT = NO DEBUG** - Only proceed with debug operations AFTER setting at least one breakpoint +2. **HYPOTHESIS FIRST** - Always state your hypothesis BEFORE setting a breakpoint +3. **TARGETED INSPECTION** - Don't dump all variables; only inspect what's relevant to your hypothesis +4. **ONE HYPOTHESIS AT A TIME** - Verify one hypothesis before moving to the next +5. **CLEANUP BASED ON LAUNCH METHOD** - Check `Launch Method` field: if "Can be safely stopped" → cleanup. If "Stopping will disconnect" → do NOT cleanup + +--- + +## The Hypothesis-Driven Debugging Loop + +``` +┌─────────────────────────────────────────────────────────────────────────┐ +│ HYPOTHESIS-DRIVEN DEBUGGING │ +├─────────────────────────────────────────────────────────────────────────┤ +│ │ +│ ╔═══════════════════════════════════════════════════════════════════╗ │ +│ ║ PHASE 1: STATIC ANALYSIS ║ │ +│ ║ • Read and understand the code ║ │ +│ ║ • Form specific hypothesis about the bug ║ │ +│ ╚═══════════════════════════════════════════════════════════════════╝ │ +│ ↓ │ +│ ╔═══════════════════════════════════════════════════════════════════╗ │ +│ ║ PHASE 2: SETUP ║ │ +│ ║ • Set breakpoint at location relevant to hypothesis ║ │ +│ ║ • Check/wait for debug session ║ │ +│ ╚═══════════════════════════════════════════════════════════════════╝ │ +│ ↓ │ +│ ╔═══════════════════════════════════════════════════════════════════╗ │ +│ ║ PHASE 3: DYNAMIC VERIFICATION ║ │ +│ ║ • Inspect ONLY variables relevant to hypothesis ║ │ +│ ║ • Evaluate specific expressions to test hypothesis ║ │ +│ ║ ║ │ +│ ║ Result A: Hypothesis CONFIRMED → Root cause found! Report & Exit ║ │ +│ ║ Result B: Hypothesis REJECTED → Form new hypothesis, loop back ║ │ +│ ╚═══════════════════════════════════════════════════════════════════╝ │ +│ ↓ │ +│ ╔═══════════════════════════════════════════════════════════════════╗ │ +│ ║ PHASE 4: CLEANUP (check Launch Method) ║ │ +│ ║ • If "Can be safely stopped": Remove breakpoints, stop session ║ │ +│ ║ • If "Stopping will disconnect": Do NOT cleanup ║ │ +│ ╚═══════════════════════════════════════════════════════════════════╝ │ +│ │ +└─────────────────────────────────────────────────────────────────────────┘ +``` + +--- + +## Phase 1: Static Analysis (ALWAYS DO THIS FIRST) + +### 1.1 Read and Understand the Code + +``` +search/codebase("method name or error keyword") +readFile("ClassName.java") +``` + +### 1.2 Form a Specific Hypothesis + +**This is the most critical step!** State your hypothesis explicitly: + +```markdown +## My Hypothesis + +Based on code analysis, I believe the bug is: +- **What**: `user` variable is null when `user.getName()` is called +- **Where**: Line 52 in OrderService.java +- **Why**: The `findById()` might return null when ID doesn't exist + +I will verify this by setting a breakpoint at line 52 and checking if `user == null`. +``` + +### 1.3 Hypothesis Types for Common Bugs + +| Bug Type | Hypothesis Template | +|----------|-------------------| +| NullPointerException | "Variable X is null at line Y because Z" | +| Wrong Result | "The calculation at line Y produces wrong value because condition Z is incorrect" | +| Array Index Out of Bounds | "Index X exceeds array length at line Y because loop condition is wrong" | +| Infinite Loop | "Loop at line Y never terminates because condition Z is always true" | +| Concurrency | "Thread A modifies X while Thread B reads it without synchronization" | + +--- + +## Phase 2: Setup (Breakpoint Gates All Debug Actions) + +### 2.1 Set Breakpoint Based on Hypothesis + +``` +vscjava.vscode-java-debug/setJavaBreakpoint(filePath="OrderService.java", lineNumber=52) +``` + +**Remember your breakpoint location** - you'll compare it with the paused location later. + +### 2.2 Check Session State (Call ONCE, Then Act!) + +``` +vscjava.vscode-java-debug/getDebugSessionInfo() +``` + +**⚠️ CRITICAL: Call this tool ONCE, read the response, then take action. DO NOT call it in a loop!** + +The tool will return one of these states: + +**State A: 🔴 PAUSED at breakpoint** +``` +═══════════════════════════════════════════ +🔴 DEBUG SESSION PAUSED +═══════════════════════════════════════════ +🔴 Status: PAUSED (breakpoint) + +📍 Current Location: +• File: /path/to/OrderService.java +• Line: 52 +• Method: OrderService.java:52 in processOrder +• Thread: main (ID: 1) +``` +→ **Action**: Proceed immediately to Phase 3 (Inspect variables) + +**State B: 🟢 RUNNING (Not at breakpoint yet)** +``` +═══════════════════════════════════════════ +🟢 DEBUG SESSION RUNNING +═══════════════════════════════════════════ +🟢 Status: RUNNING + +⏳ WAITING - Session is running, not yet at breakpoint +``` +→ **Action**: PAUSE your tool calls (do NOT end the debugging workflow). Tell user: "Breakpoint set. Program is running but hasn't hit the breakpoint yet. Please trigger the relevant operation. Let me know when done, and I'll continue the analysis." + +**⚠️ IMPORTANT: This is NOT the end of debugging! The workflow is PAUSED, waiting for the breakpoint to be hit.** + +**State C: ❌ NO SESSION** +``` +❌ No active debug session found. +``` +→ **Action**: STOP calling tools. Tell user: "Please start a debug session first, or use vscjava.vscode-java-debug/debugJavaApplication to start one." + +### 2.3 Decision Matrix (STRICT!) + +| Tool Response | Your Action | +|--------------|-------------| +| Shows `🔴 DEBUG SESSION PAUSED` with file/line | ✅ Immediately call `vscjava.vscode-java-debug/evaluateDebugExpression` or `vscjava.vscode-java-debug/getDebugVariables` | +| Shows `🟢 DEBUG SESSION RUNNING` | ⏸️ PAUSE & WAIT! Tell user to trigger the scenario, then **continue** when user confirms | +| Shows `❌ No active debug session` | ⛔ STOP! Tell user to start debug session | + +**🚫 NEVER DO THIS:** +``` +vscjava.vscode-java-debug/getDebugSessionInfo() // Returns RUNNING +vscjava.vscode-java-debug/getDebugSessionInfo() // Still RUNNING +vscjava.vscode-java-debug/getDebugSessionInfo() // Still RUNNING... (LOOP!) +``` + +**✅ CORRECT BEHAVIOR:** +``` +vscjava.vscode-java-debug/getDebugSessionInfo() // Returns RUNNING +// PAUSE HERE! Tell user: "Waiting for breakpoint. Please trigger the scenario and let me know when done." +// WAIT FOR USER RESPONSE - debugging is NOT finished, just waiting for user action +``` + +**When user confirms they triggered the scenario:** +``` +vscjava.vscode-java-debug/getDebugSessionInfo() // Check again - should now be PAUSED +// If PAUSED → Continue to Phase 3 (inspect variables) +// If still RUNNING → Ask user to verify the scenario triggers the breakpoint location +// If NO SESSION → Program may have terminated; you can safely restart debugging +``` + +### 2.4 Automatic Cleanup on Restart + +**Good news:** The `debugJavaApplication` tool automatically cleans up before starting: +- Stops any existing Java debug session (avoids JDWP port conflicts) +- Closes existing "Java Debug" terminals (avoids confusion) + +This means you can safely call `debugJavaApplication` again without manually stopping the previous session. The tool handles cleanup for you. + +### 2.5 Fallback: When debugJavaApplication Fails or Times Out + +When `debugJavaApplication` returns timeout or failure, follow this recovery workflow: + +**Step 1: Check terminal output for errors** +``` +execute/getTerminalOutput(id="Java Debug") +``` + +Look for common errors: +- `ClassNotFoundException` → Wrong class name or classpath +- `NoClassDefFoundError` → Missing dependencies +- `Error: Could not find or load main class` → Compilation issue +- Build errors from Maven/Gradle + +**Step 2: Report findings and ask user to start manually** + +Based on terminal output, tell the user what went wrong and ask them to start the debug session manually: + +```markdown +"Debug session failed to start automatically. + +**Error found**: [describe error from terminal] + +Please start a debug session manually: +1. Fix the error above, OR +2. Use VS Code's 'Run and Debug' (F5) with your own launch configuration, OR +3. Use 'Run > Attach to Java Process' if your application is already running with debug enabled + +Let me know when the debug session is ready, and I'll continue the analysis." +``` + +**Step 3: Wait for user confirmation** + +⛔ **STOP HERE and end your response.** Wait for user to reply (e.g., "ready", "started", "continue"). + +**Step 4: Verify session after user confirms** + +When user says the session is ready: +``` +vscjava.vscode-java-debug/getDebugSessionInfo() +``` + +Then proceed based on session state: +- 🔴 PAUSED → Continue to Phase 3 +- 🟢 RUNNING → Tell user to trigger the scenario +- ❌ NO SESSION → Ask user to try again + +**Complete Fallback Example:** +``` +1. vscjava.vscode-java-debug/setJavaBreakpoint(filePath="App.java", lineNumber=25) + → ✓ Breakpoint set + +2. vscjava.vscode-java-debug/debugJavaApplication(target="App", workspacePath="...") + → ⚠️ Timeout: session not detected within 15 seconds + +3. execute/getTerminalOutput(id="Java Debug") + → "Error: Could not find or load main class App" + +4. Tell user: + "The debug session failed to start. Terminal shows: 'Could not find or load main class App'. + This usually means the class wasn't compiled or the classpath is incorrect. + + Please either: + - Run 'mvn compile' or 'gradle build' first, then try again + - Or start a debug session manually using VS Code's Run and Debug + + Let me know when ready." + +5. [STOP - Wait for user response] + +6. User: "ok, started" + +7. vscjava.vscode-java-debug/getDebugSessionInfo() + → 🔴 PAUSED at App.java:25 + +8. Continue with Phase 3 (hypothesis verification)... +``` + +--- + +## Phase 3: Dynamic Verification (Hypothesis Testing) + +### 3.1 TARGETED Inspection (Don't Dump Everything!) + +❌ **BAD** - Dumping all variables: +``` +vscjava.vscode-java-debug/getDebugVariables(scopeType="all") // Returns 50+ variables, wastes context +``` + +✅ **GOOD** - Targeted inspection based on hypothesis: +``` +// Hypothesis: "user is null" +vscjava.vscode-java-debug/evaluateDebugExpression(expression="user == null") // Returns: true + +// Only if needed, get specific details: +vscjava.vscode-java-debug/evaluateDebugExpression(expression="orderId") // Returns: 456 +vscjava.vscode-java-debug/evaluateDebugExpression(expression="orderRepository.findById(orderId).isPresent()") // Returns: false +``` + +### 3.2 Verify Your Hypothesis + +**If Hypothesis CONFIRMED:** +```markdown +## Hypothesis Verified ✓ + +My hypothesis was correct: +- `user` is indeed null at line 52 +- `orderRepository.findById(456)` returns Optional.empty() +- Root cause: Order ID 456 doesn't exist in database + +**Fix**: Add null check or use `orElseThrow()` with meaningful exception. +``` +→ Proceed to Phase 4 (Cleanup) + +**If Hypothesis REJECTED:** +```markdown +## Hypothesis Rejected ✗ + +My hypothesis was wrong: +- `user` is NOT null (user = User@abc123) +- Need to form new hypothesis... + +**New Hypothesis**: The NPE occurs inside `user.getOrders()` because `orders` list is null. +``` +→ Remove old breakpoint, set new one, loop back to Phase 2 + +### 3.3 Step Strategically (Not Aimlessly!) + +Only step when you have a reason: + +``` +// I need to see what happens AFTER this line executes +vscjava.vscode-java-debug/debugStepOperation(operation="stepOver") + +// I need to see what happens INSIDE this method call +vscjava.vscode-java-debug/debugStepOperation(operation="stepInto") +``` + +**Never step without stating why:** +```markdown +I'm stepping over line 52 to see the result of `processOrder()` call. +After this step, I'll check if `result` is null. +``` + +--- + +## Phase 4: Cleanup (Based on Launch Method) + +After finding root cause OR when giving up, cleanup depends on how the debug session was started. + +Check the `Launch Method` field from `vscjava.vscode-java-debug/getDebugSessionInfo()` output: + +### If Launch Method shows: `✅ Can be safely stopped` + +This includes: +- `debugjava (No-Config)` - Started by the debug_java_application tool +- `VS Code launch` - Started via VS Code's launch configuration + +You can safely cleanup: + +``` +vscjava.vscode-java-debug/removeJavaBreakpoints() +vscjava.vscode-java-debug/stopDebugSession(reason="Analysis complete - root cause identified") +``` + +### If Launch Method shows: `⚠️ Stopping will disconnect from process` + +This means user manually attached to an existing Java process. + +**Do NOT cleanup.** Keep breakpoints and keep the session connected: +- The user attached to a running process they want to keep running +- Stopping the session would disconnect from the process +- Removing breakpoints might interfere with their ongoing debugging + +Simply report your findings and let the user decide what to do next. + +--- + +## Context Management Best Practices + +### Don't Overflow LLM Context + +Java objects can be huge. Use targeted evaluation: + +| Instead of... | Use... | +|--------------|--------| +| `vscjava.vscode-java-debug/getDebugVariables(scopeType="all")` | `vscjava.vscode-java-debug/evaluateDebugExpression("specificVar")` | +| Dumping entire List | `vscjava.vscode-java-debug/evaluateDebugExpression("list.size()")` then `vscjava.vscode-java-debug/evaluateDebugExpression("list.get(0)")` | +| Viewing entire object | `vscjava.vscode-java-debug/evaluateDebugExpression("obj.getClass().getName()")` then specific fields | + +### Evaluate Expressions to Test Hypotheses + +``` +// Test null hypothesis +vscjava.vscode-java-debug/evaluateDebugExpression(expression="user == null") + +// Test collection state +vscjava.vscode-java-debug/evaluateDebugExpression(expression="orders != null && !orders.isEmpty()") + +// Test calculation +vscjava.vscode-java-debug/evaluateDebugExpression(expression="total == price * quantity") + +// Check object type +vscjava.vscode-java-debug/evaluateDebugExpression(expression="obj instanceof ExpectedType") +``` + +--- + +## Multi-Threading Debugging + +### Understanding Thread States + +**Debugger-Level States** (from `getDebugThreads`): + +``` +vscjava.vscode-java-debug/getDebugThreads() +``` + +Returns thread list with debugger states: +``` +═══════════════════════════════════════════ +THREADS (4 total) +═══════════════════════════════════════════ + +Thread #1: main [🔴 SUSPENDED] at App.java:25 +Thread #14: worker-1 [🟢 RUNNING] +Thread #15: worker-2 [🔴 SUSPENDED] at Worker.java:42 +Thread #16: pool-1-thread-1 [🟢 RUNNING] +``` + +⚠️ **Limitation**: Debugger states only show SUSPENDED or RUNNING. Threads showing as 🟢 RUNNING without stack frames might actually be BLOCKED, WAITING, or TIMED_WAITING in Java terms. + +### Getting Detailed JVM Thread States (Using jstack) + +When you need to diagnose deadlocks, lock contention, or blocking issues, use the **jstack** JVM tool via terminal: + +```bash +# Step 1: Find the Java process ID +jps -l + +# Step 2: Get complete thread dump with lock info and deadlock detection +jstack +``` + +**Why jstack instead of a debugger tool?** +- ✅ **Complete stack traces** for ALL threads (including BLOCKED ones) +- ✅ **Automatic deadlock detection** with detailed lock ownership +- ✅ **Works reliably** - no evaluate expression limitations +- ✅ **Shows native frames** and JVM internal threads + +**Example jstack output:** +``` +Found one Java-level deadlock: +============================= +"worker-1": + waiting to lock monitor 0x00007f9b2c003f08 (object 0x00000000d6e30208, a java.lang.Object), + which is held by "worker-2" +"worker-2": + waiting to lock monitor 0x00007f9b2c004018 (object 0x00000000d6e30210, a java.lang.Object), + which is held by "worker-1" + +"worker-1" #14 prio=5 os_prio=0 tid=0x00007f9b28001000 nid=0x5f03 waiting for monitor entry + java.lang.Thread.State: BLOCKED (on object monitor) + at com.example.Service.methodA(Service.java:30) + - waiting to lock <0x00000000d6e30208> (a java.lang.Object) + - locked <0x00000000d6e30210> (a java.lang.Object) + at com.example.Worker.run(Worker.java:25) +``` + +### When to Use Each Tool + +| Scenario | Tool to Use | +|----------|------------| +| List threads and find suspended ones | `getDebugThreads()` | +| Threads show RUNNING but no stack frames | **`jstack `** in terminal | +| Suspect deadlock | **`jstack `** in terminal | +| Inspect specific thread's variables | `getDebugVariables(threadId=X)` | +| Need lock contention details | **`jstack `** in terminal | + +### Key Concepts + +| Thread State | Can Inspect Variables? | Can Evaluate Expressions? | +|--------------|------------------------|---------------------------| +| 🔴 SUSPENDED | ✅ Yes | ✅ Yes | +| 🟢 RUNNING | ❌ No | ❌ No | + +**Only SUSPENDED threads can be inspected!** + +### Inspecting Specific Threads + +``` +// Inspect variables in thread #15 (worker-2) +vscjava.vscode-java-debug/getDebugVariables(threadId=15) + +// Get stack trace of thread #1 (main) +vscjava.vscode-java-debug/getDebugStackTrace(threadId=1) + +// Evaluate expression in thread #15's context +vscjava.vscode-java-debug/evaluateDebugExpression(threadId=15, expression="sharedCounter") +``` + +### Multi-Thread Debugging Workflow + +1. **List all threads and identify suspended ones:** + ``` + vscjava.vscode-java-debug/getDebugThreads() + → Find threads with 🔴 SUSPENDED status + ``` + +2. **Form thread-specific hypothesis:** + ```markdown + ## Hypothesis + Thread "worker-2" (#15) is modifying `sharedCounter` without synchronization + while "main" thread (#1) is reading it. + ``` + +3. **Inspect each suspended thread:** + ``` + // Check main thread's view + vscjava.vscode-java-debug/evaluateDebugExpression(threadId=1, expression="sharedCounter") + → Result: 42 + + // Check worker-2's view + vscjava.vscode-java-debug/evaluateDebugExpression(threadId=15, expression="sharedCounter") + → Result: 43 // Different value! Race condition confirmed! + ``` + +4. **Step specific thread:** + ``` + vscjava.vscode-java-debug/debugStepOperation(operation="stepOver", threadId=15) + ``` + +### Common Multi-Threading Bugs + +| Bug Type | What to Look For | Diagnostic Tool | +|----------|------------------|-----------------| +| Race Condition | Same variable has different values in different threads | `getDebugVariables` on each thread | +| Deadlock | Multiple threads stuck, program hangs | **`jstack `** in terminal | +| Thread Starvation | One thread always RUNNING, others stuck | **`jstack `** in terminal | +| Lock Contention | Threads waiting for same lock | **`jstack `** in terminal | +| Memory Visibility | Thread sees stale value (check `volatile` keyword) | `evaluateDebugExpression` | + +### Deadlock Diagnosis Workflow + +**Use jstack for reliable deadlock detection:** + +``` +=== STEP 1: Detect the hang === +User: "Program seems frozen/stuck" + +=== STEP 2: Find the Java process === +Run in terminal: +$ jps -l +12345 com.example.MainApp ← This is the target PID + +=== STEP 3: Get thread dump === +Run in terminal: +$ jstack 12345 + +=== STEP 4: jstack automatically detects deadlock === +Found one Java-level deadlock: +============================= +"worker-1": + waiting to lock monitor 0x00007f9b2c003f08 (a java.lang.Object), + which is held by "worker-2" +"worker-2": + waiting to lock monitor 0x00007f9b2c004018 (a java.lang.Object), + which is held by "worker-1" + +Java stack information for the threads listed above: +=================================================== +"worker-1": + at com.example.Service.methodA(Service.java:30) + - waiting to lock <0x00000000d6e30208> (a java.lang.Object) + - locked <0x00000000d6e30210> (a java.lang.Object) + +"worker-2": + at com.example.Service.methodB(Service.java:50) + - waiting to lock <0x00000000d6e30210> (a java.lang.Object) + - locked <0x00000000d6e30208> (a java.lang.Object) + +=== STEP 5: Analyze the deadlock === +Diagnosis: Classic deadlock! +- worker-1 holds lock @210, wants lock @208 +- worker-2 holds lock @208, wants lock @210 +- Circular wait = DEADLOCK + +=== STEP 6: Report fix === +Fix: Ensure consistent lock ordering - always acquire locks in same order +``` + +### Alternative Thread Dump Methods + +If jstack is not available, use these alternatives: + +**Option 1: JConsole/VisualVM** +```bash +# Launch JConsole +jconsole +# Connect to the Java process → Go to "Threads" tab → "Detect Deadlock" +``` + +**Option 2: Add diagnostic code** +```java +// Add before suspected deadlock area +Thread.dumpStack(); +// Or for full dump: +ManagementFactory.getThreadMXBean().dumpAllThreads(true, true); +``` + +### Key Thread States in jstack Output + +| State | Meaning | +|-------|---------| +| `BLOCKED (on object monitor)` | Thread waiting for a monitor lock - **potential deadlock** | +| `WAITING (on object monitor)` | Thread waiting for notification (wait()) | +| `TIMED_WAITING (sleeping/parking)` | Thread waiting with timeout | +| `RUNNABLE` | Thread running or ready to run | + +--- + +## Example: Complete Hypothesis-Driven Debug Session + +``` +User: "Getting NPE when calling OrderService.processOrder()" + +=== PHASE 1: STATIC ANALYSIS === + +1. Read code: + search/codebase("OrderService processOrder") + readFile("OrderService.java") + +2. Form hypothesis: + "Looking at line 52: `order.getItems().forEach(...)` - I hypothesize that + either `order` is null OR `order.getItems()` returns null. + + I'll verify by checking both conditions at line 52." + +=== PHASE 2: SETUP === + +3. Set breakpoint: + vscjava.vscode-java-debug/setJavaBreakpoint(filePath="OrderService.java", lineNumber=52) + +4. Check session: + vscjava.vscode-java-debug/getDebugSessionInfo() + → ❌ No session + + "Breakpoint set. Please trigger the failing scenario." + +[User triggers scenario, breakpoint hits] + +5. Verify location: + vscjava.vscode-java-debug/getDebugSessionInfo() + → 🔴 PAUSED at OrderService.java:52 ✓ + +=== PHASE 3: DYNAMIC VERIFICATION === + +6. Test hypothesis with TARGETED evaluation: + vscjava.vscode-java-debug/evaluateDebugExpression(expression="order == null") + → false (order is NOT null) + + vscjava.vscode-java-debug/evaluateDebugExpression(expression="order.getItems() == null") + → true ✓ FOUND IT! + +7. Gather supporting evidence: + vscjava.vscode-java-debug/evaluateDebugExpression(expression="order.getId()") + → 456 + + vscjava.vscode-java-debug/evaluateDebugExpression(expression="order.getStatus()") + → "PENDING" + +8. Report: + "## Root Cause Found + + **Hypothesis CONFIRMED**: `order.getItems()` returns null for order 456. + + The order exists but its `items` field was never initialized. + This happens for orders with status='PENDING' before items are added. + + **Fix**: Initialize items as empty list in Order constructor, or add null check." + +=== PHASE 4: CLEANUP (for launch sessions only) === + +9. Check session type and cleanup if needed: + vscjava.vscode-java-debug/getDebugSessionInfo() // Check Launch Method field + + // If Launch Method shows "✅ Can be safely stopped": + vscjava.vscode-java-debug/removeJavaBreakpoints() + vscjava.vscode-java-debug/stopDebugSession(reason="Root cause identified - items field is null") + + // If Launch Method shows "⚠️ Stopping will disconnect": + // Do NOT cleanup - just report findings +``` + +--- + +## What NOT To Do + +❌ **Don't debug without a hypothesis:** +``` +// BAD - aimless debugging +vscjava.vscode-java-debug/setJavaBreakpoint(filePath="...", lineNumber=1) // Why line 1? +vscjava.vscode-java-debug/getDebugVariables(scopeType="all") // Looking for what? +``` + +❌ **Don't dump all variables:** +``` +// BAD - context overflow +vscjava.vscode-java-debug/getDebugVariables(scopeType="all") // 100+ variables +``` + +❌ **Don't step aimlessly:** +``` +// BAD - stepping without purpose +vscjava.vscode-java-debug/debugStepOperation(operation="stepOver") +vscjava.vscode-java-debug/debugStepOperation(operation="stepOver") +vscjava.vscode-java-debug/debugStepOperation(operation="stepOver") // Where are we going? +``` + +✅ **DO: Hypothesis-driven, targeted debugging:** +``` +// GOOD +"Hypothesis: user is null at line 52" +vscjava.vscode-java-debug/setJavaBreakpoint(filePath="Service.java", lineNumber=52) +vscjava.vscode-java-debug/evaluateDebugExpression(expression="user == null") // Verify hypothesis +``` + +--- + +## Remember + +1. **Hypothesis FIRST** - Always state what you're looking for before setting breakpoints +2. **Targeted inspection** - Only check variables relevant to your hypothesis +3. **Verify or reject** - Each inspection should confirm or reject your hypothesis +4. **Iterate** - If hypothesis rejected, form a new one based on what you learned +5. **Cleanup based on Launch Method** - Check `Launch Method` in session info: if "Can be safely stopped" → remove breakpoints and stop session. If "Stopping will disconnect" → do NOT cleanup (keep breakpoints, keep session connected) diff --git a/bundled/agents/images/agent-working.png b/bundled/agents/images/agent-working.png new file mode 100644 index 00000000..affe97bd Binary files /dev/null and b/bundled/agents/images/agent-working.png differ diff --git a/bundled/agents/images/invoke-agent.png b/bundled/agents/images/invoke-agent.png new file mode 100644 index 00000000..e9c46cce Binary files /dev/null and b/bundled/agents/images/invoke-agent.png differ diff --git a/bundled/agents/images/javadebug.png b/bundled/agents/images/javadebug.png new file mode 100644 index 00000000..60f631f3 Binary files /dev/null and b/bundled/agents/images/javadebug.png differ diff --git a/bundled/scripts/noConfigScripts/README.md b/bundled/scripts/noConfigScripts/README.md new file mode 100644 index 00000000..021f0553 --- /dev/null +++ b/bundled/scripts/noConfigScripts/README.md @@ -0,0 +1,102 @@ +# Java No-Config Debug + +This feature enables configuration-less debugging for Java applications, similar to the JavaScript Debug Terminal in VS Code. + +## How It Works + +When you open a terminal in VS Code with this extension installed, the following environment variables are automatically set: + +- `VSCODE_JDWP_ADAPTER_ENDPOINTS`: Path to a communication file for port exchange +- `PATH`: Includes the `debugjava` command wrapper + +Note: `JAVA_TOOL_OPTIONS` is NOT set globally to avoid affecting other Java tools (javac, maven, gradle). Instead, it's set only when you run the `debugjava` command. + +## Usage + +### Basic Usage + +Instead of running: +```bash +java -cp . com.example.Main +``` + +Simply run: +```bash +debugjava -cp . com.example.Main +``` + +The debugger will automatically attach, and breakpoints will work without any launch.json configuration! + +### Maven Projects + +```bash +debugjava -jar target/myapp.jar +``` + +### Gradle Projects + +```bash +debugjava -jar build/libs/myapp.jar +``` + +### With Arguments + +```bash +debugjava -cp . com.example.Main arg1 arg2 --flag=value +``` + +### Spring Boot + +```bash +debugjava -jar myapp.jar --spring.profiles.active=dev +``` + +## Advantages + +1. **No Configuration Required**: No need to create or maintain launch.json +2. **Rapid Prototyping**: Perfect for quick debugging sessions +3. **Script Debugging**: Debug applications launched by complex shell scripts +4. **Environment Consistency**: Inherits all terminal environment variables +5. **Parameter Flexibility**: Easy to change arguments using terminal history (↑ key) + +## How It Works Internally + +1. When you run `debugjava`, the wrapper script temporarily sets `JAVA_TOOL_OPTIONS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=0` +2. The wrapper determines which Java executable to use (priority order): + - First: `JAVA_HOME/bin/java` if JAVA_HOME environment variable is set (user's explicit choice) + - Second: `VSCODE_JAVA_EXEC` environment variable (Java path from VS Code's Java Language Server) + - Third: `java` command from system PATH +3. The wrapper launches the Java process with JDWP enabled +4. JVM starts and outputs: "Listening for transport dt_socket at address: 12345" +5. The wrapper captures the JDWP port from this output +6. The port is written to a communication file +7. VS Code's file watcher detects the file and automatically starts an attach debug session + +## Troubleshooting + +### Port Already in Use + +If you see "Address already in use", another Java debug session is running. Terminate it first. + +### No Breakpoints Hit + +1. Ensure you're running with `debugjava` command (not plain `java`) +2. Check that the `debugjava` command is available: `which debugjava` (Unix) or `Get-Command debugjava` (PowerShell) +3. Verify the terminal was opened AFTER the extension activated +4. Check the Debug Console for error messages + +### Node.js Not Found + +The wrapper script requires Node.js to be installed and available in PATH. + +## Limitations + +- Requires Node.js to be installed and available in PATH +- Only works in terminals opened within VS Code +- Requires using the `debugjava` command instead of `java` +- The Java process will suspend (hang) until the debugger attaches + +## See Also + +- [Debugger for Java Documentation](https://github.com/microsoft/vscode-java-debug) +- [JDWP Documentation](https://docs.oracle.com/javase/8/docs/technotes/guides/jpda/jdwp-spec.html) diff --git a/bundled/scripts/noConfigScripts/debugjava b/bundled/scripts/noConfigScripts/debugjava new file mode 100644 index 00000000..881a9211 --- /dev/null +++ b/bundled/scripts/noConfigScripts/debugjava @@ -0,0 +1,12 @@ +#!/bin/bash +# Java No-Config Debug Wrapper Script for Unix/Linux/macOS +# This script intercepts java commands and automatically enables JDWP debugging + +# Get the directory of this script +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +# Set environment variables only for the node process, not the current shell +# This ensures JAVA_TOOL_OPTIONS doesn't affect subsequent commands in the terminal +JDWP_ADAPTER_ENDPOINTS=$VSCODE_JDWP_ADAPTER_ENDPOINTS \ +JAVA_TOOL_OPTIONS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=0" \ +exec node "$SCRIPT_DIR/jdwp-wrapper.js" "$@" diff --git a/bundled/scripts/noConfigScripts/debugjava.bat b/bundled/scripts/noConfigScripts/debugjava.bat new file mode 100644 index 00000000..3606188c --- /dev/null +++ b/bundled/scripts/noConfigScripts/debugjava.bat @@ -0,0 +1,19 @@ +@echo off +REM Java No-Config Debug Wrapper Script for Windows +REM This script intercepts java commands and automatically enables JDWP debugging + +REM Use setlocal to ensure environment variables don't persist after this script exits +setlocal + +REM Export the endpoint file path for JDWP port communication +set JDWP_ADAPTER_ENDPOINTS=%VSCODE_JDWP_ADAPTER_ENDPOINTS% + +REM Set JDWP options only for this debugjava invocation +REM This overrides the global JAVA_TOOL_OPTIONS to avoid affecting other Java processes +set JAVA_TOOL_OPTIONS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=0 + +REM Use Node.js wrapper to capture JDWP port +node "%~dp0jdwp-wrapper.js" %* + +REM endlocal is implicit at script exit, but we can call it explicitly for clarity +endlocal diff --git a/bundled/scripts/noConfigScripts/debugjava.fish b/bundled/scripts/noConfigScripts/debugjava.fish new file mode 100644 index 00000000..47d7cf75 --- /dev/null +++ b/bundled/scripts/noConfigScripts/debugjava.fish @@ -0,0 +1,12 @@ +#!/usr/bin/env fish +# Java No-Config Debug Wrapper Script for Fish Shell +# This script intercepts java commands and automatically enables JDWP debugging + +# Get the directory of this script +set script_dir (dirname (status -f)) + +# Set environment variables only for the node process, not the current shell +# This ensures JAVA_TOOL_OPTIONS doesn't affect subsequent commands in the terminal +env JDWP_ADAPTER_ENDPOINTS=$VSCODE_JDWP_ADAPTER_ENDPOINTS \ + JAVA_TOOL_OPTIONS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=0" \ + node "$script_dir/jdwp-wrapper.js" $argv diff --git a/bundled/scripts/noConfigScripts/debugjava.ps1 b/bundled/scripts/noConfigScripts/debugjava.ps1 new file mode 100644 index 00000000..0404a860 --- /dev/null +++ b/bundled/scripts/noConfigScripts/debugjava.ps1 @@ -0,0 +1,32 @@ +# Java No-Config Debug Wrapper Script for PowerShell +# This script intercepts java commands and automatically enables JDWP debugging + +# Get the directory of this script +$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path + +# Save current environment variables to restore later +$oldJavaToolOptions = $env:JAVA_TOOL_OPTIONS +$oldJdwpAdapterEndpoints = $env:JDWP_ADAPTER_ENDPOINTS + +try { + # Set environment variables only for this debugjava invocation + $env:JDWP_ADAPTER_ENDPOINTS = $env:VSCODE_JDWP_ADAPTER_ENDPOINTS + $env:JAVA_TOOL_OPTIONS = "-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=0" + + # Use Node.js wrapper to capture JDWP port + & node (Join-Path $scriptDir "jdwp-wrapper.js") $args +} +finally { + # Restore original environment variables to avoid affecting subsequent commands + if ($null -eq $oldJavaToolOptions) { + Remove-Item Env:\JAVA_TOOL_OPTIONS -ErrorAction SilentlyContinue + } else { + $env:JAVA_TOOL_OPTIONS = $oldJavaToolOptions + } + + if ($null -eq $oldJdwpAdapterEndpoints) { + Remove-Item Env:\JDWP_ADAPTER_ENDPOINTS -ErrorAction SilentlyContinue + } else { + $env:JDWP_ADAPTER_ENDPOINTS = $oldJdwpAdapterEndpoints + } +} diff --git a/bundled/scripts/noConfigScripts/jdwp-wrapper.js b/bundled/scripts/noConfigScripts/jdwp-wrapper.js new file mode 100644 index 00000000..cae86170 --- /dev/null +++ b/bundled/scripts/noConfigScripts/jdwp-wrapper.js @@ -0,0 +1,144 @@ +#!/usr/bin/env node +/** + * JDWP Port Listener and Communication Wrapper + * + * This script wraps Java process execution and captures the JDWP port + * from the JVM output, then writes it to the endpoint file for VS Code + * to pick up and attach the debugger. + * + * JDWP Output Format: + * "Listening for transport dt_socket at address: 12345" + */ + +const { spawn } = require('child_process'); +const fs = require('fs'); +const path = require('path'); + +// Get environment variables +const endpointFile = process.env.JDWP_ADAPTER_ENDPOINTS || process.env.VSCODE_JDWP_ADAPTER_ENDPOINTS; +const javaToolOptions = process.env.JAVA_TOOL_OPTIONS || ''; + +// Check if debugging is enabled +const isDebugEnabled = javaToolOptions.includes('jdwp') && endpointFile; + +// Helper function to find java command +function getJavaCommand() { + // Priority 1: Try JAVA_HOME environment variable first (user's explicit choice) + const javaHome = process.env.JAVA_HOME; + if (javaHome) { + const javaPath = path.join(javaHome, 'bin', 'java'); + const javaPathExe = process.platform === 'win32' ? `${javaPath}.exe` : javaPath; + + // Check if the file exists + if (fs.existsSync(javaPathExe)) { + return javaPath; + } + if (fs.existsSync(javaPath)) { + return javaPath; + } + + console.warn(`[Java Debug] JAVA_HOME is set to '${javaHome}', but java command not found there. Falling back to VS Code's Java.`); + } + + // Priority 2: Use VSCODE_JAVA_EXEC if provided by VS Code (from Java Language Server) + const vscodeJavaExec = process.env.VSCODE_JAVA_EXEC; + if (vscodeJavaExec && fs.existsSync(vscodeJavaExec)) { + return vscodeJavaExec; + } + + // Priority 3: Fall back to 'java' in PATH + return 'java'; +} + +const javaCmd = getJavaCommand(); + +// Helper function to setup signal handlers for graceful termination +function setupSignalHandlers(child) { + const signals = ['SIGINT', 'SIGTERM']; + signals.forEach(signal => { + process.on(signal, () => { + child.kill(signal); + }); + }); +} + +if (!isDebugEnabled) { + // No debugging, just run java normally + const child = spawn(javaCmd, process.argv.slice(2), { + stdio: 'inherit', + shell: false + }); + setupSignalHandlers(child); + // Use 'close' event to ensure stdio streams are closed before exiting + child.on('close', (code) => process.exit(code || 0)); + child.on('error', (err) => { + console.error(`[Java Debug] Failed to start java: ${err.message}`); + console.error(`[Java Debug] Make sure Java is installed and either JAVA_HOME is set correctly or 'java' is in your PATH.`); + process.exit(1); + }); +} else { + // Debugging enabled, capture JDWP port + const child = spawn(javaCmd, process.argv.slice(2), { + stdio: ['inherit', 'pipe', 'pipe'], + shell: false + }); + setupSignalHandlers(child); + + let portCaptured = false; + const jdwpPortRegex = /Listening for transport dt_socket at address:\s*(\d+)/; + + // Shared function to capture JDWP port from output + const capturePort = (output) => { + if (portCaptured) return; + + const match = output.match(jdwpPortRegex); + if (match && match[1]) { + const port = parseInt(match[1], 10); + + // Validate port range + if (port < 1 || port > 65535) { + console.error(`[Java Debug] Invalid port number: ${port}`); + return; + } + + console.log(`[Java Debug] Captured JDWP port: ${port}`); + + // Write port to endpoint file + const endpointData = JSON.stringify({ + client: { + host: 'localhost', + port: port + } + }); + + try { + fs.writeFileSync(endpointFile, endpointData, 'utf8'); + console.log(`[Java Debug] Wrote endpoint file: ${endpointFile}`); + portCaptured = true; + } catch (err) { + console.error(`[Java Debug] Failed to write endpoint file: ${err}`); + } + } + }; + + // Monitor stdout for JDWP port + child.stdout.on('data', (data) => { + const output = data.toString(); + process.stdout.write(data); + capturePort(output); + }); + + // Monitor stderr for JDWP port (it might appear on stderr) + child.stderr.on('data', (data) => { + const output = data.toString(); + process.stderr.write(data); + capturePort(output); + }); + + // Use 'close' event to ensure stdio streams are closed before exiting + child.on('close', (code) => process.exit(code || 0)); + child.on('error', (err) => { + console.error(`[Java Debug] Failed to start java: ${err}`); + process.exit(1); + }); +} diff --git a/gulpfile.js b/gulpfile.js deleted file mode 100644 index c207429f..00000000 --- a/gulpfile.js +++ /dev/null @@ -1,36 +0,0 @@ -const gulp = require("gulp"); -const cp = require('child_process'); -const tslint = require("gulp-tslint"); - -const server_dir = '../java-debug'; - -gulp.task("tslint", () => { - return gulp.src(["**/*.ts", "!**/*.d.ts", "!node_modules/**", "!./src/views/node_modules/**"]) - .pipe(tslint()) - .pipe(tslint.report()); -}); - -gulp.task('build_server', () => { - cp.execSync(mvnw() + ' clean package', { - cwd: server_dir, - stdio: [0, 1, 2] - }); - return gulp.src(server_dir + '/com.microsoft.java.debug.plugin/target/com.microsoft.java.debug.*.jar') - .pipe(gulp.dest('./server')); -}); - -function isWin() { - return /^win/.test(process.platform); -} - -function isMac() { - return /^darwin/.test(process.platform); -} - -function isLinux() { - return /^linux/.test(process.platform); -} - -function mvnw() { - return isWin() ? "mvnw.cmd" : "./mvnw"; -} diff --git a/images/commands/hot_code_replace.svg b/images/commands/hot_code_replace.svg new file mode 100644 index 00000000..3e070476 --- /dev/null +++ b/images/commands/hot_code_replace.svg @@ -0,0 +1,13 @@ + + + + +lightning +Created with Sketch. + + + + diff --git a/images/33868694-673f14b0-df3f-11e7-9983-b3cff5842020.gif b/images/docs/33868694-673f14b0-df3f-11e7-9983-b3cff5842020.gif similarity index 100% rename from images/33868694-673f14b0-df3f-11e7-9983-b3cff5842020.gif rename to images/docs/33868694-673f14b0-df3f-11e7-9983-b3cff5842020.gif diff --git a/images/34507770-69597114-f074-11e7-8f32-027ad1d7a4fd.gif b/images/docs/34507770-69597114-f074-11e7-8f32-027ad1d7a4fd.gif similarity index 100% rename from images/34507770-69597114-f074-11e7-8f32-027ad1d7a4fd.gif rename to images/docs/34507770-69597114-f074-11e7-8f32-027ad1d7a4fd.gif diff --git a/images/37269785-0ffef8e6-2607-11e8-955f-93548ad5a0ad.gif b/images/docs/37269785-0ffef8e6-2607-11e8-955f-93548ad5a0ad.gif similarity index 100% rename from images/37269785-0ffef8e6-2607-11e8-955f-93548ad5a0ad.gif rename to images/docs/37269785-0ffef8e6-2607-11e8-955f-93548ad5a0ad.gif diff --git a/images/41949312-77627a40-79f3-11e8-9fd2-def4fa06e28d.gif b/images/docs/41949312-77627a40-79f3-11e8-9fd2-def4fa06e28d.gif similarity index 100% rename from images/41949312-77627a40-79f3-11e8-9fd2-def4fa06e28d.gif rename to images/docs/41949312-77627a40-79f3-11e8-9fd2-def4fa06e28d.gif diff --git a/images/docs/args.PNG b/images/docs/args.PNG new file mode 100644 index 00000000..fd2d6160 Binary files /dev/null and b/images/docs/args.PNG differ diff --git a/logo.png b/logo.png index a6135492..4e40f9ee 100644 Binary files a/logo.png and b/logo.png differ diff --git a/package-lock.json b/package-lock.json index 91bbdc67..46fe9962 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6788 +1,5707 @@ { - "name": "vscode-java-debug", - "version": "0.13.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@types/lodash": { - "version": "4.14.116", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.116.tgz", - "integrity": "sha512-lRnAtKnxMXcYYXqOiotTmJd74uawNWuPnsnPrrO7HiFuE3npE2iQhfABatbYDyxTNqZNuXzcKGhw37R7RjBFLg==", - "dev": true - }, - "@types/mocha": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.5.tgz", - "integrity": "sha512-lAVp+Kj54ui/vLUFxsJTMtWvZraZxum3w3Nwkble2dNuV5VnPA+Mi2oGX9XYJAaIvZi3tn3cbjS/qcJXRb6Bww==", - "dev": true - }, - "@types/node": { - "version": "8.10.22", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.22.tgz", - "integrity": "sha512-HCJ1dUJEQVFRekwBAlyv9pJ+2rzxq9uimSmsK2q7YDYMbXR3b4BXcO9rsN+36ZBwSWQ5BNh5o8xdZijDSonS5A==", - "dev": true - }, + "name": "vscode-java-debug", + "version": "0.58.5", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "vscode-java-debug", + "version": "0.58.5", + "license": "SEE LICENSE IN LICENSE.txt", + "dependencies": { + "compare-versions": "^4.1.4", + "dotenv": "^16.4.5", + "lodash": "^4.17.23", + "uuid": "^8.3.2", + "vscode-extension-telemetry-wrapper": "^0.14.0", + "vscode-languageclient": "6.0.0-next.9", + "vscode-languageserver-types": "3.16.0", + "vscode-tas-client": "^0.1.84" + }, + "devDependencies": { + "@types/glob": "^7.2.0", + "@types/lodash": "^4.17.13", + "@types/mocha": "^10.0.9", + "@types/node": "^14.18.63", + "@types/uuid": "^8.3.4", + "@types/vscode": "1.95.0", + "@vscode/test-electron": "^2.4.1", + "mocha": "^10.8.2", + "ts-loader": "^9.5.1", + "tslint": "^6.1.3", + "typescript": "^4.9.5", + "webpack": "^5.105.0", + "webpack-cli": "^4.10.0" + }, + "engines": { + "vscode": "^1.95.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@microsoft/1ds-core-js": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@microsoft/1ds-core-js/-/1ds-core-js-4.3.4.tgz", + "integrity": "sha512-3gbDUQgAO8EoyQTNcAEkxpuPnioC0May13P1l1l0NKZ128L9Ts/sj8QsfwCRTjHz0HThlA+4FptcAJXNYUy3rg==", + "dependencies": { + "@microsoft/applicationinsights-core-js": "3.3.4", + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.3", + "@nevware21/ts-async": ">= 0.5.2 < 2.x", + "@nevware21/ts-utils": ">= 0.11.3 < 2.x" + } + }, + "node_modules/@microsoft/1ds-post-js": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@microsoft/1ds-post-js/-/1ds-post-js-4.3.4.tgz", + "integrity": "sha512-nlKjWricDj0Tn68Dt0P8lX9a+X7LYrqJ6/iSfQwMfDhRIGLqW+wxx8gxS+iGWC/oc8zMQAeiZaemUpCwQcwpRQ==", + "dependencies": { + "@microsoft/1ds-core-js": "4.3.4", + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.3", + "@nevware21/ts-async": ">= 0.5.2 < 2.x", + "@nevware21/ts-utils": ">= 0.11.3 < 2.x" + } + }, + "node_modules/@microsoft/applicationinsights-channel-js": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-channel-js/-/applicationinsights-channel-js-3.3.4.tgz", + "integrity": "sha512-Z4nrxYwGKP9iyrYtm7iPQXVOFy4FsEsX0nDKkAi96Qpgw+vEh6NH4ORxMMuES0EollBQ3faJyvYCwckuCVIj0g==", + "dependencies": { + "@microsoft/applicationinsights-common": "3.3.4", + "@microsoft/applicationinsights-core-js": "3.3.4", + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.3", + "@nevware21/ts-async": ">= 0.5.2 < 2.x", + "@nevware21/ts-utils": ">= 0.11.3 < 2.x" + }, + "peerDependencies": { + "tslib": ">= 1.0.0" + } + }, + "node_modules/@microsoft/applicationinsights-common": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-common/-/applicationinsights-common-3.3.4.tgz", + "integrity": "sha512-4ms16MlIvcP4WiUPqopifNxcWCcrXQJ2ADAK/75uok2mNQe6ZNRsqb/P+pvhUxc8A5HRlvoXPP1ptDSN5Girgw==", + "dependencies": { + "@microsoft/applicationinsights-core-js": "3.3.4", + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.3", + "@nevware21/ts-utils": ">= 0.11.3 < 2.x" + }, + "peerDependencies": { + "tslib": ">= 1.0.0" + } + }, + "node_modules/@microsoft/applicationinsights-core-js": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-core-js/-/applicationinsights-core-js-3.3.4.tgz", + "integrity": "sha512-MummANF0mgKIkdvVvfmHQTBliK114IZLRhTL0X0Ep+zjDwWMHqYZgew0nlFKAl6ggu42abPZFK5afpE7qjtYJA==", + "dependencies": { + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.3", + "@nevware21/ts-async": ">= 0.5.2 < 2.x", + "@nevware21/ts-utils": ">= 0.11.3 < 2.x" + }, + "peerDependencies": { + "tslib": ">= 1.0.0" + } + }, + "node_modules/@microsoft/applicationinsights-shims": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-shims/-/applicationinsights-shims-3.0.1.tgz", + "integrity": "sha512-DKwboF47H1nb33rSUfjqI6ryX29v+2QWcTrRvcQDA32AZr5Ilkr7whOOSsD1aBzwqX0RJEIP1Z81jfE3NBm/Lg==", + "dependencies": { + "@nevware21/ts-utils": ">= 0.9.4 < 2.x" + } + }, + "node_modules/@microsoft/applicationinsights-web-basic": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-web-basic/-/applicationinsights-web-basic-3.3.4.tgz", + "integrity": "sha512-OpEPXr8vU/t/M8T9jvWJzJx/pCyygIiR1nGM/2PTde0wn7anl71Gxl5fWol7K/WwFEORNjkL3CEyWOyDc+28AA==", + "dependencies": { + "@microsoft/applicationinsights-channel-js": "3.3.4", + "@microsoft/applicationinsights-common": "3.3.4", + "@microsoft/applicationinsights-core-js": "3.3.4", + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.3", + "@nevware21/ts-async": ">= 0.5.2 < 2.x", + "@nevware21/ts-utils": ">= 0.11.3 < 2.x" + }, + "peerDependencies": { + "tslib": ">= 1.0.0" + } + }, + "node_modules/@microsoft/dynamicproto-js": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@microsoft/dynamicproto-js/-/dynamicproto-js-2.0.3.tgz", + "integrity": "sha512-JTWTU80rMy3mdxOjjpaiDQsTLZ6YSGGqsjURsY6AUQtIj0udlF/jYmhdLZu8693ZIC0T1IwYnFa0+QeiMnziBA==", + "dependencies": { + "@nevware21/ts-utils": ">= 0.10.4 < 2.x" + } + }, + "node_modules/@nevware21/ts-async": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@nevware21/ts-async/-/ts-async-0.5.3.tgz", + "integrity": "sha512-UsF7eerLsVfid7iV1oXF80qXBwHNBeqSqfh/nPZgirRU1MACmSsj83EZKS2ViFHVfSGG6WIuXMGBP6KciXfYhA==", + "dependencies": { + "@nevware21/ts-utils": ">= 0.11.5 < 2.x" + } + }, + "node_modules/@nevware21/ts-utils": { + "version": "0.11.5", + "resolved": "https://registry.npmjs.org/@nevware21/ts-utils/-/ts-utils-0.11.5.tgz", + "integrity": "sha512-7nIzWKR50mf3htOg53kwPLqD5iJaRfVyBvb1NJhlIncyP1WzK8vAQbU9rqIsRtv7td1CnqspdP6IWNEjOjaeug==" + }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true + }, + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/lodash": { + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.13.tgz", + "integrity": "sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==", + "dev": true + }, + "node_modules/@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true + }, + "node_modules/@types/mocha": { + "version": "10.0.9", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.9.tgz", + "integrity": "sha512-sicdRoWtYevwxjOHNMPTl3vSfJM6oyW8o1wXeI7uww6b6xHg8eBznQDNSGBCDJmsE8UMxP05JgZRtsKbTqt//Q==", + "dev": true + }, + "node_modules/@types/node": { + "version": "14.18.63", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz", + "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==", + "dev": true + }, + "node_modules/@types/uuid": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", + "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", + "dev": true + }, + "node_modules/@types/vscode": { + "version": "1.95.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.95.0.tgz", + "integrity": "sha512-0LBD8TEiNbet3NvWsmn59zLzOFu/txSlGxnv5yAFHCrhG9WvAnR3IvfHzMOs2aeWqgvNjq9pO99IUw8d3n+unw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vscode/extension-telemetry": { + "version": "0.9.7", + "resolved": "https://registry.npmjs.org/@vscode/extension-telemetry/-/extension-telemetry-0.9.7.tgz", + "integrity": "sha512-2GQbcfDUTg0QC1v0HefkHNwYrE5LYKzS3Zb0+uA6Qn1MBDzgiSh23ddOZF/JRqhqBFOG0mE70XslKSGQ5v9KwQ==", + "dependencies": { + "@microsoft/1ds-core-js": "^4.3.0", + "@microsoft/1ds-post-js": "^4.3.0", + "@microsoft/applicationinsights-web-basic": "^3.3.0" + }, + "engines": { + "vscode": "^1.75.0" + } + }, + "node_modules/@vscode/test-electron": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.4.1.tgz", + "integrity": "sha512-Gc6EdaLANdktQ1t+zozoBVRynfIsMKMc94Svu1QreOBC8y76x4tvaK32TljrLi1LI2+PK58sDVbL7ALdqf3VRQ==", + "dev": true, + "dependencies": { + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.5", + "jszip": "^3.10.1", + "ora": "^7.0.1", + "semver": "^7.6.2" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "dev": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", + "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", + "dev": true, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x", + "webpack-cli": "4.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", + "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", + "dev": true, + "dependencies": { + "envinfo": "^7.7.3" + }, + "peerDependencies": { + "webpack-cli": "4.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", + "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", + "dev": true, + "peerDependencies": { + "webpack-cli": "4.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "dev": true, + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "ansi-colors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", - "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", - "dev": true, - "requires": { - "ansi-wrap": "^0.1.0" - } - }, - "ansi-cyan": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", - "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-gray": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", - "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-red": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", - "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.19", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", + "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", + "dev": true, + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bl": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", + "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", + "dev": true, + "dependencies": { + "buffer": "^6.0.3", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001769", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001769.tgz", + "integrity": "sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "dev": true, + "dependencies": { + "restore-cursor": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/compare-versions": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-4.1.4.tgz", + "integrity": "sha512-FemMreK9xNyL8gQevsdRMrvO4lFCkQP7qbuktn1q8ndcNk1+0mz7lgE7b/sNvbhVgY4w6tMN1FDp6aADjqw2rw==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.5.286", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz", + "integrity": "sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true + }, + "node_modules/enhanced-resolve": { + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.19.0.tgz", + "integrity": "sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/envinfo": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.14.0.tgz", + "integrity": "sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==", + "dev": true, + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/es-module-lexer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", + "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", + "dev": true + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ] + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "dev": true, + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dev": true, + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/loader-runner": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", + "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", + "dev": true, + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mocha": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.8.2.tgz", + "integrity": "sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.3", + "browser-stdout": "^1.3.1", + "chokidar": "^3.5.3", + "debug": "^4.3.5", + "diff": "^5.2.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^8.1.0", + "he": "^1.2.0", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^5.1.6", + "ms": "^2.1.3", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^6.5.1", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9", + "yargs-unparser": "^2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-7.0.1.tgz", + "integrity": "sha512-0TUxTiFJWv+JnjWm4o9yvuskpEJLXTcng8MJuKd+SzAzp2o+OP3HWqNhB4OdJRt1Vsd9/mR0oyaEYlOnL7XIRw==", + "dev": true, + "dependencies": { + "chalk": "^5.3.0", + "cli-cursor": "^4.0.0", + "cli-spinners": "^2.9.0", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^1.3.0", + "log-symbols": "^5.1.0", + "stdin-discarder": "^0.1.0", + "string-width": "^6.1.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ora/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/log-symbols": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", + "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", + "dev": true, + "dependencies": { + "chalk": "^5.0.0", + "is-unicode-supported": "^1.1.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "dev": true, + "dependencies": { + "resolve": "^1.9.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/stdin-discarder": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.1.0.tgz", + "integrity": "sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==", + "dev": true, + "dependencies": { + "bl": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-6.1.0.tgz", + "integrity": "sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^10.2.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tas-client": { + "version": "0.2.33", + "resolved": "https://registry.npmjs.org/tas-client/-/tas-client-0.2.33.tgz", + "integrity": "sha512-V+uqV66BOQnWxvI6HjDnE4VkInmYZUQ4dgB7gzaDyFyFSK1i1nF/j7DpS9UbQAgV9NaF1XpcyuavnM1qOeiEIg==" + }, + "node_modules/terser": { + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.0.tgz", + "integrity": "sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.16", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.16.tgz", + "integrity": "sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-loader": { + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz", + "integrity": "sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4", + "source-map": "^0.7.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "typescript": "*", + "webpack": "^5.0.0" + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/tslint": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", + "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", + "deprecated": "TSLint has been deprecated in favor of ESLint. Please see https://github.com/palantir/tslint/issues/4534 for more information.", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^4.0.1", + "glob": "^7.1.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.3", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.13.0", + "tsutils": "^2.29.0" + }, + "bin": { + "tslint": "bin/tslint" + }, + "engines": { + "node": ">=4.8.0" + }, + "peerDependencies": { + "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev || >= 4.0.0-dev" + } + }, + "node_modules/tslint/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tslint/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/tslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/tslint/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tslint/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/tslint/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/tslint/node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/tslint/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/tslint/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/tslint/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/tslint/node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/tslint/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tslint/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/tslint/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "peerDependencies": { + "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" + } + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vscode-extension-telemetry-wrapper": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/vscode-extension-telemetry-wrapper/-/vscode-extension-telemetry-wrapper-0.14.0.tgz", + "integrity": "sha512-EYr1hqiYVSGfupchDN405zSwuvA8V3tJ62KcLIRDr/4ongOc2AvSZ0BlRq8a0w950tadsMlXTKEheB97fZBttg==", + "dependencies": { + "@vscode/extension-telemetry": "^0.9.6", + "uuid": "^8.3.2" + } + }, + "node_modules/vscode-jsonrpc": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", + "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/vscode-languageclient": { + "version": "6.0.0-next.9", + "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-6.0.0-next.9.tgz", + "integrity": "sha512-NEpeeFM9FKrrRqlBHXGfwpkhtnjruDz3zfFBP+Cymr10qigAEtE/JsODJsIG/ErGqjh3/JXxu8SUOVTGu5oK+w==", + "dependencies": { + "semver": "^6.3.0", + "vscode-languageserver-protocol": "^3.15.0-next.14" + }, + "engines": { + "vscode": "^1.40.0" + } + }, + "node_modules/vscode-languageclient/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", + "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", + "dependencies": { + "vscode-jsonrpc": "8.2.0", + "vscode-languageserver-types": "3.17.5" + } + }, + "node_modules/vscode-languageserver-protocol/node_modules/vscode-languageserver-types": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==" + }, + "node_modules/vscode-languageserver-types": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz", + "integrity": "sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==" + }, + "node_modules/vscode-tas-client": { + "version": "0.1.84", + "resolved": "https://registry.npmjs.org/vscode-tas-client/-/vscode-tas-client-0.1.84.tgz", + "integrity": "sha512-rUTrUopV+70hvx1hW5ebdw1nd6djxubkLvVxjGdyD/r5v/wcVF41LIfiAtbm5qLZDtQdsMH1IaCuDoluoIa88w==", + "dependencies": { + "tas-client": "0.2.33" + }, + "engines": { + "vscode": "^1.85.0" + } + }, + "node_modules/watchpack": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", + "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack": { + "version": "5.105.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.0.tgz", + "integrity": "sha512-gX/dMkRQc7QOMzgTe6KsYFM7DxeIONQSui1s0n/0xht36HvrgbxtM1xBlgx596NbpHuQU8P7QpKwrZYwUX48nw==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.28.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.19.0", + "es-module-lexer": "^2.0.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.3.1", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.3.16", + "watchpack": "^2.5.1", + "webpack-sources": "^3.3.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", + "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", + "dev": true, + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.2.0", + "@webpack-cli/info": "^1.5.0", + "@webpack-cli/serve": "^1.7.0", + "colorette": "^2.0.14", + "commander": "^7.0.0", + "cross-spawn": "^7.0.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "@webpack-cli/migrate": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", + "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true + }, + "node_modules/workerpool": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", + "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "dev": true + }, + "@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true + }, + "@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "requires": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true + }, + "@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "@microsoft/1ds-core-js": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@microsoft/1ds-core-js/-/1ds-core-js-4.3.4.tgz", + "integrity": "sha512-3gbDUQgAO8EoyQTNcAEkxpuPnioC0May13P1l1l0NKZ128L9Ts/sj8QsfwCRTjHz0HThlA+4FptcAJXNYUy3rg==", + "requires": { + "@microsoft/applicationinsights-core-js": "3.3.4", + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.3", + "@nevware21/ts-async": ">= 0.5.2 < 2.x", + "@nevware21/ts-utils": ">= 0.11.3 < 2.x" + } + }, + "@microsoft/1ds-post-js": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@microsoft/1ds-post-js/-/1ds-post-js-4.3.4.tgz", + "integrity": "sha512-nlKjWricDj0Tn68Dt0P8lX9a+X7LYrqJ6/iSfQwMfDhRIGLqW+wxx8gxS+iGWC/oc8zMQAeiZaemUpCwQcwpRQ==", + "requires": { + "@microsoft/1ds-core-js": "4.3.4", + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.3", + "@nevware21/ts-async": ">= 0.5.2 < 2.x", + "@nevware21/ts-utils": ">= 0.11.3 < 2.x" + } + }, + "@microsoft/applicationinsights-channel-js": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-channel-js/-/applicationinsights-channel-js-3.3.4.tgz", + "integrity": "sha512-Z4nrxYwGKP9iyrYtm7iPQXVOFy4FsEsX0nDKkAi96Qpgw+vEh6NH4ORxMMuES0EollBQ3faJyvYCwckuCVIj0g==", + "requires": { + "@microsoft/applicationinsights-common": "3.3.4", + "@microsoft/applicationinsights-core-js": "3.3.4", + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.3", + "@nevware21/ts-async": ">= 0.5.2 < 2.x", + "@nevware21/ts-utils": ">= 0.11.3 < 2.x" + } + }, + "@microsoft/applicationinsights-common": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-common/-/applicationinsights-common-3.3.4.tgz", + "integrity": "sha512-4ms16MlIvcP4WiUPqopifNxcWCcrXQJ2ADAK/75uok2mNQe6ZNRsqb/P+pvhUxc8A5HRlvoXPP1ptDSN5Girgw==", + "requires": { + "@microsoft/applicationinsights-core-js": "3.3.4", + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.3", + "@nevware21/ts-utils": ">= 0.11.3 < 2.x" + } + }, + "@microsoft/applicationinsights-core-js": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-core-js/-/applicationinsights-core-js-3.3.4.tgz", + "integrity": "sha512-MummANF0mgKIkdvVvfmHQTBliK114IZLRhTL0X0Ep+zjDwWMHqYZgew0nlFKAl6ggu42abPZFK5afpE7qjtYJA==", + "requires": { + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.3", + "@nevware21/ts-async": ">= 0.5.2 < 2.x", + "@nevware21/ts-utils": ">= 0.11.3 < 2.x" + } + }, + "@microsoft/applicationinsights-shims": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-shims/-/applicationinsights-shims-3.0.1.tgz", + "integrity": "sha512-DKwboF47H1nb33rSUfjqI6ryX29v+2QWcTrRvcQDA32AZr5Ilkr7whOOSsD1aBzwqX0RJEIP1Z81jfE3NBm/Lg==", + "requires": { + "@nevware21/ts-utils": ">= 0.9.4 < 2.x" + } + }, + "@microsoft/applicationinsights-web-basic": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-web-basic/-/applicationinsights-web-basic-3.3.4.tgz", + "integrity": "sha512-OpEPXr8vU/t/M8T9jvWJzJx/pCyygIiR1nGM/2PTde0wn7anl71Gxl5fWol7K/WwFEORNjkL3CEyWOyDc+28AA==", + "requires": { + "@microsoft/applicationinsights-channel-js": "3.3.4", + "@microsoft/applicationinsights-common": "3.3.4", + "@microsoft/applicationinsights-core-js": "3.3.4", + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.3", + "@nevware21/ts-async": ">= 0.5.2 < 2.x", + "@nevware21/ts-utils": ">= 0.11.3 < 2.x" + } + }, + "@microsoft/dynamicproto-js": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@microsoft/dynamicproto-js/-/dynamicproto-js-2.0.3.tgz", + "integrity": "sha512-JTWTU80rMy3mdxOjjpaiDQsTLZ6YSGGqsjURsY6AUQtIj0udlF/jYmhdLZu8693ZIC0T1IwYnFa0+QeiMnziBA==", + "requires": { + "@nevware21/ts-utils": ">= 0.10.4 < 2.x" + } + }, + "@nevware21/ts-async": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@nevware21/ts-async/-/ts-async-0.5.3.tgz", + "integrity": "sha512-UsF7eerLsVfid7iV1oXF80qXBwHNBeqSqfh/nPZgirRU1MACmSsj83EZKS2ViFHVfSGG6WIuXMGBP6KciXfYhA==", + "requires": { + "@nevware21/ts-utils": ">= 0.11.5 < 2.x" + } + }, + "@nevware21/ts-utils": { + "version": "0.11.5", + "resolved": "https://registry.npmjs.org/@nevware21/ts-utils/-/ts-utils-0.11.5.tgz", + "integrity": "sha512-7nIzWKR50mf3htOg53kwPLqD5iJaRfVyBvb1NJhlIncyP1WzK8vAQbU9rqIsRtv7td1CnqspdP6IWNEjOjaeug==" + }, + "@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true + }, + "@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "@types/lodash": { + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.13.tgz", + "integrity": "sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==", + "dev": true + }, + "@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true + }, + "@types/mocha": { + "version": "10.0.9", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.9.tgz", + "integrity": "sha512-sicdRoWtYevwxjOHNMPTl3vSfJM6oyW8o1wXeI7uww6b6xHg8eBznQDNSGBCDJmsE8UMxP05JgZRtsKbTqt//Q==", + "dev": true + }, + "@types/node": { + "version": "14.18.63", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz", + "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==", + "dev": true + }, + "@types/uuid": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", + "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", + "dev": true + }, + "@types/vscode": { + "version": "1.95.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.95.0.tgz", + "integrity": "sha512-0LBD8TEiNbet3NvWsmn59zLzOFu/txSlGxnv5yAFHCrhG9WvAnR3IvfHzMOs2aeWqgvNjq9pO99IUw8d3n+unw==", + "dev": true + }, + "@vscode/extension-telemetry": { + "version": "0.9.7", + "resolved": "https://registry.npmjs.org/@vscode/extension-telemetry/-/extension-telemetry-0.9.7.tgz", + "integrity": "sha512-2GQbcfDUTg0QC1v0HefkHNwYrE5LYKzS3Zb0+uA6Qn1MBDzgiSh23ddOZF/JRqhqBFOG0mE70XslKSGQ5v9KwQ==", + "requires": { + "@microsoft/1ds-core-js": "^4.3.0", + "@microsoft/1ds-post-js": "^4.3.0", + "@microsoft/applicationinsights-web-basic": "^3.3.0" + } + }, + "@vscode/test-electron": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.4.1.tgz", + "integrity": "sha512-Gc6EdaLANdktQ1t+zozoBVRynfIsMKMc94Svu1QreOBC8y76x4tvaK32TljrLi1LI2+PK58sDVbL7ALdqf3VRQ==", + "dev": true, + "requires": { + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.5", + "jszip": "^3.10.1", + "ora": "^7.0.1", + "semver": "^7.6.2" + } + }, + "@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "dev": true, + "requires": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true + }, + "@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "dev": true, + "requires": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "@webpack-cli/configtest": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", + "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", + "dev": true, + "requires": {} + }, + "@webpack-cli/info": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", + "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", + "dev": true, + "requires": { + "envinfo": "^7.7.3" + } + }, + "@webpack-cli/serve": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", + "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", + "dev": true, + "requires": {} + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true + }, + "acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "dev": true, + "requires": {} + }, + "agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dev": true, + "requires": { + "debug": "^4.3.4" + } + }, + "ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + } + }, + "ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "requires": { + "ajv": "^8.0.0" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true + }, + "ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "baseline-browser-mapping": { + "version": "2.9.19", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", + "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", + "dev": true + }, + "binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true + }, + "bl": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", + "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", + "dev": true, + "requires": { + "buffer": "^6.0.3", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "requires": { + "fill-range": "^7.1.1" + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, + "requires": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + } + }, + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==", + "dev": true + }, + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001769", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001769.tgz", + "integrity": "sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "dev": true + }, + "cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "dev": true, + "requires": { + "restore-cursor": "^4.0.0" + } + }, + "cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "ansi-wrap": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", - "dev": true - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - } - } - }, - "append-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", - "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", - "dev": true, - "requires": { - "buffer-equal": "^1.0.0" - } - }, - "applicationinsights": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/applicationinsights/-/applicationinsights-1.0.1.tgz", - "integrity": "sha1-U0Rrgw/o1dYZ7uKieLMdPSUDCSc=", - "requires": { - "diagnostic-channel": "0.2.0", - "diagnostic-channel-publishers": "0.2.1", - "zone.js": "0.7.6" - } - }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, - "arr-diff": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", - "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1", - "array-slice": "^0.2.3" - }, - "dependencies": { - "array-slice": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", - "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", - "dev": true - } - } - }, - "arr-filter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", - "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", - "dev": true, - "requires": { - "make-iterator": "^1.0.0" - } - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=", - "dev": true - }, - "arr-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", - "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", - "dev": true, - "requires": { - "make-iterator": "^1.0.0" - } - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", - "dev": true - }, - "array-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", - "dev": true - }, - "array-initial": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", - "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", - "dev": true, - "requires": { - "array-slice": "^1.0.0", - "is-number": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - } - } - }, - "array-last": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", - "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", - "dev": true, - "requires": { - "is-number": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - } - } - }, - "array-slice": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", - "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", - "dev": true - }, - "array-sort": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", - "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", - "dev": true, - "requires": { - "default-compare": "^1.0.0", - "get-value": "^2.0.6", - "kind-of": "^5.0.2" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "async-done": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.1.tgz", - "integrity": "sha512-R1BaUeJ4PMoLNJuk+0tLJgjmEqVsdN118+Z8O+alhnQDQgy0kmD5Mqi0DNEmMx2LM0Ed5yekKu+ZXYvIHceicg==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.2", - "process-nextick-args": "^1.0.7", - "stream-exhaust": "^1.0.1" - } - }, - "async-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", - "dev": true - }, - "async-listener": { - "version": "0.6.9", - "resolved": "https://registry.npmjs.org/async-listener/-/async-listener-0.6.9.tgz", - "integrity": "sha512-E7Z2/QMs0EPt/o9wpYO/J3hmMCDdr1aVDS3ttlur5D5JlZtxhfuOwi4e7S8zbYIxA5qOOYdxfqGj97XAfdNvkQ==", - "requires": { - "semver": "^5.3.0", - "shimmer": "^1.1.0" - } - }, - "async-settle": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", - "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", - "dev": true, - "requires": { - "async-done": "^1.2.2" - } - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "atob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", - "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", - "dev": true - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - } + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true }, - "bach": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", - "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", - "dev": true, - "requires": { - "arr-filter": "^1.1.1", - "arr-flatten": "^1.0.1", - "arr-map": "^2.0.0", - "array-each": "^1.0.0", - "array-initial": "^1.0.0", - "array-last": "^1.1.1", - "async-done": "^1.2.2", - "async-settle": "^1.0.0", - "now-and-later": "^2.0.0" - } + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "beeper": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", - "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", - "dev": true - }, - "binary-extensions": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", - "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", - "dev": true + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } }, - "block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "dev": true, - "requires": { - "inherits": "~2.0.0" - } + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "compare-versions": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-4.1.4.tgz", + "integrity": "sha512-FemMreK9xNyL8gQevsdRMrvO4lFCkQP7qbuktn1q8ndcNk1+0mz7lgE7b/sNvbhVgY4w6tMN1FDp6aADjqw2rw==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "requires": { + "ms": "^2.1.3" + } + }, + "decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true + }, + "diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "dev": true + }, + "dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==" + }, + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.5.286", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz", + "integrity": "sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==", + "dev": true + }, + "emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true + }, + "enhanced-resolve": { + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.19.0.tgz", + "integrity": "sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.0" + } + }, + "envinfo": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.14.0.tgz", + "integrity": "sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==", + "dev": true + }, + "es-module-lexer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", + "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", + "dev": true + }, + "escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "dev": true + }, + "fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true + }, + "fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "requires": { + "function-bind": "^1.1.2" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "requires": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + } + }, + "https-proxy-agent": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "dev": true, + "requires": { + "agent-base": "^7.0.2", + "debug": "4" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true + }, + "import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-core-module": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "dev": true, + "requires": { + "hasown": "^2.0.2" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + }, + "jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dev": true, + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "requires": { + "immediate": "~3.0.5" + } + }, + "loader-runner": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", + "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", + "dev": true + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==" + }, + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "requires": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + } + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "requires": { + "mime-db": "1.52.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "minimatch": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "requires": { + "minimist": "^1.2.6" + } + }, + "mocha": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.8.2.tgz", + "integrity": "sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.3", + "browser-stdout": "^1.3.1", + "chokidar": "^3.5.3", + "debug": "^4.3.5", + "diff": "^5.2.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^8.1.0", + "he": "^1.2.0", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^5.1.6", + "ms": "^2.1.3", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^6.5.1", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9", + "yargs-unparser": "^2.0.0" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "ora": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-7.0.1.tgz", + "integrity": "sha512-0TUxTiFJWv+JnjWm4o9yvuskpEJLXTcng8MJuKd+SzAzp2o+OP3HWqNhB4OdJRt1Vsd9/mR0oyaEYlOnL7XIRw==", + "dev": true, + "requires": { + "chalk": "^5.3.0", + "cli-cursor": "^4.0.0", + "cli-spinners": "^2.9.0", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^1.3.0", + "log-symbols": "^5.1.0", + "stdin-discarder": "^0.1.0", + "string-width": "^6.1.0", + "strip-ansi": "^7.1.0" + }, + "dependencies": { + "chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true + }, + "is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true + }, + "log-symbols": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", + "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", + "dev": true, + "requires": { + "chalk": "^5.0.0", + "is-unicode-supported": "^1.1.0" + } + } + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + } + } + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "dev": true, + "requires": { + "resolve": "^1.9.0" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, + "resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + } + }, + "semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true + }, + "serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "stdin-discarder": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.1.0.tgz", + "integrity": "sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==", + "dev": true, + "requires": { + "bl": "^5.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "string-width": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-6.1.0.tgz", + "integrity": "sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==", + "dev": true, + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^10.2.1", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "dev": true + }, + "tas-client": { + "version": "0.2.33", + "resolved": "https://registry.npmjs.org/tas-client/-/tas-client-0.2.33.tgz", + "integrity": "sha512-V+uqV66BOQnWxvI6HjDnE4VkInmYZUQ4dgB7gzaDyFyFSK1i1nF/j7DpS9UbQAgV9NaF1XpcyuavnM1qOeiEIg==" + }, + "terser": { + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.0.tgz", + "integrity": "sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==", + "dev": true, + "requires": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + } + }, + "terser-webpack-plugin": { + "version": "5.3.16", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.16.tgz", + "integrity": "sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "ts-loader": { + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz", + "integrity": "sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4", + "source-map": "^0.7.4" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "tslint": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", + "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^4.0.1", + "glob": "^7.1.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.3", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.13.0", + "tsutils": "^2.29.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } }, "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, - "browser-stdout": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", - "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", - "dev": true - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true - }, - "buffer-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", - "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", - "dev": true - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } }, "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "chokidar": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", - "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.0", - "braces": "^2.3.0", - "fsevents": "^1.2.2", - "glob-parent": "^3.1.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "lodash.debounce": "^4.0.8", - "normalize-path": "^2.1.1", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0", - "upath": "^1.0.5" - }, - "dependencies": { - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - } - }, - "is-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "clone": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", - "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=", - "dev": true - }, - "clone-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", - "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", - "dev": true - }, - "clone-stats": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", - "dev": true - }, - "cloneable-readable": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.0.0.tgz", - "integrity": "sha1-pikNQT8hemEjL5XkWP84QYz7ARc=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "process-nextick-args": "^1.0.6", - "through2": "^2.0.1" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "collection-map": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", - "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", - "dev": true, - "requires": { - "arr-map": "^2.0.2", - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - }, - "dependencies": { - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - } - } - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true - }, - "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", - "dev": true - }, - "combined-stream": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", - "dev": true - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "continuation-local-storage": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz", - "integrity": "sha512-jx44cconVqkCEEyLSKWwkvUXwO561jXMa3LPjTPsm5QR22PA0/mhe33FT4Xb5y74JDvt/Cq+5lm8S8rskLv9ZA==", - "requires": { - "async-listener": "^0.6.0", - "emitter-listener": "^1.1.1" - } - }, - "convert-source-map": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", - "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=", - "dev": true - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "copy-props": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.4.tgz", - "integrity": "sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==", - "dev": true, - "requires": { - "each-props": "^1.3.0", - "is-plain-object": "^2.0.1" - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "cross-env": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.2.0.tgz", - "integrity": "sha512-jtdNFfFW1hB7sMhr/H6rW1Z45LFqyI431m3qU6bFXcQ3Eh7LtBuG3h74o7ohHZ3crrRkkqHlo4jYHFPcjroANg==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.5", - "is-windows": "^1.0.0" - }, - "dependencies": { - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - } - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", - "dev": true - } - } - }, - "d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "dev": true, - "requires": { - "es5-ext": "^0.10.9" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "dateformat": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.0.0.tgz", - "integrity": "sha1-J0Pjq7XD/CRi5SfcpEXgTp9N7hc=", - "dev": true - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "deep-assign": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/deep-assign/-/deep-assign-1.0.0.tgz", - "integrity": "sha1-sJJ0O+hCfcYh6gBnzex+cN0Z83s=", - "dev": true, - "requires": { - "is-obj": "^1.0.0" - } - }, - "default-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", - "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", - "dev": true, - "requires": { - "kind-of": "^5.0.2" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "default-resolution": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", - "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=", - "dev": true - }, - "define-properties": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", - "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", - "dev": true, - "requires": { - "foreach": "^2.0.5", - "object-keys": "^1.0.8" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", - "dev": true - }, - "diagnostic-channel": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/diagnostic-channel/-/diagnostic-channel-0.2.0.tgz", - "integrity": "sha1-zJmvlhLCP7H/8TYSxy8sv6qNWhc=", - "requires": { - "semver": "^5.3.0" - } - }, - "diagnostic-channel-publishers": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/diagnostic-channel-publishers/-/diagnostic-channel-publishers-0.2.1.tgz", - "integrity": "sha1-ji1geottef6IC1SLxYzGvrKIxPM=" + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true }, "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - }, - "duplexer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", - "dev": true - }, - "duplexer2": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", - "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", - "dev": true, - "requires": { - "readable-stream": "~1.1.9" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - }, - "duplexify": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", - "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "each-props": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", - "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.1", - "object.defaults": "^1.1.0" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "optional": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "emitter-listener": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/emitter-listener/-/emitter-listener-1.1.1.tgz", - "integrity": "sha1-6Lu+gkS8jg0LTvcc0UKUx/JBx+w=", - "requires": { - "shimmer": "^1.2.0" - } - }, - "end-of-stream": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.0.tgz", - "integrity": "sha1-epDYM+/abPpurA9JSduw+tOmMgY=", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es5-ext": { - "version": "0.10.45", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.45.tgz", - "integrity": "sha512-FkfM6Vxxfmztilbxxz5UKSD4ICMf5tSpRFtDNtkAhOxZ0EKtX6qwmXNyH/sFyIbX2P/nU5AMiA9jilWsUGJzCQ==", - "dev": true, - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.1", - "next-tick": "1" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "es6-weak-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", - "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.14", - "es6-iterator": "^2.0.1", - "es6-symbol": "^3.1.1" - } + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true }, "escape-string-regexp": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz", - "integrity": "sha1-Tbwv5nTnGUnK8/smlc5/LcHZqNE=", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "event-stream": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", - "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", - "dev": true, - "requires": { - "duplexer": "~0.1.1", - "from": "~0", - "map-stream": "~0.1.0", - "pause-stream": "0.0.11", - "split": "0.3", - "stream-combiner": "~0.0.4", - "through": "~2.3.1" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, - "requires": { - "fill-range": "^2.1.0" - } - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", - "dev": true - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fancy-log": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.0.tgz", - "integrity": "sha1-Rb4X0Cu5kX1gzP/UmVyZnmyMmUg=", - "dev": true, - "requires": { - "chalk": "^1.1.1", - "time-stamp": "^1.0.0" - } - }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "dev": true, - "requires": { - "pend": "~1.2.0" - } - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true - }, - "fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", - "dev": true, - "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - } - } - }, - "findup-sync": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", - "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^3.1.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - } - } - }, - "fined": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.1.0.tgz", - "integrity": "sha1-s33IRLdqL15wgeiE98CuNE8VNHY=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "is-plain-object": "^2.0.3", - "object.defaults": "^1.1.0", - "object.pick": "^1.2.0", - "parse-filepath": "^1.0.1" - } - }, - "first-chunk-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", - "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=", - "dev": true - }, - "flagged-respawn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.0.tgz", - "integrity": "sha1-Tnmumy6zi/hrO7Vr8+ClaqX8q9c=", - "dev": true - }, - "flush-write-stream": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", - "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.4" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - }, - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", - "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "1.0.6", - "mime-types": "^2.1.12" - } - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "from": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", - "dev": true - }, - "fs-extra": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", - "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "fs-mkdirp-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", - "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "through2": "^2.0.3" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", - "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", - "dev": true, - "optional": true, - "requires": { - "nan": "^2.9.2", - "node-pre-gyp": "^0.10.0" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "debug": { - "version": "2.6.9", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "2.2.4" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aproba": "1.2.0", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" - } - }, - "glob": { - "version": "7.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.21", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safer-buffer": "2.1.2" - } - }, - "ignore-walk": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimatch": "3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "brace-expansion": "1.1.11" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true, - "optional": true - }, - "minipass": { - "version": "2.2.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "5.1.1", - "yallist": "3.0.2" - } - }, - "minizlib": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "2.2.4" - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "needle": { - "version": "2.2.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "2.6.9", - "iconv-lite": "0.4.21", - "sax": "1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.10.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "detect-libc": "1.0.3", - "mkdirp": "0.5.1", - "needle": "2.2.0", - "nopt": "4.0.1", - "npm-packlist": "1.1.10", - "npmlog": "4.1.2", - "rc": "1.2.7", - "rimraf": "2.6.2", - "semver": "5.5.0", - "tar": "4.4.1" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "abbrev": "1.1.1", - "osenv": "0.1.5" - } - }, - "npm-bundled": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.1.10", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "3.0.1", - "npm-bundled": "1.0.3" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "deep-extend": "0.5.1", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" - } - }, - "rimraf": { - "version": "2.6.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "glob": "7.1.2" - } - }, - "safe-buffer": { - "version": "5.1.1", - "bundled": true, - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "dev": true, - "optional": true - }, - "semver": { - "version": "5.5.0", - "bundled": true, - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "chownr": "1.0.1", - "fs-minipass": "1.2.5", - "minipass": "2.2.4", - "minizlib": "1.1.0", - "mkdirp": "0.5.1", - "safe-buffer": "5.1.1", - "yallist": "3.0.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "string-width": "1.0.2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "yallist": { - "version": "3.0.2", - "bundled": true, - "dev": true - } - } - }, - "fstream": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", - "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true }, "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" - }, - "dependencies": { - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "^2.0.0" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } - }, - "glob-stream": { - "version": "5.3.5", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz", - "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=", - "dev": true, - "requires": { - "extend": "^3.0.0", - "glob": "^5.0.3", - "glob-parent": "^3.0.0", - "micromatch": "^2.3.7", - "ordered-read-streams": "^0.3.0", - "through2": "^0.6.0", - "to-absolute-glob": "^0.1.1", - "unique-stream": "^2.0.2" - }, - "dependencies": { - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - } - } - }, - "glob-watcher": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.1.tgz", - "integrity": "sha512-fK92r2COMC199WCyGUblrZKhjra3cyVMDiypDdqg1vsSDmexnbYivK1kNR4QItiNXLKmGlqan469ks67RtNa2g==", - "dev": true, - "requires": { - "async-done": "^1.2.0", - "chokidar": "^2.0.0", - "just-debounce": "^1.0.0", - "object.defaults": "^1.1.0" - } - }, - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - } - }, - "glogg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.0.tgz", - "integrity": "sha1-f+DxmfV6yQbPUS/urY+Q7kooT8U=", - "dev": true, - "requires": { - "sparkles": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" - }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true - }, - "gulp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.0.tgz", - "integrity": "sha1-lXZsYB2t5Kd+0+eyttwDiBtZY2Y=", - "dev": true, - "requires": { - "glob-watcher": "^5.0.0", - "gulp-cli": "^2.0.0", - "undertaker": "^1.0.0", - "vinyl-fs": "^3.0.0" - }, - "dependencies": { - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true - }, - "clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", - "dev": true - }, - "fancy-log": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz", - "integrity": "sha1-9BEl49hPLn2JpD0G2VjI94vha+E=", - "dev": true, - "requires": { - "ansi-gray": "^0.1.1", - "color-support": "^1.1.3", - "time-stamp": "^1.0.0" - } - }, - "glob-stream": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", - "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", - "dev": true, - "requires": { - "extend": "^3.0.0", - "glob": "^7.1.1", - "glob-parent": "^3.1.0", - "is-negated-glob": "^1.0.0", - "ordered-read-streams": "^1.0.0", - "pumpify": "^1.3.5", - "readable-stream": "^2.1.5", - "remove-trailing-separator": "^1.0.1", - "to-absolute-glob": "^2.0.0", - "unique-stream": "^2.0.2" - } - }, - "gulp-cli": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.0.1.tgz", - "integrity": "sha512-RxujJJdN8/O6IW2nPugl7YazhmrIEjmiVfPKrWt68r71UCaLKS71Hp0gpKT+F6qOUFtr7KqtifDKaAJPRVvMYQ==", - "dev": true, - "requires": { - "ansi-colors": "^1.0.1", - "archy": "^1.0.0", - "array-sort": "^1.0.0", - "color-support": "^1.1.3", - "concat-stream": "^1.6.0", - "copy-props": "^2.0.1", - "fancy-log": "^1.3.2", - "gulplog": "^1.0.0", - "interpret": "^1.1.0", - "isobject": "^3.0.1", - "liftoff": "^2.5.0", - "matchdep": "^2.0.0", - "mute-stdout": "^1.0.0", - "pretty-hrtime": "^1.0.0", - "replace-homedir": "^1.0.0", - "semver-greatest-satisfied-range": "^1.1.0", - "v8flags": "^3.0.1", - "yargs": "^7.1.0" - } - }, - "interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", - "dev": true - }, - "is-valid-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", - "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "ordered-read-streams": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", - "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - } - }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", - "dev": true - }, - "to-absolute-glob": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", - "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", - "dev": true, - "requires": { - "is-absolute": "^1.0.0", - "is-negated-glob": "^1.0.0" - } - }, - "vinyl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", - "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", - "dev": true, - "requires": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" - } - }, - "vinyl-fs": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", - "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", - "dev": true, - "requires": { - "fs-mkdirp-stream": "^1.0.0", - "glob-stream": "^6.1.0", - "graceful-fs": "^4.0.0", - "is-valid-glob": "^1.0.0", - "lazystream": "^1.0.0", - "lead": "^1.0.0", - "object.assign": "^4.0.4", - "pumpify": "^1.3.5", - "readable-stream": "^2.3.3", - "remove-bom-buffer": "^3.0.0", - "remove-bom-stream": "^1.2.0", - "resolve-options": "^1.1.0", - "through2": "^2.0.0", - "to-through": "^2.0.0", - "value-or-function": "^3.0.0", - "vinyl": "^2.0.0", - "vinyl-sourcemap": "^1.1.0" - } - } - } - }, - "gulp-chmod": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/gulp-chmod/-/gulp-chmod-2.0.0.tgz", - "integrity": "sha1-AMOQuSigeZslGsz2MaoJ4BzGKZw=", - "dev": true, - "requires": { - "deep-assign": "^1.0.0", - "stat-mode": "^0.2.0", - "through2": "^2.0.0" - } - }, - "gulp-filter": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/gulp-filter/-/gulp-filter-5.1.0.tgz", - "integrity": "sha1-oF4Rr/sHz33PQafeHLe2OsN4PnM=", - "dev": true, - "requires": { - "multimatch": "^2.0.0", - "plugin-error": "^0.1.2", - "streamfilter": "^1.0.5" - } - }, - "gulp-gunzip": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulp-gunzip/-/gulp-gunzip-1.0.0.tgz", - "integrity": "sha1-FbdBFF6Dqcb1CIYkG1fMWHHxUak=", - "dev": true, - "requires": { - "through2": "~0.6.5", - "vinyl": "~0.4.6" - }, - "dependencies": { - "clone": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", - "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - }, - "vinyl": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", - "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", - "dev": true, - "requires": { - "clone": "^0.2.0", - "clone-stats": "^0.0.1" - } - } - } - }, - "gulp-remote-src-vscode": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/gulp-remote-src-vscode/-/gulp-remote-src-vscode-0.5.0.tgz", - "integrity": "sha512-/9vtSk9eI9DEWCqzGieglPqmx0WUQ9pwPHyHFpKmfxqdgqGJC2l0vFMdYs54hLdDsMDEZFLDL2J4ikjc4hQ5HQ==", - "dev": true, - "requires": { - "event-stream": "^3.3.4", - "node.extend": "^1.1.2", - "request": "^2.79.0", - "through2": "^2.0.3", - "vinyl": "^2.0.1" - }, - "dependencies": { - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true - }, - "clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", - "dev": true - }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", - "dev": true - }, - "vinyl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", - "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", - "dev": true, - "requires": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" - } - } - } - }, - "gulp-sourcemaps": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz", - "integrity": "sha1-uG/zSdgBzrVuHZ59x7vLS33uYAw=", - "dev": true, - "requires": { - "convert-source-map": "^1.1.1", - "graceful-fs": "^4.1.2", - "strip-bom": "^2.0.0", - "through2": "^2.0.0", - "vinyl": "^1.0.0" - }, - "dependencies": { - "vinyl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", - "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", - "dev": true, - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - } - } - } - }, - "gulp-symdest": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/gulp-symdest/-/gulp-symdest-1.1.0.tgz", - "integrity": "sha1-wWUyBzLRks5W/ZQnH/oSMjS/KuA=", - "dev": true, - "requires": { - "event-stream": "^3.3.1", - "mkdirp": "^0.5.1", - "queue": "^3.1.0", - "vinyl-fs": "^2.4.3" - } - }, - "gulp-tslint": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/gulp-tslint/-/gulp-tslint-8.1.2.tgz", - "integrity": "sha1-4PQxlLRz1+drtFpY/oxg59/jvrI=", - "dev": true, - "requires": { - "gulp-util": "~3.0.8", - "map-stream": "~0.0.7", - "through": "~2.3.8" - }, - "dependencies": { - "map-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz", - "integrity": "sha1-ih8HiW2CsQkmvTdEokIACfiJdKg=", - "dev": true - } - } - }, - "gulp-untar": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/gulp-untar/-/gulp-untar-0.0.7.tgz", - "integrity": "sha512-0QfbCH2a1k2qkTLWPqTX+QO4qNsHn3kC546YhAP3/n0h+nvtyGITDuDrYBMDZeW4WnFijmkOvBWa5HshTic1tw==", - "dev": true, - "requires": { - "event-stream": "~3.3.4", - "streamifier": "~0.1.1", - "tar": "^2.2.1", - "through2": "~2.0.3", - "vinyl": "^1.2.0" - }, - "dependencies": { - "vinyl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", - "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", - "dev": true, - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - } - } - } - }, - "gulp-util": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", - "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", - "dev": true, - "requires": { - "array-differ": "^1.0.0", - "array-uniq": "^1.0.2", - "beeper": "^1.0.0", - "chalk": "^1.0.0", - "dateformat": "^2.0.0", - "fancy-log": "^1.1.0", - "gulplog": "^1.0.0", - "has-gulplog": "^0.1.0", - "lodash._reescape": "^3.0.0", - "lodash._reevaluate": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.template": "^3.0.0", - "minimist": "^1.1.0", - "multipipe": "^0.1.2", - "object-assign": "^3.0.0", - "replace-ext": "0.0.1", - "through2": "^2.0.0", - "vinyl": "^0.5.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, - "gulp-vinyl-zip": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/gulp-vinyl-zip/-/gulp-vinyl-zip-2.1.0.tgz", - "integrity": "sha1-JOQGhdwFtxSZlSRQmeBZAmO+ja0=", - "dev": true, - "requires": { - "event-stream": "^3.3.1", - "queue": "^4.2.1", - "through2": "^2.0.3", - "vinyl": "^2.0.2", - "vinyl-fs": "^2.0.0", - "yauzl": "^2.2.1", - "yazl": "^2.2.1" - }, - "dependencies": { - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true - }, - "clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", - "dev": true - }, - "queue": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/queue/-/queue-4.4.2.tgz", - "integrity": "sha512-fSMRXbwhMwipcDZ08enW2vl+YDmAmhcNcr43sCJL8DIg+CFOsoRLG23ctxA+fwNk1w55SePSiS7oqQQSgQoVJQ==", - "dev": true, - "requires": { - "inherits": "~2.0.0" - } - }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", - "dev": true - }, - "vinyl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", - "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", - "dev": true, - "requires": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" - } - } - } - }, - "gulplog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", - "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", - "dev": true, - "requires": { - "glogg": "^1.0.0" - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", - "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", - "dev": true, - "requires": { - "ajv": "^5.3.0", - "har-schema": "^2.0.0" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } }, "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-gulplog": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", - "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", - "dev": true, - "requires": { - "sparkles": "^1.0.0" - } - }, - "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", - "dev": true - }, - "homedir-polyfill": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", - "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" - } - }, - "hosted-git-info": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", - "dev": true - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true - }, - "interpret": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.3.tgz", - "integrity": "sha1-y8NcYu7uc/Gat7EKgBURQBr8D5A=", - "dev": true - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "is": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is/-/is-3.2.1.tgz", - "integrity": "sha1-0Kwq1V63sL7JJqUmb2xmKqqD3KU=", - "dev": true - }, - "is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "dev": true, - "requires": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", - "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", - "dev": true - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "^1.0.0" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "requires": { - "is-primitive": "^2.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - }, - "is-negated-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", - "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", - "dev": true - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true - }, - "is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "dev": true, - "requires": { - "is-unc-path": "^1.0.0" - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "dev": true, - "requires": { - "unc-path-regex": "^0.1.2" - } - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "is-valid-glob": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz", - "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true, - "optional": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "requires": { - "jsonify": "~0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "just-debounce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz", - "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - }, - "last-run": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", - "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", - "dev": true, - "requires": { - "default-resolution": "^2.0.0", - "es6-weak-map": "^2.0.1" - } - }, - "lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "dev": true, - "requires": { - "readable-stream": "^2.0.5" - } - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - } - }, - "lead": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", - "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", - "dev": true, - "requires": { - "flush-write-stream": "^1.0.2" - } - }, - "liftoff": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz", - "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=", - "dev": true, - "requires": { - "extend": "^3.0.0", - "findup-sync": "^2.0.0", - "fined": "^1.0.1", - "flagged-respawn": "^1.0.0", - "is-plain-object": "^2.0.4", - "object.map": "^1.0.0", - "rechoir": "^0.6.2", - "resolve": "^1.1.7" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - } - }, - "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" - }, - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", - "dev": true - }, - "lodash._basetostring": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", - "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", - "dev": true - }, - "lodash._basevalues": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", - "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", - "dev": true - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", - "dev": true - }, - "lodash._reescape": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", - "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", - "dev": true - }, - "lodash._reevaluate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", - "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", - "dev": true - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", - "dev": true - }, - "lodash._root": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", - "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", - "dev": true - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", - "dev": true - }, - "lodash.escape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", - "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", - "dev": true, - "requires": { - "lodash._root": "^3.0.0" - } - }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true - }, - "lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", - "dev": true - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, - "requires": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" - } - }, - "lodash.restparam": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", - "dev": true - }, - "lodash.template": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", - "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", - "dev": true, - "requires": { - "lodash._basecopy": "^3.0.0", - "lodash._basetostring": "^3.0.0", - "lodash._basevalues": "^3.0.0", - "lodash._isiterateecall": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0", - "lodash.keys": "^3.0.0", - "lodash.restparam": "^3.0.0", - "lodash.templatesettings": "^3.0.0" - } - }, - "lodash.templatesettings": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", - "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", - "dev": true, - "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0" - } - }, - "make-iterator": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", - "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-stream": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", - "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "matchdep": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", - "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", - "dev": true, - "requires": { - "findup-sync": "^2.0.0", - "micromatch": "^3.0.4", - "resolve": "^1.4.0", - "stack-trace": "0.0.10" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - } - } - }, - "math-random": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", - "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", - "dev": true - }, - "merge-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", - "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - }, - "dependencies": { - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, - "mime-db": { - "version": "1.35.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.35.0.tgz", - "integrity": "sha512-JWT/IcCTsB0Io3AhWUMjRqucrHSPsSf2xKLaRldJVULioggvkJvggZ3VXNNSRkCddE6D+BUI4HEIZIA2OjwIvg==", - "dev": true - }, - "mime-types": { - "version": "2.1.19", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.19.tgz", - "integrity": "sha512-P1tKYHVSZ6uFo26mtnve4HQFE3koh1UWVkp8YUC+ESBHe945xWSoXuHHiGarDqcEZ+whpCDnlNw5LON0kLo+sw==", - "dev": true, - "requires": { - "mime-db": "~1.35.0" - } + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "mixin-deep": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "mocha": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", - "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", - "dev": true, - "requires": { - "browser-stdout": "1.3.1", - "commander": "2.15.1", - "debug": "3.1.0", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "glob": "7.1.2", - "growl": "1.10.5", - "he": "1.1.1", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "supports-color": "5.4.0" - }, - "dependencies": { - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - } - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "multimatch": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", - "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", - "dev": true, - "requires": { - "array-differ": "^1.0.0", - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "minimatch": "^3.0.0" - } - }, - "multipipe": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", - "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", - "dev": true, - "requires": { - "duplexer2": "0.0.2" - } - }, - "mute-stdout": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.0.tgz", - "integrity": "sha1-WzLqB+tDyd7WEwQ0z5JvRrKn/U0=", - "dev": true - }, - "nan": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", - "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", - "dev": true, - "optional": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", - "dev": true - }, - "nice-try": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.4.tgz", - "integrity": "sha512-2NpiFHqC87y/zFke0fC0spBXL3bBsoh/p5H1EFhshxjCR5+0g2d6BiXbUFz9v1sAcxsk2htp2eQnNIci2dIYcA==", - "dev": true - }, - "node.extend": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/node.extend/-/node.extend-1.1.6.tgz", - "integrity": "sha1-p7iCyC1sk6SGOlUEvV3o7IYli5Y=", - "dev": true, - "requires": { - "is": "^3.1.0" - } - }, - "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "now-and-later": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.0.tgz", - "integrity": "sha1-vGHLtFbXnLMiB85HygUTb/Ln1u4=", - "dev": true, - "requires": { - "once": "^1.3.2" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "object-keys": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", - "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, - "object.defaults": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", - "dev": true, - "requires": { - "array-each": "^1.0.1", - "array-slice": "^1.0.0", - "for-own": "^1.0.0", - "isobject": "^3.0.0" - }, - "dependencies": { - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "object.map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", - "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", - "dev": true, - "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - }, - "dependencies": { - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - } - } - }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, - "requires": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "object.reduce": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", - "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", - "dev": true, - "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - }, - "dependencies": { - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - } - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "opn": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", - "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", - "requires": { - "is-wsl": "^1.1.0" - } - }, - "ordered-read-streams": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz", - "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=", - "dev": true, - "requires": { - "is-stream": "^1.0.1", - "readable-stream": "^2.0.1" - } - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "requires": { - "lcid": "^1.0.0" - } - }, - "parse-filepath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", - "dev": true, - "requires": { - "is-absolute": "^1.0.0", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" - } - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", - "dev": true - }, - "path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", - "dev": true, - "requires": { - "path-root-regex": "^0.1.0" - } - }, - "path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", - "dev": true - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "pause-stream": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", - "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", - "dev": true, - "requires": { - "through": "~2.3" - } - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "plugin-error": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", - "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", - "dev": true, - "requires": { - "ansi-cyan": "^0.1.1", - "ansi-red": "^0.1.1", - "arr-diff": "^1.0.1", - "arr-union": "^2.0.1", - "extend-shallow": "^1.1.2" - }, - "dependencies": { - "arr-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", - "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", - "dev": true - }, - "extend-shallow": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", - "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", - "dev": true, - "requires": { - "kind-of": "^1.1.0" - } - }, - "kind-of": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", - "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", - "dev": true - } - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true - }, - "pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", - "dev": true - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "psl": { - "version": "1.1.29", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", - "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==", - "dev": true - }, - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - }, - "dependencies": { - "duplexify": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", - "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - } - } - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, - "querystringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.0.0.tgz", - "integrity": "sha512-eTPo5t/4bgaMNZxyjWx6N2a6AuE0mq51KWvpc7nU/MAqixcI6v6KrGUKES0HaomdnolQBBXU/++X6/QQ9KL4tw==", - "dev": true - }, - "queue": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/queue/-/queue-3.1.0.tgz", - "integrity": "sha1-bEnQHwCeIlZ4h4nyv/rGuLmZBYU=", - "dev": true, - "requires": { - "inherits": "~2.0.0" - } - }, - "randomatic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.0.tgz", - "integrity": "sha512-KnGPVE0lo2WoXxIZ7cPR8YBpiol4gsSuOwDSg410oHh80ZMp5EiypNqL2K4Z77vJn6lB5rap7IkAmcUlalcnBQ==", - "dev": true, - "requires": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - } - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha1-No8lEtefnUb9/HE0mueHi7weuVw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", - "util-deprecate": "~1.0.1" - } - }, - "readdirp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", - "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "minimatch": "^3.0.2", - "readable-stream": "^2.0.2", - "set-immediate-shim": "^1.0.1" - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "^1.1.6" - } - }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "dev": true, - "requires": { - "is-equal-shallow": "^0.1.3" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "remove-bom-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", - "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5", - "is-utf8": "^0.2.1" - } - }, - "remove-bom-stream": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", - "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", - "dev": true, - "requires": { - "remove-bom-buffer": "^3.0.0", - "safe-buffer": "^5.1.0", - "through2": "^2.0.3" - } - }, - "remove-trailing-separator": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz", - "integrity": "sha1-abBi2XhyetFNxrVrpKt3L9jXBRE=", - "dev": true - }, - "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", - "dev": true - }, - "replace-homedir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", - "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1", - "is-absolute": "^1.0.0", - "remove-trailing-separator": "^1.1.0" - }, - "dependencies": { - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - } - } - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", - "dev": true - }, - "resolve": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", - "integrity": "sha1-p1vgHFPaJdk0qY69DkxKcxL5KoY=", - "dev": true, - "requires": { - "path-parse": "^1.0.5" - } - }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - } - }, - "resolve-options": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", - "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", - "dev": true, - "requires": { - "value-or-function": "^3.0.0" - } - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, - "requires": { - "glob": "^7.0.5" - } - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha1-iTMSr2myEj3vcfV4iQAWce6yyFM=", - "dev": true - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } }, "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha1-4FnAnYVx8FQII3M0M1BdOi8AsY4=" - }, - "semver-greatest-satisfied-range": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", - "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=", - "dev": true, - "requires": { - "sver-compat": "^1.5.0" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", - "dev": true - }, - "set-value": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "shelljs": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.2.tgz", - "integrity": "sha512-pRXeNrCA2Wd9itwhvLp5LZQvPJ0wU6bcjaTMywHHGX5XWhVN2nzSu7WV0q+oUY7mGK3mgSkDDzP3MgjqdyIgbQ==", - "dev": true, - "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "dependencies": { - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "shimmer": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.0.tgz", - "integrity": "sha512-xTCx2vohXC2EWWDqY/zb4+5Mu28D+HYNSOuFzsyRDRvI/e1ICb69afwaUwfjr+25ZXldbOLyp+iDUZHq8UnTag==" - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", - "dev": true, - "requires": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.8.tgz", - "integrity": "sha512-WqAEWPdb78u25RfKzOF0swBpY0dKrNdjc4GvLwm7ScX/o9bj8Eh/YL8mcMhBHYDGl87UkkSXDOFnW4G7GhWhGg==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "sparkles": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", - "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=", - "dev": true - }, - "spdx-correct": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", - "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", - "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", - "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", - "dev": true - }, - "split": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", - "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", - "dev": true, - "requires": { - "through": "2" - } - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "sshpk": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", - "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", - "dev": true - }, - "stat-mode": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.2.2.tgz", - "integrity": "sha1-5sgLYjEj19gM8TLOU480YokHJQI=", - "dev": true - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "stream-combiner": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", - "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", - "dev": true, - "requires": { - "duplexer": "~0.1.1" - } - }, - "stream-exhaust": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", - "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", - "dev": true - }, - "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", - "dev": true - }, - "streamfilter": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/streamfilter/-/streamfilter-1.0.7.tgz", - "integrity": "sha512-Gk6KZM+yNA1JpW0KzlZIhjo3EaBJDkYfXtYSbOwNIQ7Zd6006E6+sCFlW1NDvFG/vnXhKmw6TJJgiEQg/8lXfQ==", - "dev": true, - "requires": { - "readable-stream": "^2.0.2" - } + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true + }, + "update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "requires": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + }, + "vscode-extension-telemetry-wrapper": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/vscode-extension-telemetry-wrapper/-/vscode-extension-telemetry-wrapper-0.14.0.tgz", + "integrity": "sha512-EYr1hqiYVSGfupchDN405zSwuvA8V3tJ62KcLIRDr/4ongOc2AvSZ0BlRq8a0w950tadsMlXTKEheB97fZBttg==", + "requires": { + "@vscode/extension-telemetry": "^0.9.6", + "uuid": "^8.3.2" + } + }, + "vscode-jsonrpc": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", + "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==" + }, + "vscode-languageclient": { + "version": "6.0.0-next.9", + "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-6.0.0-next.9.tgz", + "integrity": "sha512-NEpeeFM9FKrrRqlBHXGfwpkhtnjruDz3zfFBP+Cymr10qigAEtE/JsODJsIG/ErGqjh3/JXxu8SUOVTGu5oK+w==", + "requires": { + "semver": "^6.3.0", + "vscode-languageserver-protocol": "^3.15.0-next.14" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + } + }, + "vscode-languageserver-protocol": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", + "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", + "requires": { + "vscode-jsonrpc": "8.2.0", + "vscode-languageserver-types": "3.17.5" + }, + "dependencies": { + "vscode-languageserver-types": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==" + } + } + }, + "vscode-languageserver-types": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz", + "integrity": "sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==" + }, + "vscode-tas-client": { + "version": "0.1.84", + "resolved": "https://registry.npmjs.org/vscode-tas-client/-/vscode-tas-client-0.1.84.tgz", + "integrity": "sha512-rUTrUopV+70hvx1hW5ebdw1nd6djxubkLvVxjGdyD/r5v/wcVF41LIfiAtbm5qLZDtQdsMH1IaCuDoluoIa88w==", + "requires": { + "tas-client": "0.2.33" + } + }, + "watchpack": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", + "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", + "dev": true, + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "webpack": { + "version": "5.105.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.0.tgz", + "integrity": "sha512-gX/dMkRQc7QOMzgTe6KsYFM7DxeIONQSui1s0n/0xht36HvrgbxtM1xBlgx596NbpHuQU8P7QpKwrZYwUX48nw==", + "dev": true, + "requires": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.28.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.19.0", + "es-module-lexer": "^2.0.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.3.1", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.3.16", + "watchpack": "^2.5.1", + "webpack-sources": "^3.3.3" + } + }, + "webpack-cli": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", + "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", + "dev": true, + "requires": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.2.0", + "@webpack-cli/info": "^1.5.0", + "@webpack-cli/serve": "^1.7.0", + "colorette": "^2.0.14", + "commander": "^7.0.0", + "cross-spawn": "^7.0.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "webpack-merge": "^5.7.3" + }, + "dependencies": { + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true + } + } + }, + "webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + } + }, + "webpack-sources": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", + "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true + }, + "workerpool": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", + "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true }, - "streamifier": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/streamifier/-/streamifier-0.1.1.tgz", - "integrity": "sha1-l+mNj6TRBdYqJpHR3AfoINuN/E8=", - "dev": true + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true }, "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } }, "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - }, - "strip-bom-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz", - "integrity": "sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=", - "dev": true, - "requires": { - "first-chunk-stream": "^1.0.0", - "strip-bom": "^2.0.0" - } - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "sver-compat": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", - "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", - "dev": true, - "requires": { - "es6-iterator": "^2.0.1", - "es6-symbol": "^3.1.1" - } - }, - "tar": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", - "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", - "dev": true, - "requires": { - "block-stream": "*", - "fstream": "^1.0.2", - "inherits": "2" - } - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", - "dev": true, - "requires": { - "readable-stream": "^2.1.5", - "xtend": "~4.0.1" - } - }, - "through2-filter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz", - "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=", - "dev": true, - "requires": { - "through2": "~2.0.0", - "xtend": "~4.0.0" - } - }, - "time-stamp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", - "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", - "dev": true - }, - "to-absolute-glob": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz", - "integrity": "sha1-HN+kcqnvUMI57maZm2YsoOs5k38=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1" - } - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - } - } - }, - "to-through": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", - "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", - "dev": true, - "requires": { - "through2": "^2.0.3" - } - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - } - }, - "tslib": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.7.1.tgz", - "integrity": "sha1-vIAEFkaRkjp5/oN4u+s9ogF1OOw=", - "dev": true - }, - "tslint": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.7.0.tgz", - "integrity": "sha1-wl4NDJL6EgHCvDDoROCOaCtPNVI=", - "dev": true, - "requires": { - "babel-code-frame": "^6.22.0", - "colors": "^1.1.2", - "commander": "^2.9.0", - "diff": "^3.2.0", - "glob": "^7.1.1", - "minimatch": "^3.0.4", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.7.1", - "tsutils": "^2.8.1" - }, - "dependencies": { - "commander": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", - "dev": true - }, - "diff": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", - "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", - "dev": true - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "tsutils": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.8.2.tgz", - "integrity": "sha1-LBSGukMSYIRbCsb5Aq/Z1wio6mo=", - "dev": true, - "requires": { - "tslib": "^1.7.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true, - "optional": true - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "typescript": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.0.1.tgz", - "integrity": "sha512-zQIMOmC+372pC/CCVLqnQ0zSBiY7HHodU7mpQdjiZddek4GMj31I3dUJ7gAs9o65X7mnRma6OokOkc6f9jjfBg==", - "dev": true - }, - "unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", - "dev": true - }, - "undertaker": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.2.0.tgz", - "integrity": "sha1-M52kZGJS0ILcN45wgGcpl1DhG0k=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1", - "arr-map": "^2.0.0", - "bach": "^1.0.0", - "collection-map": "^1.0.0", - "es6-weak-map": "^2.0.1", - "last-run": "^1.1.0", - "object.defaults": "^1.0.0", - "object.reduce": "^1.0.0", - "undertaker-registry": "^1.0.0" - } - }, - "undertaker-registry": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", - "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=", - "dev": true - }, - "union-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^0.4.3" - }, - "dependencies": { - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" - } - } - } - }, - "unique-stream": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz", - "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=", - "dev": true, - "requires": { - "json-stable-stringify": "^1.0.0", - "through2-filter": "^2.0.0" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "upath": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", - "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", - "dev": true - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "url-parse": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.3.tgz", - "integrity": "sha512-rh+KuAW36YKo0vClhQzLLveoj8FwPJNu65xLb7Mrt+eZht0IPT0IXgSv8gcMegZ6NvjJUALf6Mf25POlMwD1Fw==", - "dev": true, - "requires": { - "querystringify": "^2.0.0", - "requires-port": "^1.0.0" - } - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" - }, - "v8flags": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.1.tgz", - "integrity": "sha512-iw/1ViSEaff8NJ3HLyEjawk/8hjJib3E7pvG4pddVXfUg1983s3VGsiClDjhK64MQVDGqc1Q8r18S4VKQZS9EQ==", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "vali-date": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", - "integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "value-or-function": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", - "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", - "dev": true - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "vinyl": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", - "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", - "dev": true, - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - } - }, - "vinyl-fs": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz", - "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=", - "dev": true, - "requires": { - "duplexify": "^3.2.0", - "glob-stream": "^5.3.2", - "graceful-fs": "^4.0.0", - "gulp-sourcemaps": "1.6.0", - "is-valid-glob": "^0.3.0", - "lazystream": "^1.0.0", - "lodash.isequal": "^4.0.0", - "merge-stream": "^1.0.0", - "mkdirp": "^0.5.0", - "object-assign": "^4.0.0", - "readable-stream": "^2.0.4", - "strip-bom": "^2.0.0", - "strip-bom-stream": "^1.0.0", - "through2": "^2.0.0", - "through2-filter": "^2.0.0", - "vali-date": "^1.0.0", - "vinyl": "^1.0.0" - }, - "dependencies": { - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "vinyl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", - "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", - "dev": true, - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - } - } - } - }, - "vinyl-source-stream": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vinyl-source-stream/-/vinyl-source-stream-1.1.2.tgz", - "integrity": "sha1-YrU6E1YQqJbpjKlr7jqH8Aio54A=", - "dev": true, - "requires": { - "through2": "^2.0.3", - "vinyl": "^0.4.3" - }, - "dependencies": { - "clone": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", - "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", - "dev": true - }, - "vinyl": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", - "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", - "dev": true, - "requires": { - "clone": "^0.2.0", - "clone-stats": "^0.0.1" - } - } - } - }, - "vinyl-sourcemap": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", - "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", - "dev": true, - "requires": { - "append-buffer": "^1.0.2", - "convert-source-map": "^1.5.0", - "graceful-fs": "^4.1.6", - "normalize-path": "^2.1.1", - "now-and-later": "^2.0.0", - "remove-bom-buffer": "^3.0.0", - "vinyl": "^2.0.0" - }, - "dependencies": { - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true - }, - "clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", - "dev": true - }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", - "dev": true - }, - "vinyl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", - "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", - "dev": true, - "requires": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" - } - } - } - }, - "vscode": { - "version": "1.1.21", - "resolved": "https://registry.npmjs.org/vscode/-/vscode-1.1.21.tgz", - "integrity": "sha512-tJl9eL15ZMm6vzCYYeQ26sSYRuXGMGPsaeIAmG2rOOYRn01jdaDg6I4b9G5Ed6FISdmn6egpKThk4o4om8Ax/A==", - "dev": true, - "requires": { - "glob": "^7.1.2", - "gulp-chmod": "^2.0.0", - "gulp-filter": "^5.0.1", - "gulp-gunzip": "1.0.0", - "gulp-remote-src-vscode": "^0.5.0", - "gulp-symdest": "^1.1.0", - "gulp-untar": "^0.0.7", - "gulp-vinyl-zip": "^2.1.0", - "mocha": "^4.0.1", - "request": "^2.83.0", - "semver": "^5.4.1", - "source-map-support": "^0.5.0", - "url-parse": "^1.4.3", - "vinyl-source-stream": "^1.1.0" - }, - "dependencies": { - "commander": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", - "dev": true - }, - "diff": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", - "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "growl": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", - "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", - "dev": true - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "mocha": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", - "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", - "dev": true, - "requires": { - "browser-stdout": "1.3.0", - "commander": "2.11.0", - "debug": "3.1.0", - "diff": "3.3.1", - "escape-string-regexp": "1.0.5", - "glob": "7.1.2", - "growl": "1.10.3", - "he": "1.1.1", - "mkdirp": "0.5.1", - "supports-color": "4.4.0" - } - }, - "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", - "dev": true, - "requires": { - "has-flag": "^2.0.0" - } - } - } - }, - "vscode-extension-telemetry": { - "version": "0.0.18", - "resolved": "https://registry.npmjs.org/vscode-extension-telemetry/-/vscode-extension-telemetry-0.0.18.tgz", - "integrity": "sha512-Vw3Sr+dZwl+c6PlsUwrTtCOJkgrmvS3OUVDQGcmpXWAgq9xGq6as0K4pUx+aGqTjzLAESmWSrs6HlJm6J6Khcg==", - "requires": { - "applicationinsights": "1.0.1" - } - }, - "vscode-extension-telemetry-wrapper": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/vscode-extension-telemetry-wrapper/-/vscode-extension-telemetry-wrapper-0.3.1.tgz", - "integrity": "sha512-92OsAerFwbMf5XzrkWROuehf8tZ25GdLOC7DpvMVXtDO+arFMM0ciBUW9V7KFf5MKCnS+CaxdUvOAV2Ozhgscw==", - "requires": { - "continuation-local-storage": "^3.2.1", - "fs-extra": "^5.0.0", - "uuid": "^3.1.0", - "vscode-extension-telemetry": "^0.0.18" - } - }, - "which": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha1-/wS9/AEO5UfXgL7DjhrBwnd9JTo=", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", - "dev": true - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - }, - "yargs": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", - "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", - "dev": true, - "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^5.0.0" - } - }, - "yargs-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", - "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", - "dev": true, - "requires": { - "camelcase": "^3.0.0" - } + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true }, - "yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", - "dev": true, - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true }, - "yazl": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.4.3.tgz", - "integrity": "sha1-7CblzIfVYBud+EMtvdPNLlFzoHE=", - "dev": true, - "requires": { - "buffer-crc32": "~0.2.3" - } + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } }, - "zone.js": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.7.6.tgz", - "integrity": "sha1-+7w50+AmHQmG8boGMG6zrrDSIAk=" + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } } + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true + }, + "yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "requires": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + } + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true } + } } diff --git a/package.json b/package.json index e72e615d..38de66c8 100644 --- a/package.json +++ b/package.json @@ -2,11 +2,18 @@ "name": "vscode-java-debug", "displayName": "Debugger for Java", "description": "A lightweight Java debugger for Visual Studio Code", - "version": "0.13.0", + "version": "0.58.5", "publisher": "vscjava", - "preview": true, + "preview": false, "aiKey": "67d4461e-ccba-418e-8082-1bd0acfe8516", "icon": "logo.png", + "workspaceTrust": { + "request": "onDemand", + "description": "Extension may require your trust on workspace for code execution." + }, + "capabilities": { + "virtualWorkspaces": false + }, "keywords": [ "java", "debug", @@ -14,7 +21,7 @@ "debugger" ], "engines": { - "vscode": "^1.22.0" + "vscode": "^1.95.0" }, "license": "SEE LICENSE IN LICENSE.txt", "repository": { @@ -26,20 +33,344 @@ }, "homepage": "https://github.com/Microsoft/vscode-java-debug/blob/master/README.md", "categories": [ - "Debuggers" + "Debuggers", + "Programming Languages", + "Other" ], "activationEvents": [ "onLanguage:java", "onDebugInitialConfigurations", "onDebugResolve:java", - "onCommand:JavaDebug.SpecifyProgramArgs" + "onCommand:JavaDebug.SpecifyProgramArgs", + "onCommand:JavaDebug.PickJavaProcess", + "onLanguageModelTool:debug_java_application" ], - "main": "./out/src/extension", + "main": "./dist/extension", "contributes": { + "breakpoints": [ + { + "language": "java" + } + ], "javaExtensions": [ - "./server/com.microsoft.java.debug.plugin-0.13.0.jar" + "./server/com.microsoft.java.debug.plugin-0.53.2.jar" + ], + "commands": [ + { + "command": "java.debug.hotCodeReplace", + "title": "Hot Code Replace", + "icon": { + "dark": "images/commands/hot_code_replace.svg", + "light": "images/commands/hot_code_replace.svg" + } + }, + { + "command": "java.debug.runJavaFile", + "title": "Run Java", + "icon": "$(play)" + }, + { + "command": "java.debug.debugJavaFile", + "title": "Debug Java", + "icon": "$(debug-alt-small)" + }, + { + "command": "java.debug.runFromProjectView", + "title": "Run", + "icon": "$(play)" + }, + { + "command": "java.debug.debugFromProjectView", + "title": "Debug", + "icon": "$(debug-alt-small)" + }, + { + "command": "java.debug.continueAll", + "title": "Continue All" + }, + { + "command": "java.debug.continueOthers", + "title": "Continue Others" + }, + { + "command": "java.debug.pauseAll", + "title": "Pause All" + }, + { + "command": "java.debug.pauseOthers", + "title": "Pause Others" + }, + { + "command": "java.debug.breakpoints.exceptionTypes", + "title": "Manage Java Breakpoint Exception Types" + }, + { + "command": "java.debug.variables.showHex", + "title": "Show as Hex" + }, + { + "command": "java.debug.variables.notShowHex", + "title": "Show as Dec" + }, + { + "command": "java.debug.variables.showQualifiedNames", + "title": "Show Qualified Names" + }, + { + "command": "java.debug.variables.notShowQualifiedNames", + "title": "Show Simple Names" + }, + { + "command": "java.debug.variables.showStaticVariables", + "title": "Show Static Variables" + }, + { + "command": "java.debug.variables.notShowStaticVariables", + "title": "Hide Static Variables" + }, + { + "command": "java.debug.variables.showLogicalStructure", + "title": "Enable Logical Structure View" + }, + { + "command": "java.debug.variables.notShowLogicalStructure", + "title": "Disable Logical Structure View" + }, + { + "command": "java.debug.variables.showToString", + "title": "Enable 'toString()' Object View" + }, + { + "command": "java.debug.variables.notShowToString", + "title": "Disable 'toString()' Object View" + }, + { + "command": "java.debug.variables.autoExpandLazyVariables", + "title": "Auto Expand Lazy Variables" + }, + { + "command": "java.debug.variables.manualExpandLazyVariables", + "title": "Manual Expand Lazy Variables" + } ], - "commands": [], + "menus": { + "view/item/context": [ + { + "command": "java.debug.debugFromProjectView", + "when": "view == javaProjectExplorer && viewItem =~ /java:project(?=.*?\\b\\+java\\b)(?=.*?\\b\\+uri\\b)/", + "group": "inline@100" + }, + { + "command": "java.debug.runFromProjectView", + "when": "view == javaProjectExplorer && viewItem =~ /java:project(?=.*?\\b\\+java\\b)(?=.*?\\b\\+uri\\b)/", + "group": "8_execution@10" + }, + { + "command": "java.debug.debugFromProjectView", + "when": "view == javaProjectExplorer && viewItem =~ /java:project(?=.*?\\b\\+java\\b)(?=.*?\\b\\+uri\\b)/", + "group": "8_execution@20" + } + ], + "explorer/context": [ + { + "command": "java.debug.runJavaFile", + "when": "resourceExtname == .java", + "group": "1_javaactions@90" + }, + { + "command": "java.debug.debugJavaFile", + "when": "resourceExtname == .java", + "group": "1_javaactions@91" + } + ], + "editor/context": [ + { + "command": "java.debug.runJavaFile", + "when": "editorLangId == java && resourceExtname == .java", + "group": "javadebug@1" + }, + { + "command": "java.debug.debugJavaFile", + "when": "editorLangId == java && resourceExtname == .java", + "group": "javadebug@2" + } + ], + "editor/title/run": [ + { + "command": "java.debug.runJavaFile", + "when": "resourceExtname == .java", + "group": "1_javadebug@10" + }, + { + "command": "java.debug.debugJavaFile", + "when": "resourceExtname == .java", + "group": "1_javadebug@20" + } + ], + "debug/toolBar": [ + { + "command": "java.debug.hotCodeReplace", + "group": "navigation@100", + "when": "inDebugMode && debugType == java && javaHotReload == 'manual' && javaHotReloadOn" + } + ], + "debug/callstack/context": [ + { + "command": "java.debug.continueAll", + "when": "inDebugMode && debugType == java && callStackItemType == 'thread'" + }, + { + "command": "java.debug.continueOthers", + "when": "inDebugMode && debugType == java && callStackItemType == 'thread'" + }, + { + "command": "java.debug.pauseAll", + "when": "inDebugMode && debugType == java && callStackItemType == 'thread'" + }, + { + "command": "java.debug.pauseOthers", + "when": "inDebugMode && debugType == java && callStackItemType == 'thread'" + } + ], + "commandPalette": [ + { + "command": "java.debug.hotCodeReplace", + "when": "false" + }, + { + "command": "java.debug.runJavaFile", + "when": "false" + }, + { + "command": "java.debug.debugJavaFile", + "when": "false" + }, + { + "command": "java.debug.continueAll", + "when": "false" + }, + { + "command": "java.debug.continueOthers", + "when": "false" + }, + { + "command": "java.debug.pauseAll", + "when": "false" + }, + { + "command": "java.debug.pauseOthers", + "when": "false" + }, + { + "command": "java.debug.runFromProjectView", + "when": "false" + }, + { + "command": "java.debug.debugFromProjectView", + "when": "false" + }, + { + "command": "java.debug.variables.showHex", + "when": "false" + }, + { + "command": "java.debug.variables.notShowHex", + "when": "false" + }, + { + "command": "java.debug.variables.showQualifiedNames", + "when": "false" + }, + { + "command": "java.debug.variables.notShowQualifiedNames", + "when": "false" + }, + { + "command": "java.debug.variables.showStaticVariables", + "when": "false" + }, + { + "command": "java.debug.variables.notShowStaticVariables", + "when": "false" + }, + { + "command": "java.debug.variables.showLogicalStructure", + "when": "false" + }, + { + "command": "java.debug.variables.notShowLogicalStructure", + "when": "false" + }, + { + "command": "java.debug.variables.showToString", + "when": "false" + }, + { + "command": "java.debug.variables.notShowToString", + "when": "false" + }, + { + "command": "java.debug.variables.autoExpandLazyVariables", + "when": "false" + }, + { + "command": "java.debug.variables.manualExpandLazyVariables", + "when": "false" + } + ], + "debug/variables/context": [ + { + "command": "java.debug.variables.showHex", + "when": "debugType == 'java' && javadebug:showHex == 'off'", + "group": "1_view@1" + }, + { + "command": "java.debug.variables.notShowHex", + "when": "debugType == 'java' && javadebug:showHex == 'on'", + "group": "1_view@1" + }, + { + "command": "java.debug.variables.showQualifiedNames", + "when": "debugType == 'java' && javadebug:showQualifiedNames == 'off'", + "group": "1_view@2" + }, + { + "command": "java.debug.variables.notShowQualifiedNames", + "when": "debugType == 'java' && javadebug:showQualifiedNames == 'on'", + "group": "1_view@2" + }, + { + "command": "java.debug.variables.showStaticVariables", + "when": "debugType == 'java' && javadebug:showStaticVariables == 'off'", + "group": "1_view@3" + }, + { + "command": "java.debug.variables.notShowStaticVariables", + "when": "debugType == 'java' && javadebug:showStaticVariables == 'on'", + "group": "1_view@3" + }, + { + "command": "java.debug.variables.showLogicalStructure", + "when": "debugType == 'java' && javadebug:showLogicalStructure == 'off'", + "group": "1_view@4" + }, + { + "command": "java.debug.variables.notShowLogicalStructure", + "when": "debugType == 'java' && javadebug:showLogicalStructure == 'on'", + "group": "1_view@4" + }, + { + "command": "java.debug.variables.autoExpandLazyVariables", + "when": "debugType == 'java' && javadebug:expandLazyVariable == 'off'", + "group": "1_view@6" + }, + { + "command": "java.debug.variables.manualExpandLazyVariables", + "when": "debugType == 'java' && javadebug:expandLazyVariable == 'on'", + "group": "1_view@6" + } + ] + }, "debuggers": [ { "type": "java", @@ -47,13 +378,9 @@ "languages": [ "java" ], - "enableBreakpointsFor": { - "languageIds": [ - "java" - ] - }, "variables": { - "SpecifyProgramArgs": "JavaDebug.SpecifyProgramArgs" + "SpecifyProgramArgs": "JavaDebug.SpecifyProgramArgs", + "PickJavaProcess": "JavaDebug.PickJavaProcess" }, "configurationAttributes": { "launch": { @@ -63,12 +390,17 @@ "properties": { "projectName": { "type": "string", - "description": "The preferred project in which the debugger searches for classes. There could be duplicated class names in different projects. This setting also works when the debugger looks for the specified main class when launching a program. It is required for expression evaluation.", + "description": "%java.debugger.launch.projectName.description%", "default": "" }, "mainClass": { "type": "string", - "description": "The main class of the program (fully qualified name, e.g. [mymodule/]com.xyz.MainClass).", + "description": "%java.debugger.launch.mainClass.description%", + "default": "" + }, + "javaExec": { + "type": "string", + "description": "%java.debugger.launch.javaExec.description%", "default": "" }, "args": { @@ -76,7 +408,7 @@ "array", "string" ], - "description": "The command line arguments passed to the program.", + "description": "%java.debugger.launch.args.description%", "default": "" }, "vmArgs": { @@ -84,23 +416,55 @@ "array", "string" ], - "description": "The extra options and system properties for the JVM (e.g. -Xms -Xmx -D=).", + "description": "%java.debugger.launch.vmArgs.description%", "default": "" }, "modulePaths": { "type": "array", "items": { - "type": "string" + "anyOf": [ + { + "enum": [ + "$Auto", + "$Runtime", + "$Test", + "!" + ], + "enumDescriptions": [ + "%java.debugger.launch.modulePaths.auto%", + "%java.debugger.launch.modulePaths.runtime%", + "%java.debugger.launch.modulePaths.test%", + "%java.debugger.launch.modulePaths.exclude%" + ] + }, + "string" + ] }, - "description": "The modulepaths for launching the JVM. If not specified, the debugger will automatically resolve from current project.", + "description": "%java.debugger.launch.modulePaths.description%", "default": [] }, "classPaths": { "type": "array", "items": { - "type": "string" + "anyOf": [ + { + "enum": [ + "$Auto", + "$Runtime", + "$Test", + "!" + ], + "enumDescriptions": [ + "%java.debugger.launch.classPaths.auto%", + "%java.debugger.launch.classPaths.runtime%", + "%java.debugger.launch.classPaths.test%", + "%java.debugger.launch.classPaths.exclude%" + ] + }, + "string" + ] }, - "description": "The classpaths for launching the JVM. If not specified, the debugger will automatically resolve from current project.", + "description": "%java.debugger.launch.classPaths.description%", "default": [] }, "sourcePaths": { @@ -108,27 +472,35 @@ "items": { "type": "string" }, - "description": "The extra source directories of the program. The debugger looks for source code from project settings by default. This option allows the debugger to look for source code in extra directories.", + "description": "%java.debugger.launch.sourcePaths.description%", "default": [] }, "encoding": { "type": "string", - "description": "The file.encoding setting for the JVM. If not specified, 'UTF-8' will be used. Possible values can be found in http://docs.oracle.com/javase/8/docs/technotes/guides/intl/encoding.doc.html.", + "description": "%java.debugger.launch.encoding.description%", "default": "UTF-8" }, "cwd": { "type": "string", - "description": "The working directory of the program.", + "description": "%java.debugger.launch.cwd.description%", "default": "${workspaceFolder}" }, "env": { "type": "object", - "description": "The extra environment variables for the program.", + "description": "%java.debugger.launch.env.description%", "default": {} }, + "envFile": { + "type": [ + "array", + "string" + ], + "description": "%java.debugger.launch.envFile.description%", + "default": "${workspaceFolder}/.env" + }, "stopOnEntry": { "type": "boolean", - "description": "Automatically pause the program after launching.", + "description": "%java.debugger.launch.stopOnEntry.description%", "default": true }, "console": { @@ -139,58 +511,83 @@ "externalTerminal" ], "enumDescriptions": [ - "VS Code debug console (input stream not supported).", - "VS Code integrated terminal.", - "External terminal that can be configured in user settings." + "%java.debugger.launch.internalConsole.description%", + "%java.debugger.launch.integratedTerminal.description%", + "%java.debugger.launch.externalTerminal.description%" + ], + "description": "%java.debugger.launch.console.description%", + "default": "integratedTerminal" + }, + "shortenCommandLine": { + "type": "string", + "enum": [ + "none", + "jarmanifest", + "argfile", + "auto" + ], + "enumDescriptions": [ + "%java.debugger.launch.shortenCommandLine.none%", + "%java.debugger.launch.shortenCommandLine.jarmanifest%", + "%java.debugger.launch.shortenCommandLine.argfile%", + "%java.debugger.launch.shortenCommandLine.auto%" ], - "description": "The specified console to launch the program.", - "default": "internalConsole" + "description": "%java.debugger.launch.shortenCommandLine.description%", + "default": "auto" }, "stepFilters": { "type": "object", - "description": "Skip specified classes or methods when stepping.", + "description": "%java.debugger.launch.stepFilters.description%", "default": { - "classNameFilters": [ - "java.*", - "javax.*", - "com.sun.*", - "sun.*", - "sunw.*", - "org.omg.*" + "skipClasses": [ + "$JDK", + "junit.*" ], "skipSynthetics": false, "skipStaticInitializers": false, "skipConstructors": false }, "properties": { - "classNameFilters": { + "skipClasses": { "type": "array", - "description": "Skip the specified classes when stepping. Class names should be fully qualified. Wildcard is supported.", - "item": { - "type": "string" + "description": "%java.debugger.launch.skipClasses.description%", + "items": { + "anyOf": [ + { + "enum": [ + "$JDK", + "$Libraries", + "java.lang.ClassLoader", + "" + ], + "enumDescriptions": [ + "%java.debugger.launch.skipClasses.skipJDK%", + "%java.debugger.launch.skipClasses.skipLibraries%", + "%java.debugger.launch.skipClasses.skipClassLoader%", + "%java.debugger.launch.skipClasses.skipClassPattern%" + ] + }, + "string" + ] }, "default": [ - "java.*", - "javax.*", - "com.sun.*", - "sun.*", - "sunw.*", - "org.omg.*" + "$JDK", + "junit.*" ] }, "skipSynthetics": { "type": "boolean", - "description": "Skip synthetic methods when stepping.", + "description": "%java.debugger.launch.skipSynthetics.description%", "default": true }, "skipStaticInitializers": { "type": "boolean", - "description": "Skip static initializer methods when stepping.", + "description": "%java.debugger.launch.skipStaticInitializers.description%", "default": true }, "skipConstructors": { "type": "boolean", - "description": "Skip constructor methods when stepping.", + "description": "%java.debugger.launch.skipConstructors.description%", "default": true } } @@ -198,24 +595,38 @@ } }, "attach": { - "required": [ - "hostName", - "port" - ], "properties": { "hostName": { "type": "string", "default": "localhost", - "description": "The host name or ip address of remote debuggee." + "description": "%java.debugger.attach.hostName.description%" }, "port": { - "type": "number", - "description": "The debug port of remote debuggee." + "type": [ + "number", + "string" + ], + "description": "%java.debugger.attach.port.description%" + }, + "processId": { + "anyOf": [ + { + "enum": [ + "${command:PickJavaProcess}" + ], + "description": "%java.debugger.attach.processPicker.description%", + "default": "${command:PickJavaProcess}" + }, + { + "type": "integer", + "description": "%java.debugger.attach.processId.description%" + } + ] }, "timeout": { "type": "number", "default": 30000, - "description": "Timeout value before reconnecting, in milliseconds (default to 30000ms)." + "description": "%java.debugger.attach.timeout.description%" }, "sourcePaths": { "type": "array", @@ -223,58 +634,66 @@ "type": "string" }, "default": [], - "description": "The extra source directories of the program. The debugger looks for source code from project settings by default. This option allows the debugger to look for source code in extra directories." + "description": "%java.debugger.launch.sourcePaths.description%" }, "projectName": { "type": "string", - "description": "The preferred project in which the debugger searches for classes. There could be duplicated class names in different projects.", + "description": "%java.debugger.attach.projectName.description%", "default": "" }, "stepFilters": { "type": "object", - "description": "Skip specified classes or methods when stepping.", + "description": "%java.debugger.launch.stepFilters.description%", "default": { - "classNameFilters": [ - "java.*", - "javax.*", - "com.sun.*", - "sun.*", - "sunw.*", - "org.omg.*" + "skipClasses": [ + "$JDK", + "junit.*" ], "skipSynthetics": false, "skipStaticInitializers": false, "skipConstructors": false }, "properties": { - "classNameFilters": { + "skipClasses": { "type": "array", - "description": "Skip the specified classes when stepping. Class names should be fully qualified. Wildcard is supported.", - "item": { - "type": "string" + "description": "%java.debugger.launch.skipClasses.description%", + "items": { + "anyOf": [ + { + "enum": [ + "$JDK", + "$Libraries", + "java.lang.ClassLoader", + "" + ], + "enumDescriptions": [ + "%java.debugger.launch.skipClasses.skipJDK%", + "%java.debugger.launch.skipClasses.skipLibraries%", + "%java.debugger.launch.skipClasses.skipClassLoader%", + "%java.debugger.launch.skipClasses.skipClassPattern%" + ] + }, + "string" + ] }, "default": [ - "java.*", - "javax.*", - "com.sun.*", - "sun.*", - "sunw.*", - "org.omg.*" + "$JDK", + "junit.*" ] }, "skipSynthetics": { "type": "boolean", - "description": "Skip synthetic methods when stepping.", + "description": "%java.debugger.launch.skipSynthetics.description%", "default": false }, "skipStaticInitializers": { "type": "boolean", - "description": "Skip static initializer methods when stepping.", + "description": "%java.debugger.launch.skipStaticInitializers.description%", "default": false }, "skipConstructors": { "type": "boolean", - "description": "Skip constructor methods when stepping.", + "description": "%java.debugger.launch.skipConstructors.description%", "default": false } } @@ -285,41 +704,76 @@ "configurationSnippets": [ { "label": "Java: Launch Program", - "description": "Add a new configuration for launching a java program.", + "description": "%java.debugger.snippet.launch.description%", "body": { "type": "java", - "name": "Debug (Launch)", + "name": "Launch Java Program", "request": "launch", - "cwd": "^\"\\${workspaceFolder}\"", - "console": "internalConsole", - "stopOnEntry": false, - "mainClass": "", - "args": "" + "mainClass": "" + } + }, + { + "label": "Java: Launch Program in External Terminal", + "description": "%java.debugger.snippet.launchInExternalTerminal.description%", + "body": { + "type": "java", + "name": "Launch External Terminal", + "request": "launch", + "console": "externalTerminal", + "mainClass": "" + } + }, + { + "label": "Java: Launch Program in Current File", + "description": "%java.debugger.snippet.launchCurrentFile.description%", + "body": { + "type": "java", + "name": "Launch Current File", + "request": "launch", + "mainClass": "^\"\\${file}\"" } }, { "label": "Java: Launch Program with Arguments Prompt", - "description": "Add a new configuration for launching a java program with arguments prompt.", + "description": "%java.debugger.snippet.launchWithArgumentsPrompt.description%", "body": { "type": "java", - "name": "Debug (Launch) with Arguments Prompt", + "name": "Launch with Arguments Prompt", "request": "launch", - "cwd": "^\"\\${workspaceFolder}\"", - "console": "internalConsole", - "stopOnEntry": false, "mainClass": "", "args": "^\"\\${command:SpecifyProgramArgs}\"" } }, { - "label": "Java: Attach to Remote Program", - "description": "Add a new configuration for attaching to a running java program.", + "label": "Java: Attach", + "description": "%java.debugger.snippet.attach.description%", "body": { "type": "java", - "name": "Debug (Attach)", + "name": "Attach", "request": "attach", "hostName": "localhost", - "port": 0 + "port": "" + } + }, + { + "label": "Java: Attach to Process", + "description": "%java.debugger.snippet.attachProcess.description%", + "body": { + "type": "java", + "request": "attach", + "name": "Attach by Process ID", + "processId": "^\"\\${command:PickJavaProcess}\"" + } + }, + { + "label": "Java: Attach to Remote Program", + "description": "%java.debugger.snippet.attachRemote.description%", + "body": { + "type": "java", + "name": "Attach to Remote Program", + "request": "attach", + "hostName": "", + "port": "" } } ] @@ -327,12 +781,12 @@ ], "configuration": { "type": "object", - "title": "Java Debugger Configuration", + "title": "%java.debugger.configuration.title%", "properties": { "java.debug.logLevel": { "type": "string", "default": "warn", - "description": "minimum level of debugger logs that are sent to VS Code", + "description": "%java.debugger.configuration.logLevel.description%", "enum": [ "error", "warn", @@ -342,58 +796,580 @@ }, "java.debug.settings.showHex": { "type": "boolean", - "description": "show numbers in hex format in \"Variables\" viewlet.", + "description": "%java.debugger.configuration.showHex.description%", "default": false }, "java.debug.settings.showStaticVariables": { "type": "boolean", - "description": "show static variables in \"Variables\" viewlet", - "default": true + "description": "%java.debugger.configuration.showStaticVariables.description%", + "default": false }, "java.debug.settings.showQualifiedNames": { "type": "boolean", - "description": "show fully qualified class names in \"Variables\" viewlet", + "description": "%java.debugger.configuration.showQualifiedNames.description%", "default": false }, + "java.debug.settings.showLogicalStructure": { + "type": "boolean", + "description": "%java.debugger.configuration.showLogicalStructure.description%", + "default": true + }, + "java.debug.settings.showToString": { + "type": "boolean", + "description": "%java.debugger.configuration.showToString.description%", + "default": true + }, "java.debug.settings.maxStringLength": { "type": "number", - "description": "the maximum length of string displayed in \"Variables\" or \"Debug Console\" viewlet, the string longer than this length will be trimmed, defaults to 0 which means no trim is performed.", + "description": "%java.debugger.configuration.maxStringLength.description%", + "default": 0 + }, + "java.debug.settings.numericPrecision": { + "type": "number", + "description": "%java.debugger.configuration.numericPrecision.description%", "default": 0 }, - "java.debug.settings.enableHotCodeReplace": { + "java.debug.settings.hotCodeReplace": { + "type": "string", + "default": "manual", + "description": "%java.debugger.configuration.hotCodeReplace.description%", + "enum": [ + "auto", + "manual", + "never" + ] + }, + "java.debug.settings.enableRunDebugCodeLens": { "type": "boolean", - "description": "Enable hot code replace for Java code", + "description": "%java.debugger.configuration.enableRunDebugCodeLens.description%", "default": true + }, + "java.debug.settings.forceBuildBeforeLaunch": { + "type": "boolean", + "description": "%java.debugger.configuration.forceBuildBeforeLaunch%", + "default": true + }, + "java.debug.settings.onBuildFailureProceed": { + "type": "boolean", + "description": "%java.debugger.configuration.onBuildFailureProceed%", + "default": false + }, + "java.debug.settings.console": { + "type": "string", + "enum": [ + "internalConsole", + "integratedTerminal", + "externalTerminal" + ], + "enumDescriptions": [ + "%java.debugger.launch.internalConsole.description%", + "%java.debugger.launch.integratedTerminal.description%", + "%java.debugger.launch.externalTerminal.description%" + ], + "description": "%java.debugger.configuration.console%", + "default": "integratedTerminal" + }, + "java.debug.settings.exceptionBreakpoint.exceptionTypes": { + "type": "array", + "description": "%java.debugger.configuration.exceptionBreakpoint.exceptionTypes%", + "items": { + "type": "string" + }, + "default": [] + }, + "java.debug.settings.exceptionBreakpoint.allowClasses": { + "type": "array", + "description": "%java.debugger.configuration.exceptionBreakpoint.allowClasses%", + "items": { + "type": "string" + }, + "default": [] + }, + "java.debug.settings.exceptionBreakpoint.skipClasses": { + "type": "array", + "description": "%java.debugger.configuration.exceptionBreakpoint.skipClasses%", + "items": { + "anyOf": [ + { + "enum": [ + "$JDK", + "$Libraries", + "java.lang.ClassLoader", + "" + ], + "enumDescriptions": [ + "%java.debugger.launch.skipClasses.skipJDK%", + "%java.debugger.launch.skipClasses.skipLibraries%", + "%java.debugger.launch.skipClasses.skipClassLoader%", + "%java.debugger.launch.skipClasses.skipClassPattern%" + ] + }, + "string" + ] + }, + "default": [] + }, + "java.debug.settings.stepping.skipClasses": { + "type": "array", + "description": "%java.debugger.launch.skipClasses.description%", + "items": { + "anyOf": [ + { + "enum": [ + "$JDK", + "$Libraries", + "java.lang.ClassLoader", + "" + ], + "enumDescriptions": [ + "%java.debugger.launch.skipClasses.skipJDK%", + "%java.debugger.launch.skipClasses.skipLibraries%", + "%java.debugger.launch.skipClasses.skipClassLoader%", + "%java.debugger.launch.skipClasses.skipClassPattern%" + ] + }, + "string" + ] + }, + "default": [] + }, + "java.debug.settings.stepping.skipSynthetics": { + "type": "boolean", + "description": "%java.debugger.launch.skipSynthetics.description%", + "default": false + }, + "java.debug.settings.stepping.skipStaticInitializers": { + "type": "boolean", + "description": "%java.debugger.launch.skipStaticInitializers.description%", + "default": false + }, + "java.debug.settings.stepping.skipConstructors": { + "type": "boolean", + "description": "%java.debugger.launch.skipConstructors.description%", + "default": false + }, + "java.debug.settings.jdwp.limitOfVariablesPerJdwpRequest": { + "type": "number", + "description": "%java.debugger.configuration.jdwp.limitOfVariablesPerJdwpRequest.description%", + "default": 100, + "minimum": 1 + }, + "java.debug.settings.jdwp.requestTimeout": { + "type": "number", + "description": "%java.debugger.configuration.jdwp.requestTimeout.description%", + "default": 3000, + "minimum": 100 + }, + "java.debug.settings.jdwp.async": { + "type": "string", + "enum": [ + "auto", + "on", + "off" + ], + "description": "%java.debugger.configuration.jdwp.async.description%", + "default": "auto" + }, + "java.debug.settings.vmArgs": { + "type": "string", + "description": "%java.debugger.configuration.vmArgs.description%", + "default": "" + }, + "java.debug.settings.debugSupportOnDecompiledSource": { + "type": "string", + "enum": [ + "on", + "off" + ], + "description": "%java.debugger.configuration.debugSupportOnDecompiledSource.description%", + "default": "on" + }, + "java.debug.settings.suspendAllThreads": { + "type": "boolean", + "description": "%java.debugger.configuration.suspendAllThreads.description%", + "default": false + }, + "java.silentNotification": { + "type": "boolean", + "description": "%java.debugger.configuration.silentNotification%", + "default": false + } + } + }, + "languageModelTools": [ + { + "name": "debug_java_application", + "displayName": "Debug Java Application", + "modelDescription": "Launch or attach to a Java application in debug mode with automatic compilation and classpath resolution. The tool handles building the project, resolving dependencies, starting the JVM with JDWP enabled, and auto-attaching the VS Code debugger. Use this as the first step to establish a debug session. The debug process runs in the background until stopped. Example usage: Debug a main class ('com.example.Main'), a JAR file ('target/app.jar'), or with program arguments (['--port=8080']).", + "toolReferenceName": "debugJavaApplication", + "tags": [ + "java", + "debug", + "debugger", + "build", + "compile" + ], + "icon": "$(debug-alt)", + "canBeReferencedInPrompt": true, + "inputSchema": { + "type": "object", + "properties": { + "target": { + "type": "string", + "description": "What to debug: 1) Main class name - simple ('App') or fully qualified ('com.example.Main'). Tool auto-detects package from source files. 2) JAR file path ('target/app.jar'). 3) Raw Java command arguments ('-cp bin com.example.Main'). The tool automatically finds the .class file for simple class names." + }, + "workspacePath": { + "type": "string", + "description": "Absolute path to the Java project root directory containing pom.xml, build.gradle, or .java source files. This is the working directory for compilation and debugging." + }, + "args": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Optional command-line arguments to pass to the Java main method (e.g., ['arg1', 'arg2', '--flag=value']). These are program arguments, not JVM arguments." + }, + "skipBuild": { + "type": "boolean", + "description": "Whether to skip compilation before debugging. DEFAULT: false (tool will automatically compile the project). Set to true only when you have already compiled the project and want to use an explicit classpath. In most cases, leave this as false to let the tool handle compilation automatically.", + "default": false + }, + "classpath": { + "type": "string", + "description": "Explicit classpath to use for debugging. REQUIRED when skipBuild is true. Format: absolute paths separated by system path delimiter (';' on Windows, ':' on Unix). Example: 'C:\\project\\target\\classes;C:\\project\\lib\\dep.jar' or '/project/target/classes:/project/lib/dep.jar'. If not provided and skipBuild is false, the tool will automatically resolve the classpath." + }, + "waitForSession": { + "type": "boolean", + "description": "Whether to wait for the debug session to start before returning. DEFAULT: false (returns immediately after sending debug command). Set to true to wait up to 30 seconds for VS Code to confirm the debug session has started and is ready. Useful when you need to ensure the debugger is attached before proceeding with breakpoint operations.", + "default": false + } + }, + "required": [ + "target", + "workspacePath" + ] + } + }, + { + "name": "set_java_breakpoint", + "displayName": "Set Java Breakpoint", + "modelDescription": "Set a breakpoint at a specific line in Java source code to pause execution and inspect program state. Supports conditional breakpoints (break only when condition is true), hit count conditions (break after N hits), and logpoints (log messages without stopping). REQUIRES: Active debug session. Start with 1-2 strategic breakpoints; prefer stepping over setting multiple breakpoints.", + "toolReferenceName": "setJavaBreakpoint", + "tags": [ + "java", + "debug", + "breakpoint" + ], + "icon": "$(debug-breakpoint)", + "canBeReferencedInPrompt": true, + "inputSchema": { + "type": "object", + "properties": { + "filePath": { + "type": "string", + "description": "Absolute path to the Java source file where the breakpoint should be set. Example: 'C:/project/src/main/java/com/example/Main.java' or use ${workspaceFolder} variable." + }, + "lineNumber": { + "type": "number", + "description": "The line number (1-based) where the breakpoint should be set. Must be a valid executable line (not a comment or blank line)." + }, + "condition": { + "type": "string", + "description": "Optional condition expression. Breakpoint only triggers when condition evaluates to true. Example: 'count > 10' or 'userName.equals(\"admin\")'. Leave empty for unconditional breakpoint." + }, + "hitCondition": { + "type": "string", + "description": "Optional hit count condition. Example: '>5' (break after 5th hit), '==3' (break on 3rd hit), '%2' (break every 2nd hit). Leave empty to break on every hit." + }, + "logMessage": { + "type": "string", + "description": "Optional log message. If provided, instead of breaking, the message will be logged to debug console. Use {expression} for interpolation. Example: 'Counter value: {count}'. This creates a logpoint instead of a breakpoint." + } + }, + "required": [ + "filePath", + "lineNumber" + ] + } + }, + { + "name": "debug_step_operation", + "displayName": "Debug Step Operation", + "modelDescription": "Control program execution flow: stepIn (enter method calls), stepOut (exit current method), stepOver (execute current line), continue (run to next breakpoint), pause (halt execution). REQUIRES: Active debug session in paused state. Prefer stepping through code over setting multiple breakpoints for efficient debugging.", + "toolReferenceName": "debugStepOperation", + "tags": [ + "java", + "debug", + "step", + "continue" + ], + "icon": "$(debug-step-over)", + "canBeReferencedInPrompt": true, + "inputSchema": { + "type": "object", + "properties": { + "operation": { + "type": "string", + "enum": [ + "stepIn", + "stepOut", + "stepOver", + "continue", + "pause" + ], + "description": "The step operation to perform: 'stepIn' - step into method calls, 'stepOut' - step out of current method, 'stepOver' - execute current line and move to next, 'continue' - resume execution until next breakpoint, 'pause' - pause running execution." + }, + "threadId": { + "type": "number", + "description": "Optional thread ID to perform operation on. If not specified, operates on the currently selected thread. Use get_debug_threads to get available thread IDs." + } + }, + "required": [ + "operation" + ] + } + }, + { + "name": "get_debug_variables", + "displayName": "Get Debug Variables", + "modelDescription": "Inspect variables in a specific thread's stack frame: local variables, method parameters, static fields, and instance fields. Returns variable names, types, and values. Supports filtering by scope type or name pattern. REQUIRES: Active debug session with at least one SUSPENDED thread. For multi-threaded debugging, use threadId to specify which thread's variables to inspect. If no threadId is provided, uses the first suspended thread.", + "toolReferenceName": "getDebugVariables", + "tags": [ + "java", + "debug", + "variables", + "inspect" + ], + "icon": "$(symbol-variable)", + "canBeReferencedInPrompt": true, + "inputSchema": { + "type": "object", + "properties": { + "threadId": { + "type": "number", + "description": "Thread ID to inspect. Use get_debug_threads() to list available threads with their IDs and states. Only SUSPENDED threads can be inspected. If omitted, uses the first suspended thread found." + }, + "frameId": { + "type": "number", + "description": "Optional stack frame ID. Default is 0 (current/top frame). Use get_debug_stack_trace to get available frame IDs. Higher numbers are deeper in the call stack." + }, + "scopeType": { + "type": "string", + "enum": [ + "local", + "static", + "all" + ], + "description": "Type of variables to retrieve: 'local' - only local variables and parameters, 'static' - only static class variables, 'all' - both local and static. Default: 'all'." + }, + "filter": { + "type": "string", + "description": "Optional filter pattern to match variable names. Supports wildcards (*). Example: 'user*' matches 'userName', 'userId'. Leave empty to get all variables." + } + }, + "required": [] + } + }, + { + "name": "get_debug_stack_trace", + "displayName": "Get Debug Stack Trace", + "modelDescription": "Retrieve the call stack showing all method calls leading to the current execution point. Returns method names, source files, and line numbers for each frame. REQUIRES: Active debug session in paused state. Essential for understanding program flow, tracing how code was reached, and identifying unexpected execution paths.", + "toolReferenceName": "getDebugStackTrace", + "tags": [ + "java", + "debug", + "stack", + "callstack" + ], + "icon": "$(call-hierarchy)", + "canBeReferencedInPrompt": true, + "inputSchema": { + "type": "object", + "properties": { + "threadId": { + "type": "number", + "description": "Optional thread ID. If not specified, uses the currently selected thread. Use get_debug_threads to list available threads." + }, + "maxDepth": { + "type": "number", + "description": "Maximum number of stack frames to retrieve. Default: 50. Use smaller values for shallow inspection, larger for deep call stacks.", + "default": 50 + } + }, + "required": [] + } + }, + { + "name": "evaluate_debug_expression", + "displayName": "Evaluate Debug Expression", + "modelDescription": "Evaluate a Java expression in a specific thread's debug context. Access local variables, parameters, fields, and invoke methods. Returns the result with type information. REQUIRES: Active debug session with at least one SUSPENDED thread. For multi-threaded debugging, use threadId to specify which thread's context to use. If no threadId is provided, uses the first suspended thread. Examples: 'user.getName()', 'list.size() > 10', 'counter == null'.", + "toolReferenceName": "evaluateDebugExpression", + "tags": [ + "java", + "debug", + "evaluate", + "expression" + ], + "icon": "$(symbol-method)", + "canBeReferencedInPrompt": true, + "inputSchema": { + "type": "object", + "properties": { + "expression": { + "type": "string", + "description": "The Java expression to evaluate. Can be a variable name, field access, method call, or complex expression. Example: 'user.age', 'calculateTotal()', 'count > 0 && !items.isEmpty()'." + }, + "threadId": { + "type": "number", + "description": "Thread ID for evaluation context. Use get_debug_threads() to list available threads with their IDs and states. Only SUSPENDED threads can evaluate expressions. If omitted, uses the first suspended thread found." + }, + "frameId": { + "type": "number", + "description": "Optional stack frame ID for evaluation context. Default: 0 (current frame). Variables and methods from the specified frame will be accessible.", + "default": 0 + }, + "context": { + "type": "string", + "enum": [ + "watch", + "repl", + "hover" + ], + "description": "Evaluation context: 'watch' - for watch expressions, 'repl' - for debug console input, 'hover' - for hover tooltips. Affects how side effects are handled. Default: 'repl'.", + "default": "repl" + } + }, + "required": [ + "expression" + ] + } + }, + { + "name": "get_debug_threads", + "displayName": "Get Debug Threads", + "modelDescription": "List all threads in the debugged Java application with their IDs, names, and states (🔴 SUSPENDED or 🟢 RUNNING). For SUSPENDED threads, also shows the current location (file:line). REQUIRES: Active debug session. IMPORTANT: Only SUSPENDED threads can have their variables inspected or expressions evaluated. Use the returned thread IDs with get_debug_variables(threadId=X) or evaluate_debug_expression(threadId=X) to inspect specific threads.", + "toolReferenceName": "getDebugThreads", + "tags": [ + "java", + "debug", + "threads", + "concurrent" + ], + "icon": "$(list-tree)", + "canBeReferencedInPrompt": true, + "inputSchema": { + "type": "object", + "properties": {}, + "required": [] + } + }, + { + "name": "remove_java_breakpoints", + "displayName": "Remove Java Breakpoints", + "modelDescription": "Remove breakpoints: specific breakpoint by file and line, all breakpoints in a file, or all breakpoints globally. Use this to clean up after investigation or before setting new breakpoints. Best practice: keep only 1-2 active breakpoints at a time; remove old ones before adding new ones.", + "toolReferenceName": "removeJavaBreakpoints", + "tags": [ + "java", + "debug", + "breakpoint" + ], + "icon": "$(debug-breakpoint-unverified)", + "canBeReferencedInPrompt": true, + "inputSchema": { + "type": "object", + "properties": { + "filePath": { + "type": "string", + "description": "Absolute path to the Java source file. If not provided, removes all breakpoints from all files." + }, + "lineNumber": { + "type": "number", + "description": "Optional line number. If provided, removes only the breakpoint at this line. If omitted, removes all breakpoints in the specified file." + } + }, + "required": [] + } + }, + { + "name": "stop_debug_session", + "displayName": "Stop Debug Session", + "modelDescription": "Stop the active Java debug session when investigation is complete or when you need to restart debugging. This terminates the running Java process and closes the debug session. Use this to clean up after debugging or when you've identified the root cause and want to end the session. Optional: Provide a reason for stopping (e.g., 'Investigation complete', 'Root cause identified').", + "toolReferenceName": "stopDebugSession", + "tags": [ + "java", + "debug", + "stop", + "terminate" + ], + "icon": "$(debug-stop)", + "canBeReferencedInPrompt": true, + "inputSchema": { + "type": "object", + "properties": { + "reason": { + "type": "string", + "description": "Optional reason for stopping the debug session (e.g., 'Investigation complete', 'Root cause identified', 'Need to restart'). Default: 'Investigation complete'." + } + }, + "required": [] + } + }, + { + "name": "get_debug_session_info", + "displayName": "Get Debug Session Info", + "modelDescription": "Get information about the currently active Java debug session, including whether it's PAUSED at a breakpoint or RUNNING. CRITICAL: Check status before using inspection tools (get_debug_variables, get_debug_stack_trace, evaluate_debug_expression) or control operations (continue, step). PAUSED status (🔴) means stopped at breakpoint - inspection and control tools available. RUNNING status (🟢) means executing code - only breakpoint setting or session stop available. Returns session ID, name, type, configuration details, and status-specific available actions.", + "toolReferenceName": "getDebugSessionInfo", + "tags": [ + "java", + "debug", + "session", + "info", + "status", + "paused", + "running" + ], + "icon": "$(info)", + "canBeReferencedInPrompt": true, + "inputSchema": { + "type": "object", + "properties": {}, + "required": [] } } - } + ] }, "scripts": { - "vscode:prepublish": "tsc -p ./", - "compile": "tsc -watch -p ./", - "postinstall": "node ./node_modules/vscode/bin/install", - "test": "node ./scripts/download-vscode-for-system-tests && node ./scripts/install-vsix-dependencies redhat.java && node ./scripts/install-vsix-dependencies vscode-java-debug-0.13.0.vsix && node ./scripts/run-vscode-tests" + "vscode:prepublish": "npm run build", + "compile": "tsc -p . && webpack --config webpack.config.js", + "watch": "webpack --config webpack.config.js --watch", + "build": "webpack --config webpack.config.js --mode=\"production\"", + "tslint": "tslint -t verbose --project tsconfig.json", + "build-server": "node scripts/build/buildJdtlsExt.js", + "test": "npm run compile && node ./out/test/index.js" }, - "extensionDependencies": [ - "redhat.java" - ], "devDependencies": { - "@types/lodash": "^4.14.116", - "@types/mocha": "^5.2.5", - "@types/node": "^8.10.22", - "cross-env": "^5.2.0", - "gulp": "^4.0.0", - "gulp-tslint": "^8.1.2", - "mocha": "^5.2.0", - "shelljs": "^0.8.2", - "tslint": "^5.7.0", - "typescript": "^3.0.1", - "vscode": "^1.1.21" + "@types/glob": "^7.2.0", + "@types/lodash": "^4.17.13", + "@types/mocha": "^10.0.9", + "@types/node": "^14.18.63", + "@types/uuid": "^8.3.4", + "@types/vscode": "1.95.0", + "@vscode/test-electron": "^2.4.1", + "mocha": "^10.8.2", + "ts-loader": "^9.5.1", + "tslint": "^6.1.3", + "typescript": "^4.9.5", + "webpack": "^5.105.0", + "webpack-cli": "^4.10.0" }, "dependencies": { - "lodash": "^4.17.10", - "opn": "^5.3.0", - "vscode-extension-telemetry": "0.0.18", - "vscode-extension-telemetry-wrapper": "^0.3.1" + "compare-versions": "^4.1.4", + "dotenv": "^16.4.5", + "lodash": "^4.17.23", + "uuid": "^8.3.2", + "vscode-extension-telemetry-wrapper": "^0.14.0", + "vscode-languageclient": "6.0.0-next.9", + "vscode-languageserver-types": "3.16.0", + "vscode-tas-client": "^0.1.84" } } diff --git a/package.nls.es.json b/package.nls.es.json new file mode 100644 index 00000000..06b87c18 --- /dev/null +++ b/package.nls.es.json @@ -0,0 +1,63 @@ +{ + "java.debugger.launch.projectName.description": "El proyecto preferido en el que el depurador busca clases. Podría haber nombres de clases duplicados en diferentes proyectos. Esta configuración también funciona cuando el depurador busca la clase principal especificada al lanzar un programa. Es necesario para la evaluación de la expresión.", + "java.debugger.launch.mainClass.description": "El nombre de la clase totalmente cualificado (por ejemplo, [nombre del módulo de java/]com.xyz.MainApp) o la ruta del archivo Java de la entrada del programa.", + "java.debugger.launch.args.description": "Los argumentos de la línea de comandos pasados al programa.", + "java.debugger.launch.vmArgs.description": "Las opciones extra y las propiedades del sistema para la JVM (por ejemplo -Xms -Xmx -D=).", + "java.debugger.launch.modulePaths.description": "Los modulepaths para el lanzamiento de la JVM. Si no se especifica, el depurador se resolverá automáticamente a partir del proyecto actual.", + "java.debugger.launch.classPaths.description": "Los classpath para el lanzamiento de la JVM. Si no se especifica, el depurador se resolverá automáticamente a partir del proyecto actual.", + "java.debugger.launch.sourcePaths.description": "Los directorios de fuentes extras del programa. El depurador busca el código fuente de los ajustes del proyecto por defecto. Esta opción permite al depurador buscar el código fuente en directorios extra.", + "java.debugger.launch.encoding.description": "La configuración de codificación de archivos para la JVM. Los posibles valores se pueden encontrar en https://docs.oracle.com/javase/8/docs/technotes/guides/intl/encoding.doc.html.", + "java.debugger.launch.cwd.description": "El directorio de trabajo del programa. Por defecto es la raíz del área de trabajo actual.", + "java.debugger.launch.env.description": "Las variables de entorno adicionales para el programa.", + "java.debugger.launch.stopOnEntry.description": "Pausar automáticamente el programa después del lanzamiento.", + "java.debugger.launch.internalConsole.description": "Consola de Depuración de VS Code (flujo de entrada no soportado).", + "java.debugger.launch.integratedTerminal.description": "Terminal integrado de VS Code.", + "java.debugger.launch.externalTerminal.description": "Terminal externo que puede ser configurado en la configuración del usuario.", + "java.debugger.launch.console.description": "La consola establecida para iniciar el programa.", + "java.debugger.launch.shortenCommandLine.auto": "Detectar automáticamente la longitud de la línea de comando y determinar si acortar la línea de comando mediante un enfoque apropiado.", + "java.debugger.launch.shortenCommandLine.none": "Lanza el programa con la línea de comandos estándar 'java [opciones] nombredeclase [args]'.", + "java.debugger.launch.shortenCommandLine.jarmanifest": "Generar los parámetros de classpath a un archivo temporal classpath.jar, y lanzar el programa con la línea de comandos 'java -cp classpath.jar nombre de clase [args]'.", + "java.debugger.launch.shortenCommandLine.argfile": "Generar los parámetros de classpath en un archivo de argumentos temporal, y lanzar el programa con la línea de comandos 'java @argfile [args]'. Este valor sólo se aplica a Java 9 y superiores.", + "java.debugger.launch.shortenCommandLine.description": "Cuando el proyecto tiene classpath largos o argumentos de la VM grandes, la línea de comandos para lanzar el programa puede exceder el límite máximo de string en la consola permitido por el SO. Este elemento de configuración proporciona múltiples enfoques para acortar la línea de comandos.", + "java.debugger.launch.stepFilters.description": "Omitir clases o métodos especificados al avanzar pasos.", + "java.debugger.launch.skipClasses.description": "Omitir las clases especificadas al avanzar pasos. Puedes usar las variables incorporadas como '$JDK' y '$Libraries' para omitir un grupo de clases, o añadir una expresión específica de nombre de clase, por ejemplo, java.*, *.Pepe", + "java.debugger.launch.skipClasses.skipJDK": "Omitir las clases del JDK del classpath del sistema predeterminado, como rt.jar, jrt-fs.jar.", + "java.debugger.launch.skipClasses.skipLibraries": "Omite las clases de las bibliotecas de aplicaciones, como las dependencias de Maven y Gradle.", + "java.debugger.launch.skipClasses.skipClassLoader": "Omitir los cargadores de clase.", + "java.debugger.launch.skipClasses.skipClassPattern": "Omitir las clases especificadas. Los nombres de las clases deben estar completamente calificados. Se admite el uso de comodines, por ejemplo, java.*, *.Pepe", + "java.debugger.launch.skipSynthetics.description": "Omitir los métodos sintéticos al avanzar pasos.", + "java.debugger.launch.skipStaticInitializers.description": "Omitir los métodos de inicialización static al avanzar pasos.", + "java.debugger.launch.skipConstructors.description": "Omitir los métodos constructores al avanzar pasos.", + "java.debugger.attach.hostName.description": "El nombre del host o la dirección ip del depurador remoto.", + "java.debugger.attach.port.description": "El puerto de depuración del depurador remoto.", + "java.debugger.attach.processPicker.description": "Utilice el selector de procesos para seleccionar un proceso al que acoplarse, o el ID del proceso como un número entero.", + "java.debugger.attach.processId.description": "ID del proceso local al que acoplarse.", + "java.debugger.attach.timeout.description": "Límite de tiempo de espera antes de reconectarse, en milisegundos (por defecto a 30000ms).", + "java.debugger.attach.projectName.description": "El proyecto preferido en el que el depurador busca clases. Podría haber nombres de clases duplicados en diferentes proyectos.", + "java.debugger.snippet.launch.description": "Añade una nueva configuración para lanzar un programa Java.", + "java.debugger.snippet.launchInExternalTerminal.description": "Añade una nueva configuración para lanzar un programa Java en la terminal externa.", + "java.debugger.snippet.launchCurrentFile.description": "Añade una nueva configuración para lanzar el archivo Java actual.", + "java.debugger.snippet.launchWithArgumentsPrompt.description": "Añade una nueva configuración para lanzar un programa Java con argumentos.", + "java.debugger.snippet.attach.description": "Añade una nueva configuración para acoplarse a un programa Java en ejecución.", + "java.debugger.snippet.attachProcess.description": "Utilice el selector de procesos para seleccionar un proceso Java al que acoplarse.", + "java.debugger.snippet.attachRemote.description": "Añade una nueva configuración para acoplarse a un programa Java remoto.", + "java.debugger.configuration.title": "Depurador de Java", + "java.debugger.configuration.logLevel.description": "Nivel mínimo de registros de depuración que se envían a VS Code.", + "java.debugger.configuration.showHex.description": "Mostrar los números en formato hexadecimal en la vista \"Variables\".", + "java.debugger.configuration.showStaticVariables.description": "Muestra las variables estáticas en la vista \"Variables\".", + "java.debugger.configuration.showQualifiedNames.description": "Mostrar los nombres de las clases totalmente cualificados en la vista de \"Variables\".", + "java.debugger.configuration.showLogicalStructure.description": "Mostrar la estructura lógica de las clases Collection y Map en la vista de \"Variables\".", + "java.debugger.configuration.showToString.description": "Mostrar el valor 'toString()' en la vista \"Variables\" para todas las clases que sobrescriban el método 'toString'.", + "java.debugger.configuration.maxStringLength.description": "La longitud máxima de los strings mostrados en la vista \"Variables\" o \"Consola de Depuración\", los strings más largos que esta longitud serán recortados, si es 0 no se realiza recorte.", + "java.debugger.configuration.numericPrecision.description": "La precisión en el formato de números reales en la vista \"Variables\" o \"Consola de Depuración\".", + "java.debugger.configuration.hotCodeReplace.description": "Recargar las clases de Java modificadas durante la depuración. Asegúrate de que 'java.autobuild.enabled' no esté desactivado.", + "java.debugger.configuration.enableRunDebugCodeLens.description": "Habilitar proveedores de CodeLens para la ejecución y depuración sobre los métodos principales.", + "java.debugger.configuration.forceBuildBeforeLaunch": "Forzar la compilación del área de trabajo antes de lanzar el programa Java.", + "java.debugger.configuration.onBuildFailureProceed": "Forzar continuar cuando falla la compilación.", + "java.debugger.configuration.console": "La consola establecida para lanzar el programa Java. Si quieres personalizar la consola para una sesión de depuración específica, por favor modifica la configuración de la 'console' en launch.json.", + "java.debugger.configuration.exceptionBreakpoint.skipClasses": "Omitir las clases especificadas al parar por una excepción. Puedes usar las variables incorporadas como '$JDK' y '$Libraries' para omitir un grupo de clases, o añadir una expresión específica de nombre de clase, por ejemplo, java.*, *.Pepe", + "java.debugger.configuration.jdwp.limitOfVariablesPerJdwpRequest.description": "El máximo número de variables o campos que pueden ser solicitados en una solicitud de JDWP. Cuanto más alto sea el valor, menos frecuentemente se solicitará la depuración al expandir la vista de la variable. Además, un número grande puede causar un límite de tiempo de espera de la solicitud JDWP.", + "java.debugger.configuration.jdwp.requestTimeout.description": "El límite de tiempo (ms) de la solicitud de JDWP cuando el depurador se comunica con el JVM objetivo.", + "java.debugger.configuration.vmArgs.description": "Los argumentos por defecto de la VM para lanzar el programa Java. Por ejemplo, usa '-Xmx1G -ea' para aumentar el tamaño de la pila a 1GB y habilitar los asertos. Si quieres personalizar los argumentos de la máquina virtual para una sesión de depuración específica, modifica la configuración de 'vmArgs' en launch.json.", + "java.debugger.configuration.suspendAllThreads.description": "Suspenda todos los hilos al alcanzar un punto de interrupción o detenerse por una excepción. Solo tiene efecto en nuevas sesiones de depuración; los cambios durante una sesión en ejecución no se aplican." +} \ No newline at end of file diff --git a/package.nls.it.json b/package.nls.it.json new file mode 100644 index 00000000..9279a2bd --- /dev/null +++ b/package.nls.it.json @@ -0,0 +1,10 @@ +{ + "java.debugger.configuration.title": "Java Debugger", + "java.debugger.configuration.logLevel.description": "Livello dei log di debug minimo inviato a VS Code.", + "java.debugger.configuration.showHex.description": "Mostra numeri in formato esadecimale nella scheda \"variabili\".", + "java.debugger.configuration.showStaticVariables.description": "Mostra variabili statiche nella scheda \"variabili\".", + "java.debugger.configuration.showQualifiedNames.description": "Mostra nome completo delle classi nella scheda \"variabili\".", + "java.debugger.configuration.maxStringLength.description": "Lunghezza massima delle stringhe visualizzate nella scheda \"Variabili\" o \"Console di Debug\", stringhe più lunghe di questo numero verranno tagliate, se 0 nessun taglio viene eseguito.", + "java.debugger.configuration.enableRunDebugCodeLens.description": "Abilitare i provider di lenti di codice run e debug sui metodi principali.", + "java.debugger.configuration.suspendAllThreads.description": "Sospende tutti i thread quando si raggiunge un punto di interruzione o ci si ferma per un'eccezione. Ha effetto solo nelle nuove sessioni di debug; le modifiche durante una sessione in esecuzione non si applicano." +} diff --git a/package.nls.json b/package.nls.json new file mode 100644 index 00000000..8634a297 --- /dev/null +++ b/package.nls.json @@ -0,0 +1,78 @@ +{ + "java.debugger.launch.projectName.description": "The preferred project in which the debugger searches for classes. There could be duplicated class names in different projects. This setting also works when the debugger looks for the specified main class when launching a program. It is required for expression evaluation.", + "java.debugger.launch.mainClass.description": "The fully qualified class name (e.g. [java module name/]com.xyz.MainApp) or the java file path of the program entry.", + "java.debugger.launch.javaExec.description": "The path to java executable to use. If unset project JDK's java executable is used.", + "java.debugger.launch.args.description": "The command line arguments passed to the program.", + "java.debugger.launch.vmArgs.description": "The extra options and system properties for the JVM (e.g. -Xms -Xmx -D=).", + "java.debugger.launch.modulePaths.description": "The modulepaths for launching the JVM. If not specified, the debugger will automatically resolve from current project.", + "java.debugger.launch.modulePaths.auto": "Automatically resolve the module paths of current project.", + "java.debugger.launch.modulePaths.runtime": "The module paths within 'runtime' scope of current project.", + "java.debugger.launch.modulePaths.test": "The module paths within 'test' scope of current project.", + "java.debugger.launch.modulePaths.exclude": "The path after '!' will be excluded from the modulePaths.", + "java.debugger.launch.classPaths.description": "The classpaths for launching the JVM. If not specified, the debugger will automatically resolve from current project.", + "java.debugger.launch.classPaths.auto": "Automatically resolve the classpaths of current project.", + "java.debugger.launch.classPaths.runtime": "The classpaths within 'runtime' scope of current project.", + "java.debugger.launch.classPaths.test": "The classpaths within 'test' scope of current project.", + "java.debugger.launch.classPaths.exclude": "The path after '!' will be excluded from the classpaths.", + "java.debugger.launch.sourcePaths.description": "The extra source directories of the program. The debugger looks for source code from project settings by default. This option allows the debugger to look for source code in extra directories.", + "java.debugger.launch.encoding.description": "The file.encoding setting for the JVM. Possible values can be found in https://docs.oracle.com/javase/8/docs/technotes/guides/intl/encoding.doc.html.", + "java.debugger.launch.cwd.description": "The working directory of the program. Defaults to the current workspace root.", + "java.debugger.launch.env.description": "The extra environment variables for the program.", + "java.debugger.launch.envFile.description": "Absolute path to a file containing environment variable definitions. Multiple files can be specified by providing an array of absolute paths.", + "java.debugger.launch.stopOnEntry.description": "Automatically pause the program after launching.", + "java.debugger.launch.internalConsole.description": "VS Code debug console (input stream not supported).", + "java.debugger.launch.integratedTerminal.description": "VS Code integrated terminal.", + "java.debugger.launch.externalTerminal.description": "External terminal that can be configured in user settings.", + "java.debugger.launch.console.description": "The specified console to launch the program.", + "java.debugger.launch.shortenCommandLine.auto": "Automatically detect the command line length and determine whether to shorten the command line via an appropriate approach.", + "java.debugger.launch.shortenCommandLine.none": "Launch the program with the standard command line 'java [options] classname [args]'.", + "java.debugger.launch.shortenCommandLine.jarmanifest": "Generate the classpath parameters to a temporary classpath.jar file, and launch the program with the command line 'java -cp classpath.jar classname [args]'.", + "java.debugger.launch.shortenCommandLine.argfile": "Generate the classpath parameters to a temporary argument file, and launch the program with the command line 'java @argfile [args]'. This value only applies to Java 9 and higher.", + "java.debugger.launch.shortenCommandLine.description": "When the project has long classpath or big VM arguments, the command line to launch the program may exceed the maximum command line string limitation allowed by the OS. This configuration item provides multiple approaches to shorten the command line.", + "java.debugger.launch.stepFilters.description": "Skip specified classes or methods when stepping.", + "java.debugger.launch.skipClasses.description": "Skip the specified classes when stepping. You could use the built-in variables such as '$JDK' and '$Libraries' to skip a group of classes, or add a specific class name expression, e.g. java.*, *.Foo", + "java.debugger.launch.skipClasses.skipJDK": "Skip the JDK classes from the default system bootstrap classpath, such as rt.jar, jrt-fs.jar.", + "java.debugger.launch.skipClasses.skipLibraries": "Skip the classes from application libraries, such as Maven, Gradle dependencies.", + "java.debugger.launch.skipClasses.skipClassLoader": "Skip the class loaders.", + "java.debugger.launch.skipClasses.skipClassPattern": "Skip the specified classes. Class names should be fully qualified. Wildcard is supported, e.g. java.*, *.Foo", + "java.debugger.launch.skipSynthetics.description": "Skip synthetic methods when stepping.", + "java.debugger.launch.skipStaticInitializers.description": "Skip static initializer methods when stepping.", + "java.debugger.launch.skipConstructors.description": "Skip constructor methods when stepping.", + "java.debugger.attach.hostName.description": "The host name or ip address of remote debuggee.", + "java.debugger.attach.port.description": "The debug port of remote debuggee.", + "java.debugger.attach.processPicker.description": "Use process picker to select a process to attach, or Process ID as integer.", + "java.debugger.attach.processId.description": "ID of the local process to attach to.", + "java.debugger.attach.timeout.description": "Timeout value before reconnecting, in milliseconds (default to 30000ms).", + "java.debugger.attach.projectName.description": "The preferred project in which the debugger searches for classes. There could be duplicated class names in different projects.", + "java.debugger.snippet.launch.description": "Add a new configuration for launching a java program.", + "java.debugger.snippet.launchInExternalTerminal.description": "Add a new configuration for launching a java program in the external terminal.", + "java.debugger.snippet.launchCurrentFile.description": "Add a new configuration for launching current java file.", + "java.debugger.snippet.launchWithArgumentsPrompt.description": "Add a new configuration for launching a java program with arguments prompt.", + "java.debugger.snippet.attach.description": "Add a new configuration for attaching to a running java program.", + "java.debugger.snippet.attachProcess.description": "Use process picker to select a Java process to attach to.", + "java.debugger.snippet.attachRemote.description": "Add a new configuration for attaching to a remote java program.", + "java.debugger.configuration.title": "Java Debugger", + "java.debugger.configuration.logLevel.description": "Minimum level of debugger logs that are sent to VS Code.", + "java.debugger.configuration.showHex.description": "Show numbers in hex format in \"Variables\" viewlet.", + "java.debugger.configuration.showStaticVariables.description": "Show static variables in \"Variables\" viewlet.", + "java.debugger.configuration.showQualifiedNames.description": "Show fully qualified class names in \"Variables\" viewlet.", + "java.debugger.configuration.showLogicalStructure.description": "Show the logical structure for the Collection and Map classes in \"Variables\" viewlet.", + "java.debugger.configuration.showToString.description": "Show 'toString()' value for all classes that override 'toString' method in \"Variables\" viewlet.", + "java.debugger.configuration.maxStringLength.description": "The maximum length of strings displayed in \"Variables\" or \"Debug Console\" viewlet, strings longer than this length will be trimmed, if 0 no trim is performed.", + "java.debugger.configuration.numericPrecision.description": "The precision when formatting doubles in \"Variables\" or \"Debug Console\" viewlet.", + "java.debugger.configuration.hotCodeReplace.description": "Reload the changed Java classes during debugging.", + "java.debugger.configuration.enableRunDebugCodeLens.description": "Enable the run and debug code lens providers over main methods.", + "java.debugger.configuration.forceBuildBeforeLaunch": "Force building the workspace before launching java program.", + "java.debugger.configuration.onBuildFailureProceed": "Force to proceed when build fails", + "java.debugger.configuration.console": "The specified console to launch Java program. If you want to customize the console for a specific debug session, please modify the 'console' config in launch.json.", + "java.debugger.configuration.exceptionBreakpoint.exceptionTypes": "Specifies a set of exception types you want to break on, e.g. java.lang.NullPointerException. A specific exception type and its subclasses can be selected for caught exceptions, uncaught exceptions, or both can be selected.", + "java.debugger.configuration.exceptionBreakpoint.allowClasses": "Specifies the allowed locations where the exception breakpoint can break on. Wildcard is supported, e.g. java.*, *.Foo", + "java.debugger.configuration.exceptionBreakpoint.skipClasses": "Skip the specified classes when breaking on exception. You could use the built-in variables such as '$JDK' and '$Libraries' to skip a group of classes, or add a specific class name expression, e.g. java.*, *.Foo", + "java.debugger.configuration.jdwp.limitOfVariablesPerJdwpRequest.description": "The maximum number of variables or fields that can be requested in one JDWP request. The higher the value, the less frequently debuggee will be requested when expanding the variable view. Also a large number can cause JDWP request timeout.", + "java.debugger.configuration.jdwp.requestTimeout.description": "The timeout (ms) of JDWP request when the debugger communicates with the target JVM.", + "java.debugger.configuration.vmArgs.description": "The default VM arguments to launch the Java program. Eg. Use '-Xmx1G -ea' to increase the heap size to 1GB and enable assertions. If you want to customize the VM arguments for a specific debug session, please modify the 'vmArgs' config in launch.json.", + "java.debugger.configuration.silentNotification": "Controls whether notifications can be used to report progress. If true, use status bar to report progress instead.", + "java.debugger.configuration.jdwp.async.description": "Experimental: Controls whether the debugger is allowed to send JDWP commands asynchronously. Async mode can improve remote debugging response speed on high-latency networks.", + "java.debugger.configuration.debugSupportOnDecompiledSource.description": "[Experimental]: Enable debugging support on the decompiled source code. Be aware that this feature may affect the loading speed of Call Stack Viewlet.", + "java.debugger.configuration.suspendAllThreads.description": "Suspend all threads when hitting a breakpoint or stopping for an exception. Takes effect only for new debug sessions; changes during a running session don’t apply." +} diff --git a/package.nls.zh-cn.json b/package.nls.zh-cn.json new file mode 100644 index 00000000..75d1406a --- /dev/null +++ b/package.nls.zh-cn.json @@ -0,0 +1,75 @@ +{ + "java.debugger.launch.projectName.description": "调试器搜索类名时的首选工程。不同工程中可能存在重复的类名。当调试器在启动应用程序时查找指定的主类,此设置也有效。当使用表达式求值功能时,需要此配置项。", + "java.debugger.launch.mainClass.description": "主类的全名(例如[java module name /] com.xyz.MainApp)或主类对应的java文件路径。", + "java.debugger.launch.args.description": "启动应用程序的命令行参数。", + "java.debugger.launch.vmArgs.description": "用于启动JVM的额外选项和系统属性(例如-Xms -Xmx -D = )。", + "java.debugger.launch.modulePaths.description": "用于启动JVM的模块路径。如果未指定,调试器将自动从当前工程中解析。", + "java.debugger.launch.modulePaths.auto": "自动从当前工程中解析模块路径。", + "java.debugger.launch.modulePaths.runtime": "当前工程中属于 runtime 作用域的模块路径。", + "java.debugger.launch.modulePaths.test": "当前工程中属于 test 作用域的模块路径。", + "java.debugger.launch.modulePaths.exclude": "'!' 之后的路径将会从模块路径中去除。", + "java.debugger.launch.classPaths.description": "用于启动JVM的类路径。如果未指定,调试器将自动从当前工程中解析。", + "java.debugger.launch.classPaths.auto": "自动从当前工程中解析类路径。", + "java.debugger.launch.classPaths.runtime": "当前工程中属于 runtime 作用域的类路径。", + "java.debugger.launch.classPaths.test": "当前工程中属于 test 作用域的类路径。", + "java.debugger.launch.classPaths.exclude": "'!' 之后的路径将会从类路径中去除。", + "java.debugger.launch.sourcePaths.description": "应用程序的额外源代码目录。调试器默认从工程配置中查找源代码。此选项允许调试器在额外目录中查找源代码。", + "java.debugger.launch.encoding.description": "JVM的file.encoding设置。可以在http://docs.oracle.com/javase/8/docs/technotes/guides/intl/encoding.doc.html中找到可能的值。", + "java.debugger.launch.cwd.description": "应用程序的工作目录。默认为当前工作空间根目录。", + "java.debugger.launch.env.description": "启动应用程序时自定义的环境变量。", + "java.debugger.launch.envFile.description": "环境变量文件绝对路径。", + "java.debugger.launch.stopOnEntry.description": "启动后自动暂停应用程序。", + "java.debugger.launch.internalConsole.description": "VS Code调试控制台(不支持输入流)。", + "java.debugger.launch.integratedTerminal.description": "VS Code集成终端。", + "java.debugger.launch.externalTerminal.description": "外部终端(可在用户设置中修改)。", + "java.debugger.launch.console.description": "用于启动应用程序的控制台。", + "java.debugger.launch.shortenCommandLine.auto": "自动检测命令行长度并决定是否通过适当的方法缩短命令行。", + "java.debugger.launch.shortenCommandLine.none": "使用标准命令行 'java [options] classname [args]' 启动应用程序。", + "java.debugger.launch.shortenCommandLine.jarmanifest": "将类路径参数生成到临时 classpath.jar 文件中,并使用命令行 'java -cp classpath.jar classname [args]' 启动应用程序。", + "java.debugger.launch.shortenCommandLine.argfile": "将类路径参数生成到临时 argument 文件中, 并使用命令行 'java @argfile [args]' 启动应用程序。该值仅适用于 Java 9 及以上版本。", + "java.debugger.launch.shortenCommandLine.description": "当项目具有较长的类路径或较大的VM参数时,启动程序的命令行可能会超出OS允许的最大命令行字符串限制。此配置项提供了多种缩短命令行的方法。", + "java.debugger.launch.stepFilters.description": "Step时跳过指定的类或方法。", + "java.debugger.launch.skipClasses.description": "Step时跳过指定的类。你可以使用内置变量,如'$JDK'和'$Libraries'来跳过一组类,或者添加一个特定的类名表达式,如java.*,*.Foo。", + "java.debugger.launch.skipClasses.skipJDK": "跳过系统默认的启动路径中的JDK类,如rt.jar、jrt-fs.jar。", + "java.debugger.launch.skipClasses.skipLibraries": "跳过应用库中的类,如Maven、Gradle依赖。", + "java.debugger.launch.skipClasses.skipClassLoader": "跳过类加载器。", + "java.debugger.launch.skipClasses.skipClassPattern": "跳过指定的类。仅支持全名,以及通配符,如java.*,*.Foo。", + "java.debugger.launch.skipSynthetics.description": "Step时跳过合成方法。", + "java.debugger.launch.skipStaticInitializers.description": "Step时跳过静态初始化方法。", + "java.debugger.launch.skipConstructors.description": "Step时跳过构造函数。", + "java.debugger.attach.hostName.description": "远程调试进程所在的主机名或IP地址。", + "java.debugger.attach.port.description": "远程调试进程的调试端口。", + "java.debugger.attach.processPicker.description": "使用进程选取器选择要附加的进程,或直接配置进程ID。", + "java.debugger.attach.processId.description": "要附加到的本地进程的ID。", + "java.debugger.attach.timeout.description": "重新连接前的超时值,以毫秒为单位(默认为30000ms)。", + "java.debugger.attach.projectName.description": "调试器搜索类的首选工程。不同工程中可能存在重复的类名。", + "java.debugger.snippet.launch.description": "启动java程序。", + "java.debugger.snippet.launchInExternalTerminal.description": "在外部终端中启动java程序。", + "java.debugger.snippet.launchCurrentFile.description": "启动当前java文件中的程序。", + "java.debugger.snippet.launchWithArgumentsPrompt.description": "启动java程序时动态提示命令行参数。", + "java.debugger.snippet.attach.description": "附加到正在运行的java程序。", + "java.debugger.snippet.attachProcess.description": "使用进程选择器选择要附加的Java进程。", + "java.debugger.snippet.attachRemote.description": "附加到远程java程序。", + "java.debugger.configuration.title": "Java调试器", + "java.debugger.configuration.logLevel.description": "Java调试器的日志级别。", + "java.debugger.configuration.showHex.description": "在“变量”视图中以十六进制格式显示数值。", + "java.debugger.configuration.showStaticVariables.description": "在“变量”视图中显示静态变量。", + "java.debugger.configuration.showQualifiedNames.description": "在“变量”视图中显示类的全名。", + "java.debugger.configuration.showLogicalStructure.description": "在“变量”视图中显示Collection和Map类的逻辑结构。", + "java.debugger.configuration.showToString.description": "在“变量”视图中显示所有重载过'toString'方法的类的'toString()'值。", + "java.debugger.configuration.maxStringLength.description": "设定“变量”或“调试控制台”视图中显示的字符串最大长度,长度超过部分将被剪掉。如果值为0,则不执行修剪。", + "java.debugger.configuration.hotCodeReplace.description": "在调试期间重新加载已更改的Java类。", + "java.debugger.configuration.enableRunDebugCodeLens.description": "在main方法上启用CodeLens标记。", + "java.debugger.configuration.forceBuildBeforeLaunch": "在启动java程序之前强制编译整个工作空间。", + "java.debugger.configuration.console": "指定的控制台用于启动Java程序。如果要为特定的调试会话自定义控制台,请修改launch.json中的“console”配置。", + "java.debugger.configuration.exceptionBreakpoint.exceptionTypes": "指定要中断的一组异常类型,例如 java.lang.NullPointerException。可以为捕获的异常、未捕获的异常或两者都选择一个特定的异常类型及其子类。", + "java.debugger.configuration.exceptionBreakpoint.allowClasses": "指定允许异常断点中断的位置。支持通配符,例如 java.,.Foo", + "java.debugger.configuration.exceptionBreakpoint.skipClasses": "当发生异常时,跳过指定的类。你可以使用内置变量,如'$JDK'和'$Libraries'来跳过一组类,或者添加一个特定的类名表达式,如java.*,*.Foo。", + "java.debugger.configuration.jdwp.limitOfVariablesPerJdwpRequest.description": "一次JDWP请求中可以请求的变量或字段的最大数量。该值越高,在展开变量视图时,请求debuggee的频率就越低。同时数量过大也会导致JDWP请求超时。", + "java.debugger.configuration.jdwp.requestTimeout.description": "调试器与目标JVM通信时JDWP请求的超时时间(ms)。", + "java.debugger.configuration.vmArgs.description": "启动Java程序的默认VM参数。例如,使用'-Xmx1G -ea'将堆大小增加到1GB并启用断言。如果要为特定的调试会话定制VM参数,请修改launch.json中的'vmArgs'配置。", + "java.debugger.configuration.silentNotification": "控制是否可以使用通知来报告进度。如果为真,则使用状态栏来报告进度。", + "java.debugger.configuration.jdwp.async.description": "实验性的:控制是否允许调试器以异步方式发送JDWP命令。异步模式可以提高高延迟网络上的远程调试响应速度。", + "java.debugger.configuration.debugSupportOnDecompiledSource.description": "[实验性的]: 在反编译的源代码上启用调试支持。请注意,该功能可能会影响Call Stack试图的加载速度。", + "java.debugger.configuration.suspendAllThreads.description": "当命中断点或因异常停止时暂停所有线程。仅对新的调试会话生效;在运行中的会话内更改不会生效。" +} \ No newline at end of file diff --git a/package.nls.zh-tw.json b/package.nls.zh-tw.json new file mode 100644 index 00000000..4261c873 --- /dev/null +++ b/package.nls.zh-tw.json @@ -0,0 +1,71 @@ +{ + "java.debugger.launch.projectName.description": "偵錯器搜索類別名時的偏好專案。不同專案中可能存在重復的類別名。當偵錯器在啟動應用程式時查找指定的主類別,此設定也有效。當使用表達式求值功能時,需要此選項。", + "java.debugger.launch.mainClass.description": "主類別的全名(例如 [java module name /] com.xyz.MainApp)或主類別對應的 Java 檔案路徑。", + "java.debugger.launch.args.description": "啟動應用程式的命令列參數。", + "java.debugger.launch.vmArgs.description": "用於啟動 JVM 的額外選項和系統屬性(例如-Xms -Xmx -D = )。", + "java.debugger.launch.modulePaths.description": "用於啟動 JVM 的模組路徑。如果未指定,偵錯器將自動從當前專案中解析。", + "java.debugger.launch.modulePaths.auto": "自動從當前專案中解析模組路徑。", + "java.debugger.launch.modulePaths.runtime": "當前專案中屬於 runtime 範圍的模組路徑。", + "java.debugger.launch.modulePaths.test": "當前專案中屬於 test 範圍的模組路徑。", + "java.debugger.launch.modulePaths.exclude": "'!' 之後的路徑將會從模組路徑中去除。", + "java.debugger.launch.classPaths.description": "用於啟動 JVM 的類別路徑。如果未指定,偵錯器將自動從當前專案中解析。", + "java.debugger.launch.classPaths.auto": "自動從當前專案中解析類別路徑。", + "java.debugger.launch.classPaths.runtime": "當前專案中屬於 runtime 範圍的類別路徑。", + "java.debugger.launch.classPaths.test": "當前專案中屬於 test 範圍的類別路徑。", + "java.debugger.launch.classPaths.exclude": "'!' 之後的路徑將會從類別路徑中去除。", + "java.debugger.launch.sourcePaths.description": "應用程式的額外原始碼目錄。偵錯器預設從專案設定中查找原始碼。此選項允許偵錯器在額外目錄中查找原始碼。", + "java.debugger.launch.encoding.description": "JVM 的 file.encoding 設定。可以在 http://docs.oracle.com/javase/8/docs/technotes/guides/intl/encoding.doc.html 中找到可能的值。", + "java.debugger.launch.cwd.description": "應用程式的工作目錄。預設為當前工作空間根目錄。", + "java.debugger.launch.env.description": "啟動應用程式時自定義的環境變數。", + "java.debugger.launch.envFile.description": "環境變數檔案絕對路徑。", + "java.debugger.launch.stopOnEntry.description": "啟動後自動暫停應用程式。", + "java.debugger.launch.internalConsole.description": "VS Code 偵錯主控台(不支援輸入串流)。", + "java.debugger.launch.integratedTerminal.description": "VS Code 整合終端。", + "java.debugger.launch.externalTerminal.description": "外部終端(可在用戶設定中修改)。", + "java.debugger.launch.console.description": "用於啟動應用程式的主控台。", + "java.debugger.launch.shortenCommandLine.auto": "自動檢測命令列長度並決定是否通過適當的方法縮短命令列。", + "java.debugger.launch.shortenCommandLine.none": "使用標準命令列 'java [options] classname [args]' 啟動應用程式。", + "java.debugger.launch.shortenCommandLine.jarmanifest": "將類別路徑參數生成到臨時 classpath.jar 檔案中,並使用命令列 'java -cp classpath.jar classname [args]' 啟動應用程式。", + "java.debugger.launch.shortenCommandLine.argfile": "將類別路徑參數生成到臨時 argument 檔案中, 並使用命令列 'java @argfile [args]' 啟動應用程式。該值僅適用於 Java 9 及以上版本。", + "java.debugger.launch.shortenCommandLine.description": "當項目具有較長的類別路徑或較大的 VM 參數時,啟動程式的命令列可能會超出OS允許的最大命令列字元串限制。此選項提供了多種縮短命令列的方法。", + "java.debugger.launch.stepFilters.description": "Step 時跳過指定的類別或方法。", + "java.debugger.launch.skipClasses.description": "Step 時跳過指定的類別。你可以使用內建變數,如 '$JDK' 和 '$Libraries' 來跳過一組類別,或者添加一個特定的類別名表達式,如 java.*,*.Foo。", + "java.debugger.launch.skipClasses.skipJDK": "跳過系統預設的啟動路徑中的 JDK 類別,如 rt.jar、jrt-fs.jar。", + "java.debugger.launch.skipClasses.skipLibraries": "跳過應用程式庫中的類別,如 Maven、Gradle 相依性。", + "java.debugger.launch.skipClasses.skipClassLoader": "跳過類別載入器。", + "java.debugger.launch.skipClasses.skipClassPattern": "跳過指定的類別。僅支援全名,以及萬用字元,如 java.*,*.Foo。", + "java.debugger.launch.skipSynthetics.description": "Step 時跳過合成方法。", + "java.debugger.launch.skipStaticInitializers.description": "Step 時跳過靜態初始化方法。", + "java.debugger.launch.skipConstructors.description": "Step 時跳過建構函數。", + "java.debugger.attach.hostName.description": "遠端偵錯程序所在的主機名或 IP 地址。", + "java.debugger.attach.port.description": "遠端偵錯程序的偵錯埠。", + "java.debugger.attach.processPicker.description": "使用程序選取器選擇要附加的程序,或直接設定程序 ID。", + "java.debugger.attach.processId.description": "要附加到的本地程序的 ID。", + "java.debugger.attach.timeout.description": "重新連接前的超時值,以毫秒為單位(預設為 30000ms)。", + "java.debugger.attach.projectName.description": "偵錯器搜索類別的偏好專案。不同專案中可能存在重復的類別名。", + "java.debugger.snippet.launch.description": "啟動 Java 程式。", + "java.debugger.snippet.launchInExternalTerminal.description": "在外部終端中啟動 Java 程式。", + "java.debugger.snippet.launchCurrentFile.description": "啟動當前 Java 檔案中的程式。", + "java.debugger.snippet.launchWithArgumentsPrompt.description": "啟動 Java 程式時動態提示命令列參數。", + "java.debugger.snippet.attach.description": "附加到正在運行的 Java 程式。", + "java.debugger.snippet.attachProcess.description": "使用程序選擇器選擇要附加的 Java 程序。", + "java.debugger.snippet.attachRemote.description": "附加到遠端 Java 程式。", + "java.debugger.configuration.title": "Java 偵錯器", + "java.debugger.configuration.logLevel.description": "Java 偵錯器的記錄級別。", + "java.debugger.configuration.showHex.description": "在「變數」視圖中以十六進位格式顯示數值。", + "java.debugger.configuration.showStaticVariables.description": "在「變數」視圖中顯示靜態變數。", + "java.debugger.configuration.showQualifiedNames.description": "在「變數」視圖中顯示類別的全名。", + "java.debugger.configuration.showLogicalStructure.description": "在「變數」視圖中顯示 Collection 和 Map 類別的邏輯結構。", + "java.debugger.configuration.showToString.description": "在「變數」視圖中顯示所有覆寫過 'toString' 方法的類別的 'toString()' 值。", + "java.debugger.configuration.maxStringLength.description": "設定「變數」或「偵錯主控台」視圖中顯示的字元串最大長度,長度超過部分將被剪掉。如果值為0,則不執行修剪。", + "java.debugger.configuration.hotCodeReplace.description": "在偵錯期間重新載入已更改的 Java 類別。確保未停用 'java.autobuild.enabled'。", + "java.debugger.configuration.enableRunDebugCodeLens.description": "在 main 方法上啟用 CodeLens 標記。", + "java.debugger.configuration.forceBuildBeforeLaunch": "在啟動 Java 程式之前強制編譯整個工作空間。", + "java.debugger.configuration.console": "指定用於啟動 Java 程式的主控台。如果要為特定的偵錯會話自訂義主控台,請修改 launch.json 中的「console」設定。", + "java.debugger.configuration.exceptionBreakpoint.skipClasses": "當發生異常時,跳過指定的類別。你可以使用內建變數,如 '$JDK' 和 '$Libraries' 來跳過一組類別,或者添加一個特定的類別名表達式,如 java.*,*.Foo。", + "java.debugger.configuration.jdwp.limitOfVariablesPerJdwpRequest.description": "一次 JDWP 請求中可以請求的變數或欄位的最大數量。該值越高,在展開變數視圖時,請求偵錯對象的頻率就越低。同時數量過大也會導致 JDWP 請求超時。", + "java.debugger.configuration.jdwp.requestTimeout.description": "偵錯器與目標 JVM 連線時 JDWP 請求的超時時間(ms)。", + "java.debugger.configuration.vmArgs.description": "啟動 Java 程式的預設 VM 參數。例如,使用 '-Xmx1G -ea' 將堆大小增加到 1GB 並啟用斷言。如果要為特定的偵錯會話定製 VM 參數,請修改launch.json 中的 'vmArgs' 設定。", + "java.debugger.configuration.silentNotification": "控制是否可以使用通知來回報進度。如果為真,則使用狀態欄來回報進度。", + "java.debugger.configuration.suspendAllThreads.description": "當命中斷點或因異常停止時暫停所有執行緒。僅對新的偵錯工作階段生效;在執行中的工作階段內變更不會生效。" +} \ No newline at end of file diff --git a/scripts/build/buildJdtlsExt.js b/scripts/build/buildJdtlsExt.js new file mode 100644 index 00000000..fb323b87 --- /dev/null +++ b/scripts/build/buildJdtlsExt.js @@ -0,0 +1,42 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +const cp = require('child_process'); +const path = require('path'); +const fs = require('fs'); + +const server_dir = path.resolve('../java-debug'); + +cp.execSync(mvnw() + ' clean package', { + cwd: server_dir, + stdio: [0, 1, 2] +}); +copy(path.join(server_dir, 'com.microsoft.java.debug.plugin/target'), path.resolve('server'), (file) => { + return /^com.microsoft.java.debug.*.jar$/.test(file); +}); + +function copy(sourceFolder, targetFolder, fileFilter) { + const jars = fs.readdirSync(sourceFolder).filter(file => fileFilter(file)); + if (!fs.existsSync(targetFolder)) { + fs.mkdirSync(targetFolder); + } + for (const jar of jars) { + fs.copyFileSync(path.join(sourceFolder, jar), path.join(targetFolder, path.basename(jar))); + } +} + +function isWin() { + return /^win/.test(process.platform); +} + +function isMac() { + return /^darwin/.test(process.platform); +} + +function isLinux() { + return /^linux/.test(process.platform); +} + +function mvnw() { + return isWin() ? "mvnw.cmd" : "./mvnw"; +} diff --git a/scripts/build/prepare-nightly-build.js b/scripts/build/prepare-nightly-build.js new file mode 100644 index 00000000..8dcbf3f2 --- /dev/null +++ b/scripts/build/prepare-nightly-build.js @@ -0,0 +1,25 @@ +const fs = require("fs"); + +const json = JSON.parse(fs.readFileSync("./package.json").toString()); +const stableVersion = json.version.match(/(\d+)\.(\d+)\.(\d+)/); +const major = stableVersion[1]; +const minor = stableVersion[2]; + +function prependZero(number) { + if (number > 99) { + throw "Unexpected value to prepend with zero"; + } + return `${number < 10 ? "0" : ""}${number}`; +} + +const date = new Date(); +const month = date.getMonth() + 1; +const day = date.getDate(); +const hours = date.getHours(); +patch = `${date.getFullYear()}${prependZero(month)}${prependZero(day)}${prependZero(hours)}`; + +const insiderPackageJson = Object.assign(json, { + version: `${major}.${minor}.${patch}`, +}); + +fs.writeFileSync("./package.json", JSON.stringify(insiderPackageJson, null, 2)); diff --git a/scripts/download-vscode-for-system-tests.js b/scripts/download-vscode-for-system-tests.js deleted file mode 100644 index 23c2e6a9..00000000 --- a/scripts/download-vscode-for-system-tests.js +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env node - -const shell = require('shelljs'); - -// Downloads an instance of VS Code for tests - -if (shell.test('-e', '.vscode-test')) { - // Already downloaded the instance of vscode-test - shell.echo( - 'Using already downloaded instance in ' + shell.pwd() + '/.vscode-test' - ); -} else { - shell.echo( - 'Invoking ' + - shell.pwd() + - '/node_modules/vscode/bin/test for downloading VS Code' - ); - shell.exec('node ./node_modules/vscode/bin/test', { silent: true }); -} \ No newline at end of file diff --git a/scripts/install-vsix-dependencies.js b/scripts/install-vsix-dependencies.js deleted file mode 100644 index 6e912405..00000000 --- a/scripts/install-vsix-dependencies.js +++ /dev/null @@ -1,59 +0,0 @@ -#!/usr/bin/env node - -const path = require('path'); -const shell = require('shelljs'); -const glob = require('glob'); - -// Installs a list of extensions passed on the command line -var version = process.env.CODE_VERSION || '*'; -var isInsiders = version === 'insiders'; - -const testRunFolder = path.join( - '.vscode-test', - isInsiders ? 'insiders' : 'stable' -); -const testRunFolderAbsolute = path.join(process.cwd(), testRunFolder); -const codeExecutives = glob.sync('./.vscode-test/**/bin/code'); -const windowsExecutable = codeExecutives[0].replace(/\//g, '\\'); -const darwinExecutable = codeExecutives[0] || path.join( - testRunFolderAbsolute, - 'Visual Studio Code.app', - 'Contents', - 'Resources', - 'app', - 'bin', - 'code' -); -const linuxExecutable = codeExecutives[0] || path.join( - testRunFolderAbsolute, - 'VSCode-linux-x64', - 'bin', - 'code' -); - -const extensionsDir = path.join(__dirname, '..', 'packages'); - -const executable = - process.platform === 'darwin' - ? darwinExecutable - : process.platform === 'win32' ? windowsExecutable : linuxExecutable; - -if (process.platform === 'linux') { - // Somehow the code executable doesn't have +x set on the autobuilds -- set it here - shell.chmod('+x', `${executable}`); -} - -// We always invoke this script with 'node install-vsix-dependencies arg' -// so position2 is where the first argument is -for (let arg = 2; arg < process.argv.length; arg++) { - if (process.platform === 'win32') { - // Windows Powershell doesn't like the single quotes around the executable - shell.exec( - `${executable} --extensions-dir ${extensionsDir} --install-extension ${process.argv[arg]}` - ); - } else { - shell.exec( - `'${executable}' --extensions-dir ${extensionsDir} --install-extension ${process.argv[arg]}` - ); - } -} \ No newline at end of file diff --git a/scripts/run-vscode-tests.js b/scripts/run-vscode-tests.js deleted file mode 100644 index 7b810bc5..00000000 --- a/scripts/run-vscode-tests.js +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env node - -const shell = require('shelljs'); -shell.set('-e'); -shell.set('+v'); - -const path = require('path'); -shell.exec( - `cross-env CODE_EXTENSIONS_PATH='${path.join( - __dirname, - '..', - 'packages' - )}' node ./node_modules/vscode/bin/test` -); \ No newline at end of file diff --git a/src/JavaInlineValueProvider.ts b/src/JavaInlineValueProvider.ts new file mode 100644 index 00000000..87979c75 --- /dev/null +++ b/src/JavaInlineValueProvider.ts @@ -0,0 +1,81 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +import { debug, InlineValue, InlineValueContext, InlineValueEvaluatableExpression, InlineValuesProvider, InlineValueText, InlineValueVariableLookup, + Range, TextDocument } from "vscode"; +import { instrumentOperation, instrumentOperationStep, sendInfo } from "vscode-extension-telemetry-wrapper"; +import * as CodeConverter from "vscode-languageclient/lib/codeConverter"; +import * as ProtocolConverter from "vscode-languageclient/lib/protocolConverter"; +import { InlineKind, InlineVariable, resolveInlineVariables } from "./languageServerPlugin"; + +const protoConverter: ProtocolConverter.Converter = ProtocolConverter.createConverter(); +const codeConverter: CodeConverter.Converter = CodeConverter.createConverter(); + +export class JavaInlineValuesProvider implements InlineValuesProvider { + + public async provideInlineValues(document: TextDocument, viewPort: Range, context: InlineValueContext): Promise { + const provideInlineValuesOperation = instrumentOperation("provideInlineValues", async (operationId) => { + const resolveInlineVariablesStep = instrumentOperationStep(operationId, "resolveInlineVariables", async () => { + return (await resolveInlineVariables({ + uri: document.uri.toString(), + viewPort: codeConverter.asRange(viewPort), + stoppedLocation: codeConverter.asRange(context.stoppedLocation), + })); + }); + const variables: InlineVariable[] = await resolveInlineVariablesStep(); + + const resolveInlineValuesStep = instrumentOperationStep(operationId, "resolveInlineValues", async () => { + if (!variables || !variables.length) { + sendInfo(operationId, { + inlineVariableCount: 0, + }); + return []; + } + + const unresolvedVariables: any[] = variables.filter((variable) => variable.kind === InlineKind.Evaluation).map((variable) => { + return { + expression: variable.expression || variable.name, + declaringClass: variable.declaringClass, + }; + }); + sendInfo(operationId, { + inlineVariableCount: variables.length, + inlineVariableLookupCount: variables.length - unresolvedVariables.length, + inlineVariableEvaluationCount: unresolvedVariables.length, + }); + + let resolvedVariables: any; + if (unresolvedVariables.length && debug.activeDebugSession) { + const response = await debug.activeDebugSession.customRequest("inlineValues", { + frameId: context.frameId, + variables: unresolvedVariables, + }); + resolvedVariables = response?.variables; + } + + const result: InlineValue[] = []; + let next = 0; + for (const variable of variables) { + if (variable.kind === InlineKind.VariableLookup) { + result.push(new InlineValueVariableLookup(protoConverter.asRange(variable.range), variable.name, true)); + } else if (resolvedVariables && resolvedVariables.length > next) { + const resolvedValue = resolvedVariables[next++]; + if (resolvedValue) { + result.push(new InlineValueText(protoConverter.asRange(variable.range), `${variable.name} = ${resolvedValue.value}`)); + } else { + result.push(new InlineValueEvaluatableExpression(protoConverter.asRange(variable.range), variable.name)); + } + } else { + result.push(new InlineValueEvaluatableExpression(protoConverter.asRange(variable.range), variable.name)); + } + } + + return result; + }); + return resolveInlineValuesStep(); + }); + + return provideInlineValuesOperation(); + } + +} diff --git a/src/anchor.ts b/src/anchor.ts index 95668e41..22e2d195 100644 --- a/src/anchor.ts +++ b/src/anchor.ts @@ -5,7 +5,6 @@ export const REQUEST_TYPE_NOT_SUPPORTED = "request-type-xyz-is-not-supported-onl export const FAILED_TO_COMPLETE_HCR = "failed-to-complete-hot-code-replace"; export const ATTACH_CONFIG_ERROR = "please-specify-the-host-name-and-the-port-of-the-remote-debuggee-in-the-launchjson"; export const EVALUATE_ON_RUNNING_THREAD = "failed-to-evaluate-reason-cannot-evaluate-because-the-thread-is-resumed"; -export const DEBUGCONSOLE_MAIN_CLASS_NOT_FOUND = "the-debug-console-throws-error-could-not-find-or-load-main-class-xyz"; -export const DEBUGCONSOLE_CLASS_NOT_FOUND_EXCEPTION = "the-debug-console-throws-classnotfoundexception"; export const CANNOT_FIND_MAIN_CLASS = "cannot-find-a-class-with-the-main-method"; export const BUILD_FAILED = "build-failed-do-you-want-to-continue"; +export const UNSUPPORTED_CLASS_VERSION_ERROR = "program-throws-unsupportedclassversionerror"; diff --git a/src/breakpointCommands.ts b/src/breakpointCommands.ts new file mode 100644 index 00000000..84ee9e22 --- /dev/null +++ b/src/breakpointCommands.ts @@ -0,0 +1,124 @@ +import * as vscode from "vscode"; + +export function registerBreakpointCommands(context: vscode.ExtensionContext): void { + context.subscriptions.push(vscode.commands.registerCommand('java.debug.breakpoints.exceptionTypes', exceptionTypes)); +} + +async function exceptionTypes() { + const config = vscode.workspace.getConfiguration('java.debug.settings.exceptionBreakpoint'); + let currentTypes = config.get('exceptionTypes', []); + const addExceptionTypeItem: vscode.QuickPickItem = { + label: '$(add) Add Exception Types...', + alwaysShow: true, + }; + const removeExceptionTypeItem: any = (type: string): any => ({ + label: type, + buttons: [{ + iconPath: new vscode.ThemeIcon('close'), + tooltip: 'Remove this Exception Type' + }] + }); + + // Step 1: Show Breakpoint Exception Types + const pickStep = async (state: any) => { + return new Promise((resolve) => { + const items: vscode.QuickPickItem[] = [ + addExceptionTypeItem, + ...currentTypes.map(type => removeExceptionTypeItem(type)) + ]; + const quickPick = vscode.window.createQuickPick(); + quickPick.items = items; + quickPick.title = 'Breakpoint Exception Types'; + quickPick.canSelectMany = false; + quickPick.matchOnDescription = false; + quickPick.matchOnDetail = false; + + quickPick.onDidAccept(() => { + const selected = quickPick.selectedItems[0]; + if (selected.label.includes('Add Exception Types')) { + quickPick.hide(); + // go to next step + resolve(state); + } + }); + + quickPick.onDidTriggerItemButton(async (e) => { + const typeToRemove = e.item.label; + currentTypes = currentTypes.filter(type => type !== typeToRemove); + await config.update('exceptionTypes', currentTypes, vscode.ConfigurationTarget.Global); + quickPick.items = [ + addExceptionTypeItem, + ...currentTypes.map(type => removeExceptionTypeItem(type)) + ]; + }); + quickPick.onDidHide(() => { + quickPick.dispose(); + }); + quickPick.show(); + }); + }; + + // Step 2: Add Exception Type(s) + const inputStep = async (state: any) => { + return new Promise((resolve, reject) => { + const input = vscode.window.createInputBox(); + input.title = 'Add Breakpoint Exception Type(s)'; + input.placeholder = 'Enter exception type(s) (comma or space separated). "java.lang.NullPointerException" e.g.'; + input.prompt = 'Input exception types'; + input.buttons = [vscode.QuickInputButtons.Back]; + input.onDidAccept(async () => { + const exceptionType = input.value; + if (exceptionType) { + const types = exceptionType.split(/[,\s]+/).map(type => type.trim()).filter(type => type.length > 0); + let updated = false; + for (const type of types) { + if (!currentTypes.includes(type)) { + currentTypes.push(type); + updated = true; + } + } + if (updated) { + await config.update('exceptionTypes', currentTypes, vscode.ConfigurationTarget.Global); + } + } + input.hide(); + // go back to pick step + resolve(state); + }); + input.onDidTriggerButton((btn) => { + if (btn === vscode.QuickInputButtons.Back) { + input.hide(); + reject({ stepBack: true }); + } + }); + input.onDidHide(() => { + input.dispose(); + }); + input.show(); + }); + }; + + while (true) { + await multiStepInput([pickStep, inputStep], {}); + } +} + +async function multiStepInput(steps: ((input: T) => Promise)[], initial: T): Promise { + let state = initial; + let currentStep = 0; + while (currentStep < steps.length) { + try { + state = await steps[currentStep](state); + currentStep++; + } catch (err) { + if (err?.stepBack) { + if (currentStep > 0) { + currentStep--; + } + } else { + throw err; + } + } + } + return state; +} diff --git a/src/build.ts b/src/build.ts new file mode 100644 index 00000000..ebf38e7e --- /dev/null +++ b/src/build.ts @@ -0,0 +1,182 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. +import * as vscode from "vscode"; +import { instrumentOperation, sendInfo, sendOperationError, setErrorCode } from "vscode-extension-telemetry-wrapper"; + +import * as anchor from "./anchor"; +import * as commands from "./commands"; +import * as lsPlugin from "./languageServerPlugin"; +import { IProgressReporter } from "./progressAPI"; +import * as utility from "./utility"; + +const JAVA_DEBUG_CONFIGURATION = "java.debug.settings"; +const ON_BUILD_FAILURE_PROCEED = "onBuildFailureProceed"; +const CANCELLED_CODE = -32800; + +enum CompileWorkspaceStatus { + FAILED = 0, + SUCCEED = 1, + WITHERROR = 2, + CANCELLED = 3, + GRADLE_BS_COMPILATION_ERROR = 100, +} + +export interface BuildParams { + readonly mainClass: string; + readonly projectName?: string; + readonly filePath?: string; + readonly isFullBuild: boolean; +} + +export async function buildWorkspace(params: BuildParams, progressReporter: IProgressReporter): Promise { + const startAt = new Date().getTime(); + const buildResult = await instrumentOperation("build", async (operationId: string) => { + let status; + try { + status = await commands.executeJavaLanguageServerCommand(commands.JAVA_BUILD_WORKSPACE, + JSON.stringify(params), + progressReporter.getCancellationToken()); + } catch (err) { + status = (err && err.code === CANCELLED_CODE) ? CompileWorkspaceStatus.CANCELLED : err; + } + + return { + status, + operationId, + }; + })(); + + if (progressReporter.isCancelled() || buildResult.status === CompileWorkspaceStatus.CANCELLED) { + return false; + } else if (buildResult.status === CompileWorkspaceStatus.SUCCEED) { + return true; + } else { + const elapsed = new Date().getTime() - startAt; + const humanVisibleDelay = elapsed < 150 ? 150 : 0; + await new Promise(resolve => { + setTimeout(() => { // set a timeout so user still can see a compiling message. + resolve(null); + }, humanVisibleDelay); + }); + return handleBuildFailure(buildResult.operationId, buildResult.status, progressReporter); + } +} + +async function handleBuildFailure(operationId: string, err: any, progressReporter: IProgressReporter): Promise { + const configuration = vscode.workspace.getConfiguration(JAVA_DEBUG_CONFIGURATION); + const onBuildFailureProceed = configuration.get(ON_BUILD_FAILURE_PROCEED); + + if (err instanceof utility.JavaExtensionNotEnabledError) { + utility.guideToInstallJavaExtension(); + return false; + } + + const error: Error = new utility.UserError({ + message: "Build failed", + }); + setErrorCode(error, Number(err)); + sendOperationError(operationId, "build", error); + const errorDiagnostics = traceErrorTypes(operationId); + if (!onBuildFailureProceed && err) { + // build failure information is not displayed in PROBLEMS panel for build server project. + if (errorDiagnostics && err !== CompileWorkspaceStatus.GRADLE_BS_COMPILATION_ERROR) { + vscode.commands.executeCommand("workbench.actions.view.problems"); + } + + progressReporter.hide(true); + const ans = await vscode.window.showErrorMessage("Build failed, do you want to continue?", "Continue", "Always Continue", "Fix..."); + sendInfo(operationId, { + operationName: "build", + choiceForBuildError: ans || "esc", + }); + if (ans === "Continue") { + return true; + } else if (ans === "Always Continue") { + const debugSettings: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("java.debug.settings"); + debugSettings?.update("onBuildFailureProceed", true); + return true; + } else if (ans === "Fix...") { + showFixSuggestions(operationId); + } + + return false; + } + + return true; +} + +function traceErrorTypes(operationId: string): boolean { + const problems = vscode.languages.getDiagnostics() || []; + const errorTypes: {[key: string]: number} = {}; + let errorCount = 0; + for (const problem of problems) { + for (const diagnostic of problem[1]) { + if (diagnostic.severity === vscode.DiagnosticSeverity.Error && diagnostic.source === "Java") { + const errorCode = typeof diagnostic.code === 'object' ? String(diagnostic.code.value) : String(diagnostic.code); + errorTypes[errorCode] = (errorTypes[errorCode] || 0) + 1; + errorCount++; + } + } + } + + if (errorCount) { + sendInfo(operationId, { + buildErrorTypes: JSON.stringify(errorTypes), + buildErrorCount: errorCount, + }); + } + + return errorCount > 0; +} + +async function showFixSuggestions(operationId: string) { + let buildFiles: string[] = []; + try { + buildFiles = await lsPlugin.resolveBuildFiles(); + } catch (error) { + // do nothing + } + + const pickitems = []; + pickitems.push({ + label: "Clean workspace cache", + detail: "Clean the stale workspace and reload the window", + }); + if (buildFiles.length) { + pickitems.push({ + label: "Update project configuration", + detail: "Force the language server to update the project configuration/classpath", + }); + } + pickitems.push({ + label: "Open log file", + detail: "Open log file to view more details for the build errors", + }); + pickitems.push({ + label: "Troubleshooting guide", + detail: "Find more detail about the troubleshooting steps", + }); + + const ans = await vscode.window.showQuickPick(pickitems, { + placeHolder: "Please fix the errors in PROBLEMS first, then try the fix suggestions below.", + }); + sendInfo(operationId, { + operationName: "build", + choiceForBuildFix: ans ? ans.label : "esc", + }); + if (!ans) { + return; + } + + if (ans.label === "Clean workspace cache") { + vscode.commands.executeCommand("java.clean.workspace"); + } else if (ans.label === "Update project configuration") { + for (const buildFile of buildFiles) { + await vscode.commands.executeCommand("java.projectConfiguration.update", vscode.Uri.parse(buildFile)); + } + } else if (ans.label === "Open log file") { + vscode.commands.executeCommand("java.open.serverLog"); + } else if (ans.label === "Troubleshooting guide") { + utility.openTroubleshootingPage("Build failed", anchor.BUILD_FAILED); + } +} diff --git a/src/classFilter.ts b/src/classFilter.ts new file mode 100644 index 00000000..7ddf4af4 --- /dev/null +++ b/src/classFilter.ts @@ -0,0 +1,49 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +import * as vscode from "vscode"; +import { resolveClassFilters } from "./languageServerPlugin"; + +export async function populateStepFilters(config: vscode.DebugConfiguration) { + if (!config.stepFilters) { + return; + } + + const skipClasses = await substituteFilterVariables(config.stepFilters.skipClasses); + // Migrate classNameFilters to skipClasses. + if (Array.isArray(config.stepFilters.classNameFilters)) { + mergeResult(config.stepFilters.classNameFilters, skipClasses); + } + config.stepFilters.classNameFilters = undefined; + config.stepFilters.skipClasses = skipClasses; +} + +export async function substituteFilterVariables(skipClasses: string[]): Promise { + if (!skipClasses) { + return []; + } + + try { + // Preprocess skipClasses configurations. + if (Array.isArray(skipClasses)) { + const hasReservedName = skipClasses.some((filter) => filter === "$JDK" || filter === "$Libraries"); + return hasReservedName ? await resolveClassFilters(skipClasses) : skipClasses; + } else { + // tslint:disable-next-line:no-console + console.error("Invalid type for skipClasses config:" + skipClasses); + } + } catch (e) { + // tslint:disable-next-line:no-console + console.error(e); + } + + return []; +} + +function mergeResult(newItems: any[], result: string[]) { + newItems.forEach((item) => { + if (result.indexOf(item) < 0) { + result.push(String(item)); + } + }); +} diff --git a/src/commands.ts b/src/commands.ts index 07e3fb9a..2419ec8f 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -2,6 +2,7 @@ // Licensed under the MIT license. import * as vscode from "vscode"; +import * as utility from "./utility"; export const VSCODE_STARTDEBUG = "vscode.startDebug"; @@ -15,7 +16,7 @@ export const JAVA_RESOLVE_MAINCLASS = "vscode.java.resolveMainClass"; export const JAVA_VALIDATE_LAUNCHCONFIG = "vscode.java.validateLaunchConfig"; -export const JAVA_BUILD_WORKSPACE = "java.workspace.compile"; +export const JAVA_BUILD_WORKSPACE = "vscode.java.buildWorkspace"; export const JAVA_EXECUTE_WORKSPACE_COMMAND = "java.execute.workspaceCommand"; @@ -25,7 +26,38 @@ export const JAVA_UPDATE_DEBUG_SETTINGS = "vscode.java.updateDebugSettings"; export const JAVA_RESOLVE_MAINMETHOD = "vscode.java.resolveMainMethod"; -export function executeJavaLanguageServerCommand(...rest) { +export const JAVA_INFER_LAUNCH_COMMAND_LENGTH = "vscode.java.inferLaunchCommandLength"; + +export const JAVA_CHECK_PROJECT_SETTINGS = "vscode.java.checkProjectSettings"; + +export const JAVA_RESOLVE_ELEMENT_AT_SELECTION = "vscode.java.resolveElementAtSelection"; + +export const JAVA_RESOLVE_BUILD_FILES = "vscode.java.resolveBuildFiles"; + +export const JAVA_IS_ON_CLASSPATH = "vscode.java.isOnClasspath"; + +export const JAVA_RESOLVE_JAVAEXECUTABLE = "vscode.java.resolveJavaExecutable"; + +export const JAVA_FETCH_PLATFORM_SETTINGS = "vscode.java.fetchPlatformSettings"; + +export const JAVA_RESOLVE_CLASSFILTERS = "vscode.java.resolveClassFilters"; + +export const JAVA_RESOLVE_SOURCE_URI = "vscode.java.resolveSourceUri"; + +export const JAVA_RESOLVE_INLINE_VARIABLES = "vscode.java.resolveInlineVariables"; + +export function executeJavaLanguageServerCommand(...rest: any[]) { + return executeJavaExtensionCommand(JAVA_EXECUTE_WORKSPACE_COMMAND, ...rest); +} + +export async function executeJavaExtensionCommand(commandName: string, ...rest: any[]) { // TODO: need to handle error and trace telemetry - return vscode.commands.executeCommand(JAVA_EXECUTE_WORKSPACE_COMMAND, ...rest); + const javaExtension = utility.getJavaExtension(); + if (!javaExtension) { + throw new utility.JavaExtensionNotEnabledError(`Cannot execute command ${commandName}, VS Code Java Extension is not enabled.`); + } + if (!javaExtension.isActive) { + await javaExtension.activate(); + } + return vscode.commands.executeCommand(commandName, ...rest); } diff --git a/src/configurationProvider.ts b/src/configurationProvider.ts index 072768e1..92db8e11 100644 --- a/src/configurationProvider.ts +++ b/src/configurationProvider.ts @@ -1,120 +1,178 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. +import * as fs from "fs"; import * as _ from "lodash"; import * as os from "os"; import * as path from "path"; import * as vscode from "vscode"; -import { instrumentOperation } from "vscode-extension-telemetry-wrapper"; +import * as dotenv from 'dotenv'; + +import { instrumentOperation, sendError, sendInfo, setUserError } from "vscode-extension-telemetry-wrapper"; import * as anchor from "./anchor"; +import { buildWorkspace } from "./build"; +import { populateStepFilters, substituteFilterVariables } from "./classFilter"; import * as commands from "./commands"; -import { logger, Type } from "./logger"; +import { ClasspathVariable } from "./constants"; +import { Type } from "./javaLogger"; +import * as lsPlugin from "./languageServerPlugin"; +import { addMoreHelpfulVMArgs, getJavaVersion, getShortenApproachForCLI, validateRuntimeCompatibility } from "./launchCommand"; +import { mainClassPicker } from "./mainClassPicker"; +import { resolveJavaProcess } from "./processPicker"; +import { IProgressReporter } from "./progressAPI"; +import { progressProvider } from "./progressImpl"; import * as utility from "./utility"; -import { VariableResolver } from "./variableResolver"; + +const platformNameMappings: { [key: string]: string } = { + win32: "windows", + linux: "linux", + darwin: "osx", +}; +const platformName = platformNameMappings[process.platform]; + +export let lastUsedLaunchConfig: vscode.DebugConfiguration | undefined; export class JavaDebugConfigurationProvider implements vscode.DebugConfigurationProvider { private isUserSettingsDirty: boolean = true; - private debugHistory: MostRecentlyUsedHistory = new MostRecentlyUsedHistory(); - private resolver: VariableResolver; constructor() { - this.resolver = new VariableResolver(); + const packageJson: {[key: string]: any} = require("../package.json"); + const debugConfigNames = Object.keys(packageJson?.contributes?.configuration?.properties || {}); vscode.workspace.onDidChangeConfiguration((event) => { - if (vscode.debug.activeDebugSession) { - this.isUserSettingsDirty = false; - return updateDebugSettings(); - } else { - this.isUserSettingsDirty = true; + if (event.affectsConfiguration("java.debug")) { + for (const key of debugConfigNames) { + if (event.affectsConfiguration(key)) { + sendInfo("", { + operationName: "changeJavaDebugSettings", + configName: key, + }); + } + } + + if (vscode.debug.activeDebugSession) { + this.isUserSettingsDirty = false; + return updateDebugSettings(event); + } else { + this.isUserSettingsDirty = true; + } } + return undefined; }); } // Returns an initial debug configurations based on contextual information. public provideDebugConfigurations(folder: vscode.WorkspaceFolder | undefined, token?: vscode.CancellationToken): vscode.ProviderResult { - const provideDebugConfigurationsHandler = instrumentOperation("provideDebugConfigurations", (operationId: string) => { - return >this.provideDebugConfigurationsAsync(folder); + const provideDebugConfigurationsHandler = instrumentOperation("provideDebugConfigurations", (_operationId: string) => { + return >this.provideDebugConfigurationsAsync(folder, token); }); return provideDebugConfigurationsHandler(); } // Try to add all missing attributes to the debug configuration being launched. - public resolveDebugConfiguration(folder: vscode.WorkspaceFolder | undefined, config: vscode.DebugConfiguration, token?: vscode.CancellationToken): + public resolveDebugConfiguration(_folder: vscode.WorkspaceFolder | undefined, + config: vscode.DebugConfiguration, _token?: vscode.CancellationToken): vscode.ProviderResult { - const resolveDebugConfigurationHandler = instrumentOperation("resolveDebugConfiguration", (operationId: string) => { - this.resolveVariables(folder, config); - return this.heuristicallyResolveDebugConfiguration(folder, config); + // If no debug configuration is provided, then generate one in memory. + if (this.isEmptyConfig(config)) { + config.type = "java"; + config.name = "Java Debug"; + config.request = "launch"; + config.__origin = "internal"; + } + + return config; + } + + // Try to add all missing attributes to the debug configuration being launched. + public resolveDebugConfigurationWithSubstitutedVariables( + folder: vscode.WorkspaceFolder | undefined, + config: vscode.DebugConfiguration, + token?: vscode.CancellationToken): vscode.ProviderResult { + const resolveDebugConfigurationHandler = instrumentOperation("resolveDebugConfiguration", (_operationId: string) => { + try { + // See https://github.com/microsoft/vscode-java-debug/issues/778 + // Merge the platform specific properties to the global config to simplify the subsequent resolving logic. + this.mergePlatformProperties(config, folder); + return this.resolveAndValidateDebugConfiguration(folder, config, token); + } catch (ex) { + utility.showErrorMessage({ + type: Type.EXCEPTION, + message: String((ex && ex.message) || ex), + }); + return undefined; + } }); return resolveDebugConfigurationHandler(); } private provideDebugConfigurationsAsync(folder: vscode.WorkspaceFolder | undefined, token?: vscode.CancellationToken) { - return vscode.window.withProgress({ location: vscode.ProgressLocation.Window }, (p) => { - return new Promise((resolve, reject) => { - p.report({ message: "Auto generating configuration..." }); - resolveMainClass(folder ? folder.uri : undefined).then((res: IMainClassOption[]) => { - let cache; - cache = {}; - const defaultLaunchConfig = { - type: "java", - name: "Debug (Launch)", - request: "launch", - // tslint:disable-next-line - cwd: "${workspaceFolder}", - console: "internalConsole", - stopOnEntry: false, - mainClass: "", - args: "", - }; - const launchConfigs = res.map((item) => { - return { - ...defaultLaunchConfig, - name: this.constructLaunchConfigName(item.mainClass, item.projectName, cache), - mainClass: item.mainClass, - projectName: item.projectName, - }; - }); - const defaultAttachConfig = { - type: "java", - name: "Debug (Attach)", - request: "attach", - hostName: "localhost", - port: "", + return new Promise(async (resolve, _reject) => { + const progressReporter = progressProvider.createProgressReporter("Create launch.json", vscode.ProgressLocation.Window); + progressReporter.observe(token); + const defaultLaunchConfig = { + type: "java", + name: "Current File", + request: "launch", + // tslint:disable-next-line + mainClass: "${file}", + }; + try { + const isOnStandardMode = await utility.waitForStandardMode(progressReporter); + if (!isOnStandardMode) { + resolve([defaultLaunchConfig]); + return; + } + + if (progressReporter.isCancelled()) { + resolve([defaultLaunchConfig]); + return; + } + progressReporter.report("Generating Java configuration..."); + const mainClasses = await lsPlugin.resolveMainClass(folder ? folder.uri : undefined); + const cache = {}; + const launchConfigs = mainClasses.map((item) => { + return { + ...defaultLaunchConfig, + name: this.constructLaunchConfigName(item.mainClass, cache), + mainClass: item.mainClass, + projectName: item.projectName, }; - resolve([defaultLaunchConfig, ...launchConfigs, defaultAttachConfig]); - }, (ex) => { - p.report({ message: `failed to generate configuration. ${ex}` }); - reject(ex); }); - }); + if (progressReporter.isCancelled()) { + resolve([defaultLaunchConfig]); + return; + } + resolve([defaultLaunchConfig, ...launchConfigs]); + } catch (ex) { + if (ex instanceof utility.JavaExtensionNotEnabledError) { + utility.guideToInstallJavaExtension(); + } else { + // tslint:disable-next-line + console.error(ex); + } + + resolve([defaultLaunchConfig]); + } finally { + progressReporter.done(); + } }); } - private resolveVariables(folder: vscode.WorkspaceFolder, config: vscode.DebugConfiguration): void { - // all the properties whose values are string or array of string - const keys = ["mainClass", "args", "vmArgs", "modulePaths", "classPaths", "projectName", - "env", "sourcePaths", "encoding", "cwd", "hostName"]; - if (!config) { - return; - } - for (const key of keys) { - if (config.hasOwnProperty(key)) { - const value = config[key]; - if (_.isString(value)) { - config[key] = this.resolver.resolveString(folder ? folder.uri : undefined, value); - } else if (_.isArray(value)) { - config[key] = _.map(value, (item) => - _.isString(item) ? this.resolver.resolveString(folder ? folder.uri : undefined, item) : item); + private mergePlatformProperties(config: vscode.DebugConfiguration, _folder?: vscode.WorkspaceFolder) { + if (config && platformName && config[platformName]) { + try { + for (const key of Object.keys(config[platformName])) { + config[key] = config[platformName][key]; } + config[platformName] = undefined; + } catch { + // do nothing } } } - private constructLaunchConfigName(mainClass: string, projectName: string, cache: {}) { - const prefix = "Debug (Launch)-"; - let name = prefix + mainClass.substr(mainClass.lastIndexOf(".") + 1); - if (projectName !== undefined) { - name += `<${projectName}>`; - } + private constructLaunchConfigName(mainClass: string, cache: { [key: string]: any }) { + const name = `${mainClass.substr(mainClass.lastIndexOf(".") + 1)}`; if (cache[name] === undefined) { cache[name] = 0; return name; @@ -124,57 +182,143 @@ export class JavaDebugConfigurationProvider implements vscode.DebugConfiguration } } - private async heuristicallyResolveDebugConfiguration(folder: vscode.WorkspaceFolder | undefined, config: vscode.DebugConfiguration) { + private mergeEnvFile(config: vscode.DebugConfiguration) { + const baseEnv = config.env || {}; + let result = baseEnv; + if (config.envFile) { + try { + if (typeof config.envFile === 'string') { + result = { + ...result, + ...readEnvFile(config.envFile) + }; + } + if (Array.isArray(config.envFile)) { + config.envFile.forEach((f) => { + result = { + ...result, + ...readEnvFile(f) + }; + }); + } + } catch (e) { + throw new utility.UserError({ + message: "Cannot load environment file.", + type: Type.USAGEERROR, + }); + } + } + config.env = result; + } + + private async resolveAndValidateDebugConfiguration(folder: vscode.WorkspaceFolder | undefined, config: vscode.DebugConfiguration, + token?: vscode.CancellationToken) { + let configCopy: vscode.DebugConfiguration | undefined; + const isConfigFromInternal = config.__origin === "internal" /** in-memory configuration from debugger */ + || config.__configurationTarget /** configuration from launch.json */; + if (config.request === "launch" && isConfigFromInternal) { + configCopy = _.cloneDeep(config); + delete configCopy.__progressId; + delete configCopy.noDebug; + } + + let progressReporter = progressProvider.getProgressReporter(config.__progressId); + if (!progressReporter && config.__progressId) { + return undefined; + } else if (!progressReporter) { + progressReporter = progressProvider.createProgressReporter(utility.launchJobName(config.name, config.noDebug)); + } + + progressReporter.observe(token); + if (progressReporter.isCancelled()) { + return undefined; + } + try { + const isOnStandardMode = await utility.waitForStandardMode(progressReporter); + if (!isOnStandardMode || progressReporter.isCancelled()) { + return undefined; + } + if (this.isUserSettingsDirty) { this.isUserSettingsDirty = false; await updateDebugSettings(); } - /** - * If no launch.json exists in the current workspace folder - * delegate to provideDebugConfigurations api to generate the initial launch.json configurations - */ - if (this.isEmptyConfig(config) && folder) { - // Follow the feature request https://github.com/Microsoft/vscode/issues/54213#issuecomment-420965778, - // in order to generate launch.json, the resolveDebugConfiguration api must return null explicitly. - return null; - } - - // If it's the single file case that no workspace folder is opened, generate debug config in memory - if (this.isEmptyConfig(config) && !folder) { + // If no debug configuration is provided, then generate one in memory. + if (this.isEmptyConfig(config)) { config.type = "java"; config.name = "Java Debug"; config.request = "launch"; } if (config.request === "launch") { - try { - const buildResult = await vscode.commands.executeCommand(commands.JAVA_BUILD_WORKSPACE, false); - } catch (err) { - const ans = await utility.showErrorMessageWithTroubleshooting({ - message: "Build failed, do you want to continue?", - type: Type.USAGEERROR, - anchor: anchor.BUILD_FAILED, - }, "Proceed", "Abort"); - if (ans !== "Proceed") { - return undefined; - } - } - - const mainClassOption = await this.resolveLaunchConfig(folder ? folder.uri : undefined, config); + const mainClassOption = await this.resolveAndValidateMainClass(folder && folder.uri, config, progressReporter); if (!mainClassOption || !mainClassOption.mainClass) { // Exit silently if the user cancels the prompt fix by ESC. // Exit the debug session. - return; + return undefined; } config.mainClass = mainClassOption.mainClass; config.projectName = mainClassOption.projectName; + if (config.__workspaceFolder && config.__workspaceFolder !== folder) { + folder = config.__workspaceFolder; + } + // Update the job name if the main class is changed during the resolving of configuration provider. + if (configCopy && configCopy.mainClass !== config.mainClass) { + config.name = config.mainClass.substr(config.mainClass.lastIndexOf(".") + 1); + progressReporter.setJobName(utility.launchJobName(config.name, config.noDebug)); + } + if (progressReporter.isCancelled()) { + return undefined; + } + + if (needsBuildWorkspace()) { + progressReporter.report("Compiling..."); + const proceed = await buildWorkspace({ + mainClass: mainClassOption.mainClass, + projectName: mainClassOption.projectName, + isFullBuild: false, + }, progressReporter); + if (!proceed) { + return undefined; + } + } + + if (progressReporter.isCancelled()) { + return undefined; + } + + progressReporter.report("Resolving launch configuration..."); + this.mergeEnvFile(config); + // If the user doesn't specify 'vmArgs' in launch.json, use the global setting to get the default vmArgs. + if (config.vmArgs === undefined) { + const debugSettings: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("java.debug.settings"); + config.vmArgs = debugSettings.vmArgs; + } + // If the user doesn't specify 'console' in launch.json, use the global setting to get the launch console. + if (!config.console) { + const debugSettings: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("java.debug.settings"); + config.console = debugSettings.console; + } + // If the console is integratedTerminal, don't auto switch the focus to DEBUG CONSOLE. + if (config.console === "integratedTerminal" && !config.internalConsoleOptions) { + config.internalConsoleOptions = "neverOpen"; + } + + if (progressReporter.isCancelled()) { + return undefined; + } if (_.isEmpty(config.classPaths) && _.isEmpty(config.modulePaths)) { - const result = (await resolveClasspath(config.mainClass, config.projectName)); + const result = (await lsPlugin.resolveClasspath(config.mainClass, config.projectName)); config.modulePaths = result[0]; config.classPaths = result[1]; + } else { + config.modulePaths = await this.resolvePath(folder, config.modulePaths, config.mainClass, + config.projectName, true /*isModulePath*/); + config.classPaths = await this.resolvePath(folder, config.classPaths, config.mainClass, + config.projectName, false /*isModulePath*/); } if (_.isEmpty(config.classPaths) && _.isEmpty(config.modulePaths)) { throw new utility.UserError({ @@ -182,14 +326,90 @@ export class JavaDebugConfigurationProvider implements vscode.DebugConfiguration type: Type.USAGEERROR, }); } + + if (_.isEmpty(config.javaExec)) { + config.javaExec = await lsPlugin.resolveJavaExecutable(config.mainClass, config.projectName); + } else { + if (!fs.existsSync(config.javaExec)) { + throw new utility.UserError({ + message: "Java executable file path cannot be accessed, please specify a valid path in the launch.json.", + type: Type.USAGEERROR, + }); + } + } + + // Add the default launch options to the config. + config.cwd = config.cwd || _.get(folder, "uri.fsPath"); + if (Array.isArray(config.args)) { + config.args = this.concatArgs(config.args); + } + + if (Array.isArray(config.vmArgs)) { + config.vmArgs = this.concatArgs(config.vmArgs); + } + + if (progressReporter.isCancelled()) { + return undefined; + } + // Populate the class filters to the debug configuration. + await populateStepFilters(config); + + const targetJavaVersion: number = await getJavaVersion(config.javaExec); + // Auto add '--enable-preview' vmArgs if the java project enables COMPILER_PB_ENABLE_PREVIEW_FEATURES flag. + if (await lsPlugin.detectPreviewFlag(config.mainClass, config.projectName)) { + config.vmArgs = (config.vmArgs || "") + " --enable-preview"; + validateRuntimeCompatibility(targetJavaVersion); + } + + // Add more helpful vmArgs. + await addMoreHelpfulVMArgs(config, targetJavaVersion); + + if (!config.shortenCommandLine || config.shortenCommandLine === "auto") { + config.shortenCommandLine = await getShortenApproachForCLI(config, targetJavaVersion); + } + + // VS Code internal console uses UTF-8 to display output by default. + if (config.console === "internalConsole" && !config.encoding) { + config.encoding = "UTF-8"; + } } else if (config.request === "attach") { - if (!config.hostName || !config.port) { + if (config.hostName && config.port && Number.isInteger(Number(config.port))) { + config.port = Number(config.port); + config.processId = undefined; + // Continue if the hostName and port are configured. + } else if (config.processId !== undefined) { + // tslint:disable-next-line + if (config.processId === "${command:PickJavaProcess}") { + return undefined; + } + + const pid: number = Number(config.processId); + if (Number.isNaN(pid)) { + vscode.window.showErrorMessage(`The processId config '${config.processId}' is not a valid process id.`); + return undefined; + } + + const javaProcess = await resolveJavaProcess(pid); + if (!javaProcess) { + vscode.window.showErrorMessage(`Attach to process: pid '${config.processId}' is not a debuggable Java process. ` + + `Please make sure the process has turned on debug mode using vmArgs like ` + + `'-agentlib:jdwp=transport=dt_socket,server=y,address=5005.'`); + return undefined; + } + + config.processId = undefined; + config.hostName = javaProcess.hostName; + config.port = javaProcess.debugPort; + } else { throw new utility.UserError({ - message: "Please specify the host name and the port of the remote debuggee in the launch.json.", + message: "Please specify the hostName/port directly, or provide the processId of the remote debuggee in the launch.json.", type: Type.USAGEERROR, anchor: anchor.ATTACH_CONFIG_ERROR, }); } + + // Populate the class filters to the debug configuration. + await populateStepFilters(config); } else { throw new utility.UserError({ message: `Request type "${config.request}" is not supported. Only "launch" and "attach" are supported.`, @@ -198,39 +418,121 @@ export class JavaDebugConfigurationProvider implements vscode.DebugConfiguration }); } - if (Array.isArray(config.args)) { - config.args = this.concatArgs(config.args); - } - - if (Array.isArray(config.vmArgs)) { - config.vmArgs = this.concatArgs(config.vmArgs); + if (token?.isCancellationRequested || progressReporter.isCancelled()) { + return undefined; } - const debugServerPort = await startDebugSession(); - if (debugServerPort) { - config.debugServer = debugServerPort; - return config; - } else { - // Information for diagnostic: - console.log("Cannot find a port for debugging session"); - throw new Error("Failed to start debug server."); - } + delete config.__progressId; + return config; } catch (ex) { + if (ex instanceof utility.JavaExtensionNotEnabledError) { + utility.guideToInstallJavaExtension(); + return undefined; + } if (ex instanceof utility.UserError) { utility.showErrorMessageWithTroubleshooting(ex.context); return undefined; } - const errorMessage = (ex && ex.message) || ex; - utility.showErrorMessageWithTroubleshooting({ - message: String(errorMessage), - type: Type.EXCEPTION, - details: utility.formatErrorProperties(ex), - }); + utility.showErrorMessageWithTroubleshooting(utility.convertErrorToMessage(ex)); return undefined; + } finally { + if (configCopy && config.mainClass) { + configCopy.name = config.name; + configCopy.mainClass = config.mainClass; + configCopy.projectName = config.projectName; + configCopy.__workspaceFolder = folder; + lastUsedLaunchConfig = configCopy; + } + + progressReporter.done(); } } + private async resolvePath(folder: vscode.WorkspaceFolder | undefined, pathArray: string[], mainClass: string, + projectName: string, isModulePath: boolean): Promise { + if (_.isEmpty(pathArray)) { + return []; + } + + const pathVariables: string[] = [ClasspathVariable.Auto, ClasspathVariable.Runtime, ClasspathVariable.Test]; + const containedVariables: string[] = pathArray.filter((cp: string) => pathVariables.includes(cp)); + if (_.isEmpty(containedVariables)) { + return this.filterExcluded(folder, pathArray); + } + + const scope: string | undefined = this.mergeScope(containedVariables); + const response: any[] = await lsPlugin.resolveClasspath(mainClass, projectName, scope); + const resolvedPaths: string[] = isModulePath ? response?.[0] : response?.[1]; + if (!resolvedPaths) { + // tslint:disable-next-line:no-console + console.log("The Java Language Server failed to resolve the classpaths/modulepaths"); + } + const paths: string[] = []; + let replaced: boolean = false; + for (const p of pathArray) { + for (const splitPath of p.split(process.platform === 'win32' ? ';' : ':')) { + if (pathVariables.includes(splitPath)) { + if (!replaced) { + paths.push(...resolvedPaths); + replaced = true; + } + continue; + } + paths.push(splitPath); + } + } + return this.filterExcluded(folder, paths); + } + + private async filterExcluded(folder: vscode.WorkspaceFolder | undefined, paths: string[]): Promise { + const result: string[] = []; + const excludes: Map = new Map(); + for (const p of paths) { + if (p.startsWith("!")) { + let exclude = p.substr(1); + if (!path.isAbsolute(exclude)) { + exclude = path.join(folder?.uri.fsPath || "", exclude); + } + // use Uri to normalize the fs path + excludes.set(vscode.Uri.file(exclude).fsPath, this.isFilePath(exclude)); + continue; + } + + result.push(vscode.Uri.file(p).fsPath); + } + + return result.filter((r) => { + for (const [excludedPath, isFile] of excludes.entries()) { + if (isFile && r === excludedPath) { + return false; + } + + if (!isFile && r.startsWith(excludedPath)) { + return false; + } + } + + return true; + }); + } + + private mergeScope(scopes: string[]): string | undefined { + if (scopes.includes(ClasspathVariable.Test)) { + return "test"; + } + + if (scopes.includes(ClasspathVariable.Auto)) { + return undefined; + } + + if (scopes.includes(ClasspathVariable.Runtime)) { + return "runtime"; + } + + return undefined; + } + /** * Converts an array of arguments to a string as the args and vmArgs. */ @@ -238,8 +540,8 @@ export class JavaDebugConfigurationProvider implements vscode.DebugConfiguration return _.join(_.map(args, (arg: any): string => { const str = String(arg); // if it has quotes or spaces, use double quotes to wrap it - if (/['"\s]/.test(str)) { - return "\"" + str.replace(/(['"\\])/g, "\\$1") + "\""; + if (/["\s]/.test(str)) { + return "\"" + str.replace(/(["\\])/g, "\\$1") + "\""; } return str; @@ -255,47 +557,146 @@ export class JavaDebugConfigurationProvider implements vscode.DebugConfiguration return Object.keys(config).filter((key: string) => key !== "noDebug").length === 0; } - private async resolveLaunchConfig(folder: vscode.Uri | undefined, config: vscode.DebugConfiguration): Promise { - if (!config.mainClass) { - return await this.promptMainClass(folder); + private async resolveAndValidateMainClass(folder: vscode.Uri | undefined, config: vscode.DebugConfiguration, + progressReporter: IProgressReporter): Promise { + // Validate it if the mainClass is already set in launch configuration. + if (config.mainClass && !this.isFilePath(config.mainClass)) { + progressReporter.report("Resolving main class..."); + const containsExternalClasspaths = !_.isEmpty(config.classPaths) || !_.isEmpty(config.modulePaths); + const validationResponse = await lsPlugin.validateLaunchConfig(config.mainClass, config.projectName, containsExternalClasspaths, folder); + if (progressReporter.isCancelled()) { + return undefined; + } else if (!validationResponse.mainClass.isValid || !validationResponse.projectName.isValid) { + return this.fixMainClass(folder, config, validationResponse, progressReporter); + } + + return { + mainClass: config.mainClass, + projectName: config.projectName, + }; + } + + return this.resolveMainClass(config, progressReporter); + } + + private async resolveMainClass(config: vscode.DebugConfiguration, progressReporter: IProgressReporter): + Promise { + if (config.projectName) { + progressReporter.report("Resolving main class..."); + if (this.isFilePath(config.mainClass)) { + const mainEntries = await lsPlugin.resolveMainMethod(vscode.Uri.file(config.mainClass)); + if (progressReporter.isCancelled()) { + return undefined; + } else if (mainEntries.length) { + if (!mainClassPicker.isAutoPicked(mainEntries)) { + progressReporter.hide(true); + } + return mainClassPicker.showQuickPick(mainEntries, "Please select a main class you want to run."); + } + } + + return this.promptMainClassUnderProject(config.projectName, progressReporter, "Please select a main class you wan to run"); + } + + // Try to resolve main class from current file + const currentFile = config.mainClass || vscode.window.activeTextEditor?.document.uri.fsPath; + if (currentFile) { + const mainEntries = await lsPlugin.resolveMainMethod(vscode.Uri.file(currentFile)); + if (progressReporter.isCancelled()) { + return undefined; + } else if (mainEntries.length) { + if (!mainClassPicker.isAutoPicked(mainEntries)) { + progressReporter.hide(true); + } + return mainClassPicker.showQuickPick(mainEntries, "Please select a main class you want to run."); + } + } + + // If current file is not executable, run previously used launch config. + if (lastUsedLaunchConfig) { + Object.assign(config, lastUsedLaunchConfig); + progressReporter.setJobName(utility.launchJobName(config.name, config.noDebug)); + progressReporter.report("Resolving main class..."); + return { + mainClass: config.mainClass, + projectName: config.projectName, + }; + } + + progressReporter.report("Resolving main class..."); + const hintMessage = currentFile ? + `The file '${path.basename(currentFile)}' is not executable, please select a main class you want to run.` : + "Please select a main class you want to run."; + return this.promptMainClassUnderPath(undefined, progressReporter, hintMessage); + } + + private isFilePath(filePath: string): boolean { + if (!filePath) { + return false; } - const containsExternalClasspaths = !_.isEmpty(config.classPaths) || !_.isEmpty(config.modulePaths); - const validationResponse = await validateLaunchConfig(folder, config.mainClass, config.projectName, containsExternalClasspaths); - if (!validationResponse.mainClass.isValid || !validationResponse.projectName.isValid) { - return await this.fixMainClass(folder, config, validationResponse); + try { + return fs.lstatSync(filePath).isFile(); + } catch (error) { + // do nothing + return false; } + } - return { - mainClass: config.mainClass, - projectName: config.projectName, - }; + private getValidationErrorMessage(error: lsPlugin.IValidationResult): string { + switch (error.kind) { + case lsPlugin.CONFIGERROR_INVALID_CLASS_NAME: + return "ConfigError: mainClass was configured with an invalid class name."; + case lsPlugin.CONFIGERROR_MAIN_CLASS_NOT_EXIST: + return "ConfigError: mainClass does not exist."; + case lsPlugin.CONFIGERROR_MAIN_CLASS_NOT_UNIQUE: + return "ConfigError: mainClass is not unique in the workspace"; + case lsPlugin.CONFIGERROR_INVALID_JAVA_PROJECT: + return "ConfigError: could not find a Java project with the configured projectName."; + } + + return "ConfigError: Invalid mainClass/projectName configs."; } - private async fixMainClass(folder: vscode.Uri | undefined, config: vscode.DebugConfiguration, validationResponse: ILaunchValidationResponse): - Promise { + private async fixMainClass(folder: vscode.Uri | undefined, config: vscode.DebugConfiguration, + validationResponse: lsPlugin.ILaunchValidationResponse, progressReporter: IProgressReporter): + Promise { const errors: string[] = []; if (!validationResponse.mainClass.isValid) { errors.push(String(validationResponse.mainClass.message)); + const errorLog: Error = { + name: "error", + message: this.getValidationErrorMessage(validationResponse.mainClass), + }; + setUserError(errorLog); + sendError(errorLog); } if (!validationResponse.projectName.isValid) { errors.push(String(validationResponse.projectName.message)); + const errorLog: Error = { + name: "error", + message: this.getValidationErrorMessage(validationResponse.projectName), + }; + setUserError(errorLog); + sendError(errorLog); } if (validationResponse.proposals && validationResponse.proposals.length) { + progressReporter.hide(true); const answer = await utility.showErrorMessageWithTroubleshooting({ message: errors.join(os.EOL), type: Type.USAGEERROR, anchor: anchor.FAILED_TO_RESOLVE_CLASSPATH, + bypassLog: true, // Avoid logging the raw user input in the logger for privacy. }, "Fix"); if (answer === "Fix") { - const pickItems: IMainClassQuickPickItem[] = this.formatMainClassOptions(validationResponse.proposals); - const selectedFix: IMainClassOption = await this.showMainClassQuickPick(pickItems, "Please select main class", false); + const selectedFix = await mainClassPicker.showQuickPick(validationResponse.proposals, + "Please select main class.", false); if (selectedFix) { - logger.log(Type.USAGEDATA, { + sendInfo("", { fix: "yes", - fixMessage: errors.join(os.EOL), + fixMessage: "Fix the configs of mainClass and projectName", }); await this.persistMainClassOption(folder, config, selectedFix); } @@ -303,17 +704,18 @@ export class JavaDebugConfigurationProvider implements vscode.DebugConfiguration return selectedFix; } // return undefined if the user clicks "Learn More". - return; + return undefined; } throw new utility.UserError({ message: errors.join(os.EOL), type: Type.USAGEERROR, anchor: anchor.FAILED_TO_RESOLVE_CLASSPATH, + bypassLog: true, // Avoid logging the raw user input in the logger for privacy. }); } - private async persistMainClassOption(folder: vscode.Uri | undefined, oldConfig: vscode.DebugConfiguration, change: IMainClassOption): + private async persistMainClassOption(folder: vscode.Uri | undefined, oldConfig: vscode.DebugConfiguration, change: lsPlugin.IMainClassOption): Promise { const newConfig: vscode.DebugConfiguration = _.cloneDeep(oldConfig); newConfig.mainClass = change.mainClass; @@ -333,128 +735,47 @@ export class JavaDebugConfigurationProvider implements vscode.DebugConfiguration } } - private async promptMainClass(folder: vscode.Uri | undefined): Promise { - const res = await resolveMainClass(folder); - if (res.length === 0) { + private async promptMainClassUnderPath(folder: vscode.Uri | undefined, progressReporter: IProgressReporter, hintMessage?: string): + Promise { + const res = await lsPlugin.resolveMainClass(folder); + if (progressReporter.isCancelled()) { + return undefined; + } else if (res.length === 0) { + const workspaceFolder = folder ? vscode.workspace.getWorkspaceFolder(folder) : undefined; throw new utility.UserError({ - message: "Cannot find a class with the main method.", + message: `Cannot find a class with the main method${ workspaceFolder ? " in the folder '" + workspaceFolder.name + "'" : ""}.`, type: Type.USAGEERROR, anchor: anchor.CANNOT_FIND_MAIN_CLASS, }); } - const pickItems: IMainClassQuickPickItem[] = this.formatRecentlyUsedMainClassOptions(res); - const selected = await this.showMainClassQuickPick(pickItems, "Select main class"); - if (selected) { - this.debugHistory.updateMRUTimestamp(selected); + if (!mainClassPicker.isAutoPicked(res)) { + progressReporter.hide(true); } - - return selected; - } - - private async showMainClassQuickPick(pickItems: IMainClassQuickPickItem[], quickPickHintMessage: string, autoPick: boolean = true): - Promise { - // return undefined when the user cancels QuickPick by pressing ESC. - const selected = (pickItems.length === 1 && autoPick) ? - pickItems[0] : await vscode.window.showQuickPick(pickItems, { placeHolder: quickPickHintMessage }); - - return selected && selected.item; - } - - private formatRecentlyUsedMainClassOptions(options: IMainClassOption[]): IMainClassQuickPickItem[] { - // Sort the Main Class options with the recently used timestamp. - options.sort((a: IMainClassOption, b: IMainClassOption) => { - return this.debugHistory.getMRUTimestamp(b) - this.debugHistory.getMRUTimestamp(a); - }); - - const mostRecentlyUsedOption: IMainClassOption = (options.length && this.debugHistory.contains(options[0])) ? options[0] : undefined; - const isMostRecentlyUsed = (option: IMainClassOption): boolean => { - return mostRecentlyUsedOption - && mostRecentlyUsedOption.mainClass === option.mainClass - && mostRecentlyUsedOption.projectName === option.projectName; - }; - const isFromActiveEditor = (option: IMainClassOption): boolean => { - const activeEditor: vscode.TextEditor = vscode.window.activeTextEditor; - const currentActiveFile: string = _.get(activeEditor, "document.uri.fsPath"); - return option.filePath && currentActiveFile && path.relative(option.filePath, currentActiveFile) === ""; - }; - const isPrivileged = (option: IMainClassOption): boolean => { - return isMostRecentlyUsed(option) || isFromActiveEditor(option); - }; - - // Show the most recently used Main Class as the first one, - // then the Main Class from Active Editor as second, - // finally other Main Class. - const adjustedOptions: IMainClassOption[] = []; - options.forEach((option: IMainClassOption) => { - if (isPrivileged(option)) { - adjustedOptions.push(option); - } - }); - options.forEach((option: IMainClassOption) => { - if (!isPrivileged(option)) { - adjustedOptions.push(option); - } - }); - - const pickItems: IMainClassQuickPickItem[] = this.formatMainClassOptions(adjustedOptions); - pickItems.forEach((pickItem: IMainClassQuickPickItem) => { - const adjustedDetail = []; - if (isMostRecentlyUsed(pickItem.item)) { - adjustedDetail.push("$(clock) recently used"); - } - - if (isFromActiveEditor(pickItem.item)) { - adjustedDetail.push(`$(file-text) active editor (${path.basename(pickItem.item.filePath)})`); - } - - pickItem.detail = adjustedDetail.join(", "); - }); - - return pickItems; + return mainClassPicker.showQuickPickWithRecentlyUsed(res, hintMessage || "Select main class"); } - private formatMainClassOptions(options: IMainClassOption[]): IMainClassQuickPickItem[] { - return options.map((item) => { - let label = item.mainClass; - let description = `main class: ${item.mainClass}`; - if (item.projectName) { - label += `<${item.projectName}>`; - description += ` | project name: ${item.projectName}`; - } - - return { - label, - description, - detail: null, - item, - }; - }); - } -} - -function startDebugSession() { - return commands.executeJavaLanguageServerCommand(commands.JAVA_START_DEBUGSESSION); -} - -function resolveClasspath(mainClass, projectName) { - return commands.executeJavaLanguageServerCommand(commands.JAVA_RESOLVE_CLASSPATH, mainClass, projectName); -} + private async promptMainClassUnderProject(projectName: string, progressReporter: IProgressReporter, hintMessage?: string): + Promise { + const res = await lsPlugin.resolveMainClassFromProject(projectName); + if (progressReporter.isCancelled()) { + return undefined; + } else if (res.length === 0) { + throw new utility.UserError({ + message: `Cannot find a class with the main method in the project '${projectName}'.`, + type: Type.USAGEERROR, + anchor: anchor.CANNOT_FIND_MAIN_CLASS, + }); + } -function resolveMainClass(workspaceUri: vscode.Uri): Promise { - if (workspaceUri) { - return >commands.executeJavaLanguageServerCommand(commands.JAVA_RESOLVE_MAINCLASS, workspaceUri.toString()); + if (!mainClassPicker.isAutoPicked(res)) { + progressReporter.hide(true); + } + return mainClassPicker.showQuickPickWithRecentlyUsed(res, hintMessage || "Select main class"); } - return >commands.executeJavaLanguageServerCommand(commands.JAVA_RESOLVE_MAINCLASS); -} - -function validateLaunchConfig(workspaceUri: vscode.Uri, mainClass: string, projectName: string, containsExternalClasspaths: boolean): - Promise { - return >commands.executeJavaLanguageServerCommand(commands.JAVA_VALIDATE_LAUNCHCONFIG, - workspaceUri ? workspaceUri.toString() : undefined, mainClass, projectName, containsExternalClasspaths); } -async function updateDebugSettings() { +async function updateDebugSettings(event?: vscode.ConfigurationChangeEvent) { const debugSettingsRoot: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("java.debug"); if (!debugSettingsRoot) { return; @@ -463,15 +784,51 @@ async function updateDebugSettings() { const javaHome = await utility.getJavaHome(); if (debugSettingsRoot.settings && Object.keys(debugSettingsRoot.settings).length) { try { - console.log("settings:", await commands.executeJavaLanguageServerCommand(commands.JAVA_UPDATE_DEBUG_SETTINGS, JSON.stringify( - { ...debugSettingsRoot.settings, logLevel, javaHome }))); + const stepFilters = { + skipClasses: await substituteFilterVariables(debugSettingsRoot.settings.stepping.skipClasses), + skipSynthetics: debugSettingsRoot.settings.stepping.skipSynthetics, + skipStaticInitializers: debugSettingsRoot.settings.stepping.skipStaticInitializers, + skipConstructors: debugSettingsRoot.settings.stepping.skipConstructors, + }; + const exceptionFilters = { + exceptionTypes: debugSettingsRoot.settings.exceptionBreakpoint.exceptionTypes, + allowClasses: debugSettingsRoot.settings.exceptionBreakpoint.allowClasses, + skipClasses: await substituteFilterVariables(debugSettingsRoot.settings.exceptionBreakpoint.skipClasses), + }; + + const asyncJDWP: string = debugSettingsRoot.settings.jdwp.async; + const settings = await commands.executeJavaLanguageServerCommand(commands.JAVA_UPDATE_DEBUG_SETTINGS, JSON.stringify( + { + ...debugSettingsRoot.settings, + logLevel, + javaHome, + stepFilters, + exceptionFilters, + exceptionFiltersUpdated: event && + (event.affectsConfiguration("java.debug.settings.exceptionBreakpoint.skipClasses") + || event.affectsConfiguration("java.debug.settings.exceptionBreakpoint.allowClasses") + || event.affectsConfiguration("java.debug.settings.exceptionBreakpoint.exceptionTypes")), + limitOfVariablesPerJdwpRequest: Math.max(debugSettingsRoot.settings.jdwp.limitOfVariablesPerJdwpRequest, 1), + jdwpRequestTimeout: Math.max(debugSettingsRoot.settings.jdwp.requestTimeout, 100), + asyncJDWP, + })); + if (logLevel === "FINE") { + // tslint:disable-next-line:no-console + console.log("settings:", settings); + } } catch (err) { // log a warning message and continue, since update settings failure should not block debug session - console.log("Cannot update debug settings.", err) + // tslint:disable-next-line:no-console + console.log("Cannot update debug settings.", err); } } } +function needsBuildWorkspace(): boolean { + const javaConfig: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("java"); + return javaConfig?.debug?.settings?.forceBuildBeforeLaunch; +} + function convertLogLevel(commonLogLevel: string) { // convert common log level to java log level switch (commonLogLevel.toLowerCase()) { @@ -488,43 +845,21 @@ function convertLogLevel(commonLogLevel: string) { } } -interface IMainClassOption { - readonly mainClass: string; - readonly projectName?: string; - readonly filePath?: string; -} - -interface IMainClassQuickPickItem extends vscode.QuickPickItem { - item: IMainClassOption; -} - -interface IValidationResult { - readonly isValid: boolean; - readonly message?: string; -} - -interface ILaunchValidationResponse { - readonly mainClass: IValidationResult; - readonly projectName: IValidationResult; - readonly proposals?: IMainClassOption[]; -} - -class MostRecentlyUsedHistory { - private cache: { [key: string]: number } = {}; - - public getMRUTimestamp(mainClassOption: IMainClassOption): number { - return this.cache[this.getKey(mainClassOption)] || 0; +// from vscode-js-debug https://github.com/microsoft/vscode-js-debug/blob/master/src/targets/node/nodeLauncherBase.ts +function readEnvFile(file: string): { [key: string]: string } { + if (!fs.existsSync(file)) { + return {}; } - public updateMRUTimestamp(mainClassOption: IMainClassOption): void { - this.cache[this.getKey(mainClassOption)] = Date.now(); - } + const buffer = stripBOM(fs.readFileSync(file, "utf8")); + const env = dotenv.parse(Buffer.from(buffer)); - public contains(mainClassOption: IMainClassOption): boolean { - return Boolean(this.cache[this.getKey(mainClassOption)]); - } + return env; +} - private getKey(mainClassOption: IMainClassOption): string { - return mainClassOption.mainClass + "|" + mainClassOption.projectName; +function stripBOM(s: string): string { + if (s && s[0] === "\uFEFF") { + s = s.substr(1); } + return s; } diff --git a/src/constants.ts b/src/constants.ts index 7e0e21ad..206dd470 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -2,5 +2,12 @@ // Licensed under the MIT license. export const JAVA_LANGID: string = "java"; +export const TELEMETRY_EVENT = "telemetry"; export const HCR_EVENT = "hotcodereplace"; export const USER_NOTIFICATION_EVENT = "usernotification"; + +export enum ClasspathVariable { + Auto = "$Auto", + Runtime = "$Runtime", + Test = "$Test", +} diff --git a/src/customWidget.ts b/src/customWidget.ts new file mode 100644 index 00000000..a4f4b88e --- /dev/null +++ b/src/customWidget.ts @@ -0,0 +1,38 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +import * as vscode from "vscode"; + +export class NotificationBar implements vscode.Disposable { + private statusBar: vscode.StatusBarItem; + private lastUpdateTime: number; + + constructor(id: string, name: string) { + this.statusBar = vscode.window.createStatusBarItem(id, vscode.StatusBarAlignment.Left, 1); + this.statusBar.name = name; + } + + public show(text: string, duration?: number) { + this.statusBar.text = text; + this.statusBar.show(); + const updateTime = Date.now(); + this.lastUpdateTime = updateTime; + if (duration) { + setTimeout(() => { + if (this.lastUpdateTime === updateTime) { + this.statusBar.text = ""; + this.statusBar.hide(); + } + }, duration); + } + } + + public clear() { + this.statusBar.text = ""; + this.statusBar.hide(); + } + + public dispose() { + this.statusBar.dispose(); + } +} diff --git a/src/debugCodeLensProvider.ts b/src/debugCodeLensProvider.ts index 9e694ebe..110d2946 100644 --- a/src/debugCodeLensProvider.ts +++ b/src/debugCodeLensProvider.ts @@ -1,133 +1,231 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -import * as _ from "lodash"; -import * as vscode from "vscode"; - -import * as commands from "./commands"; -import { JAVA_LANGID } from "./constants"; -import { logger, Type } from "./logger"; -import * as utility from "./utility"; - -const onDidChange: vscode.EventEmitter = new vscode.EventEmitter(); -const JAVA_RUN_COMMAND = "vscode.java.run"; -const JAVA_DEBUG_COMMAND = "vscode.java.debug"; - -export function initializeCodeLensProvider(context: vscode.ExtensionContext): void { - const watcher = vscode.workspace.createFileSystemWatcher("**/*.{[jJ][aA][vV][aA]}"); - context.subscriptions.push(watcher); - watcher.onDidChange((uri) => { - onDidChange.fire(); - }); - - context.subscriptions.push(vscode.languages.registerCodeLensProvider(JAVA_LANGID, new DebugCodeLensProvider(onDidChange))); - context.subscriptions.push(vscode.commands.registerCommand(JAVA_RUN_COMMAND, runJavaProgram)); - context.subscriptions.push(vscode.commands.registerCommand(JAVA_DEBUG_COMMAND, debugJavaProgram)); -} - -class DebugCodeLensProvider implements vscode.CodeLensProvider { - constructor(private _onDidChange: vscode.EventEmitter) { - } - - get onDidChangeCodeLenses(): vscode.Event { - return this._onDidChange.event; - } - - public async provideCodeLenses(document: vscode.TextDocument, token: vscode.CancellationToken): Promise { - const mainMethods: IMainMethod[] = await resolveMainMethod(document); - return _.flatten(mainMethods.map((method) => { - return [ - new vscode.CodeLens(method.range, { - title: "▶ Run", - command: JAVA_RUN_COMMAND, - tooltip: "Run Java Program", - arguments: [ method.mainClass, method.projectName, document.uri ], - }), - new vscode.CodeLens(method.range, { - title: "🐞 Debug", - command: JAVA_DEBUG_COMMAND, - tooltip: "Debug Java Program", - arguments: [ method.mainClass, method.projectName, document.uri ], - }), - ]; - })); - } -} - -function runJavaProgram(mainClass: string, projectName: string, uri: vscode.Uri): Promise { - return runCodeLens(mainClass, projectName, uri, true); -} - -function debugJavaProgram(mainClass: string, projectName: string, uri: vscode.Uri): Promise { - return runCodeLens(mainClass, projectName, uri, false); -} - -async function runCodeLens(mainClass: string, projectName: string, uri: vscode.Uri, noDebug: boolean): Promise { - const workspaceFolder: vscode.WorkspaceFolder = vscode.workspace.getWorkspaceFolder(uri); - const workspaceUri: vscode.Uri = workspaceFolder ? workspaceFolder.uri : undefined; - - const debugConfig: vscode.DebugConfiguration = await constructDebugConfig(mainClass, projectName, workspaceUri); - debugConfig.projectName = projectName; - debugConfig.noDebug = noDebug; - - vscode.debug.startDebugging(workspaceFolder, debugConfig); - - logger.log(Type.USAGEDATA, { - runCodeLens: "yes", - noDebug: String(noDebug), - }); -} - -async function constructDebugConfig(mainClass: string, projectName: string, workspace: vscode.Uri): Promise { - const launchConfigurations: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("launch", workspace); - const rawConfigs: vscode.DebugConfiguration[] = launchConfigurations.configurations; - - let debugConfig: vscode.DebugConfiguration = _.find(rawConfigs, (config) => { - return config.mainClass === mainClass && _.toString(config.projectName) === _.toString(projectName); - }); - - if (!debugConfig) { - debugConfig = _.find(rawConfigs, (config) => { - return config.mainClass === mainClass && !config.projectName; - }); - } - - if (!debugConfig) { - debugConfig = { - type: "java", - name: `CodeLens (Launch) - ${mainClass.substr(mainClass.lastIndexOf(".") + 1)}`, - request: "launch", - // tslint:disable-next-line - cwd: workspace ? "${workspaceFolder}" : undefined, - console: "internalConsole", - stopOnEntry: false, - mainClass, - args: "", - projectName, - }; - - // Persist the default debug configuration only if the workspace exists. - if (workspace) { - // Insert the default debug configuration to the beginning of launch.json. - rawConfigs.splice(0, 0, debugConfig); - await launchConfigurations.update("configurations", rawConfigs, vscode.ConfigurationTarget.WorkspaceFolder); - } - } - - return _.cloneDeep(debugConfig); -} - -async function resolveMainMethod(document: vscode.TextDocument): Promise { - try { - return await commands.executeJavaLanguageServerCommand(commands.JAVA_RESOLVE_MAINMETHOD, document.uri.toString()); - } catch (ex) { - logger.log(Type.EXCEPTION, utility.formatErrorProperties(ex)); - return []; - } -} - -interface IMainMethod { - range: vscode.Range; - mainClass: string; - projectName: string; -} +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +import * as _ from "lodash"; +import * as path from "path"; +import * as vscode from "vscode"; +import { instrumentOperationAsVsCodeCommand, sendInfo } from "vscode-extension-telemetry-wrapper"; + +import { JAVA_LANGID } from "./constants"; +import { initializeHoverProvider } from "./hoverProvider"; +import { IMainMethod, isOnClasspath, resolveMainMethod } from "./languageServerPlugin"; +import { IProgressReporter } from "./progressAPI"; +import { getJavaExtensionAPI, isJavaExtEnabled, ServerMode } from "./utility"; + +const JAVA_RUN_CODELENS_COMMAND = "java.debug.runCodeLens"; +const JAVA_DEBUG_CODELENS_COMMAND = "java.debug.debugCodeLens"; +const JAVA_DEBUG_CONFIGURATION = "java.debug.settings"; +const ENABLE_CODE_LENS_VARIABLE = "enableRunDebugCodeLens"; + +export function initializeCodeLensProvider(context: vscode.ExtensionContext): void { + // delay registering codelens provider until the Java extension is activated. + if (isActivatedByJavaFile() && isJavaExtEnabled()) { + getJavaExtensionAPI().then((api) => { + if (api && (api.serverMode === ServerMode.LIGHTWEIGHT || api.serverMode === ServerMode.HYBRID)) { + api.onDidServerModeChange((mode: string) => { + if (mode === ServerMode.STANDARD) { + context.subscriptions.push(new DebugCodeLensContainer()); + } + }); + } else { + context.subscriptions.push(new DebugCodeLensContainer()); + } + }); + } else { + context.subscriptions.push(new DebugCodeLensContainer()); + } +} + +function isActivatedByJavaFile(): boolean { + if (vscode.window.activeTextEditor) { + return vscode.window.activeTextEditor.document && vscode.window.activeTextEditor.document.languageId === "java"; + } + + return false; +} + +class DebugCodeLensContainer implements vscode.Disposable { + private runCommand: vscode.Disposable; + private debugCommand: vscode.Disposable; + private lensProvider: vscode.Disposable | undefined; + private hoverProvider: vscode.Disposable | undefined; + private configurationEvent: vscode.Disposable; + + constructor() { + this.runCommand = instrumentOperationAsVsCodeCommand(JAVA_RUN_CODELENS_COMMAND, runJavaProgram); + this.debugCommand = instrumentOperationAsVsCodeCommand(JAVA_DEBUG_CODELENS_COMMAND, debugJavaProgram); + + const configuration = vscode.workspace.getConfiguration(JAVA_DEBUG_CONFIGURATION); + const isCodeLensEnabled = configuration.get(ENABLE_CODE_LENS_VARIABLE); + + if (isCodeLensEnabled) { + this.lensProvider = vscode.languages.registerCodeLensProvider(JAVA_LANGID, new DebugCodeLensProvider()); + } else { + this.hoverProvider = initializeHoverProvider(); + } + + this.configurationEvent = vscode.workspace.onDidChangeConfiguration((event: vscode.ConfigurationChangeEvent) => { + if (event.affectsConfiguration(JAVA_DEBUG_CONFIGURATION)) { + const newConfiguration = vscode.workspace.getConfiguration(JAVA_DEBUG_CONFIGURATION); + const newEnabled = newConfiguration.get(ENABLE_CODE_LENS_VARIABLE); + if (newEnabled && this.lensProvider === undefined) { + this.lensProvider = vscode.languages.registerCodeLensProvider(JAVA_LANGID, new DebugCodeLensProvider()); + } else if (!newEnabled && this.lensProvider !== undefined) { + this.lensProvider.dispose(); + this.lensProvider = undefined; + } + + if (newEnabled && this.hoverProvider) { + this.hoverProvider.dispose(); + this.hoverProvider = undefined; + } else if (!newEnabled && !this.hoverProvider) { + this.hoverProvider = initializeHoverProvider(); + } + } + }, this); + } + + public dispose() { + if (this.lensProvider !== undefined) { + this.lensProvider.dispose(); + } + if (this.hoverProvider) { + this.hoverProvider.dispose(); + } + this.runCommand.dispose(); + this.debugCommand.dispose(); + this.configurationEvent.dispose(); + } + +} + +class DebugCodeLensProvider implements vscode.CodeLensProvider { + + public async provideCodeLenses(document: vscode.TextDocument, token: vscode.CancellationToken): Promise { + try { + const mainMethods: IMainMethod[] = await resolveMainMethod(document.uri, token); + return _.flatten(mainMethods.map((method) => { + return [ + new vscode.CodeLens(method.range, { + title: "Run", + command: JAVA_RUN_CODELENS_COMMAND, + tooltip: "Run Java Program", + arguments: [ method.mainClass, method.projectName, document.uri ], + }), + new vscode.CodeLens(method.range, { + title: "Debug", + command: JAVA_DEBUG_CODELENS_COMMAND, + tooltip: "Debug Java Program", + arguments: [ method.mainClass, method.projectName, document.uri ], + }), + ]; + })); + } catch (ex) { + // do nothing. + return []; + } + } +} + +function runJavaProgram(mainClass: string, projectName: string, uri: vscode.Uri): Promise { + return startDebugging(mainClass, projectName, uri, true); +} + +function debugJavaProgram(mainClass: string, projectName: string, uri: vscode.Uri): Promise { + return startDebugging(mainClass, projectName, uri, false); +} + +async function constructDebugConfig(mainClass: string, projectName: string, workspace?: vscode.Uri): Promise { + const launchConfigurations: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("launch", workspace); + const rawConfigs: vscode.DebugConfiguration[] = launchConfigurations.configurations; + + let debugConfig: vscode.DebugConfiguration | undefined = _.find(rawConfigs, (config) => { + return config.mainClass === mainClass && _.toString(config.projectName) === _.toString(projectName); + }); + + if (!debugConfig) { + debugConfig = _.find(rawConfigs, (config) => { + return config.mainClass === mainClass && !config.projectName; + }); + } + + if (!debugConfig) { + debugConfig = { + type: "java", + name: `${mainClass.substr(mainClass.lastIndexOf(".") + 1)}`, + request: "launch", + mainClass, + projectName, + }; + + // Persist the configuration into launch.json only if the launch.json file already exists in the workspace. + if ((rawConfigs && rawConfigs.length) || await launchJsonExists(workspace)) { + try { + // Insert the default debug configuration to the beginning of launch.json. + rawConfigs.splice(0, 0, debugConfig); + await launchConfigurations.update("configurations", rawConfigs, vscode.ConfigurationTarget.WorkspaceFolder); + } catch (error) { + // When launch.json has unsaved changes before invoking the update api, it will throw the error below: + // 'Unable to write into launch configuration file because the file is dirty. Please save it first and then try again.' + // It's safe to ignore it because the only impact is the configuration is not saved, but you can continue to start the debugger. + } + } + } + + return _.cloneDeep(debugConfig); +} + +async function launchJsonExists(workspace?: vscode.Uri): Promise { + if (!workspace) { + return false; + } + + const workspaceFolder = vscode.workspace.getWorkspaceFolder(workspace); + // Excluding "**/node_modules/**" as a common cause of excessive CPU usage. + // https://github.com/microsoft/vscode/issues/75314#issuecomment-503195666 + const results: vscode.Uri[] = await vscode.workspace.findFiles(".vscode/launch.json", "**/node_modules/**"); + return !!results.find((launchJson) => vscode.workspace.getWorkspaceFolder(launchJson) === workspaceFolder); +} + +export async function startDebugging(mainClass: string, projectName: string, uri: vscode.Uri, noDebug: boolean, + progressReporter?: IProgressReporter): Promise { + const workspaceFolder: vscode.WorkspaceFolder | undefined = vscode.workspace.getWorkspaceFolder(uri); + const workspaceUri: vscode.Uri | undefined = workspaceFolder ? workspaceFolder.uri : undefined; + const onClasspath = await isOnClasspath(uri.toString()); + if (workspaceUri && onClasspath === false && !(await addToClasspath(uri))) { + return false; + } + + const debugConfig: vscode.DebugConfiguration = await constructDebugConfig(mainClass, projectName, workspaceUri); + debugConfig.projectName = projectName; + debugConfig.noDebug = noDebug; + debugConfig.__progressId = progressReporter?.getId(); + debugConfig.__origin = "internal"; + + return vscode.debug.startDebugging(workspaceFolder, debugConfig); +} + +async function addToClasspath(uri: vscode.Uri): Promise { + const fileName = path.basename(uri.fsPath || ""); + const parentFsPath = path.dirname(uri.fsPath || ""); + if (!parentFsPath) { + return true; + } + + const parentUri = vscode.Uri.file(parentFsPath); + let parentPath = vscode.workspace.asRelativePath(parentUri, true); + if (parentPath === parentUri.fsPath) { + parentPath = path.basename(parentFsPath); + } + sendInfo("", {operationName: "notOnClasspath"}); + const ans = await vscode.window.showWarningMessage(`The file ${fileName} isn't on the classpath, the runtime may throw class not found error. ` + + `Do you want to add the parent folder "${parentPath}" to Java source path?`, "Add to Source Path", "Skip"); + if (ans === "Skip") { + return true; + } else if (ans === "Add to Source Path") { + sendInfo("", {operationName: "addToSourcePath"}); + vscode.commands.executeCommand("java.project.addToSourcePath.command", parentUri); + } + + return false; +} diff --git a/src/experimentationService.ts b/src/experimentationService.ts new file mode 100644 index 00000000..42a1c84a --- /dev/null +++ b/src/experimentationService.ts @@ -0,0 +1,40 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +import * as vscode from "vscode"; +import { addContextProperty, sendInfo } from "vscode-extension-telemetry-wrapper"; +import { getExperimentationServiceAsync, IExperimentationService, IExperimentationTelemetry, TargetPopulation } from "vscode-tas-client"; + +class ExperimentationTelemetry implements IExperimentationTelemetry { + + public setSharedProperty(name: string, value: string): void { + addContextProperty(name, value); + } + + public postEvent(eventName: string, props: Map): void { + const payload: any = { __event_name__: eventName }; + for (const [key, value] of props) { + payload[key] = value; + } + + sendInfo("", payload); + } +} + +let expService: IExperimentationService; + +export function getExpService() { + return expService; +} + +export async function initExpService(context: vscode.ExtensionContext): Promise { + const packageJson: {[key: string]: any} = require("../package.json"); + // tslint:disable: no-string-literal + const extensionName = `${packageJson["publisher"]}.${packageJson["name"]}`; + const extensionVersion = packageJson["version"]; + // tslint:enable: no-string-literal + + // The async version will await the initializePromise to make sure shared property is set + expService = await getExperimentationServiceAsync(extensionName, extensionVersion, + TargetPopulation.Public, new ExperimentationTelemetry(), context.globalState); +} diff --git a/src/extension.ts b/src/extension.ts index c0de6476..e3a75eb0 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -1,31 +1,165 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. +import * as compareVersions from "compare-versions"; +import * as _ from "lodash"; import * as path from "path"; import * as vscode from "vscode"; -import { initializeFromJsonFile, instrumentOperation } from "vscode-extension-telemetry-wrapper"; +import { dispose as disposeTelemetryWrapper, initializeFromJsonFile, instrumentOperation, + instrumentOperationAsVsCodeCommand, sendInfo, setUserError } from "vscode-extension-telemetry-wrapper"; import * as commands from "./commands"; -import { JavaDebugConfigurationProvider } from "./configurationProvider"; -import { HCR_EVENT, JAVA_LANGID, USER_NOTIFICATION_EVENT } from "./constants"; -import { initializeCodeLensProvider } from "./debugCodeLensProvider" -import { handleHotCodeReplaceCustomEvent, initializeHotCodeReplace } from "./hotCodeReplace"; -import { logger, Type } from "./logger"; +import { JavaDebugConfigurationProvider, lastUsedLaunchConfig } from "./configurationProvider"; +import { HCR_EVENT, JAVA_LANGID, TELEMETRY_EVENT, USER_NOTIFICATION_EVENT } from "./constants"; +import { NotificationBar } from "./customWidget"; +import { initializeCodeLensProvider, startDebugging } from "./debugCodeLensProvider"; +import { initExpService } from "./experimentationService"; +import { registerNoConfigDebug } from "./noConfigDebugInit"; +import { handleHotCodeReplaceCustomEvent, initializeHotCodeReplace, NO_BUTTON, YES_BUTTON } from "./hotCodeReplace"; +import { JavaDebugAdapterDescriptorFactory } from "./javaDebugAdapterDescriptorFactory"; +import { JavaInlineValuesProvider } from "./JavaInlineValueProvider"; +import { logJavaException, logJavaInfo } from "./javaLogger"; +import { registerLanguageModelTool, registerDebugSessionTools } from "./languageModelTool"; +import { IMainClassOption, IMainMethod, resolveMainMethod } from "./languageServerPlugin"; +import { mainClassPicker } from "./mainClassPicker"; +import { pickJavaProcess } from "./processPicker"; +import { IProgressReporter } from "./progressAPI"; +import { progressProvider } from "./progressImpl"; +import { JavaTerminalLinkProvder } from "./terminalLinkProvider"; +import { initializeThreadOperations } from "./threadOperations"; import * as utility from "./utility"; +import { registerBreakpointCommands } from "./breakpointCommands"; +import { registerVariableMenuCommands } from "./variableMenu"; +import { promisify } from "util"; -export async function activate(context: vscode.ExtensionContext) { +export async function activate(context: vscode.ExtensionContext): Promise { await initializeFromJsonFile(context.asAbsolutePath("./package.json")); - await instrumentOperation("activation", initializeExtension)(context); + await initExpService(context); + + // Register No-Config Debug functionality + const noConfigDisposable = await registerNoConfigDebug( + context.environmentVariableCollection, + context.extensionPath + ); + context.subscriptions.push(noConfigDisposable); + + // Register Language Model Tools after Java Language Server is ready + registerLanguageModelToolsWhenReady(context); + + return instrumentOperation("activation", initializeExtension)(context); } -function initializeExtension(operationId: string, context: vscode.ExtensionContext) { - logger.initialize(context); - logger.log(Type.ACTIVATEEXTENSION, {}); // TODO: Activation belongs to usage data, remove this line. - logger.log(Type.USAGEDATA, { - description: "activateExtension", - }); +function initializeExtension(_operationId: string, context: vscode.ExtensionContext): any { + registerDebugEventListener(context); + registerBreakpointCommands(context); + registerVariableMenuCommands(context); + context.subscriptions.push(vscode.window.registerTerminalLinkProvider(new JavaTerminalLinkProvder())); + context.subscriptions.push(vscode.debug.registerDebugConfigurationProvider("java", new JavaDebugConfigurationProvider())); + context.subscriptions.push(vscode.debug.registerDebugAdapterDescriptorFactory("java", new JavaDebugAdapterDescriptorFactory())); + context.subscriptions.push(instrumentOperationAsVsCodeCommand("JavaDebug.SpecifyProgramArgs", async () => { + return specifyProgramArguments(context); + })); + context.subscriptions.push(instrumentOperationAsVsCodeCommand("JavaDebug.PickJavaProcess", async () => { + let javaProcess; + try { + javaProcess = await pickJavaProcess(); + } catch (error) { + vscode.window.showErrorMessage(error.message ? error.message : String(error)); + } + + // tslint:disable-next-line + return javaProcess ? String(javaProcess.pid) : "${command:PickJavaProcess}"; + })); + const hcrStatusBar: NotificationBar = new NotificationBar("java.hcrStatusBar", "Java HotCodeReplace"); + context.subscriptions.push(hcrStatusBar); + context.subscriptions.push(instrumentOperationAsVsCodeCommand("java.debug.hotCodeReplace", async () => { + await applyHCR(hcrStatusBar); + })); + context.subscriptions.push(instrumentOperationAsVsCodeCommand("java.debug.runJavaFile", async (uri: vscode.Uri) => { + await runJavaFile(uri, true); + })); + context.subscriptions.push(instrumentOperationAsVsCodeCommand("java.debug.debugJavaFile", async (uri: vscode.Uri) => { + await runJavaFile(uri, false); + })); + context.subscriptions.push(instrumentOperationAsVsCodeCommand("java.debug.runFromProjectView", async (node: any) => { + await runJavaProject(node, true); + })); + context.subscriptions.push(instrumentOperationAsVsCodeCommand("java.debug.debugFromProjectView", async (node: any) => { + await runJavaProject(node, false); + })); + initializeHotCodeReplace(context); + initializeCodeLensProvider(context); + initializeThreadOperations(context); + subscribeToJavaExtensionEvents(); + + context.subscriptions.push(vscode.languages.registerInlineValuesProvider("java", new JavaInlineValuesProvider())); + return { + progressProvider, + }; +} + +// this method is called when your extension is deactivated +export async function deactivate() { + await disposeTelemetryWrapper(); +} + +const delay = promisify(setTimeout); + +/** + * Register Language Model Tools after Java Language Server is ready. + * The debug tools depend on JDT.LS for compilation, classpath resolution, + * and executing debug server commands. + */ +async function registerLanguageModelToolsWhenReady(context: vscode.ExtensionContext): Promise { + // Check if Language Model API is available + if (!vscode.lm || typeof vscode.lm.registerTool !== 'function') { + return; + } + + const javaExt = vscode.extensions.getExtension("redhat.java"); + if (!javaExt) { + return; + } + + // Register Language Model Tools for AI-assisted debugging + registerLanguageModelTool(context); + const debugToolsDisposables = registerDebugSessionTools(context); + context.subscriptions.push(...debugToolsDisposables); +} + +async function subscribeToJavaExtensionEvents(): Promise { + const javaExt = vscode.extensions.getExtension("redhat.java"); + if (!javaExt) { + return; + } + // wait javaExt to activate + const timeout = 30 * 60 * 1000; // wait 30 min at most + let count = 0; + while (!javaExt.isActive && count < timeout) { + await delay(1000); + count += 1000; + } + + if (javaExt.isActive) { + javaExt.exports?.onDidSourceInvalidate?.((event: any) => { + if (event?.affectedRootPaths?.length) { + const activeDebugSession = vscode.debug.activeDebugSession; + if (activeDebugSession?.type === "java") { + activeDebugSession.customRequest("refreshFrames", { + affectedRootPaths: event.affectedRootPaths, + }); + } + } + }); + } +} + +function registerDebugEventListener(context: vscode.ExtensionContext) { const measureKeys = ["duration"]; - vscode.debug.onDidTerminateDebugSession(() => { + context.subscriptions.push(vscode.debug.onDidTerminateDebugSession((e) => { + if (e.type !== "java") { + return; + } fetchUsageData().then((ret) => { if (Array.isArray(ret) && ret.length) { ret.forEach((entry) => { @@ -38,37 +172,35 @@ function initializeExtension(operationId: string, context: vscode.ExtensionConte commonProperties[key] = String(entry[key]); } } - logger.log(entry.scope === "exception" ? Type.EXCEPTION : Type.USAGEDATA, commonProperties, measureProperties); + if (entry.scope === "exception") { + logJavaException(commonProperties); + } else { + logJavaInfo(commonProperties, measureProperties); + } }); } }); - }); - - context.subscriptions.push(vscode.debug.registerDebugConfigurationProvider("java", new JavaDebugConfigurationProvider())); - context.subscriptions.push(instrumentAndRegisterCommand("JavaDebug.SpecifyProgramArgs", async () => { - return specifyProgramArguments(context); })); - initializeHotCodeReplace(context); + context.subscriptions.push(vscode.debug.onDidReceiveDebugSessionCustomEvent((customEvent) => { const t = customEvent.session ? customEvent.session.type : undefined; if (t !== JAVA_LANGID) { return; } - if (customEvent.event === HCR_EVENT) { + if (customEvent.event === TELEMETRY_EVENT) { + sendInfo("", { + operationName: customEvent.body?.name, + ...customEvent.body?.properties, + }); + } else if (customEvent.event === HCR_EVENT) { handleHotCodeReplaceCustomEvent(customEvent); } else if (customEvent.event === USER_NOTIFICATION_EVENT) { handleUserNotification(customEvent); } })); - - initializeCodeLensProvider(context); -} - -// this method is called when your extension is deactivated -export function deactivate() { } -function handleUserNotification(customEvent) { +function handleUserNotification(customEvent: vscode.DebugSessionCustomEvent) { if (customEvent.body.notificationType === "ERROR") { utility.showErrorMessageWithTroubleshooting({ message: customEvent.body.message, @@ -109,7 +241,256 @@ function specifyProgramArguments(context: vscode.ExtensionContext): Thenable any) { - const instrumented = instrumentOperation(name, async (_operationId, myargs) => await cb(myargs)); - return vscode.commands.registerCommand(name, instrumented); +async function applyHCR(hcrStatusBar: NotificationBar) { + const debugSession: vscode.DebugSession | undefined = vscode.debug.activeDebugSession; + if (!debugSession) { + return; + } + + if (debugSession.configuration.noDebug) { + vscode.window.showWarningMessage("Failed to apply the changes because hot code replace is not supported by run mode, " + + "would you like to restart the program?", YES_BUTTON, NO_BUTTON).then((res) => { + if (res === YES_BUTTON) { + vscode.commands.executeCommand("workbench.action.debug.restart"); + } + }); + + return; + } + + const autobuildConfig: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("java.autobuild"); + if (!autobuildConfig.enabled) { + // If autobuild is disabled, force an incremental build before HCR. + try { + hcrStatusBar.show("$(sync~spin)Compiling..."); + await commands.executeJavaExtensionCommand(commands.JAVA_BUILD_WORKSPACE, JSON.stringify({ + isFullBuild: false + })); + } catch (err) { + // do nothing. + } + } + + hcrStatusBar.show("$(sync~spin)Applying code changes..."); + const start = new Date().getTime(); + const response = await debugSession.customRequest("redefineClasses"); + const elapsed = new Date().getTime() - start; + const humanVisibleDelay = elapsed < 150 ? 150 : 0; + if (humanVisibleDelay) { + await new Promise((resolve) => { + setTimeout(resolve, humanVisibleDelay); + }); + } + + if (response && response.errorMessage) { + // The detailed error message is handled by hotCodeReplace#handleHotCodeReplaceCustomEvent + hcrStatusBar.clear(); + return; + } + + if (!response || !response.changedClasses || !response.changedClasses.length) { + hcrStatusBar.clear(); + vscode.window.showWarningMessage("Cannot find any changed classes for hot replace!"); + return; + } + + const changed = response.changedClasses.length; + hcrStatusBar.show("$(check)" + `${changed} changed class${changed > 1 ? "es are" : " is"} reloaded`, 5 * 1000); +} + +async function runJavaFile(uri: vscode.Uri, noDebug: boolean) { + const progressReporter = progressProvider.createProgressReporter(noDebug ? "Run" : "Debug"); + try { + // Wait for Java Language Support extension being on Standard mode. + const isOnStandardMode = await utility.waitForStandardMode(progressReporter); + if (!isOnStandardMode) { + throw new utility.OperationCancelledError(""); + } + + const activeEditor: vscode.TextEditor | undefined = vscode.window.activeTextEditor; + if (!uri && activeEditor && _.endsWith(path.basename(activeEditor.document.fileName), ".java")) { + uri = activeEditor.document.uri; + } + + if (!uri) { + vscode.window.showErrorMessage(`${noDebug ? "Run" : "Debug"} failed. Please open a Java file with main method first.`); + throw new utility.OperationCancelledError(""); + } + + const mainMethods: IMainMethod[] = await resolveMainMethod(uri); + const hasMainMethods: boolean = mainMethods.length > 0; + const canRunTests: boolean = await canDelegateToJavaTestRunner(uri); + const defaultPlaceHolder: string = "Select the main class to run"; + + if (!hasMainMethods && !canRunTests) { + // If current file is not a main class, "Run Java" will run previously used launch config. + if (lastUsedLaunchConfig) { + progressReporter.setJobName(utility.launchJobName(lastUsedLaunchConfig.name, noDebug)); + progressReporter.report("Resolving launch configuration..."); + lastUsedLaunchConfig.noDebug = noDebug; + lastUsedLaunchConfig.__progressId = progressReporter.getId(); + vscode.debug.startDebugging(lastUsedLaunchConfig.__workspaceFolder, lastUsedLaunchConfig); + } else { + progressReporter.report("Resolving main class..."); + const mainClasses: IMainClassOption[] = await utility.searchMainMethods(); + if (progressReporter.isCancelled()) { + throw new utility.OperationCancelledError(""); + } + + const placeHolder: string = `The file '${path.basename(uri.fsPath)}' is not executable, please select a main class you want to run.`; + await launchMain(mainClasses, uri, noDebug, progressReporter, placeHolder, false /*autoPick*/); + } + } else if (hasMainMethods && !canRunTests) { + await launchMain(mainMethods, uri, noDebug, progressReporter, defaultPlaceHolder); + } else if (!hasMainMethods && canRunTests) { + launchTesting(uri, noDebug, progressReporter); + } else { + const launchMainChoice: string = "main() method"; + const launchTestChoice: string = "unit tests"; + const choice: string | undefined = await vscode.window.showQuickPick( + [launchMainChoice, launchTestChoice], + { placeHolder: "Please select which kind of task you would like to launch" }, + ); + if (choice === launchMainChoice) { + await launchMain(mainMethods, uri, noDebug, progressReporter, defaultPlaceHolder); + } else if (choice === launchTestChoice) { + launchTesting(uri, noDebug, progressReporter); + } + } + } catch (ex) { + progressReporter.done(); + if (ex instanceof utility.OperationCancelledError) { + return; + } + + if (ex instanceof utility.JavaExtensionNotEnabledError) { + utility.guideToInstallJavaExtension(); + return; + } + + vscode.window.showErrorMessage(String((ex && ex.message) || ex)); + } +} + +async function canDelegateToJavaTestRunner(uri: vscode.Uri): Promise { + const fsPath: string = uri.fsPath; + const isTestFile: boolean = /.*[\/\\]src[\/\\]test[\/\\]java[\/\\].*[Tt]ests?\.java/.test(fsPath); + if (!isTestFile) { + return false; + } + return (await vscode.commands.getCommands()).includes("java.test.editor.run"); +} + +function launchTesting(uri: vscode.Uri, noDebug: boolean, progressReporter: IProgressReporter) { + const command: string = noDebug ? "java.test.editor.run" : "java.test.editor.debug"; + vscode.commands.executeCommand(command, uri, progressReporter); + if (compareVersions.compare(getTestExtensionVersion(), "0.26.1", "<=")) { + throw new utility.OperationCancelledError(""); + } +} + +function getTestExtensionVersion(): string { + const extension: vscode.Extension | undefined = vscode.extensions.getExtension("vscjava.vscode-java-test"); + return extension?.packageJSON.version || "0.0.0"; +} + +async function launchMain(mainMethods: IMainClassOption[], uri: vscode.Uri, noDebug: boolean, progressReporter: IProgressReporter, + placeHolder: string, autoPick: boolean = true): Promise { + if (!mainMethods || !mainMethods.length) { + vscode.window.showErrorMessage( + "Error: Main method not found in the file, please define the main method as: public static void main(String[] args)"); + throw new utility.OperationCancelledError(""); + } + + if (!mainClassPicker.isAutoPicked(mainMethods, autoPick)) { + progressReporter.hide(true); + } + + const pick = await mainClassPicker.showQuickPickWithRecentlyUsed(mainMethods, placeHolder, autoPick); + if (!pick) { + throw new utility.OperationCancelledError(""); + } + + const existConfig: vscode.DebugConfiguration | undefined = findLaunchConfiguration( + pick.mainClass, pick.projectName, uri.fsPath); + if (existConfig) { + progressReporter.setJobName(utility.launchJobName(existConfig.name, noDebug)); + } else { + progressReporter.setJobName(utility.launchJobNameByMainClass(pick.mainClass, noDebug)); + } + progressReporter.report("Launching main class..."); + startDebugging(pick.mainClass, pick.projectName || "", uri, noDebug, progressReporter); +} + +async function runJavaProject(node: any, noDebug: boolean) { + if (!node || !node.name || !node.uri) { + vscode.window.showErrorMessage(`Failed to ${noDebug ? "run" : "debug"} the project because of invalid project node. ` + + "This command only applies to Project Explorer view."); + const error = new Error(`Failed to ${noDebug ? "run" : "debug"} the project because of invalid project node.`); + setUserError(error); + throw error; + } + + const progressReporter = progressProvider.createProgressReporter(noDebug ? "Run" : "Debug"); + try { + progressReporter.report("Resolving main class..."); + const mainClassesOptions: IMainClassOption[] = await utility.searchMainMethods(vscode.Uri.parse(node.uri)); + if (progressReporter.isCancelled()) { + throw new utility.OperationCancelledError(""); + } + + if (!mainClassesOptions || !mainClassesOptions.length) { + vscode.window.showErrorMessage(`Failed to ${noDebug ? "run" : "debug"} this project '${node._nodeData.displayName || node.name}' ` + + "because it does not contain any main class."); + throw new utility.OperationCancelledError(""); + } + + if (!mainClassPicker.isAutoPicked(mainClassesOptions)) { + progressReporter.hide(true); + } + const pick = await mainClassPicker.showQuickPickWithRecentlyUsed(mainClassesOptions, + "Select the main class to run."); + if (!pick || progressReporter.isCancelled()) { + throw new utility.OperationCancelledError(""); + } + + const projectName: string | undefined = pick.projectName; + const mainClass: string = pick.mainClass; + const filePath: string | undefined = pick.filePath; + const workspaceFolder: vscode.WorkspaceFolder | undefined = + filePath ? vscode.workspace.getWorkspaceFolder(vscode.Uri.file(filePath)) : undefined; + const existConfig: vscode.DebugConfiguration | undefined = findLaunchConfiguration(mainClass, projectName, filePath); + const debugConfig = existConfig || { + type: "java", + name: `${mainClass.substr(mainClass.lastIndexOf(".") + 1)}`, + request: "launch", + mainClass, + projectName, + }; + debugConfig.noDebug = noDebug; + debugConfig.__progressId = progressReporter.getId(); + debugConfig.__origin = "internal"; + progressReporter.setJobName(utility.launchJobName(debugConfig.name, noDebug)); + progressReporter.report("Launching main class..."); + vscode.debug.startDebugging(workspaceFolder, debugConfig); + } catch (ex) { + progressReporter.done(); + if (ex instanceof utility.OperationCancelledError) { + return; + } + + throw ex; + } +} + +function findLaunchConfiguration(mainClass: string, projectName: string | undefined, filePath?: string): vscode.DebugConfiguration | undefined { + const workspaceFolder: vscode.WorkspaceFolder | undefined = + filePath ? vscode.workspace.getWorkspaceFolder(vscode.Uri.file(filePath)) : undefined; + const launchConfigurations: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("launch", workspaceFolder); + const existingConfigs: vscode.DebugConfiguration[] = launchConfigurations.configurations; + const existConfig: vscode.DebugConfiguration | undefined = _.find(existingConfigs, (config) => { + return config.mainClass === mainClass && _.toString(config.projectName) === _.toString(projectName); + }); + + return existConfig; } diff --git a/src/hotCodeReplace.ts b/src/hotCodeReplace.ts index a49fbfe0..03ee077b 100644 --- a/src/hotCodeReplace.ts +++ b/src/hotCodeReplace.ts @@ -4,16 +4,16 @@ import * as vscode from "vscode"; import * as anchor from "./anchor"; -import { HCR_EVENT, JAVA_LANGID } from "./constants"; +import { JAVA_LANGID } from "./constants"; import * as utility from "./utility"; const suppressedReasons: Set = new Set(); -const YES_BUTTON: string = "Yes"; +export const YES_BUTTON: string = "Yes"; -const NO_BUTTON: string = "No"; +export const NO_BUTTON: string = "No"; -const NEVER_BUTTON: string = "Not show again"; +const NEVER_BUTTON: string = "Do not show again"; enum HcrChangeType { ERROR = "ERROR", @@ -24,6 +24,20 @@ enum HcrChangeType { } export function initializeHotCodeReplace(context: vscode.ExtensionContext) { + vscode.commands.executeCommand("setContext", "javaHotReload", getHotReloadFlag()); + vscode.workspace.onDidChangeConfiguration((event) => { + if (event.affectsConfiguration("java.debug.settings.hotCodeReplace")) { + vscode.commands.executeCommand("setContext", "javaHotReload", getHotReloadFlag()); + } + }); + vscode.debug.onDidStartDebugSession((session) => { + if (session?.configuration.noDebug && !vscode.debug.activeDebugSession) { + vscode.commands.executeCommand("setContext", "javaHotReloadOn", false); + } + }); + vscode.debug.onDidChangeActiveDebugSession((session) => { + vscode.commands.executeCommand("setContext", "javaHotReloadOn", session && !session.configuration.noDebug); + }); context.subscriptions.push(vscode.debug.onDidTerminateDebugSession((session) => { const t = session ? session.type : undefined; if (t === JAVA_LANGID) { @@ -32,12 +46,14 @@ export function initializeHotCodeReplace(context: vscode.ExtensionContext) { })); } -export function handleHotCodeReplaceCustomEvent(hcrEvent) { +export function handleHotCodeReplaceCustomEvent(hcrEvent: vscode.DebugSessionCustomEvent) { if (hcrEvent.body.changeType === HcrChangeType.BUILD_COMPLETE) { - return vscode.window.withProgress({ location: vscode.ProgressLocation.Window }, (progress) => { - progress.report({ message: "Applying code changes..." }); - return hcrEvent.session.customRequest("redefineClasses"); - }); + if (getHotReloadFlag() === "auto") { + return vscode.window.withProgress({ location: vscode.ProgressLocation.Window }, (progress) => { + progress.report({ message: "Applying code changes..." }); + return hcrEvent.session.customRequest("redefineClasses"); + }); + } } if (hcrEvent.body.changeType === HcrChangeType.ERROR || hcrEvent.body.changeType === HcrChangeType.WARNING) { @@ -54,4 +70,9 @@ export function handleHotCodeReplaceCustomEvent(hcrEvent) { }); } } + return undefined; +} + +function getHotReloadFlag(): string { + return vscode.workspace.getConfiguration("java.debug.settings").get("hotCodeReplace") || "manual"; } diff --git a/src/hoverProvider.ts b/src/hoverProvider.ts new file mode 100644 index 00000000..2a44ffa9 --- /dev/null +++ b/src/hoverProvider.ts @@ -0,0 +1,86 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +import { CancellationToken, Command, Disposable, Hover, HoverProvider, languages, MarkdownString, Position, ProviderResult, TextDocument, + Uri, window } from "vscode"; +import { instrumentOperationAsVsCodeCommand } from "vscode-extension-telemetry-wrapper"; +import { JAVA_LANGID } from "./constants"; +import { startDebugging } from "./debugCodeLensProvider"; +import { resolveElementAtSelection } from "./languageServerPlugin"; + +const JAVA_HOVER_RUN_COMMAND = "java.debug.runHover"; +const MAIN_METHOD_REGEX = /^(public|static|final|synchronized|\s+){4,}void\s+main\s*\(\s*String\s*\[\s*\]\s*\w+\s*\)\s*($|\{)/; + +export function initializeHoverProvider(): Disposable { + return new DebugHoverProvider(); +} + +class DebugHoverProvider implements Disposable { + private runHoverCommand: Disposable; + private hoverProvider: Disposable | undefined; + + constructor() { + this.runHoverCommand = instrumentOperationAsVsCodeCommand(JAVA_HOVER_RUN_COMMAND, async (noDebug: boolean, uri: string, position: any) => { + const element = await resolveElementAtSelection(uri, position.line, position.character); + if (element && element.hasMainMethod) { + startDebugging(element.declaringType, element.projectName, Uri.parse(uri), noDebug); + } else { + window.showErrorMessage("The hovered element is not a main method."); + } + }); + this.hoverProvider = languages.registerHoverProvider(JAVA_LANGID, new InternalDebugHoverProvider()); + } + + public dispose() { + if (this.runHoverCommand) { + this.runHoverCommand.dispose(); + } + + if (this.hoverProvider) { + this.hoverProvider.dispose(); + } + } +} + +class InternalDebugHoverProvider implements HoverProvider { + public provideHover(document: TextDocument, position: Position, _token: CancellationToken): ProviderResult { + const range = document.getWordRangeAtPosition(position, /\w+/); + if (!range || document.getText(range) !== "main") { + return undefined; + } + + const line = document.lineAt(position); + if (MAIN_METHOD_REGEX.test(line.text.trim()) && this.isMainMethod(line.text.trim())) { + const commands: Command[] = [ + { + title: "Run", + command: JAVA_HOVER_RUN_COMMAND, + tooltip: "Run Java Program", + arguments: [ true, document.uri.toString(), { line: position.line, character: position.character }], + }, + { + title: "Debug", + command: JAVA_HOVER_RUN_COMMAND, + tooltip: "Debug Java Program", + arguments: [ false, document.uri.toString(), { line: position.line, character: position.character }], + }, + ]; + const contributed = new MarkdownString(commands.map((command) => this.convertCommandToMarkdown(command)).join(" | ")); + contributed.isTrusted = true; + return new Hover(contributed); + } + + return undefined; + } + + private isMainMethod(line: string): boolean { + const modifier: string = line.substring(0, line.indexOf("main")); + const modifiers: string[] = modifier.split(/\s+/); + return modifiers.indexOf("public") >= 0 && modifiers.indexOf("static") >= 0; + } + + private convertCommandToMarkdown(command: Command): string { + return `[${command.title}](command:${command.command}?` + + `${encodeURIComponent(JSON.stringify(command.arguments || []))} "${command.tooltip || command.command}")`; + } +} diff --git a/src/javaDebugAdapterDescriptorFactory.ts b/src/javaDebugAdapterDescriptorFactory.ts new file mode 100644 index 00000000..99bd78c0 --- /dev/null +++ b/src/javaDebugAdapterDescriptorFactory.ts @@ -0,0 +1,33 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +import { DebugAdapterDescriptor, DebugAdapterDescriptorFactory, DebugAdapterExecutable, DebugAdapterServer, DebugSession } from "vscode"; +import { Type } from "./javaLogger"; +import { startDebugSession } from "./languageServerPlugin"; +import { convertErrorToMessage, showErrorMessageWithTroubleshooting } from "./utility"; + +export class JavaDebugAdapterDescriptorFactory implements DebugAdapterDescriptorFactory { + public async createDebugAdapterDescriptor(_session: DebugSession, + _executable: DebugAdapterExecutable): Promise { + let error: Error| undefined; + try { + const debugServerPort = (await startDebugSession()); + if (debugServerPort) { + return new DebugAdapterServer(debugServerPort); + } else { + // Information for diagnostic: + // tslint:disable-next-line:no-console + console.log("Cannot find a port for debugging session"); + } + } catch (err) { + error = err; + } + + const message = error ? convertErrorToMessage(error) : { + type: Type.EXCEPTION, + message: "Failed to start debug server.", + }; + showErrorMessageWithTroubleshooting(message); + return undefined; + } +} diff --git a/src/javaLogger.ts b/src/javaLogger.ts new file mode 100644 index 00000000..a7631d32 --- /dev/null +++ b/src/javaLogger.ts @@ -0,0 +1,37 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +import { sendInfo, sendOperationError } from "vscode-extension-telemetry-wrapper"; + +export enum Type { + EXCEPTION = "exception", + USAGEDATA = "usageData", + USAGEERROR = "usageError", + ACTIVATEEXTENSION = "activateExtension", // TODO: Activation belongs to usage data, remove this category. +} + +export function logJavaException(errorProperties: any): void { + /** + * A sample errorProperties from Java code. + * { + * "description": "Failed to attach to remote debuggee VM. Reason: java.net.ConnectException: Connection refused: connect", + * "message": "Failed to attach to remote debuggee VM. Reason: java.net.ConnectException: Connection refused: connect", + * "stackTrace": "[{\"declaringClass\":\"com.microsoft.java.debug.core.adapter.AdapterUtils\", ...]", + * "debugSessionid": "5680f12b-5b5f-4ac0-bda3-d1dbc3c12c10", + * } + */ + const { debugSessionId, description, message, stackTrace } = errorProperties; + sendOperationError(debugSessionId, "debugSession", { + name: "JavaException", + message: description || message, + stack: stackTrace, + }); +} + +export function logJavaInfo(commonProperties: any, measureProperties?: any): void { + if (measureProperties && measureProperties.duration !== undefined) { + sendInfo(commonProperties.debugSessionId, commonProperties, measureProperties); + } else { + sendInfo(commonProperties.debugSessionId, commonProperties); + } +} diff --git a/src/languageModelTool.ts b/src/languageModelTool.ts new file mode 100644 index 00000000..ad803d25 --- /dev/null +++ b/src/languageModelTool.ts @@ -0,0 +1,1577 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +import * as fs from 'fs'; +import * as path from 'path'; +import * as vscode from 'vscode'; +import { sendError, sendInfo } from "vscode-extension-telemetry-wrapper"; + +// ============================================================================ +// Constants +// ============================================================================ +const CONSTANTS = { + /** Timeout for waitForSession mode (ms) */ + SESSION_WAIT_TIMEOUT: 45000, + /** Maximum wait time for smart polling (ms) */ + SMART_POLLING_MAX_WAIT: 15000, + /** Interval between polling checks (ms) */ + SMART_POLLING_INTERVAL: 300, + /** Timeout for build tasks (ms) */ + BUILD_TIMEOUT: 60000, + /** Maximum number of Java files to check for compilation errors */ + MAX_JAVA_FILES_TO_CHECK: 100, + /** Default stack trace depth */ + DEFAULT_STACK_DEPTH: 50, + /** Maximum depth for recursive file search */ + MAX_FILE_SEARCH_DEPTH: 10 +}; + +interface DebugJavaApplicationInput { + target: string; + workspacePath: string; + args?: string[]; + skipBuild?: boolean; + classpath?: string; + waitForSession?: boolean; +} + +interface DebugJavaApplicationResult { + success: boolean; + message: string; + terminalName?: string; + status?: 'started' | 'timeout' | 'sent'; // More specific status + sessionId?: string; // Session ID if detected +} + +// Type definitions for Language Model API (these will be in future VS Code versions) +// For now, we use 'any' to allow compilation with older VS Code types +interface LanguageModelTool { + invoke(options: { input: T }, token: vscode.CancellationToken): Promise; +} + +/** + * Registers the Language Model Tool for debugging Java applications. + * This allows AI assistants to help users debug Java code by invoking the debugjava command. + */ +export function registerLanguageModelTool(context: vscode.ExtensionContext): vscode.Disposable | undefined { + // Check if the Language Model API is available + const lmApi = (vscode as any).lm; + if (!lmApi || typeof lmApi.registerTool !== 'function') { + // Language Model API not available in this VS Code version + return undefined; + } + + const tool: LanguageModelTool = { + async invoke(options: { input: DebugJavaApplicationInput }, token: vscode.CancellationToken): Promise { + sendInfo('', { + operationName: 'languageModelTool.debugJavaApplication.invoke', + target: options.input.target, + skipBuild: options.input.skipBuild?.toString() || 'false', + }); + + try { + const result = await debugJavaApplication(options.input, token); + + // Format the message for AI - use simple text, not JSON + const message = result.success + ? `✓ ${result.message}` + : `✗ ${result.message}`; + + // Return result in the expected format - simple text part + return new (vscode as any).LanguageModelToolResult([ + new (vscode as any).LanguageModelTextPart(message) + ]); + } catch (error) { + sendError(error as Error); + + const errorMessage = error instanceof Error ? error.message : String(error); + + return new (vscode as any).LanguageModelToolResult([ + new (vscode as any).LanguageModelTextPart(`✗ Debug failed: ${errorMessage}`) + ]); + } + } + }; + + const disposable = lmApi.registerTool('debug_java_application', tool); + context.subscriptions.push(disposable); + return disposable; +} + +/** + * Main function to debug a Java application. + * This function handles: + * 1. Cleanup any existing debug session (to avoid port conflicts) + * 2. Project type detection + * 3. Building the project if needed + * 4. Executing the debugjava command + */ +async function debugJavaApplication( + input: DebugJavaApplicationInput, + token: vscode.CancellationToken +): Promise { + if (token.isCancellationRequested) { + return { + success: false, + message: 'Operation cancelled by user' + }; + } + + // Step 0: Cleanup any existing Java debug session to avoid port conflicts + const existingSession = vscode.debug.activeDebugSession; + if (existingSession && existingSession.type === 'java') { + sendInfo('', { + operationName: 'languageModelTool.cleanupExistingSession', + sessionId: existingSession.id, + sessionName: existingSession.name + }); + try { + await vscode.debug.stopDebugging(existingSession); + // Give VS Code a moment to clean up the session + await new Promise(resolve => setTimeout(resolve, 500)); + } catch (error) { + // Log but continue - the old session might already be dead + sendInfo('', { + operationName: 'languageModelTool.cleanupExistingSessionFailed', + error: String(error) + }); + } + } + + // Also close any existing "Java Debug" terminals to avoid confusion + for (const existingTerminal of vscode.window.terminals) { + if (existingTerminal.name === 'Java Debug') { + existingTerminal.dispose(); + } + } + + // Validate workspace path + const workspaceUri = vscode.Uri.file(input.workspacePath); + if (!fs.existsSync(input.workspacePath)) { + return { + success: false, + message: `Workspace path does not exist: ${input.workspacePath}` + }; + } + + // Step 1: Detect project type + const projectType = detectProjectType(input.workspacePath); + + // Step 2: Build the project if needed + if (!input.skipBuild) { + const buildResult = await buildProject(workspaceUri, projectType, token); + if (!buildResult.success) { + return buildResult; + } + } + + // Step 3: Construct and execute the debugjava command + const debugCommand = constructDebugCommand(input, projectType); + + // Validate that we can construct a valid command + if (!debugCommand || debugCommand === 'debugjava') { + return { + success: false, + message: 'Failed to construct debug command. Please check the target parameter.' + }; + } + + // Step 4: Execute in terminal and optionally wait for debug session + const terminal = vscode.window.createTerminal({ + name: 'Java Debug', + cwd: input.workspacePath, + hideFromUser: false, + isTransient: false // Keep terminal alive even after process exits + }); + + terminal.show(); + + // Build info message for AI + let targetInfo = input.target; + let warningNote = ''; + + if (input.target.endsWith('.jar')) { + targetInfo = input.target; + } else if (input.target.includes('.')) { + targetInfo = input.target; + } else { + // Simple class name - check if we successfully detected the full name + const detectedClassName = findFullyQualifiedClassName(input.workspacePath, input.target, projectType); + if (detectedClassName) { + targetInfo = `${detectedClassName} (detected from ${input.target})`; + } else { + targetInfo = input.target; + warningNote = ' ⚠️ Note: Could not auto-detect package name. If you see "ClassNotFoundException", please provide the fully qualified class name (e.g., "com.example.App" instead of "App").'; + } + } + + // If waitForSession is true, wait for the debug session to start + if (input.waitForSession) { + return new Promise((resolve) => { + let sessionStarted = false; + + // Listen for debug session start + const sessionDisposable = vscode.debug.onDidStartDebugSession((session) => { + if (session.type === 'java' && !sessionStarted) { + sessionStarted = true; + sessionDisposable.dispose(); + if (timeoutHandle) { + clearTimeout(timeoutHandle); + } + + sendInfo('', { + operationName: 'languageModelTool.debugSessionStarted.eventBased', + sessionId: session.id, + sessionName: session.name + }); + + resolve({ + success: true, + status: 'started', + sessionId: session.id, + message: `✓ Debug session started for ${targetInfo}. Session ID: ${session.id}. The debugger is now attached and ready. Any breakpoints you set will be active.${warningNote}`, + terminalName: terminal.name + }); + } + }); + + // Send the command after setting up the listener + terminal.sendText(debugCommand); + + // Set a timeout for large applications + const timeoutHandle = setTimeout(() => { + if (!sessionStarted) { + sessionDisposable.dispose(); + + sendInfo('', { + operationName: 'languageModelTool.debugSessionTimeout.eventBased', + target: targetInfo + }); + + resolve({ + success: false, + status: 'timeout', + message: `❌ Debug session failed to start within ${CONSTANTS.SESSION_WAIT_TIMEOUT / 1000} seconds for ${targetInfo}.\n\n` + + `This usually indicates a problem:\n` + + `• Compilation errors preventing startup\n` + + `• ClassNotFoundException or NoClassDefFoundError\n` + + `• Application crashed during initialization\n` + + `• Incorrect main class or classpath configuration\n\n` + + `Action required:\n` + + `1. Check terminal '${terminal.name}' for error messages\n` + + `2. Verify the target class name is correct\n` + + `3. Ensure the project is compiled successfully\n` + + `4. Use get_debug_session_info() to confirm session status${warningNote}`, + terminalName: terminal.name + }); + } + }, CONSTANTS.SESSION_WAIT_TIMEOUT); + }); + } else { + // Default behavior: send command and use smart polling to detect session start + terminal.sendText(debugCommand); + + // Smart polling to detect session start + const maxWaitTime = CONSTANTS.SMART_POLLING_MAX_WAIT; + const pollInterval = CONSTANTS.SMART_POLLING_INTERVAL; + const startTime = Date.now(); + + while (Date.now() - startTime < maxWaitTime) { + // Check if debug session has started + const session = vscode.debug.activeDebugSession; + if (session && session.type === 'java') { + const elapsedTime = ((Date.now() - startTime) / 1000).toFixed(1); + + sendInfo('', { + operationName: 'languageModelTool.debugSessionDetected', + sessionId: session.id, + elapsedTime + }); + + return { + success: true, + status: 'started', + sessionId: session.id, + message: `✓ Debug session started for ${targetInfo} (detected in ${elapsedTime}s). Session ID: ${session.id}. The debugger is attached and ready.${warningNote}`, + terminalName: terminal.name + }; + } + + // Wait before next check + await new Promise(resolve => setTimeout(resolve, pollInterval)); + } + + // Timeout: session not detected within 15 seconds + sendInfo('', { + operationName: 'languageModelTool.debugSessionTimeout.smartPolling', + target: targetInfo, + maxWaitTime + }); + + return { + success: true, + status: 'timeout', + message: `⚠️ Debug command sent for ${targetInfo}, but session not detected within ${CONSTANTS.SMART_POLLING_MAX_WAIT / 1000} seconds.\n\n` + + `Possible reasons:\n` + + `• Application is still starting (large projects may take longer)\n` + + `• Compilation errors (check terminal '${terminal.name}' for errors)\n` + + `• Application may have started and already terminated\n\n` + + `Next steps:\n` + + `• Use get_debug_session_info() to check if session is now active\n` + + `• Check terminal '${terminal.name}' for error messages\n` + + `• If starting slowly, wait a bit longer and check again${warningNote}`, + terminalName: terminal.name + }; + } +} + +/** + * Detects the type of Java project based on build files present. + */ +function detectProjectType(workspacePath: string): 'maven' | 'gradle' | 'vscode' | 'unknown' { + if (fs.existsSync(path.join(workspacePath, 'pom.xml'))) { + return 'maven'; + } + + if (fs.existsSync(path.join(workspacePath, 'build.gradle')) || + fs.existsSync(path.join(workspacePath, 'build.gradle.kts'))) { + return 'gradle'; + } + + // Check if VS Code Java extension is likely managing compilation + const workspaceFolder = vscode.workspace.getWorkspaceFolder(vscode.Uri.file(workspacePath)); + if (workspaceFolder) { + const javaExt = vscode.extensions.getExtension('redhat.java'); + if (javaExt?.isActive) { + return 'vscode'; + } + } + + return 'unknown'; +} + +/** + * Builds the Java project based on its type. + */ +async function buildProject( + workspaceUri: vscode.Uri, + projectType: 'maven' | 'gradle' | 'vscode' | 'unknown', + _token: vscode.CancellationToken +): Promise { + switch (projectType) { + case 'maven': + return buildMavenProject(workspaceUri); + + case 'gradle': + return buildGradleProject(workspaceUri); + + case 'vscode': + return ensureVSCodeCompilation(workspaceUri); + + case 'unknown': + // Try to proceed anyway - user might have manually compiled + return { + success: true, + message: 'Unknown project type. Skipping build step. Ensure your Java files are compiled.' + }; + } +} + +/** + * Executes a shell task and waits for completion. + * This is a common function used by both Maven and Gradle builds. + */ +async function executeShellTask( + workspaceUri: vscode.Uri, + taskId: string, + taskName: string, + command: string, + successMessage: string, + timeoutMessage: string, + failureMessagePrefix: string +): Promise { + return new Promise((resolve) => { + const workspaceFolder = vscode.workspace.getWorkspaceFolder(workspaceUri); + if (!workspaceFolder) { + resolve({ + success: false, + message: `Cannot find workspace folder for ${workspaceUri.fsPath}` + }); + return; + } + + const task = new vscode.Task( + { type: 'shell', task: taskId }, + workspaceFolder, + taskName, + 'Java Debug', + new vscode.ShellExecution(command, { cwd: workspaceUri.fsPath }) + ); + + let resolved = false; + let taskDisposable: vscode.Disposable | undefined; + let errorDisposable: vscode.Disposable | undefined; + + const cleanup = () => { + clearTimeout(timeoutHandle); + taskDisposable?.dispose(); + errorDisposable?.dispose(); + }; + + // Set a timeout to avoid hanging indefinitely + const timeoutHandle = setTimeout(() => { + if (!resolved) { + resolved = true; + cleanup(); + resolve({ + success: true, + message: timeoutMessage + }); + } + }, CONSTANTS.BUILD_TIMEOUT); + + vscode.tasks.executeTask(task).then( + (execution) => { + taskDisposable = vscode.tasks.onDidEndTask((e) => { + if (e.execution === execution && !resolved) { + resolved = true; + cleanup(); + resolve({ + success: true, + message: successMessage + }); + } + }); + + errorDisposable = vscode.tasks.onDidEndTaskProcess((e) => { + if (e.execution === execution && e.exitCode !== 0 && !resolved) { + resolved = true; + cleanup(); + resolve({ + success: false, + message: `${failureMessagePrefix} with exit code ${e.exitCode}. Please check the terminal output.` + }); + } + }); + }, + (error: Error) => { + if (!resolved) { + resolved = true; + cleanup(); + resolve({ + success: false, + message: `Failed to execute task: ${error.message}` + }); + } + } + ); + }); +} + +/** + * Builds a Maven project using mvn compile. + */ +async function buildMavenProject( + workspaceUri: vscode.Uri +): Promise { + return executeShellTask( + workspaceUri, + 'maven-compile', + 'Maven Compile', + 'mvn compile', + 'Maven project compiled successfully', + 'Maven compile command sent. Build may still be in progress.', + 'Maven build failed' + ); +} + +/** + * Builds a Gradle project using gradle classes. + */ +async function buildGradleProject( + workspaceUri: vscode.Uri +): Promise { + const gradleWrapper = process.platform === 'win32' ? 'gradlew.bat' : './gradlew'; + const gradleCommand = fs.existsSync(path.join(workspaceUri.fsPath, gradleWrapper)) + ? gradleWrapper + : 'gradle'; + + return executeShellTask( + workspaceUri, + 'gradle-classes', + 'Gradle Classes', + `${gradleCommand} classes`, + 'Gradle project compiled successfully', + 'Gradle compile command sent. Build may still be in progress.', + 'Gradle build failed' + ); +} + +/** + * Ensures VS Code Java Language Server has compiled the files. + */ +async function ensureVSCodeCompilation(workspaceUri: vscode.Uri): Promise { + try { + // Check for compilation errors using VS Code diagnostics + const javaFiles = await vscode.workspace.findFiles( + new vscode.RelativePattern(workspaceUri, '**/*.java'), + '**/node_modules/**', + CONSTANTS.MAX_JAVA_FILES_TO_CHECK + ); + + let hasErrors = false; + for (const file of javaFiles) { + const diagnostics = vscode.languages.getDiagnostics(file); + const errors = diagnostics.filter(d => d.severity === vscode.DiagnosticSeverity.Error); + if (errors.length > 0) { + hasErrors = true; + break; + } + } + + if (hasErrors) { + return { + success: false, + message: 'Compilation errors detected in the project. Please fix the errors before debugging.' + }; + } + + // Check if Java extension is active and in standard mode + const javaExt = vscode.extensions.getExtension('redhat.java'); + if (!javaExt?.isActive) { + return { + success: true, + message: 'Java Language Server is not active. Proceeding with debug, but ensure your code is compiled.' + }; + } + + return { + success: true, + message: 'VS Code Java compilation verified' + }; + } catch (error) { + // If we can't verify, proceed anyway + return { + success: true, + message: 'Unable to verify compilation status. Proceeding with debug.' + }; + } +} + +/** + * Constructs the debugjava command based on input parameters. + */ +function constructDebugCommand( + input: DebugJavaApplicationInput, + projectType: 'maven' | 'gradle' | 'vscode' | 'unknown' +): string { + let command = 'debugjava'; + + // Handle JAR files + if (input.target.endsWith('.jar')) { + command += ` -jar ${input.target}`; + } + // Handle raw java command arguments (starts with - like -cp, -jar, etc) + else if (input.target.startsWith('-')) { + command += ` ${input.target}`; + } + // Handle class name (with or without package) + else { + let className = input.target; + + // If target doesn't contain a dot and we can find the Java file, + // try to detect the fully qualified class name + if (!input.target.includes('.')) { + const detectedClassName = findFullyQualifiedClassName(input.workspacePath, input.target, projectType); + if (detectedClassName) { + sendInfo('', { + operationName: 'languageModelTool.classNameDetection', + simpleClassName: input.target, + detectedClassName, + projectType + }); + className = detectedClassName; + } else { + // No package detected - class is in default package + sendInfo('', { + operationName: 'languageModelTool.classNameDetection.noPackage', + simpleClassName: input.target, + projectType + }); + } + } + + // Use provided classpath if available, otherwise infer it + const classpath = input.classpath || inferClasspath(input.workspacePath, projectType); + + command += ` -cp "${classpath}" ${className}`; + } + + // Add arguments if provided + if (input.args && input.args.length > 0) { + command += ' ' + input.args.join(' '); + } + + return command; +} + +/** + * Tries to find the fully qualified class name by searching for the Java file. + * This helps when user provides just "App" instead of "com.example.App". + */ +function findFullyQualifiedClassName( + workspacePath: string, + simpleClassName: string, + projectType: 'maven' | 'gradle' | 'vscode' | 'unknown' +): string | null { + // Determine source directories based on project type + const sourceDirs: string[] = []; + + switch (projectType) { + case 'maven': + sourceDirs.push(path.join(workspacePath, 'src', 'main', 'java')); + break; + case 'gradle': + sourceDirs.push(path.join(workspacePath, 'src', 'main', 'java')); + break; + case 'vscode': + sourceDirs.push(path.join(workspacePath, 'src')); + break; + case 'unknown': + // Try all common locations + sourceDirs.push( + path.join(workspacePath, 'src', 'main', 'java'), + path.join(workspacePath, 'src'), + workspacePath + ); + break; + } + + // Search for the Java file + for (const srcDir of sourceDirs) { + if (!fs.existsSync(srcDir)) { + continue; + } + + try { + const javaFile = findJavaFile(srcDir, simpleClassName, 0); + if (javaFile) { + // Extract package name from the file + const packageName = extractPackageName(javaFile); + if (packageName) { + return `${packageName}.${simpleClassName}`; + } else { + // No package, use simple name + return simpleClassName; + } + } + } catch (error) { + // Continue searching in other directories + } + } + + return null; +} + +/** + * Recursively searches for a Java file with the given class name. + * @param depth Current recursion depth (for limiting search depth) + */ +function findJavaFile(dir: string, className: string, depth: number = 0): string | null { + // Limit recursion depth to prevent performance issues + if (depth > CONSTANTS.MAX_FILE_SEARCH_DEPTH) { + return null; + } + + try { + const files = fs.readdirSync(dir); + + for (const file of files) { + const filePath = path.join(dir, file); + const stat = fs.statSync(filePath); + + if (stat.isDirectory()) { + // Skip common non-source directories + if (file === 'node_modules' || file === '.git' || file === 'target' || file === 'build') { + continue; + } + const found = findJavaFile(filePath, className, depth + 1); + if (found) { + return found; + } + } else if (file === `${className}.java`) { + return filePath; + } + } + } catch (error) { + // Ignore permission errors or other file system issues + } + + return null; +} + +/** + * Extracts the package name from a Java source file. + */ +function extractPackageName(javaFilePath: string): string | null { + try { + const content = fs.readFileSync(javaFilePath, 'utf-8'); + const packageMatch = content.match(/^\s*package\s+([\w.]+)\s*;/m); + return packageMatch ? packageMatch[1] : null; + } catch (error) { + return null; + } +} + +/** + * Checks if a directory contains any .class files. + * @param depth Current recursion depth (for limiting search depth) + */ +function hasClassFiles(dir: string, depth: number = 0): boolean { + // Limit recursion depth to prevent performance issues + if (depth > CONSTANTS.MAX_FILE_SEARCH_DEPTH) { + return false; + } + + try { + const files = fs.readdirSync(dir); + for (const file of files) { + const filePath = path.join(dir, file); + const stat = fs.statSync(filePath); + + if (stat.isFile() && file.endsWith('.class')) { + return true; + } else if (stat.isDirectory()) { + if (hasClassFiles(filePath, depth + 1)) { + return true; + } + } + } + } catch (error) { + // Ignore errors + } + return false; +} + +/** + * Infers the classpath based on project type and common conventions. + */ +function inferClasspath(workspacePath: string, projectType: 'maven' | 'gradle' | 'vscode' | 'unknown'): string { + const classpaths: string[] = []; + + switch (projectType) { + case 'maven': + // Maven standard output directory + const mavenTarget = path.join(workspacePath, 'target', 'classes'); + if (fs.existsSync(mavenTarget)) { + classpaths.push(mavenTarget); + } + break; + + case 'gradle': + // Gradle standard output directories + const gradleMain = path.join(workspacePath, 'build', 'classes', 'java', 'main'); + if (fs.existsSync(gradleMain)) { + classpaths.push(gradleMain); + } + break; + + case 'vscode': + // VS Code Java extension default output + const vscodeOut = path.join(workspacePath, 'bin'); + if (fs.existsSync(vscodeOut)) { + classpaths.push(vscodeOut); + } + break; + } + + // Fallback to common locations + if (classpaths.length === 0) { + const commonPaths = [ + path.join(workspacePath, 'bin'), // VS Code default + path.join(workspacePath, 'out'), // IntelliJ default + path.join(workspacePath, 'target', 'classes'), // Maven + path.join(workspacePath, 'build', 'classes', 'java', 'main'), // Gradle + path.join(workspacePath, 'build', 'classes'), + ]; + + // Check each common path + for (const p of commonPaths) { + if (fs.existsSync(p)) { + // Check if there are actually .class files in this directory + if (hasClassFiles(p)) { + classpaths.push(p); + break; + } + } + } + } + + // If still no classpath found, use current directory + // This is common for simple projects where .class files are alongside .java files + if (classpaths.length === 0) { + classpaths.push('.'); + } + + return classpaths.join(path.delimiter); +} + +// ============================================================================ +// Debug Session Control Tools +// ============================================================================ + +interface SetBreakpointInput { + filePath: string; + lineNumber: number; + condition?: string; + hitCondition?: string; + logMessage?: string; +} + +interface StepOperationInput { + operation: 'stepIn' | 'stepOut' | 'stepOver' | 'continue' | 'pause'; + threadId?: number; +} + +interface GetVariablesInput { + threadId?: number; + frameId?: number; + scopeType?: 'local' | 'static' | 'all'; + filter?: string; +} + +interface GetStackTraceInput { + threadId?: number; + maxDepth?: number; +} + +interface EvaluateExpressionInput { + expression: string; + threadId?: number; + frameId?: number; + context?: 'watch' | 'repl' | 'hover'; +} + +interface RemoveBreakpointsInput { + filePath?: string; + lineNumber?: number; +} + +interface StopDebugSessionInput { + reason?: string; +} + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +type GetDebugSessionInfoInput = Record; + +/** + * Result of finding a suspended thread + */ +interface SuspendedThreadInfo { + threadId: number; + frameId: number; +} + +/** + * Finds the first suspended thread in the debug session. + * Returns the thread ID and top frame ID, or null if no suspended thread is found. + */ +async function findFirstSuspendedThread(session: vscode.DebugSession): Promise { + try { + const threadsResponse = await session.customRequest('threads'); + for (const thread of threadsResponse.threads || []) { + try { + const stackResponse = await session.customRequest('stackTrace', { + threadId: thread.id, + startFrame: 0, + levels: 1 + }); + if (stackResponse?.stackFrames?.length > 0) { + return { + threadId: thread.id, + frameId: stackResponse.stackFrames[0].id + }; + } + } catch { + // Thread is running, continue to next + continue; + } + } + } catch { + // Failed to get threads + } + return null; +} + +/** + * Registers all debug session control tools + */ +export function registerDebugSessionTools(_context: vscode.ExtensionContext): vscode.Disposable[] { + const lmApi = (vscode as any).lm; + if (!lmApi || typeof lmApi.registerTool !== 'function') { + return []; + } + + const disposables: vscode.Disposable[] = []; + + // Tool 1: Set Breakpoint + const setBreakpointTool: LanguageModelTool = { + async invoke(options: { input: SetBreakpointInput }, _token: vscode.CancellationToken): Promise { + try { + const { filePath, lineNumber, condition, hitCondition, logMessage } = options.input; + + // Set breakpoint through VS Code API (no active session required) + const uri = vscode.Uri.file(filePath); + const breakpoint = new vscode.SourceBreakpoint( + new vscode.Location(uri, new vscode.Position(lineNumber - 1, 0)), + true, // enabled + condition, + hitCondition, + logMessage + ); + + vscode.debug.addBreakpoints([breakpoint]); + + const bpType = logMessage ? 'Logpoint' : 'Breakpoint'; + const session = vscode.debug.activeDebugSession; + const sessionInfo = (session && session.type === 'java') + ? ' (active in current session)' + : ' (will activate when debugging starts)'; + + return new (vscode as any).LanguageModelToolResult([ + new (vscode as any).LanguageModelTextPart( + `✓ ${bpType} set at ${path.basename(filePath)}:${lineNumber}${condition ? ` (condition: ${condition})` : ''}${sessionInfo}` + ) + ]); + } catch (error) { + return new (vscode as any).LanguageModelToolResult([ + new (vscode as any).LanguageModelTextPart(`✗ Failed to set breakpoint: ${error}`) + ]); + } + } + }; + disposables.push(lmApi.registerTool('set_java_breakpoint', setBreakpointTool)); + + // Tool 2: Step Operations + const stepOperationTool: LanguageModelTool = { + async invoke(options: { input: StepOperationInput }, _token: vscode.CancellationToken): Promise { + try { + const session = vscode.debug.activeDebugSession; + if (!session || session.type !== 'java') { + return new (vscode as any).LanguageModelToolResult([ + new (vscode as any).LanguageModelTextPart('✗ No active Java debug session.') + ]); + } + + const { operation, threadId } = options.input; + + // Map operation to VS Code debug commands + const commandMap: { [key: string]: string } = { + stepIn: 'workbench.action.debug.stepInto', + stepOut: 'workbench.action.debug.stepOut', + stepOver: 'workbench.action.debug.stepOver', + continue: 'workbench.action.debug.continue', + pause: 'workbench.action.debug.pause' + }; + + const command = commandMap[operation]; + if (threadId !== undefined) { + // For thread-specific operations, use custom request + await session.customRequest(operation, { threadId }); + } else { + // Use VS Code command for current thread + await vscode.commands.executeCommand(command); + } + + return new (vscode as any).LanguageModelToolResult([ + new (vscode as any).LanguageModelTextPart(`✓ Executed ${operation}`) + ]); + } catch (error) { + return new (vscode as any).LanguageModelToolResult([ + new (vscode as any).LanguageModelTextPart(`✗ Step operation failed: ${error}`) + ]); + } + } + }; + disposables.push(lmApi.registerTool('debug_step_operation', stepOperationTool)); + + // Tool 3: Get Variables + const getVariablesTool: LanguageModelTool = { + async invoke(options: { input: GetVariablesInput }, _token: vscode.CancellationToken): Promise { + try { + const session = vscode.debug.activeDebugSession; + if (!session || session.type !== 'java') { + return new (vscode as any).LanguageModelToolResult([ + new (vscode as any).LanguageModelTextPart('✗ No active Java debug session.') + ]); + } + + const { threadId, frameId = 0, scopeType = 'all', filter } = options.input; + + // Find the target thread - either specified or find first suspended thread + let targetThreadId = threadId; + if (!targetThreadId) { + const suspendedThread = await findFirstSuspendedThread(session); + if (suspendedThread) { + targetThreadId = suspendedThread.threadId; + } + } + + if (!targetThreadId) { + return new (vscode as any).LanguageModelToolResult([ + new (vscode as any).LanguageModelTextPart('✗ No suspended thread found. Use get_debug_threads() to see thread states.') + ]); + } + + // Get stack trace to access frame + const stackResponse = await session.customRequest('stackTrace', { + threadId: targetThreadId, + startFrame: frameId, + levels: 1 + }); + + if (!stackResponse.stackFrames || stackResponse.stackFrames.length === 0) { + return new (vscode as any).LanguageModelToolResult([ + new (vscode as any).LanguageModelTextPart('✗ No stack frame available.') + ]); + } + + const frame = stackResponse.stackFrames[0]; + + // Get scopes for the frame + const scopesResponse = await session.customRequest('scopes', { frameId: frame.id }); + + const variables: string[] = []; + for (const scope of scopesResponse.scopes) { + // Filter by scope type + if (scopeType === 'local' && scope.name !== 'Local' && scope.name !== 'Locals') { + continue; + } + if (scopeType === 'static' && scope.name !== 'Static') { + continue; + } + + // Get variables for this scope + const varsResponse = await session.customRequest('variables', { + variablesReference: scope.variablesReference + }); + + for (const v of varsResponse.variables) { + if (!filter || v.name.includes(filter) || matchWildcard(v.name, filter)) { + variables.push(`${v.name}: ${v.type || ''} = ${v.value}`); + } + } + } + + if (variables.length === 0) { + return new (vscode as any).LanguageModelToolResult([ + new (vscode as any).LanguageModelTextPart('No variables found.') + ]); + } + + return new (vscode as any).LanguageModelToolResult([ + new (vscode as any).LanguageModelTextPart( + `Variables (Thread #${targetThreadId}, Frame ${frameId}):\n${variables.join('\n')}` + ) + ]); + } catch (error) { + return new (vscode as any).LanguageModelToolResult([ + new (vscode as any).LanguageModelTextPart(`✗ Failed to get variables: ${error}`) + ]); + } + } + }; + disposables.push(lmApi.registerTool('get_debug_variables', getVariablesTool)); + + // Tool 4: Get Stack Trace + const getStackTraceTool: LanguageModelTool = { + async invoke(options: { input: GetStackTraceInput }, _token: vscode.CancellationToken): Promise { + try { + const session = vscode.debug.activeDebugSession; + if (!session || session.type !== 'java') { + return new (vscode as any).LanguageModelToolResult([ + new (vscode as any).LanguageModelTextPart('✗ No active Java debug session.') + ]); + } + + const { threadId, maxDepth = CONSTANTS.DEFAULT_STACK_DEPTH } = options.input; + + const stackResponse = await session.customRequest('stackTrace', { + threadId: threadId || (session as any).threadId || 1, + startFrame: 0, + levels: maxDepth + }); + + if (!stackResponse.stackFrames || stackResponse.stackFrames.length === 0) { + return new (vscode as any).LanguageModelToolResult([ + new (vscode as any).LanguageModelTextPart('No stack frames available.') + ]); + } + + const frames = stackResponse.stackFrames.map((frame: any, index: number) => { + const location = frame.source ? + `${frame.source.name}:${frame.line}` : + 'unknown location'; + return `#${index} ${frame.name} at ${location}`; + }); + + return new (vscode as any).LanguageModelToolResult([ + new (vscode as any).LanguageModelTextPart( + `Call Stack:\n${frames.join('\n')}` + ) + ]); + } catch (error) { + return new (vscode as any).LanguageModelToolResult([ + new (vscode as any).LanguageModelTextPart(`✗ Failed to get stack trace: ${error}`) + ]); + } + } + }; + disposables.push(lmApi.registerTool('get_debug_stack_trace', getStackTraceTool)); + + // Tool 5: Evaluate Expression + const evaluateExpressionTool: LanguageModelTool = { + async invoke(options: { input: EvaluateExpressionInput }, _token: vscode.CancellationToken): Promise { + try { + const session = vscode.debug.activeDebugSession; + if (!session || session.type !== 'java') { + return new (vscode as any).LanguageModelToolResult([ + new (vscode as any).LanguageModelTextPart('✗ No active Java debug session.') + ]); + } + + const { expression, threadId, frameId = 0, context = 'repl' } = options.input; + + // Find the target thread and frame for evaluation + let targetFrameId: number = frameId; + let targetThreadId = threadId; + + // If no threadId specified, find first suspended thread + if (!targetThreadId) { + const suspendedThread = await findFirstSuspendedThread(session); + if (suspendedThread) { + targetThreadId = suspendedThread.threadId; + // Use the actual frame ID from the stack if frameId is 0 + if (frameId === 0) { + targetFrameId = suspendedThread.frameId; + } + } + } else { + // Get the frame ID for the specified thread + try { + const stackResponse = await session.customRequest('stackTrace', { + threadId: targetThreadId, + startFrame: frameId, + levels: 1 + }); + if (stackResponse?.stackFrames?.length > 0) { + targetFrameId = stackResponse.stackFrames[0].id; + } + } catch { + return new (vscode as any).LanguageModelToolResult([ + new (vscode as any).LanguageModelTextPart(`✗ Thread #${targetThreadId} is not suspended. Cannot evaluate expression.`) + ]); + } + } + + if (!targetThreadId) { + return new (vscode as any).LanguageModelToolResult([ + new (vscode as any).LanguageModelTextPart('✗ No suspended thread found. Use get_debug_threads() to see thread states.') + ]); + } + + const evalResponse = await session.customRequest('evaluate', { + expression, + frameId: targetFrameId, + context + }); + + return new (vscode as any).LanguageModelToolResult([ + new (vscode as any).LanguageModelTextPart( + `Expression: ${expression}\n` + + `Thread: #${targetThreadId}\n` + + `Result: ${evalResponse.result}${evalResponse.type ? ` (${evalResponse.type})` : ''}` + ) + ]); + } catch (error) { + return new (vscode as any).LanguageModelToolResult([ + new (vscode as any).LanguageModelTextPart(`✗ Evaluation failed: ${error}`) + ]); + } + } + }; + disposables.push(lmApi.registerTool('evaluate_debug_expression', evaluateExpressionTool)); + + // Tool 6: Get Threads + const getThreadsTool: LanguageModelTool<{}> = { + async invoke(_options: { input: {} }, _token: vscode.CancellationToken): Promise { + try { + const session = vscode.debug.activeDebugSession; + if (!session || session.type !== 'java') { + return new (vscode as any).LanguageModelToolResult([ + new (vscode as any).LanguageModelTextPart('✗ No active Java debug session.') + ]); + } + + const threadsResponse = await session.customRequest('threads'); + + if (!threadsResponse.threads || threadsResponse.threads.length === 0) { + return new (vscode as any).LanguageModelToolResult([ + new (vscode as any).LanguageModelTextPart('No threads found.') + ]); + } + + // Check each thread's state by trying to get its stack trace + const threadInfos: string[] = []; + for (const thread of threadsResponse.threads) { + let state = '🟢 RUNNING'; + let location = ''; + + try { + const stackResponse = await session.customRequest('stackTrace', { + threadId: thread.id, + startFrame: 0, + levels: 1 + }); + + if (stackResponse?.stackFrames?.length > 0) { + state = '🔴 SUSPENDED'; + const topFrame = stackResponse.stackFrames[0]; + if (topFrame.source) { + location = ` at ${topFrame.source.name}:${topFrame.line}`; + } + } + } catch { + // Thread is running, can't get stack + state = '🟢 RUNNING'; + } + + threadInfos.push(`Thread #${thread.id}: ${thread.name} [${state}]${location}`); + } + + return new (vscode as any).LanguageModelToolResult([ + new (vscode as any).LanguageModelTextPart( + `═══════════════════════════════════════════\n` + + `THREADS (${threadsResponse.threads.length} total)\n` + + `═══════════════════════════════════════════\n\n` + + `${threadInfos.join('\n')}\n\n` + + `───────────────────────────────────────────\n` + + `💡 Use threadId parameter to inspect a specific thread:\n` + + `• get_debug_variables(threadId=X)\n` + + `• get_debug_stack_trace(threadId=X)\n` + + `• evaluate_debug_expression(threadId=X, expression="...")\n` + + `───────────────────────────────────────────` + ) + ]); + } catch (error) { + return new (vscode as any).LanguageModelToolResult([ + new (vscode as any).LanguageModelTextPart(`✗ Failed to get threads: ${error}`) + ]); + } + } + }; + disposables.push(lmApi.registerTool('get_debug_threads', getThreadsTool)); + + // Tool 7: Remove Breakpoints + const removeBreakpointsTool: LanguageModelTool = { + async invoke(options: { input: RemoveBreakpointsInput }, _token: vscode.CancellationToken): Promise { + try { + const { filePath, lineNumber } = options.input; + + const breakpoints = vscode.debug.breakpoints; + + if (!filePath) { + // Remove all breakpoints (no active session required) + const count = breakpoints.length; + vscode.debug.removeBreakpoints(breakpoints); + return new (vscode as any).LanguageModelToolResult([ + new (vscode as any).LanguageModelTextPart(`✓ Removed all ${count} breakpoint(s).`) + ]); + } + + const uri = vscode.Uri.file(filePath); + const toRemove = breakpoints.filter(bp => { + if (bp instanceof vscode.SourceBreakpoint) { + const match = bp.location.uri.fsPath === uri.fsPath; + if (lineNumber !== undefined) { + return match && bp.location.range.start.line === lineNumber - 1; + } + return match; + } + return false; + }); + + if (toRemove.length > 0) { + vscode.debug.removeBreakpoints(toRemove); + } + + return new (vscode as any).LanguageModelToolResult([ + new (vscode as any).LanguageModelTextPart( + toRemove.length > 0 + ? `✓ Removed ${toRemove.length} breakpoint(s) from ${path.basename(filePath)}${lineNumber ? `:${lineNumber}` : ''}` + : 'No matching breakpoints found.' + ) + ]); + } catch (error) { + return new (vscode as any).LanguageModelToolResult([ + new (vscode as any).LanguageModelTextPart(`✗ Failed to remove breakpoints: ${error}`) + ]); + } + } + }; + disposables.push(lmApi.registerTool('remove_java_breakpoints', removeBreakpointsTool)); + + // Tool 9: Stop Debug Session + const stopDebugSessionTool: LanguageModelTool = { + async invoke(options: { input: StopDebugSessionInput }, _token: vscode.CancellationToken): Promise { + try { + const session = vscode.debug.activeDebugSession; + + if (!session) { + return new (vscode as any).LanguageModelToolResult([ + new (vscode as any).LanguageModelTextPart('No active debug session to stop.') + ]); + } + + const sessionInfo = `${session.name} (${session.type})`; + const reason = options.input.reason || 'Investigation complete'; + + // Stop the debug session + await vscode.debug.stopDebugging(session); + + sendInfo('', { + operationName: 'languageModelTool.stopDebugSession', + sessionId: session.id, + sessionName: session.name, + reason + }); + + return new (vscode as any).LanguageModelToolResult([ + new (vscode as any).LanguageModelTextPart( + `✓ Stopped debug session: ${sessionInfo}. Reason: ${reason}` + ) + ]); + } catch (error) { + return new (vscode as any).LanguageModelToolResult([ + new (vscode as any).LanguageModelTextPart(`✗ Failed to stop debug session: ${error}`) + ]); + } + } + }; + disposables.push(lmApi.registerTool('stop_debug_session', stopDebugSessionTool)); + + // Tool 10: Get Debug Session Info + const getDebugSessionInfoTool: LanguageModelTool = { + async invoke(_options: { input: GetDebugSessionInfoInput }, _token: vscode.CancellationToken): Promise { + try { + const session = vscode.debug.activeDebugSession; + + if (!session) { + return new (vscode as any).LanguageModelToolResult([ + new (vscode as any).LanguageModelTextPart( + '❌ No active debug session found.\n\n' + + 'You can:\n' + + '• Start a new debug session using debug_java_application\n' + + '• Set breakpoints before or after starting a session\n' + + '• Wait for an existing session to hit a breakpoint' + ) + ]); + } + + // Gather session information + const sessionInfo = { + id: session.id, + name: session.name, + type: session.type, + workspaceFolder: session.workspaceFolder?.name || 'N/A', + configuration: { + name: session.configuration.name, + type: session.configuration.type, + request: session.configuration.request, + mainClass: session.configuration.mainClass, + projectName: session.configuration.projectName + } + }; + + // Check if session is paused and get current location + // Strategy: Get all threads first, then try to get stack trace for each + // A thread is paused if we can successfully get its stack trace + let isPaused = false; + let stoppedReason = 'unknown'; + let currentLocation = ''; + let currentFile = ''; + let currentLine = 0; + let stoppedThreadId: number | undefined; + let stoppedThreadName = ''; + + try { + // Step 1: Get all threads + const threadsResponse = await session.customRequest('threads'); + const threads = threadsResponse?.threads || []; + + // Step 2: Try to get stack trace for each thread to find paused one + // In Java debug, only paused threads can provide stack traces + for (const thread of threads) { + try { + const stackResponse = await session.customRequest('stackTrace', { + threadId: thread.id, + startFrame: 0, + levels: 1 + }); + + // If we got stack frames, this thread is paused + if (stackResponse?.stackFrames?.length > 0) { + isPaused = true; + stoppedThreadId = thread.id; + stoppedThreadName = thread.name || `Thread-${thread.id}`; + + const topFrame = stackResponse.stackFrames[0]; + + // Extract current location details + if (topFrame.source) { + currentFile = topFrame.source.path || topFrame.source.name || 'unknown'; + currentLine = topFrame.line || 0; + const methodName = topFrame.name || 'unknown'; + const fileName = topFrame.source.name || path.basename(currentFile); + currentLocation = `${fileName}:${currentLine} in ${methodName}`; + } + + // Try to determine stop reason from thread name or default to breakpoint + stoppedReason = 'breakpoint'; + + // Found a paused thread, no need to check others for basic info + break; + } + } catch { + // This thread is running, not paused - continue to next + continue; + } + } + + // If no thread had stack frames, all are running + if (!isPaused && threads.length > 0) { + // Session exists but all threads are running + isPaused = false; + } + } catch (error) { + // If we can't even get threads, something is wrong + // But session exists, so mark as running + isPaused = false; + sendInfo('', { + operationName: 'languageModelTool.getDebugSessionInfo.threadError', + error: String(error) + }); + } + + // Build status line with location info + let statusLine: string; + let locationInfo = ''; + + if (isPaused) { + statusLine = `🔴 Status: PAUSED (${stoppedReason})`; + locationInfo = [ + '', + '📍 Current Location:', + `• File: ${currentFile}`, + `• Line: ${currentLine}`, + `• Method: ${currentLocation}`, + `• Thread: ${stoppedThreadName} (ID: ${stoppedThreadId})` + ].join('\n'); + } else { + statusLine = '🟢 Status: RUNNING'; + } + + // Build clear action guidance based on state + let actionGuidance: string; + if (isPaused) { + actionGuidance = [ + '✅ READY FOR INSPECTION - Session is paused at breakpoint', + '', + 'You can now:', + '• evaluate_debug_expression - Test your hypothesis (e.g., "user == null")', + '• get_debug_variables - Inspect specific variables', + '• get_debug_stack_trace - See full call stack', + '• debug_step_operation - Step through code (stepOver, stepIn, stepOut)', + '• debug_step_operation(continue) - Resume to next breakpoint', + '• stop_debug_session - End debugging when done' + ].join('\n'); + } else { + actionGuidance = [ + '⏳ WAITING - Session is running, not yet at breakpoint', + '', + 'The program is executing. To pause:', + '• Wait for it to hit your breakpoint', + '• Or use debug_step_operation(pause) to pause immediately', + '', + 'Inspection tools (get_debug_variables, evaluate_debug_expression) ', + 'will NOT work until the session is PAUSED.' + ].join('\n'); + } + + // Determine if this is a debugjava (No-Config) session that can be safely stopped + const isNoConfigSession = sessionInfo.name.includes('No-Config') || + sessionInfo.name.includes('debugjava'); + const launchMethod = isNoConfigSession + ? 'debugjava (No-Config) - ✅ Can be safely stopped' + : sessionInfo.configuration.request === 'attach' + ? 'External attach - ⚠️ Stopping will disconnect from process' + : 'VS Code launch - ✅ Can be safely stopped'; + + const message = [ + '═══════════════════════════════════════════', + isPaused ? '🔴 DEBUG SESSION PAUSED' : '🟢 DEBUG SESSION RUNNING', + '═══════════════════════════════════════════', + '', + statusLine, + locationInfo, + '', + '───────────────────────────────────────────', + 'Session Details:', + `• Session ID: ${sessionInfo.id}`, + `• Name: ${sessionInfo.name}`, + `• Type: ${sessionInfo.type}`, + `• Request: ${sessionInfo.configuration.request || 'N/A'}`, + `• Launch Method: ${launchMethod}`, + `• Main Class: ${sessionInfo.configuration.mainClass || 'N/A'}`, + '', + '───────────────────────────────────────────', + actionGuidance, + '═══════════════════════════════════════════' + ].join('\n'); + + sendInfo('', { + operationName: 'languageModelTool.getDebugSessionInfo', + sessionId: session.id, + sessionType: session.type, + isPaused: String(isPaused), + stoppedThreadId: String(stoppedThreadId || ''), + currentFile, + currentLine: String(currentLine) + }); + + return new (vscode as any).LanguageModelToolResult([ + new (vscode as any).LanguageModelTextPart(message) + ]); + } catch (error) { + return new (vscode as any).LanguageModelToolResult([ + new (vscode as any).LanguageModelTextPart(`✗ Failed to get debug session info: ${error}`) + ]); + } + } + }; + disposables.push(lmApi.registerTool('get_debug_session_info', getDebugSessionInfoTool)); + + return disposables; +} + +/** + * Simple wildcard matching helper + */ +function matchWildcard(text: string, pattern: string): boolean { + const regex = new RegExp('^' + pattern.split('*').map(escapeRegex).join('.*') + '$'); + return regex.test(text); +} + +function escapeRegex(str: string): string { + return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); +} diff --git a/src/languageServerPlugin.ts b/src/languageServerPlugin.ts new file mode 100644 index 00000000..bbafd573 --- /dev/null +++ b/src/languageServerPlugin.ts @@ -0,0 +1,154 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +import * as vscode from "vscode"; +import { Range } from "vscode-languageserver-types"; + +import * as commands from "./commands"; + +export enum CompileWorkspaceStatus { + FAILED = 0, + SUCCEED = 1, + WITHERROR = 2, + CANCELLED = 3, +} + +export interface IMainClassOption { + readonly mainClass: string; + readonly projectName?: string; + readonly filePath?: string; +} + +export interface IMainMethod extends IMainClassOption { + range: vscode.Range; +} + +export const CONFIGERROR_INVALID_CLASS_NAME = 1; +export const CONFIGERROR_MAIN_CLASS_NOT_EXIST = 2; +export const CONFIGERROR_MAIN_CLASS_NOT_UNIQUE = 3; +export const CONFIGERROR_INVALID_JAVA_PROJECT = 4; +export interface IValidationResult { + readonly isValid: boolean; + readonly message?: string; + readonly kind?: number; +} + +export interface ILaunchValidationResponse { + readonly mainClass: IValidationResult; + readonly projectName: IValidationResult; + readonly proposals?: IMainClassOption[]; +} + +export async function resolveMainMethod(uri: vscode.Uri, token?: vscode.CancellationToken): Promise { + if (token) { + return await commands.executeJavaLanguageServerCommand(commands.JAVA_RESOLVE_MAINMETHOD, uri.toString(), token); + } + + return await commands.executeJavaLanguageServerCommand(commands.JAVA_RESOLVE_MAINMETHOD, uri.toString()); +} + +export function startDebugSession() { + return commands.executeJavaLanguageServerCommand(commands.JAVA_START_DEBUGSESSION); +} + +export function resolveClasspath(mainClass: string, projectName: string, scope?: string) { + return commands.executeJavaLanguageServerCommand(commands.JAVA_RESOLVE_CLASSPATH, mainClass, projectName, scope); +} + +export function resolveMainClass(workspaceUri?: vscode.Uri): Promise { + if (workspaceUri) { + return >commands.executeJavaLanguageServerCommand(commands.JAVA_RESOLVE_MAINCLASS, workspaceUri.toString()); + } + return >commands.executeJavaLanguageServerCommand(commands.JAVA_RESOLVE_MAINCLASS); +} + +export function resolveMainClassFromProject(projectName: string): Promise { + return >commands.executeJavaLanguageServerCommand(commands.JAVA_RESOLVE_MAINCLASS, projectName); +} + +export function validateLaunchConfig(mainClass: string, projectName: string, containsExternalClasspaths: boolean, workspaceUri?: vscode.Uri): + Promise { + return >commands.executeJavaLanguageServerCommand(commands.JAVA_VALIDATE_LAUNCHCONFIG, + workspaceUri ? workspaceUri.toString() : undefined, mainClass, projectName, containsExternalClasspaths); +} + +export function inferLaunchCommandLength(config: vscode.DebugConfiguration): Promise { + return >commands.executeJavaLanguageServerCommand(commands.JAVA_INFER_LAUNCH_COMMAND_LENGTH, JSON.stringify(config)); +} + +export function checkProjectSettings(className: string, projectName: string, inheritedOptions: boolean, expectedOptions: {[key: string]: string}): +Promise { + return >commands.executeJavaLanguageServerCommand( + commands.JAVA_CHECK_PROJECT_SETTINGS, JSON.stringify({ + className, + projectName, + inheritedOptions, + expectedOptions, + })); +} + +const COMPILER_PB_ENABLE_PREVIEW_FEATURES: string = "org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures"; +export async function detectPreviewFlag(className: string, projectName: string): Promise { + const expectedOptions = { + [COMPILER_PB_ENABLE_PREVIEW_FEATURES]: "enabled", + }; + return checkProjectSettings(className, projectName, true, expectedOptions); +} + +export function resolveElementAtSelection(uri: string, line: number, character: number): Promise { + return >commands.executeJavaLanguageServerCommand(commands.JAVA_RESOLVE_ELEMENT_AT_SELECTION, uri, line, character); +} + +export function resolveBuildFiles(): Promise { + return >commands.executeJavaLanguageServerCommand(commands.JAVA_RESOLVE_BUILD_FILES); +} + +export async function isOnClasspath(uri: string): Promise { + try { + return await commands.executeJavaExtensionCommand(commands.JAVA_IS_ON_CLASSPATH, uri); + } catch (error) { + return true; + } +} + +export function resolveJavaExecutable(mainClass: string, projectName: string) { + return commands.executeJavaLanguageServerCommand(commands.JAVA_RESOLVE_JAVAEXECUTABLE, mainClass, projectName); +} + +export function fetchPlatformSettings(): any { + return commands.executeJavaLanguageServerCommand(commands.JAVA_FETCH_PLATFORM_SETTINGS); +} + +export async function resolveClassFilters(patterns: string[]): Promise { + return await commands.executeJavaLanguageServerCommand(commands.JAVA_RESOLVE_CLASSFILTERS, ...patterns); +} + +export async function resolveSourceUri(line: string): Promise { + return await commands.executeJavaLanguageServerCommand(commands.JAVA_RESOLVE_SOURCE_URI, line); +} + +export async function resolveInlineVariables(inlineParams: InlineParams): Promise { + return await commands.executeJavaLanguageServerCommand(commands.JAVA_RESOLVE_INLINE_VARIABLES, JSON.stringify(inlineParams)); +} + +// tslint:disable-next-line:interface-name +export interface InlineParams { + uri: string; + viewPort?: Range; + stoppedLocation: Range; +} + +// tslint:disable-next-line:interface-name +export enum InlineKind { + VariableLookup = 0, + Evaluation = 1, +} + +// tslint:disable-next-line:interface-name +export interface InlineVariable { + range: Range; + name: string; + kind: InlineKind; + expression: string; + declaringClass: string; +} diff --git a/src/launchCommand.ts b/src/launchCommand.ts new file mode 100644 index 00000000..75a6d201 --- /dev/null +++ b/src/launchCommand.ts @@ -0,0 +1,199 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. +import * as cp from "child_process"; +import * as fs from "fs"; +import * as _ from "lodash"; +import * as path from "path"; +import * as vscode from "vscode"; + +import { UNSUPPORTED_CLASS_VERSION_ERROR } from "./anchor"; +import { fetchPlatformSettings, inferLaunchCommandLength } from "./languageServerPlugin"; +import { getJavaHome, showWarningMessageWithTroubleshooting } from "./utility"; + +enum shortenApproach { + none = "none", + jarmanifest = "jarmanifest", + argfile = "argfile", +} + +const HELPFUL_NPE_VMARGS = "-XX:+ShowCodeDetailsInExceptionMessages"; + +/** + * Returns the recommended approach to shorten the command line length. + * @param config the launch configuration + * @param runtimeVersion the target runtime version + */ +export async function getShortenApproachForCLI(config: vscode.DebugConfiguration, runtimeVersion: number): Promise { + const recommendedShortenApproach = runtimeVersion <= 8 ? shortenApproach.jarmanifest : shortenApproach.argfile; + return (await shouldShortenIfNecessary(config)) ? recommendedShortenApproach : shortenApproach.none; +} + +/** + * Validates whether the specified runtime version could be supported by the Java tooling. + * @param runtimeVersion the target runtime version + */ +export async function validateRuntimeCompatibility(runtimeVersion: number) { + try { + const platformSettings = await fetchPlatformSettings(); + if (platformSettings && platformSettings.latestSupportedJavaVersion) { + const latestSupportedVersion = flattenMajorVersion(platformSettings.latestSupportedJavaVersion); + if (latestSupportedVersion < runtimeVersion) { + showWarningMessageWithTroubleshooting({ + message: "The compiled classes are not compatible with the runtime JDK. To mitigate the issue, please refer to \"Learn More\".", + anchor: UNSUPPORTED_CLASS_VERSION_ERROR, + }); + } + } + } catch (err) { + // do nothing + } +} + +/** + * Add some helpful VM arguments to the launch configuration based on the target runtime version. + * @param config the launch configuration + * @param runtimeVersion the target runtime version + */ +export async function addMoreHelpfulVMArgs(config: vscode.DebugConfiguration, runtimeVersion: number) { + try { + if (runtimeVersion >= 14) { + // JEP-358: https://openjdk.java.net/jeps/358 + if (config.vmArgs && config.vmArgs.indexOf(HELPFUL_NPE_VMARGS) >= 0) { + return; + } + + config.vmArgs = (config.vmArgs || "") + " " + HELPFUL_NPE_VMARGS; + } + } catch (error) { + // do nothing. + } +} + +/** + * Returns the target runtime version. If the javaExec is not specified, then return the current Java version + * that the Java tooling used. + * @param javaExec the path of the Java executable + */ +export async function getJavaVersion(javaExec: string): Promise { + javaExec = javaExec || path.join(await getJavaHome(), "bin", "java"); + let javaVersion = await checkVersionInReleaseFile(path.resolve(javaExec, "..", "..")); + if (!javaVersion) { + javaVersion = await checkVersionByCLI(javaExec); + } + return javaVersion; +} + +async function checkVersionInReleaseFile(javaHome: string): Promise { + if (!javaHome) { + return 0; + } + const releaseFile = path.join(javaHome, "release"); + if (!await fs.existsSync(releaseFile)) { + return 0; + } + + try { + const content = fs.readFileSync(releaseFile); + const regexp = /^JAVA_VERSION="(.*)"/gm; + const match = regexp.exec(content.toString()); + if (!match) { + return 0; + } + const majorVersion = flattenMajorVersion(match[1]); + return majorVersion; + } catch (error) { + // ignore + } + + return 0; +} + +/** + * Get version by parsing `JAVA_HOME/bin/java -version` + */ +async function checkVersionByCLI(javaExec: string): Promise { + if (!javaExec) { + return 0; + } + return new Promise((resolve) => { + cp.execFile(javaExec, ["-version"], {}, (_error, _stdout, stderr) => { + const regexp = /version "(.*)"/g; + const match = regexp.exec(stderr); + if (!match) { + return resolve(0); + } + const javaVersion = flattenMajorVersion(match[1]); + resolve(javaVersion); + }); + }); +} + +function flattenMajorVersion(version: string): number { + // Ignore '1.' prefix for legacy Java versions + if (version.startsWith("1.")) { + version = version.substring(2); + } + + // look into the interesting bits now + const regexp = /\d+/g; + const match = regexp.exec(version); + let javaVersion = 0; + if (match) { + javaVersion = parseInt(match[0], 10); + } + + return javaVersion; +} + +async function shouldShortenIfNecessary(config: vscode.DebugConfiguration): Promise { + const cliLength = await inferLaunchCommandLength(config); + const classPaths = config.classPaths || []; + const modulePaths = config.modulePaths || []; + const classPathLength = classPaths.join(path.delimiter).length; + const modulePathLength = modulePaths.join(path.delimiter).length; + if (!config.console || config.console === "internalConsole") { + return cliLength >= getMaxProcessCommandLineLength(config) || classPathLength >= getMaxArgLength() || modulePathLength >= getMaxArgLength(); + } else { + return classPaths.length > 1 || modulePaths.length > 1; + } +} + +function getMaxProcessCommandLineLength(config: vscode.DebugConfiguration): number { + const ARG_MAX_WINDOWS = 32768; + const ARG_MAX_MACOS = 262144; + const ARG_MAX_LINUX = 2097152; + // for Posix systems, ARG_MAX is the maximum length of argument to the exec functions including environment data. + // POSIX suggests to subtract 2048 additionally so that the process may safely modify its environment. + // see https://www.in-ulm.de/~mascheck/various/argmax/ + if (process.platform === "win32") { + // https://blogs.msdn.microsoft.com/oldnewthing/20031210-00/?p=41553/ + // On windows, the max process commmand line length is 32k (32768) characters. + return ARG_MAX_WINDOWS - 2048; + } else if (process.platform === "darwin") { + return ARG_MAX_MACOS - getEnvironmentLength(config) - 2048; + } else if (process.platform === "linux") { + return ARG_MAX_LINUX - getEnvironmentLength(config) - 2048; + } + + return Number.MAX_SAFE_INTEGER; +} + +function getEnvironmentLength(config: vscode.DebugConfiguration): number { + const env = config.env || {}; + return _.isEmpty(env) ? 0 : Object.keys(env).map((key) => strlen(key) + strlen(env[key]) + 1).reduce((a, b) => a + b); +} + +function strlen(str: string): number { + return str ? str.length : 0; +} + +function getMaxArgLength(): number { + const MAX_ARG_STRLEN_LINUX = 131072; + if (process.platform === "linux") { + // On Linux, MAX_ARG_STRLEN (kernel >= 2.6.23) is the maximum length of a command line argument (or environment variable). Its value + // cannot be changed without recompiling the kernel. + return MAX_ARG_STRLEN_LINUX - 2048; + } + + return Number.MAX_SAFE_INTEGER; +} diff --git a/src/logger.ts b/src/logger.ts deleted file mode 100644 index 37df1b00..00000000 --- a/src/logger.ts +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -import * as vscode from "vscode"; -import TelemetryReporter from "vscode-extension-telemetry"; - -export enum Type { - EXCEPTION = "exception", - USAGEDATA = "usageData", - USAGEERROR = "usageError", - ACTIVATEEXTENSION = "activateExtension", // TODO: Activation belongs to usage data, remove this category. -} - -class Logger { - private reporter: TelemetryReporter = null; - - public initialize(context: vscode.ExtensionContext): void { - if (this.reporter) { - return; - } - - const extensionPackage = require(context.asAbsolutePath("./package.json")); - if (extensionPackage) { - const packageInfo = { - name: extensionPackage.name, - version: extensionPackage.version, - aiKey: extensionPackage.aiKey, - }; - if (packageInfo.aiKey) { - this.reporter = new TelemetryReporter(packageInfo.name, packageInfo.version, packageInfo.aiKey); - } - } - } - - public log(type: Type, properties?: { [key: string]: string; }, measures?: { [key: string]: number; }): void { - if (!this.reporter) { - return; - } - - this.reporter.sendTelemetryEvent(type, properties, measures); - } - - public logMessage(type: Type, message: string): void { - this.log(type, { message }); - } -} - -export const logger = new Logger(); diff --git a/src/mainClassPicker.ts b/src/mainClassPicker.ts new file mode 100644 index 00000000..d34121d5 --- /dev/null +++ b/src/mainClassPicker.ts @@ -0,0 +1,189 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +import * as _ from "lodash"; +import * as path from "path"; +import { TextEditor, window } from "vscode"; +import { IMainClassOption } from "./languageServerPlugin"; + +const defaultLabelFormatter = (option: IMainClassOption) => { + return option.mainClass; +}; +type Formatter = (option: IMainClassOption) => string; + +class MainClassPicker { + private cache: { [key: string]: number } = {}; + + // tslint:disable-next-line + public async showQuickPick(options: IMainClassOption[], placeHolder: string): Promise; + // tslint:disable-next-line + public async showQuickPick(options: IMainClassOption[], placeHolder: string, labelFormatter: Formatter): Promise; + // tslint:disable-next-line + public async showQuickPick(options: IMainClassOption[], placeHolder: string, autoPick: boolean): Promise; + // tslint:disable-next-line + public async showQuickPick(options: IMainClassOption[], placeHolder: string, parameter3?: Formatter | boolean, + parameter4?: boolean): Promise { + let labelFormatter: Formatter = defaultLabelFormatter; + let autoPick: boolean = true; + if (typeof parameter3 === "function") { + labelFormatter = parameter3; + } else if (typeof parameter3 === "boolean") { + autoPick = parameter3; + } + if (typeof parameter4 === "boolean") { + autoPick = parameter4; + } + + if (!options || !options.length) { + return undefined; + } else if (autoPick && options.length === 1) { + return options[0]; + } + + const pickItems = options.map((option) => { + return { + label: labelFormatter(option), + description: option.filePath ? path.basename(option.filePath) : "", + detail: option.projectName ? `Project: ${option.projectName}` : "", + data: option, + }; + }); + + const selected = await window.showQuickPick(pickItems, { placeHolder }); + if (selected) { + return selected.data; + } + return undefined; + } + + // tslint:disable-next-line + public async showQuickPickWithRecentlyUsed(options: IMainClassOption[], placeHolder: string): Promise; + // tslint:disable-next-line + public async showQuickPickWithRecentlyUsed(options: IMainClassOption[], placeHolder: string, labelFormatter: Formatter): Promise; + // tslint:disable-next-line + public async showQuickPickWithRecentlyUsed(options: IMainClassOption[], placeHolder: string, autoPick: boolean): Promise; + // tslint:disable-next-line + public async showQuickPickWithRecentlyUsed(options: IMainClassOption[], placeHolder: string, parameter3?: Formatter | boolean, + parameter4?: boolean): Promise { + // Record the main class picking history in a most recently used cache. + let labelFormatter: Formatter = defaultLabelFormatter; + let autoPick: boolean = true; + if (typeof parameter3 === "function") { + labelFormatter = parameter3; + } else if (typeof parameter3 === "boolean") { + autoPick = parameter3; + } + if (typeof parameter4 === "boolean") { + autoPick = parameter4; + } + + if (!options || !options.length) { + return undefined; + } else if (autoPick && options.length === 1) { + return options[0]; + } + + // Sort the Main Class options with the recently used timestamp. + options.sort((a: IMainClassOption, b: IMainClassOption) => { + return this.getMRUTimestamp(b) - this.getMRUTimestamp(a); + }); + + const mostRecentlyUsedOption: IMainClassOption | undefined = (options.length && this.contains(options[0])) ? options[0] : undefined; + const isMostRecentlyUsed = (option: IMainClassOption): boolean => { + return !!mostRecentlyUsedOption + && mostRecentlyUsedOption.mainClass === option.mainClass + && mostRecentlyUsedOption.projectName === option.projectName; + }; + const isFromActiveEditor = (option: IMainClassOption): boolean => { + const activeEditor: TextEditor | undefined = window.activeTextEditor; + const currentActiveFile: string | undefined = _.get(activeEditor, "document.uri.fsPath"); + if (option.filePath && currentActiveFile) { + return path.relative(option.filePath, currentActiveFile) === ""; + } + return false; + }; + const isPrivileged = (option: IMainClassOption): boolean => { + return isMostRecentlyUsed(option) || isFromActiveEditor(option); + }; + + // Show the most recently used Main Class as the first one, + // then the Main Class from Active Editor as second, + // finally other Main Class. + const adjustedOptions: IMainClassOption[] = []; + options.forEach((option: IMainClassOption) => { + if (isPrivileged(option)) { + adjustedOptions.push(option); + } + }); + options.forEach((option: IMainClassOption) => { + if (!isPrivileged(option)) { + adjustedOptions.push(option); + } + }); + + const pickItems = adjustedOptions.map((option) => { + const adjustedDetail = []; + if (isMostRecentlyUsed(option)) { + adjustedDetail.push("$(clock) recently used"); + } + + if (isFromActiveEditor(option) && option.filePath) { + adjustedDetail.push(`$(file-text) active editor (${path.basename(option.filePath)})`); + } + + if (option.projectName) { + adjustedDetail.push(`Project: ${option.projectName}`); + } + + const detail: string = adjustedDetail.join(", "); + + return { + label: labelFormatter ? labelFormatter(option) : defaultLabelFormatter(option), + description: option.filePath ? path.basename(option.filePath) : "", + detail, + data: option, + }; + }); + + const selected = await window.showQuickPick(pickItems, { placeHolder }); + if (selected) { + this.updateMRUTimestamp(selected.data); + return selected.data; + } + return undefined; + } + + /** + * Checks whether the item options can be picked automatically without popping up the QuickPick box. + * @param options the item options to pick + * @param autoPick pick it automatically if only one option is available + */ + public isAutoPicked(options: IMainClassOption[], autoPick?: boolean) { + const shouldAutoPick: boolean = (autoPick === undefined ? true : !!autoPick); + if (!options || !options.length) { + return true; + } else if (shouldAutoPick && options.length === 1) { + return true; + } + + return false; + } + + private getMRUTimestamp(mainClassOption: IMainClassOption): number { + return this.cache[this.getKey(mainClassOption)] || 0; + } + + private updateMRUTimestamp(mainClassOption: IMainClassOption): void { + this.cache[this.getKey(mainClassOption)] = Date.now(); + } + + private contains(mainClassOption: IMainClassOption): boolean { + return Boolean(this.cache[this.getKey(mainClassOption)]); + } + + private getKey(mainClassOption: IMainClassOption): string { + return mainClassOption.mainClass + "|" + mainClassOption.projectName; + } +} + +export const mainClassPicker: MainClassPicker = new MainClassPicker(); diff --git a/src/noConfigDebugInit.ts b/src/noConfigDebugInit.ts new file mode 100644 index 00000000..b0da4f01 --- /dev/null +++ b/src/noConfigDebugInit.ts @@ -0,0 +1,247 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +import * as fs from 'fs'; +import * as path from 'path'; +import * as crypto from 'crypto'; +import * as vscode from 'vscode'; + +import { sendInfo, sendError } from "vscode-extension-telemetry-wrapper"; +import { getJavaHome } from "./utility"; + +/** + * Registers the configuration-less debugging setup for the extension. + * + * This function sets up environment variables and a file system watcher to + * facilitate debugging without requiring a pre-configured launch.json file. + * + * @param envVarCollection - The collection of environment variables to be modified. + * @param extPath - The path to the extension directory. + * + * Environment Variables: + * - `VSCODE_JDWP_ADAPTER_ENDPOINTS`: Path to the file containing the debugger adapter endpoint. + * - `JAVA_TOOL_OPTIONS`: JDWP configuration for automatic debugging. + * - `PATH`: Appends the path to the noConfigScripts directory. + */ +export async function registerNoConfigDebug( + envVarCollection: vscode.EnvironmentVariableCollection, + extPath: string, +): Promise { + const collection = envVarCollection; + + // create a temp directory for the noConfigDebugAdapterEndpoints + // file path format: extPath/.noConfigDebugAdapterEndpoints/endpoint-stableWorkspaceHash.txt + let workspaceString = vscode.workspace.workspaceFile?.fsPath; + if (!workspaceString) { + workspaceString = vscode.workspace.workspaceFolders?.map((e) => e.uri.fsPath).join(';'); + } + if (!workspaceString) { + const error: Error = { + name: "NoConfigDebugError", + message: '[Java Debug] No workspace folder found', + }; + sendError(error); + return Promise.resolve(new vscode.Disposable(() => { })); + } + + // create a stable hash for the workspace folder, reduce terminal variable churn + const hash = crypto.createHash('sha256'); + hash.update(workspaceString.toString()); + const stableWorkspaceHash = hash.digest('hex').slice(0, 16); + + const tempDirPath = path.join(extPath, '.noConfigDebugAdapterEndpoints'); + const tempFilePath = path.join(tempDirPath, `endpoint-${stableWorkspaceHash}.txt`); + + // create the temp directory if it doesn't exist + if (!fs.existsSync(tempDirPath)) { + fs.mkdirSync(tempDirPath, { recursive: true }); + } else { + // remove endpoint file in the temp directory if it exists (async to avoid blocking) + if (fs.existsSync(tempFilePath)) { + fs.promises.unlink(tempFilePath).catch((err) => { + const error: Error = { + name: "NoConfigDebugError", + message: `[Java Debug] Failed to cleanup old endpoint file: ${err}`, + }; + sendError(error); + }); + } + } + + // clear the env var collection to remove any existing env vars + collection.clear(); + + // Add env var for VSCODE_JDWP_ADAPTER_ENDPOINTS + // Note: We do NOT set JAVA_TOOL_OPTIONS globally to avoid affecting all Java processes + // (javac, maven, gradle, language server, etc.). Instead, JAVA_TOOL_OPTIONS is set + // only in the debugjava wrapper scripts (debugjava.ps1, debugjava.bat, debugjava) + collection.replace('VSCODE_JDWP_ADAPTER_ENDPOINTS', tempFilePath); + + // Try to get Java executable from Java Language Server + // This ensures we use the same Java version as the project is compiled with + try { + const javaHome = await getJavaHome(); + if (javaHome) { + const javaExec = path.join(javaHome, 'bin', 'java'); + collection.replace('VSCODE_JAVA_EXEC', javaExec); + } + } catch (error) { + // If we can't get Java from Language Server, that's okay + // The wrapper script will fall back to JAVA_HOME or PATH + } + + const noConfigScriptsDir = path.join(extPath, 'bundled', 'scripts', 'noConfigScripts'); + const pathSeparator = process.platform === 'win32' ? ';' : ':'; + + // Check if the current PATH already ends with a path separator to avoid double separators + const currentPath = process.env.PATH || ''; + const needsSeparator = currentPath.length > 0 && !currentPath.endsWith(pathSeparator); + const pathValueToAppend = needsSeparator ? `${pathSeparator}${noConfigScriptsDir}` : noConfigScriptsDir; + + collection.append('PATH', pathValueToAppend); + + // create file system watcher for the debuggerAdapterEndpointFolder for when the communication port is written + const fileSystemWatcher = vscode.workspace.createFileSystemWatcher( + new vscode.RelativePattern(tempDirPath, '**/*.txt') + ); + + // Track active debug sessions to prevent duplicates + const activeDebugSessions = new Set(); + + // Handle both file creation and modification to support multiple runs + const handleEndpointFile = async (uri: vscode.Uri) => { + const filePath = uri.fsPath; + + // Add a small delay to ensure file is fully written + // File system events can fire before write is complete + await new Promise(resolve => setTimeout(resolve, 100)); + + fs.readFile(filePath, (err, data) => { + if (err) { + const error: Error = { + name: "NoConfigDebugError", + message: `[Java Debug] No-config debug failed: file_read_error - ${err}`, + }; + sendError(error); + return; + } + try { + // parse the client port + const dataParse = data.toString(); + const jsonData = JSON.parse(dataParse); + + // Validate JSON structure + if (!jsonData || typeof jsonData !== 'object' || !jsonData.client) { + const error: Error = { + name: "NoConfigDebugError", + message: `[Java Debug] No-config debug failed: invalid_format - ${dataParse}`, + }; + sendError(error); + return; + } + + const clientPort = jsonData.client.port; + + // Validate port number + if (!clientPort || typeof clientPort !== 'number' || clientPort < 1 || clientPort > 65535) { + const error: Error = { + name: "NoConfigDebugError", + message: `[Java Debug] No-config debug failed: invalid_port - ${clientPort}`, + }; + sendError(error); + return; + } + + // Check if we already have an active session for this port + if (activeDebugSessions.has(clientPort)) { + // Skip duplicate session silently - this is expected behavior + return; + } + + // Mark this port as active + activeDebugSessions.add(clientPort); + + const options: vscode.DebugSessionOptions = { + noDebug: false, + }; + + // start debug session with the client port + vscode.debug.startDebugging( + undefined, + { + type: 'java', + request: 'attach', + name: 'Attach to Java (No-Config)', + hostName: 'localhost', + port: clientPort, + }, + options, + ).then( + (started) => { + if (started) { + // Send telemetry only on successful session start with port info + sendInfo('', { message: '[Java Debug] No-config debug session started', port: clientPort }); + // Clean up the endpoint file after successful debug session start (async) + if (fs.existsSync(filePath)) { + fs.promises.unlink(filePath).catch((cleanupErr) => { + // Cleanup failure is non-critical, just log for debugging + const error: Error = { + name: "NoConfigDebugError", + message: `[Java Debug] No-config debug failed: cleanup_error - ${cleanupErr}`, + }; + sendError(error); + }); + } + } else { + const error: Error = { + name: "NoConfigDebugError", + message: `[Java Debug] No-config debug failed: attach_failed - port ${clientPort}`, + }; + sendError(error); + // Remove from active sessions on failure + activeDebugSessions.delete(clientPort); + } + }, + (error) => { + const attachError: Error = { + name: "NoConfigDebugError", + message: `[Java Debug] No-config debug failed: attach_error - port ${clientPort} - ${error}`, + }; + sendError(attachError); + // Remove from active sessions on error + activeDebugSessions.delete(clientPort); + }, + ); + } catch (parseErr) { + const error: Error = { + name: "NoConfigDebugError", + message: `[Java Debug] No-config debug failed: parse_error - ${parseErr}`, + }; + sendError(error); + } + }); + }; + + // Listen for both file creation and modification events + const fileCreationEvent = fileSystemWatcher.onDidCreate(handleEndpointFile); + const fileChangeEvent = fileSystemWatcher.onDidChange(handleEndpointFile); + + // Clean up active sessions when debug session ends + const debugSessionEndListener = vscode.debug.onDidTerminateDebugSession((session) => { + if (session.name === 'Attach to Java (No-Config)' && session.configuration.port) { + const port = session.configuration.port; + activeDebugSessions.delete(port); + // Session end is normal operation, no telemetry needed + } + }); + + return Promise.resolve( + new vscode.Disposable(() => { + fileSystemWatcher.dispose(); + fileCreationEvent.dispose(); + fileChangeEvent.dispose(); + debugSessionEndListener.dispose(); + activeDebugSessions.clear(); + }), + ); +} diff --git a/src/processPicker.ts b/src/processPicker.ts new file mode 100644 index 00000000..a9f11ff0 --- /dev/null +++ b/src/processPicker.ts @@ -0,0 +1,95 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +import * as path from "path"; +import { window } from "vscode"; +import { getProcesses, getProcessTree } from "./processTree"; + +const JAVA_PATTERN = /(?:java|javaw|j9|j9w)$/i; +const DEBUG_MODE_PATTERN = /(-agentlib|-Xrunjdwp):\S*(address=[^\s,]+)/i; + +interface IJavaProcess { + pid: number; + command: string; + args: string; + hostName: string; + debugPort: number; +} + +function convertToJavaProcess(pid: number, command: string, args: string): IJavaProcess | undefined { + if (process.platform === "win32" && command.indexOf("\\??\\") === 0) { + // remove leading device specifier + command = command.replace("\\??\\", ""); + } + + const simpleName = path.basename(command, ".exe"); + if (JAVA_PATTERN.test(simpleName) && args) { + const match = args.match(DEBUG_MODE_PATTERN); + if (match && match.length) { + const address = match[2].split("=")[1].split(":"); + const hostName = address.length > 1 ? address[0] : "127.0.0.1"; + const debugPort = parseInt(address[address.length - 1], 10); + const exeName = path.basename(command); + const binPath = path.dirname(command); + const commandPath = path.basename(binPath) === "bin" ? + path.join(path.basename(path.dirname(binPath)), "bin", exeName) : exeName; + return { + pid, + command: commandPath, + args, + hostName, + debugPort, + }; + } + } + + return undefined; +} + +export async function pickJavaProcess(): Promise { + const javaProcesses: IJavaProcess[] = []; + try { + await getProcesses((pid: number, _ppid: number, command: string, args: string, _date: number) => { + const javaProcess = convertToJavaProcess(pid, command, args); + if (javaProcess) { + javaProcesses.push(javaProcess); + } + }); + } catch (error) { + throw new Error("Process picker failed: " + error); + } + + if (!javaProcesses.length) { + throw new Error("Process picker: Cannot find any debuggable Java process. Please make sure to use vmArgs like " + + "'-agentlib:jdwp=transport=dt_socket,server=y,address=5005' to turn on debug mode when you start your " + + "program."); + } + + const items = javaProcesses.map((process) => { + return { + label: process.command, + description: process.args, + detail: `process id: ${process.pid}, debug port: ${process.debugPort}`, + process, + }; + }); + + const pick = await window.showQuickPick(items, { + placeHolder: "Pick Java process to attach to", + }); + + if (pick) { + return pick.process; + } + + return undefined; +} + +export async function resolveJavaProcess(pid: number): Promise { + const processTree = await getProcessTree(pid); + if (!processTree || processTree.pid !== pid) { + return undefined; + } + + return convertToJavaProcess(processTree.pid, processTree.command, processTree.args); +} diff --git a/src/processTree.ts b/src/processTree.ts new file mode 100644 index 00000000..7a0840e0 --- /dev/null +++ b/src/processTree.ts @@ -0,0 +1,201 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + * + * Copied from https://github.com/microsoft/vscode-node-debug/blob/master/src/node/extension/processTree.ts + *--------------------------------------------------------------------------------------------*/ +/* tslint:disable */ +'use strict'; + +import { spawn, ChildProcessWithoutNullStreams } from 'child_process'; +import { join } from 'path'; + +export class ProcessTreeNode { + children?: ProcessTreeNode[]; + + constructor(public pid: number, public ppid: number, public command: string, public args: string) { + } +} + +export async function getProcessTree(rootPid: number) : Promise { + + const map = new Map(); + + map.set(0, new ProcessTreeNode(0, 0, '???', '')); + + try { + await getProcesses((pid: number, ppid: number, command: string, args: string) => { + if (pid !== ppid) { + map.set(pid, new ProcessTreeNode(pid, ppid, command, args)); + } + }); + } catch (err) { + return undefined; + } + + const values = map.values(); + for (const p of values) { + const parent = map.get(p.ppid); + if (parent && parent !== p) { + if (!parent.children) { + parent.children = []; + } + parent.children.push(p); + } + } + + if (!isNaN(rootPid) && rootPid > 0) { + return map.get(rootPid); + } + return map.get(0); +} + +export function getProcesses(one: (pid: number, ppid: number, command: string, args: string, date?: number) => void) : Promise { + + // returns a function that aggregates chunks of data until one or more complete lines are received and passes them to a callback. + function lines(callback: (a: string) => void) { + let unfinished = ''; // unfinished last line of chunk + return (data: string | Buffer) => { + const lines = data.toString().split(/\r?\n/); + const finishedLines = lines.slice(0, lines.length - 1); + finishedLines[0] = unfinished + finishedLines[0]; // complete previous unfinished line + unfinished = lines[lines.length - 1]; // remember unfinished last line of this chunk for next round + for (const s of finishedLines) { + callback(s); + } + }; + } + + return new Promise((resolve, reject) => { + + let proc: ChildProcessWithoutNullStreams; + + if (process.platform === 'win32') { + + // attributes columns are in alphabetic order! + const CMD_PAT = /^(.*)\s+([0-9]+)\.[0-9]+[+-][0-9]+\s+([0-9]+)\s+([0-9]+)$/; + + const wmic = join(process.env['WINDIR'] || 'C:\\Windows', 'System32', 'wbem', 'WMIC.exe'); + proc = spawn(wmic, [ 'process', 'get', 'CommandLine,CreationDate,ParentProcessId,ProcessId' ]); + proc.stdout.setEncoding('utf8'); + proc.stdout.on('data', lines(line => { + let matches = CMD_PAT.exec(line.trim()); + if (matches && matches.length === 5) { + const pid = Number(matches[4]); + const ppid = Number(matches[3]); + const date = Number(matches[2]); + let args = matches[1].trim(); + if (!isNaN(pid) && !isNaN(ppid) && args) { + let command = args; + if (args[0] === '"') { + const end = args.indexOf('"', 1); + if (end > 0) { + command = args.substr(1, end-1); + args = args.substr(end + 2); + } + } else { + const end = args.indexOf(' '); + if (end > 0) { + command = args.substr(0, end); + args = args.substr(end + 1); + } else { + args = ''; + } + } + one(pid, ppid, command, args, date); + } + } + })); + + } else if (process.platform === 'darwin') { // OS X + + proc = spawn('/bin/ps', [ '-x', '-o', `pid,ppid,comm=${'a'.repeat(256)},command` ]); + proc.stdout.setEncoding('utf8'); + proc.stdout.on('data', lines(line => { + + const pid = Number(line.substr(0, 5)); + const ppid = Number(line.substr(6, 5)); + const command = line.substr(12, 256).trim(); + const args = line.substr(269 + command.length); + + if (!isNaN(pid) && !isNaN(ppid)) { + one(pid, ppid, command, args); + } + })); + + } else { // linux + + proc = spawn('/bin/ps', [ '-ax', '-o', 'pid:6,ppid:6,comm:20,command' ]); // we specify the column width explicitly + proc.stdout.setEncoding('utf8'); + proc.stdout.on('data', lines(line => { + + // the following substr arguments must match the column width specified for the "ps" command above + // regular substr is deprecated + const pid = Number(substr(line, 0, 6)); + const ppid = Number(substr(line, 7, 6)); + const shortName = substr(line, 14, 20).trim() + const fullCommand = substr(line, 35) + + let command = shortName; + let args = fullCommand; + + const pos = fullCommand.indexOf(shortName); + if (pos >= 0) { + // binaries with spaces in path may not work + // possible solution to read directly from /proc + const commandEndPositionMaybe = fullCommand.indexOf(" ", pos + shortName.length); + const commandEndPosition = commandEndPositionMaybe < 0 ? fullCommand.length : commandEndPositionMaybe; + command = fullCommand.substring(0, commandEndPosition) + args = fullCommand.substring(commandEndPosition).trimStart() + } + + + if (!isNaN(pid) && !isNaN(ppid)) { + one(pid, ppid, command, args); + } + })); + } + + proc.on('error', err => { + reject(err); + }); + + proc.stderr.setEncoding('utf8'); + proc.stderr.on('data', data => { + const e = data.toString(); + if (e.indexOf('screen size is bogus') >= 0) { + // ignore this error silently; see https://github.com/microsoft/vscode/issues/75932 + } else { + reject(new Error(data.toString())); + } + }); + + proc.on('close', (code, signal) => { + if (code === 0) { + resolve(); + } else if (code !== null && code > 0) { + reject(new Error(`process terminated with exit code: ${code}`)); + } + if (signal) { + reject(new Error(`process terminated with signal: ${signal}`)); + } + }); + + proc.on('exit', (code, signal) => { + if (typeof code === 'number') { + if (code === 0) { + //resolve(); + } else if (code > 0) { + reject(new Error(`process terminated with exit code: ${code}`)); + } + } + if (signal) { + reject(new Error(`process terminated with signal: ${signal}`)); + } + }); + }); +} + +function substr(str: string, startIndex: number, length?: number) { + return str.slice(startIndex, length != undefined ? startIndex + length : str.length) +} diff --git a/src/progressAPI.ts b/src/progressAPI.ts new file mode 100644 index 00000000..d78581d8 --- /dev/null +++ b/src/progressAPI.ts @@ -0,0 +1,82 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +import { CancellationToken, ProgressLocation } from "vscode"; + +export interface IProgressReporter { + /** + * Set the job name. + * @param jobName the job name + */ + setJobName(jobName: string): void; + + /** + * Returns the id of the progress reporter. + */ + getId(): string; + + /** + * Returns the progress location. + */ + getProgressLocation(): ProgressLocation | { viewId: string }; + + /** + * Reports a progress message update. + * @param message the message to update + * @param increment use `increment` to report discrete progress. Each call with a `increment` + * value will be summed up and reflected as overall progress until 100% is reached. + * Note that currently only `ProgressLocation.Notification` is capable of showing + * discrete progress. + */ + report(message: string, increment?: number): void; + + /** + * Shows the progress reporter. + */ + show(): void; + + /** + * Hides the progress reporter. + * @param onlyNotifications only hide the progress reporter when it's shown as notification. + */ + hide(onlyNotifications?: boolean): void; + + /** + * Returns whether the progress reporter has been cancelled or completed. + */ + isCancelled(): boolean; + + /** + * Notifies the work is done that is either the task is completed or the user has cancelled it. + */ + done(): void; + + /** + * The CancellationToken to monitor if the progress reporter has been cancelled by the user. + */ + getCancellationToken(): CancellationToken; + + /** + * Disposes the progress reporter if the observed token has been cancelled. + * @param token the cancellation token to observe + */ + observe(token?: CancellationToken): void; +} + +export interface IProgressProvider { + /** + * Creates a progress reporter. + * @param jobName the job name + * @param progressLocation The location at which progress should show, defaults to `ProgressLocation.Notification`. + * @param cancellable Controls if a cancel button should show to allow the user to cancel the progress reporter, + * defaults to true. Note that currently only `ProgressLocation.Notification` is supporting + * to show a cancel button. + */ + createProgressReporter(jobName: string, progressLocation?: ProgressLocation | { viewId: string }, cancellable?: boolean): IProgressReporter; + + /** + * Returns the progress reporter with the progress id. + * @param progressId the progress id + */ + getProgressReporter(progressId: string): IProgressReporter | undefined; +} diff --git a/src/progressImpl.ts b/src/progressImpl.ts new file mode 100644 index 00000000..6ee2a98c --- /dev/null +++ b/src/progressImpl.ts @@ -0,0 +1,168 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +import { v4 } from "uuid"; +import { CancellationToken, CancellationTokenSource, Disposable, EventEmitter, ProgressLocation, + StatusBarAlignment, StatusBarItem, window, workspace } from "vscode"; +import { IProgressProvider, IProgressReporter } from "./progressAPI"; + +const STATUS_COMMAND: string = "java.show.server.task.status"; +class ProgressReporter implements IProgressReporter { + private _id: string = v4(); + private _jobName: string; + private _progressLocation: ProgressLocation | { viewId: string }; + private _cancellable: boolean = false; + + private _message: string; + private _increment: number | undefined; + private _isShown: boolean; + + private _tokenSource = new CancellationTokenSource(); + private _statusBarItem: StatusBarItem | undefined; + private _cancelProgressEventEmitter: EventEmitter; + private _progressEventEmitter: EventEmitter; + private _disposables: Disposable[] = []; + + constructor(jobName: string, progressLocation: ProgressLocation | { viewId: string }, cancellable: boolean) { + this._jobName = jobName; + this._progressLocation = progressLocation || ProgressLocation.Notification; + this._cancellable = cancellable; + const config = workspace.getConfiguration("java"); + if (config.silentNotification && this._progressLocation === ProgressLocation.Notification) { + this._progressLocation = ProgressLocation.Window; + } + + if (this._progressLocation === ProgressLocation.Window) { + this._statusBarItem = window.createStatusBarItem(this._id, StatusBarAlignment.Left, 1); + this._statusBarItem.name = "Progress Message for " + this._jobName; + this._statusBarItem.text = `$(sync~spin) ${this._jobName}...`; + this._statusBarItem.command = { + title: "Check Java Build Status", + command: STATUS_COMMAND, + arguments: [], + }; + this._statusBarItem.tooltip = "Check Java Build Status"; + this._disposables.push(this._statusBarItem); + } + + this._cancelProgressEventEmitter = new EventEmitter(); + this._progressEventEmitter = new EventEmitter(); + this._disposables.push(this._cancelProgressEventEmitter); + this._disposables.push(this._progressEventEmitter); + this._disposables.push(this._tokenSource); + } + + public setJobName(jobName: string): void { + this._jobName = jobName; + } + + public getId(): string { + return this._id; + } + + public getProgressLocation(): ProgressLocation | { viewId: string } { + return this._progressLocation; + } + + public report(message: string, increment?: number): void { + if (this._statusBarItem) { + const text = message ? `${this._jobName} - ${message}` : `${this._jobName}...`; + this._statusBarItem.text = `$(sync~spin) ${text}`; + } + + this._message = message; + this._increment = increment; + this._progressEventEmitter.fire(); + this.show(); + } + + public show(): void { + if (this._statusBarItem) { + this._statusBarItem.show(); + return; + } + + this.showNativeProgress(); + } + + public hide(onlyNotifications?: boolean): void { + if (onlyNotifications && this._progressLocation === ProgressLocation.Notification) { + this._cancelProgressEventEmitter.fire(); + this._isShown = false; + } + } + + public isCancelled(): boolean { + return this.getCancellationToken().isCancellationRequested; + } + + public done(): void { + this._tokenSource.cancel(); + this._cancelProgressEventEmitter.fire(); + this._statusBarItem?.hide(); + this._disposables.forEach((disposable) => disposable.dispose()); + ( progressProvider).remove(this); + } + + public getCancellationToken(): CancellationToken { + return this._tokenSource.token; + } + + public observe(token?: CancellationToken): void { + token?.onCancellationRequested(() => { + this.done(); + }); + } + + private showNativeProgress() { + if (this._isShown) { + return; + } + + this._isShown = true; + window.withProgress({ + location: this._progressLocation, + title: this._jobName ? `[${this._jobName}](command:${STATUS_COMMAND})` : undefined, + cancellable: this._cancellable, + }, (progress, token) => { + progress.report({ + message: this._message, + increment: this._increment, + }); + this.observe(token); + this._progressEventEmitter.event(() => { + progress.report({ + message: this._message, + increment: this._increment, + }); + }); + return new Promise((resolve) => { + this._cancelProgressEventEmitter.event(() => { + resolve(true); + }); + }); + }); + } +} + +class ProgressProvider implements IProgressProvider { + private store: { [key: string]: IProgressReporter } = {}; + + public createProgressReporter(jobName: string, progressLocation?: ProgressLocation | { viewId: string }, + cancellable?: boolean): IProgressReporter { + const progressReporter = new ProgressReporter(jobName, progressLocation || ProgressLocation.Notification, + cancellable === undefined ? true : !!cancellable); + this.store[progressReporter.getId()] = progressReporter; + return progressReporter; + } + + public getProgressReporter(progressId: string): IProgressReporter | undefined { + return this.store[progressId]; + } + + public remove(progressReporter: IProgressReporter) { + delete this.store[progressReporter.getId()]; + } +} + +export const progressProvider: IProgressProvider = new ProgressProvider(); diff --git a/src/terminalLinkProvider.ts b/src/terminalLinkProvider.ts new file mode 100644 index 00000000..33016f71 --- /dev/null +++ b/src/terminalLinkProvider.ts @@ -0,0 +1,67 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +import { CancellationToken, commands, Position, ProviderResult, Range, TerminalLink, TerminalLinkContext, + TerminalLinkProvider, Uri, window } from "vscode"; +import { sendInfo } from "vscode-extension-telemetry-wrapper"; +import { resolveSourceUri } from "./languageServerPlugin"; + +export class JavaTerminalLinkProvder implements TerminalLinkProvider { + /** + * Provide terminal links for the given context. Note that this can be called multiple times + * even before previous calls resolve, make sure to not share global objects (eg. `RegExp`) + * that could have problems when asynchronous usage may overlap. + * @param context Information about what links are being provided for. + * @param token A cancellation token. + * @return A list of terminal links for the given line. + */ + public provideTerminalLinks(context: TerminalLinkContext, _token: CancellationToken): ProviderResult { + const isDebuggerTerminal: boolean = context.terminal.name.startsWith("Run:") || context.terminal.name.startsWith("Debug:"); + const regex = new RegExp("(\\sat\\s+)([\\w$\\.]+\\/)?(([\\w$]+\\.)+[<\\w$>]+)\\(([\\w-$]+\\.java:\\d+)\\)"); + const result: RegExpExecArray | null = regex.exec(context.line); + if (result && result.length) { + const stackTrace = `${result[2] || ""}${result[3]}(${result[5]})`; + const sourceLineNumber = Number(result[5].split(":")[1]); + return [{ + startIndex: result.index + result[1].length, + length: stackTrace.length, + methodName: result[3], + stackTrace, + lineNumber: sourceLineNumber, + isDebuggerTerminal, + }]; + } + + return []; + } + + /** + * Handle an activated terminal link. + */ + public async handleTerminalLink(link: IJavaTerminalLink): Promise { + sendInfo("", { + operationName: "handleJavaTerminalLink", + isDebuggerTerminal: String(link.isDebuggerTerminal), + }); + const uri = await resolveSourceUri(link.stackTrace); + if (uri) { + const lineNumber = Math.max(link.lineNumber - 1, 0); + window.showTextDocument(Uri.parse(uri), { + preserveFocus: true, + selection: new Range(new Position(lineNumber, 0), new Position(lineNumber, 0)), + }); + } else { + // If no source is found, then open the searching symbols quickpick box. + const fullyQualifiedName = link.methodName.substring(0, link.methodName.lastIndexOf(".")); + const className = fullyQualifiedName.substring(fullyQualifiedName.lastIndexOf(".") + 1); + commands.executeCommand("workbench.action.quickOpen", "#" + className); + } + } +} + +interface IJavaTerminalLink extends TerminalLink { + methodName: string; + stackTrace: string; + lineNumber: number; + isDebuggerTerminal: boolean; +} diff --git a/src/threadOperations.ts b/src/threadOperations.ts new file mode 100644 index 00000000..23ca45c6 --- /dev/null +++ b/src/threadOperations.ts @@ -0,0 +1,36 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +import * as vscode from "vscode"; +import { instrumentOperationAsVsCodeCommand } from "vscode-extension-telemetry-wrapper"; + +export function initializeThreadOperations(context: vscode.ExtensionContext) { + context.subscriptions.push(instrumentOperationAsVsCodeCommand("java.debug.continueAll", async (threadId) => { + await operateThread("continueAll", threadId); + })); + + context.subscriptions.push(instrumentOperationAsVsCodeCommand("java.debug.continueOthers", async (threadId) => { + await operateThread("continueOthers", threadId); + })); + + context.subscriptions.push(instrumentOperationAsVsCodeCommand("java.debug.pauseAll", async (threadId) => { + await operateThread("pauseAll", threadId); + })); + + context.subscriptions.push(instrumentOperationAsVsCodeCommand("java.debug.pauseOthers", async (threadId) => { + await operateThread("pauseOthers", threadId); + })); +} + +async function operateThread(request: string, threadId: any): Promise { + const debugSession: vscode.DebugSession | undefined = vscode.debug.activeDebugSession; + if (!debugSession) { + return; + } + + if (debugSession.configuration.noDebug) { + return; + } + + await debugSession.customRequest(request, { threadId }); +} diff --git a/src/utility.ts b/src/utility.ts index 3bf86d9d..94c8e77c 100644 --- a/src/utility.ts +++ b/src/utility.ts @@ -1,12 +1,15 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. -import * as opn from "opn"; import * as vscode from "vscode"; -import { logger, Type } from "./logger"; +import { sendError, sendInfo, setUserError } from "vscode-extension-telemetry-wrapper"; +import { Type } from "./javaLogger"; +import { IMainClassOption, resolveMainClass } from "./languageServerPlugin"; +import { IProgressReporter } from "./progressAPI"; const TROUBLESHOOTING_LINK = "https://github.com/Microsoft/vscode-java-debug/blob/master/Troubleshooting.md"; const LEARN_MORE = "Learn More"; +const JAVA_EXTENSION_ID = "redhat.java"; export class UserError extends Error { public context: ITroubleshootingMessage; @@ -14,17 +17,28 @@ export class UserError extends Error { constructor(context: ITroubleshootingMessage) { super(context.message); this.context = context; + setUserError(this); } } -interface IProperties { - [key: string]: string; +export class JavaExtensionNotEnabledError extends Error { + constructor(message: string) { + super(message); + setUserError(this); + } +} + +export class OperationCancelledError extends Error { + constructor(message: string) { + super(message); + } } interface ILoggingMessage { - message: string; type?: Type; - details?: IProperties; + message: string; + stack?: string; + bypassLog?: boolean; } interface ITroubleshootingMessage extends ILoggingMessage { @@ -32,65 +46,103 @@ interface ITroubleshootingMessage extends ILoggingMessage { } function logMessage(message: ILoggingMessage): void { - if (!message.type) { + if (!message.type || message.bypassLog) { return; } - if (message.details) { - logger.log(message.type, message.details); + if (message.type === Type.EXCEPTION || message.type === Type.USAGEERROR) { + const error: Error = { + name: "error", + message: message.message, + stack: message.stack, + }; + if (message.type === Type.USAGEERROR) { + setUserError(error); + } + sendError(error); } else { - logger.logMessage(message.type, message.message); + sendInfo("", { message: message.message }); } } export async function showInformationMessage(message: ILoggingMessage, ...items: string[]): Promise { logMessage(message); - return await vscode.window.showInformationMessage(message.message, ...items); + return vscode.window.showInformationMessage(message.message, ...items); } export async function showWarningMessage(message: ILoggingMessage, ...items: string[]): Promise { logMessage(message); - return await vscode.window.showWarningMessage(message.message, ...items); + return vscode.window.showWarningMessage(message.message, ...items); } export async function showErrorMessage(message: ILoggingMessage, ...items: string[]): Promise { logMessage(message); - return await vscode.window.showErrorMessage(message.message, ...items); + return vscode.window.showErrorMessage(message.message, ...items); } export async function showInformationMessageWithTroubleshooting(message: ITroubleshootingMessage, ...items: string[]): Promise { const choice = await showInformationMessage(message, ...items, LEARN_MORE); - return handleTroubleshooting(choice, message.message, message.anchor); + return handleTroubleshooting(message.message, choice, message.anchor); } export async function showWarningMessageWithTroubleshooting(message: ITroubleshootingMessage, ...items: string[]): Promise { const choice = await showWarningMessage(message, ...items, LEARN_MORE); - return handleTroubleshooting(choice, message.message, message.anchor); + return handleTroubleshooting(message.message, choice, message.anchor); } export async function showErrorMessageWithTroubleshooting(message: ITroubleshootingMessage, ...items: string[]): Promise { const choice = await showErrorMessage(message, ...items, LEARN_MORE); - return handleTroubleshooting(choice, message.message, message.anchor); + return handleTroubleshooting(message.message, choice, message.anchor); } -function openLink(url: string): void { - opn(url); -} - -function handleTroubleshooting(choice: string, message: string, anchor: string): string | undefined { +function handleTroubleshooting(message: string, choice?: string, anchor?: string): string | undefined { if (choice === LEARN_MORE) { - openLink(anchor ? `${TROUBLESHOOTING_LINK}#${anchor}` : TROUBLESHOOTING_LINK); - logger.log(Type.USAGEDATA, { - troubleshooting: "yes", - troubleshootingMessage: message, - }); - return; + openTroubleshootingPage(message, anchor); + return undefined; } return choice; } -export function formatErrorProperties(ex: any): IProperties { +export function openTroubleshootingPage(message: string, anchor?: string) { + vscode.commands.executeCommand("vscode.open", vscode.Uri.parse(anchor ? `${TROUBLESHOOTING_LINK}#${anchor}` : TROUBLESHOOTING_LINK)); + sendInfo("", { + troubleshooting: "yes", + troubleshootingMessage: message, + }); +} + +export async function guideToInstallJavaExtension() { + const MESSAGE = "Language Support for Java is required. Please install and enable it."; + const INSTALL = "Install"; + const choice = await vscode.window.showWarningMessage(MESSAGE, INSTALL); + if (choice === INSTALL) { + await installJavaExtension(); + } +} + +async function installJavaExtension() { + await vscode.window.withProgress({ location: vscode.ProgressLocation.Notification }, async (p) => { + p.report({ message: "Installing Language Support for Java ..." }); + await vscode.commands.executeCommand("workbench.extensions.installExtension", JAVA_EXTENSION_ID); + }); + const RELOAD = "Reload Window"; + const choice = await vscode.window.showInformationMessage("Please reload window to activate Language Support for Java.", RELOAD); + if (choice === RELOAD) { + await vscode.commands.executeCommand("workbench.action.reloadWindow"); + } +} + +export function convertErrorToMessage(err: Error): ILoggingMessage { + const properties = formatErrorProperties(err); + return { + type: Type.EXCEPTION, + message: properties.message, + stack: properties.stackTrace, + }; +} + +function formatErrorProperties(ex: any): any { const exception = (ex && ex.data && ex.data.cause) || { stackTrace: (ex && ex.stack), detailMessage: String((ex && ex.message) || ex || "Unknown exception") }; @@ -111,14 +163,163 @@ export function formatErrorProperties(ex: any): IProperties { } export async function getJavaHome(): Promise { - const extension = vscode.extensions.getExtension("redhat.java"); - try { - const extensionApi = await extension.activate(); - if (extensionApi && extensionApi.javaRequirement) { - return extensionApi.javaRequirement.java_home; + const extensionApi = await getJavaExtensionAPI(); + if (extensionApi && extensionApi.javaRequirement) { + return extensionApi.javaRequirement.java_home; + } + + return ""; +} + +export function getJavaExtensionAPI(progressReporter?: IProgressReporter): Thenable { + const extension = vscode.extensions.getExtension(JAVA_EXTENSION_ID); + if (!extension) { + throw new JavaExtensionNotEnabledError("VS Code Java Extension is not enabled."); + } + + return new Promise(async (resolve) => { + progressReporter?.getCancellationToken().onCancellationRequested(() => { + resolve(undefined); + }); + + resolve(await extension.activate()); + }); +} + +export function getJavaExtension(): vscode.Extension | undefined { + return vscode.extensions.getExtension(JAVA_EXTENSION_ID); +} + +export function isJavaExtEnabled(): boolean { + const javaExt = vscode.extensions.getExtension(JAVA_EXTENSION_ID); + return !!javaExt; +} + +export function isJavaExtActivated(): boolean { + const javaExt = vscode.extensions.getExtension(JAVA_EXTENSION_ID); + return !!javaExt && javaExt.isActive; +} + +export function isGitBash(isIntegratedTerminal: boolean): boolean { + const currentWindowsShellPath: string | undefined = isIntegratedTerminal ? vscode.env.shell : + vscode.workspace.getConfiguration("terminal")?.get("external.windowsExec"); + if (!currentWindowsShellPath) { + return false; + } + + const candidates: string[] = ["Git\\bin\\bash.exe", "Git\\bin\\bash", "Git\\usr\\bin\\bash.exe", "Git\\usr\\bin\\bash"]; + const find: string | undefined = candidates.find((candidate: string) => currentWindowsShellPath.endsWith(candidate)); + return !!find; +} + +export enum ServerMode { + STANDARD = "Standard", + LIGHTWEIGHT = "LightWeight", + HYBRID = "Hybrid", +} + +/** + * Wait for Java Language Support extension being on Standard mode, + * and return true if the final status is on Standard mode. + */ +export async function waitForStandardMode(progressReporter: IProgressReporter): Promise { + const importMessage = progressReporter?.getProgressLocation() === vscode.ProgressLocation.Notification ? + "Importing projects, [check details](command:java.show.server.task.status)" : "Importing projects..."; + if (await isImportingProjects()) { + progressReporter.report(importMessage); + } + + const api = await getJavaExtensionAPI(progressReporter); + if (!api) { + return false; + } + + if (api && api.serverMode === ServerMode.LIGHTWEIGHT) { + const answer = await vscode.window.showInformationMessage("Run/Debug feature requires Java language server to run in Standard mode. " + + "Do you want to switch it to Standard mode now?", "Yes", "Cancel"); + if (answer === "Yes") { + if (api.serverMode === ServerMode.STANDARD) { + return true; + } + + progressReporter?.report(importMessage); + return new Promise((resolve) => { + progressReporter.getCancellationToken().onCancellationRequested(() => { + resolve(false); + }); + api.onDidServerModeChange((mode: string) => { + if (mode === ServerMode.STANDARD) { + resolve(true); + } + }); + + vscode.commands.executeCommand("java.server.mode.switch", ServerMode.STANDARD, true); + }); } + + return false; + } else if (api && api.serverMode === ServerMode.HYBRID) { + progressReporter.report(importMessage); + return new Promise((resolve) => { + progressReporter.getCancellationToken().onCancellationRequested(() => { + resolve(false); + }); + api.onDidServerModeChange((mode: string) => { + if (mode === ServerMode.STANDARD) { + resolve(true); + } + }); + }); + } + + return true; +} + +export async function searchMainMethods(uri?: vscode.Uri): Promise { + return resolveMainClass(uri); +} + +export async function searchMainMethodsWithProgress(uri?: vscode.Uri): Promise { + try { + return await vscode.window.withProgress( + { location: vscode.ProgressLocation.Window }, + async (p) => { + p.report({ message: "Searching main classes..." }); + return resolveMainClass(uri); + }); } catch (ex) { + vscode.window.showErrorMessage(String((ex && ex.message) || ex)); + throw ex; } +} - return ""; +async function isImportingProjects(): Promise { + const extension = vscode.extensions.getExtension(JAVA_EXTENSION_ID); + if (!extension) { + return false; + } + + const serverMode = getJavaServerMode(); + if (serverMode === ServerMode.STANDARD || serverMode === ServerMode.HYBRID) { + const allCommands = await vscode.commands.getCommands(); + return (!extension.isActive && allCommands.includes("java.show.server.task.status")) + || (extension.isActive && extension.exports?.serverMode === ServerMode.HYBRID); + } + + return false; +} + +function getJavaServerMode(): ServerMode { + return vscode.workspace.getConfiguration().get("java.server.launchMode") + || ServerMode.HYBRID; +} + +export function launchJobName(configName: string, noDebug: boolean): string { + let jobName = noDebug ? "Run" : "Debug"; + jobName += configName ? ` '${configName} '` : ""; + return jobName; +} + +export function launchJobNameByMainClass(mainClass: string, noDebug: boolean): string { + return launchJobName(mainClass.substr(mainClass.lastIndexOf(".") + 1), noDebug); } diff --git a/src/variableMenu.ts b/src/variableMenu.ts new file mode 100644 index 00000000..e12889e4 --- /dev/null +++ b/src/variableMenu.ts @@ -0,0 +1,99 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +import * as vscode from "vscode"; +import { instrumentOperationAsVsCodeCommand } from "vscode-extension-telemetry-wrapper"; + +export function registerVariableMenuCommands(context: vscode.ExtensionContext): void { + vscode.workspace.onDidChangeConfiguration((event) => { + if (event.affectsConfiguration("java.debug.settings") || event.affectsConfiguration("debug.autoExpandLazyVariables")) { + updateContextKeys(); + } + }); + // Initialize the context keys + updateContextKeys(); + + context.subscriptions.push(instrumentOperationAsVsCodeCommand( + "java.debug.variables.showHex", () => updateVariableFormatter("showHex", true))); + context.subscriptions.push(instrumentOperationAsVsCodeCommand( + "java.debug.variables.notShowHex", () => updateVariableFormatter("showHex", false))); + context.subscriptions.push(instrumentOperationAsVsCodeCommand( + "java.debug.variables.showQualifiedNames", () => updateVariableFormatter("showQualifiedNames", true))); + context.subscriptions.push(instrumentOperationAsVsCodeCommand( + "java.debug.variables.notShowQualifiedNames", () => updateVariableFormatter("showQualifiedNames", false))); + context.subscriptions.push(instrumentOperationAsVsCodeCommand( + "java.debug.variables.showStaticVariables", () => updateVariableFormatter("showStaticVariables", true))); + context.subscriptions.push(instrumentOperationAsVsCodeCommand( + "java.debug.variables.notShowStaticVariables", () => updateVariableFormatter("showStaticVariables", false))); + context.subscriptions.push(instrumentOperationAsVsCodeCommand( + "java.debug.variables.showLogicalStructure", () => updateVariableFormatter("showLogicalStructure", true))); + context.subscriptions.push(instrumentOperationAsVsCodeCommand( + "java.debug.variables.notShowLogicalStructure", () => updateVariableFormatter("showLogicalStructure", false))); + context.subscriptions.push(instrumentOperationAsVsCodeCommand( + "java.debug.variables.showToString", () => updateVariableFormatter("showToString", true))); + context.subscriptions.push(instrumentOperationAsVsCodeCommand( + "java.debug.variables.notShowToString", () => updateVariableFormatter("showToString", false))); + context.subscriptions.push(instrumentOperationAsVsCodeCommand( + "java.debug.variables.autoExpandLazyVariables", () => toggleLazyVariableSetting(true))); + context.subscriptions.push(instrumentOperationAsVsCodeCommand( + "java.debug.variables.manualExpandLazyVariables", () => toggleLazyVariableSetting(false))); +} + +async function updateVariableFormatter(key: string, value: any) { + const debugSettingsRoot: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("java.debug.settings"); + // Update the formatter to settings.json + await debugSettingsRoot.update(key, value, getConfigurationTarget("java.debug", "settings")); + refreshVariableView(); +} + +function refreshVariableView() { + const debugSettingsRoot: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("java.debug.settings"); + if (vscode.debug.activeDebugSession && vscode.debug.activeDebugSession.type === "java") { + const formatter: any = { + showHex: debugSettingsRoot.showHex, + showQualifiedNames: debugSettingsRoot.showQualifiedNames, + showStaticVariables: debugSettingsRoot.showStaticVariables, + showLogicalStructure: debugSettingsRoot.showLogicalStructure, + showToString: debugSettingsRoot.showToString, + }; + vscode.debug.activeDebugSession.customRequest("refreshVariables", formatter); + } +} + +async function toggleLazyVariableSetting(toggle: boolean) { + const javadDebugSettingsRoot: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("java.debug.settings"); + if (!javadDebugSettingsRoot.showToString) { + await javadDebugSettingsRoot.update("showToString", true, getConfigurationTarget("java.debug", "settings")); + } + + const debugSettingsRoot: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("debug"); + await debugSettingsRoot.update("autoExpandLazyVariables", toggle, getConfigurationTarget("debug", "autoExpandLazyVariables")); + refreshVariableView(); +} + +function getConfigurationTarget(section: string, key: string): vscode.ConfigurationTarget { + const inspect = vscode.workspace.getConfiguration(section).inspect(key); + if (inspect && inspect.workspaceFolderValue !== undefined) { + return vscode.ConfigurationTarget.WorkspaceFolder; + } else if (inspect && inspect.workspaceValue !== undefined) { + return vscode.ConfigurationTarget.Workspace; + } else { + return vscode.ConfigurationTarget.Global; + } +} + +function updateContextKeys() { + const debugSettingsRoot: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("java.debug.settings"); + if (debugSettingsRoot) { + vscode.commands.executeCommand("setContext", "javadebug:showHex", debugSettingsRoot.showHex ? "on" : "off"); + vscode.commands.executeCommand("setContext", "javadebug:showLogicalStructure", debugSettingsRoot.showLogicalStructure ? "on" : "off"); + vscode.commands.executeCommand("setContext", "javadebug:showQualifiedNames", debugSettingsRoot.showQualifiedNames ? "on" : "off"); + vscode.commands.executeCommand("setContext", "javadebug:showStaticVariables", debugSettingsRoot.showStaticVariables ? "on" : "off"); + vscode.commands.executeCommand("setContext", "javadebug:showToString", debugSettingsRoot.showToString ? "on" : "off"); + } + + const globalDebugRoot: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("debug"); + if (globalDebugRoot) { + vscode.commands.executeCommand("setContext", "javadebug:expandLazyVariable", globalDebugRoot.autoExpandLazyVariables ? "on" : "off"); + } +} diff --git a/src/variableResolver.ts b/src/variableResolver.ts deleted file mode 100644 index ee8643cd..00000000 --- a/src/variableResolver.ts +++ /dev/null @@ -1,234 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. -// Originally copied from https://github.com/Microsoft/vscode/blob/1.27.1/src/vs/workbench/services/configurationResolver/node/variableResolver.ts - -import * as _ from "lodash"; -import * as path from "path"; -import * as vscode from "vscode"; -export interface IProcessEnv { - [key: string]: string | undefined; -} - -function isWin(): boolean { - return /^win/.test(process.platform); -} - -function hasDriveLetter(_path: string): boolean { - return isWindows && _path && _path[1] === ":"; -} - -function normalizeDriveLetter(_path: string): string { - if (hasDriveLetter(_path)) { - return _path.charAt(0).toUpperCase() + _path.slice(1); - } - - return _path; -} -const isWindows = isWin(); - -export class VariableResolver { - private static VARIABLE_REGEXP = /\$\{(.*?)\}/g; - - public constructor(private readonly _envVariables: IProcessEnv = process.env) { - if (isWindows) { - this._envVariables = Object.create(null); - Object.keys(_envVariables).forEach((key) => { - this._envVariables[key.toLowerCase()] = _envVariables[key]; - }); - } - } - public resolveString(folderUri: vscode.Uri, value: string): string { - - const filePath = this.getFilePath(); - return value.replace(VariableResolver.VARIABLE_REGEXP, (match: string, variable: string) => { - - let argument: string; - const parts = variable.split(":"); - if (parts && parts.length > 1) { - variable = parts[0]; - argument = parts[1]; - } - - switch (variable) { - - case "env": - if (argument) { - if (isWindows) { - argument = argument.toLowerCase(); - } - const env = this._envVariables[argument]; - if (_.isString(env)) { - return env; - } - // For `env` we should do the same as a normal shell does - evaluates missing envs to an empty string #46436 - return ""; - } - throw new Error(`missingEnvVarName: '${match}' can not be resolved because no environment variable name is given.`); - - case "config": - if (argument) { - const config = this.getConfigurationValue(folderUri, argument); - if (_.isUndefined(config) || _.isNull(config)) { - throw new Error(`configNotFound: '${match}' can not be resolved because setting '${argument}' not found.`); - } - if (_.isObject(config)) { - throw new Error(`configNoString: '${match}' can not be resolved because '${argument}' is a structured value.`); - } - return config; - } - throw new Error(`missingConfigName: '${match}' can not be resolved because no settings name is given.`); - - default: { - - // common error handling for all variables that require an open folder and accept a folder name argument - switch (variable) { - case "workspaceRoot": - case "workspaceFolder": - case "workspaceRootFolderName": - case "workspaceFolderBasename": - case "relativeFile": - if (argument) { - const folder = this.getFolderUri(argument); - if (folder) { - folderUri = folder; - } else { - throw new Error(`canNotFindFolder: '${match}' can not be resolved. No such folder '${argument}'.`); - } - } - if (!folderUri) { - if (this.getWorkspaceFolderCount() > 1) { - throw new Error(`canNotResolveWorkspaceFolderMultiRoot: '${match}' ` + - `can not be resolved in a multi folder workspace. ` + - `Scope this variable using ":' and a workspace folder name.`); - } - throw new Error(`canNotResolveWorkspaceFolder: '${match}' can not be resolved. Please open a folder.`); - } - break; - default: - break; - } - - // common error handling for all variables that require an open file - switch (variable) { - case "file": - case "relativeFile": - case "fileDirname": - case "fileExtname": - case "fileBasename": - case "fileBasenameNoExtension": - if (!filePath) { - throw new Error(`canNotResolveFile: '${match}' can not be resolved. Please open an editor.`); - } - break; - default: - break; - } - - switch (variable) { - case "workspaceRoot": - case "workspaceFolder": - return normalizeDriveLetter(folderUri.fsPath); - - case "cwd": - return folderUri ? normalizeDriveLetter(folderUri.fsPath) : process.cwd(); - - case "workspaceRootFolderName": - case "workspaceFolderBasename": - return path.basename(folderUri.fsPath); - - case "lineNumber": - const lineNumber = this.getLineNumber(); - if (lineNumber) { - return lineNumber; - } - throw new Error(`canNotResolveLineNumber: '${match}' can not be resolved.` + - ` Make sure to have a line selected in the active editor.`); - - case "selectedText": - const selectedText = this.getSelectedText(); - if (selectedText) { - return selectedText; - } - throw new Error(`canNotResolveSelectedText: '${match}' can not be resolved.` + - ` Make sure to have some text selected in the active editor.`); - - case "file": - return filePath; - - case "relativeFile": - if (folderUri) { - return path.normalize(path.relative(folderUri.fsPath, filePath)); - } - return filePath; - - case "fileDirname": - return path.dirname(filePath); - - case "fileExtname": - return path.extname(filePath); - - case "fileBasename": - return path.basename(filePath); - - case "fileBasenameNoExtension": - const basename = path.basename(filePath); - return basename.slice(0, basename.length - path.extname(basename).length); - - case "execPath": - const ep = process.execPath; - if (ep) { - return ep; - } - return match; - - default: - return match; - } - } - } - }); - } - - private getFilePath(): string | undefined { - const activeEditor = vscode.window.activeTextEditor; - if (activeEditor) { - const resource = activeEditor.document.uri; - if (resource.scheme === "file") { - return path.normalize(resource.fsPath); - } - } - return undefined; - } - - private getSelectedText(): string | undefined { - const activeTextEditor = vscode.window.activeTextEditor; - if (activeTextEditor && activeTextEditor.selection) { - return activeTextEditor.document.getText(activeTextEditor.selection); - } - return undefined; - } - - private getLineNumber(): string | undefined { - const activeTextEditor = vscode.window.activeTextEditor; - if (activeTextEditor && activeTextEditor.selection) { - return String(activeTextEditor.selection.start.line); - } - return undefined; - } - - private getConfigurationValue(folderUri: vscode.Uri, suffix: string): string { - - const configuration = vscode.workspace.getConfiguration(undefined, folderUri); - const configValue = configuration.get(suffix); - return String(configValue); - } - - private getWorkspaceFolderCount(): number { - return vscode.workspace.workspaceFolders.length; - } - - private getFolderUri(folderName: string): vscode.Uri { - const folder = vscode.workspace.workspaceFolders.filter((f) => f.name === folderName).pop(); - return folder ? folder.uri : undefined; - } -} diff --git a/test/extension.test.ts b/test/extension.test.ts index b5fb28da..a2127763 100644 --- a/test/extension.test.ts +++ b/test/extension.test.ts @@ -1,20 +1,9 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. -// -// Note: This example test is leveraging the Mocha test framework. -// Please refer to their documentation on https://mochajs.org/ for help. -// - -// The module 'assert' provides assertion methods from node import * as assert from "assert"; - -// You can import and use all API from the 'vscode' module -// as well as import your extension to test it import * as vscode from "vscode"; -import * as myExtension from "../src/extension"; -// Defines a Mocha test suite to group tests of similar kind together suite("Extension Tests", () => { test("Extension should be present", () => { @@ -23,7 +12,7 @@ suite("Extension Tests", () => { test("should activate", function() { this.timeout(1 * 60 * 1000); - return vscode.extensions.getExtension("vscjava.vscode-java-debug").activate().then((api) => { + return vscode.extensions.getExtension("vscjava.vscode-java-debug")!.activate().then((_api) => { assert.ok(true); }); }); diff --git a/test/index.ts b/test/index.ts index b47e40e6..7e8d8261 100644 --- a/test/index.ts +++ b/test/index.ts @@ -1,26 +1,24 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. -// -// PLEASE DO NOT MODIFY / DELETE UNLESS YOU KNOW WHAT YOU ARE DOING -// -// This file is providing the test runner to use when running extension tests. -// By default the test runner in use is Mocha based. -// -// You can provide your own test runner if you want to override it by exporting -// a function run(testRoot: string, clb: (error:Error) => void) that the extension -// host can call to run the tests. The test runner is expected to use console.log -// to report the results back to the caller. When the tests are finished, return -// a possible error to the callback or null if none. +import * as path from "path"; +import { runTests } from "@vscode/test-electron"; -// tslint:disable-next-line:no-submodule-imports -import testRunner = require("vscode/lib/testrunner"); +async function main(): Promise { + try { + // The folder containing the Extension Manifest package.json + // Passed to `--extensionDevelopmentPath` + const extensionDevelopmentPath: string = path.resolve(__dirname, "../../"); -// You can directly control Mocha options by uncommenting the following lines -// See https://github.com/mochajs/mocha/wiki/Using-mocha-programmatically#set-options for more info -testRunner.configure({ - ui: "tdd", // the TDD UI is being used in extension.test.ts (suite, test, etc.) - useColors: true, // colored output from test results -}); + // The path to the extension test script + // Passed to --extensionTestsPath + const extensionTestsPath: string = path.resolve(__dirname, "./suite/index"); -module.exports = testRunner; + // Download VS Code, unzip it and run the integration test + await runTests({ extensionDevelopmentPath, extensionTestsPath }); + } catch (err) { + process.exit(1); + } +} + +main(); diff --git a/test/suite/index.ts b/test/suite/index.ts new file mode 100644 index 00000000..d87e690a --- /dev/null +++ b/test/suite/index.ts @@ -0,0 +1,40 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +import * as glob from "glob"; +import * as Mocha from "mocha"; +import * as path from "path"; + +export function run(): Promise { + // Create the mocha test + const mocha = new Mocha({ + ui: "tdd", + }); + mocha.options.color = true; + + const testsRoot = path.resolve(__dirname, ".."); + + return new Promise((c, e) => { + glob("**/**.test.js", { cwd: testsRoot }, (err, files) => { + if (err) { + return e(err); + } + + // Add files to the test suite + files.forEach((f) => mocha.addFile(path.resolve(testsRoot, f))); + + try { + // Run the mocha test + mocha.run((failures) => { + if (failures > 0) { + e(new Error(`${failures} tests failed.`)); + } else { + c(); + } + }); + } catch (err) { + e(err); + } + }); + }); +} diff --git a/testprojects/1.helloworld/.classpath b/testprojects/1.helloworld/.classpath deleted file mode 100644 index 02610159..00000000 --- a/testprojects/1.helloworld/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/testprojects/1.helloworld/.project b/testprojects/1.helloworld/.project deleted file mode 100644 index ab52c1af..00000000 --- a/testprojects/1.helloworld/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 1.helloworld - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/testprojects/1.helloworld/src/main/java/HelloWorld.java b/testprojects/1.helloworld/src/main/java/HelloWorld.java deleted file mode 100644 index 507090dc..00000000 --- a/testprojects/1.helloworld/src/main/java/HelloWorld.java +++ /dev/null @@ -1,13 +0,0 @@ -public class HelloWorld { - public static void main(String[] args) { - System.out.print("hello"); - if (args != null && args.length > 0) { - for (String arg : args) { - System.out.print(" " + arg); - } - System.out.println(); - } else { - System.out.println(" world"); - } - } -} \ No newline at end of file diff --git a/testprojects/10.junit/.classpath b/testprojects/10.junit/.classpath deleted file mode 100644 index 5fb16767..00000000 --- a/testprojects/10.junit/.classpath +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/testprojects/10.junit/.project b/testprojects/10.junit/.project deleted file mode 100644 index d19df6cb..00000000 --- a/testprojects/10.junit/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 10.junit - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/testprojects/10.junit/build.gradle_ b/testprojects/10.junit/build.gradle_ deleted file mode 100644 index fcac9678..00000000 --- a/testprojects/10.junit/build.gradle_ +++ /dev/null @@ -1,39 +0,0 @@ -apply plugin: 'java' -apply plugin: 'eclipse' -apply plugin: 'idea' - -buildscript { - repositories { - mavenCentral() - } - dependencies { classpath "commons-io:commons-io:2.5" } -} - -import org.apache.commons.io.FilenameUtils; - -sourceSets { - main.java.srcDirs = ['src/main/java'] -} -dependencies { - testCompile 'junit:junit:4.12' -} - - -repositories { - mavenCentral() -} - -def getShortJar = { e -> FilenameUtils.getName(e) } -eclipse.classpath.file { - withXml{xml -> - def node = xml.asNode() - - node.classpathentry.each{ - if (it.@kind == 'lib') { - it.@path = 'lib/' + getShortJar(it.@path); - it.@sourcepath = 'lib/' + getShortJar(it.@sourcepath); - } - - } - } -} \ No newline at end of file diff --git a/testprojects/10.junit/lib/hamcrest-core-1.3-sources.jar b/testprojects/10.junit/lib/hamcrest-core-1.3-sources.jar deleted file mode 100644 index c3c110b4..00000000 Binary files a/testprojects/10.junit/lib/hamcrest-core-1.3-sources.jar and /dev/null differ diff --git a/testprojects/10.junit/lib/hamcrest-core-1.3.jar b/testprojects/10.junit/lib/hamcrest-core-1.3.jar deleted file mode 100644 index 9d5fe16e..00000000 Binary files a/testprojects/10.junit/lib/hamcrest-core-1.3.jar and /dev/null differ diff --git a/testprojects/10.junit/lib/junit-4.12-sources.jar b/testprojects/10.junit/lib/junit-4.12-sources.jar deleted file mode 100644 index 884f92f5..00000000 Binary files a/testprojects/10.junit/lib/junit-4.12-sources.jar and /dev/null differ diff --git a/testprojects/10.junit/lib/junit-4.12.jar b/testprojects/10.junit/lib/junit-4.12.jar deleted file mode 100644 index 3a7fc266..00000000 Binary files a/testprojects/10.junit/lib/junit-4.12.jar and /dev/null differ diff --git a/testprojects/10.junit/src/main/java/MyClass.java b/testprojects/10.junit/src/main/java/MyClass.java deleted file mode 100644 index 20dc61a1..00000000 --- a/testprojects/10.junit/src/main/java/MyClass.java +++ /dev/null @@ -1,17 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2017 Microsoft Corporation and others. All rights reserved. - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: Microsoft Corporation - initial API and implementation - *******************************************************************************/ - -public class MyClass { - public int multiply(int x, int y) { - if (x > 999) { - throw new IllegalArgumentException("X should be less than 1000"); - } - return x * y; - } -} diff --git a/testprojects/10.junit/src/test/java/MyTest.java b/testprojects/10.junit/src/test/java/MyTest.java deleted file mode 100644 index 2b1abe01..00000000 --- a/testprojects/10.junit/src/test/java/MyTest.java +++ /dev/null @@ -1,18 +0,0 @@ -import static org.junit.Assert.assertEquals; - -import org.junit.Test; - -public class MyTest { - - @Test(expected = IllegalArgumentException.class) - public void testExceptionIsThrown() { - MyClass tester = new MyClass(); - tester.multiply(1000, 5); - } - - @Test - public void testMultiply() { - MyClass tester = new MyClass(); - assertEquals("10 x 5 must be 50", 50, tester.multiply(10, 5)); - } -} \ No newline at end of file diff --git a/testprojects/11.maven/pom.xml b/testprojects/11.maven/pom.xml deleted file mode 100644 index 88b3fe28..00000000 --- a/testprojects/11.maven/pom.xml +++ /dev/null @@ -1,18 +0,0 @@ - - 4.0.0 - com.mycompany.app - my-app - jar - 1.0-SNAPSHOT - my-app - http://maven.apache.org - - - junit - junit - 3.8.1 - test - - - diff --git a/testprojects/11.maven/src/main/java/com/mycompany/app/App.java b/testprojects/11.maven/src/main/java/com/mycompany/app/App.java deleted file mode 100644 index 77cf3e05..00000000 --- a/testprojects/11.maven/src/main/java/com/mycompany/app/App.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.mycompany.app; - -/** - * Hello world! - * - */ -public class App -{ - public static void main( String[] args ) - { - System.out.println( "Hello World!" ); - } -} diff --git a/testprojects/11.maven/src/test/java/com/mycompany/app/AppTest.java b/testprojects/11.maven/src/test/java/com/mycompany/app/AppTest.java deleted file mode 100644 index 33559900..00000000 --- a/testprojects/11.maven/src/test/java/com/mycompany/app/AppTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.mycompany.app; - -import junit.framework.Test; -import junit.framework.TestCase; -import junit.framework.TestSuite; - -/** - * Unit test for simple App. - */ -public class AppTest - extends TestCase -{ - /** - * Create the test case - * - * @param testName name of the test case - */ - public AppTest( String testName ) - { - super( testName ); - } - - /** - * @return the suite of tests being tested - */ - public static Test suite() - { - return new TestSuite( AppTest.class ); - } - - /** - * Rigourous Test :-) - */ - public void testApp() - { - assertTrue( true ); - } -} diff --git a/testprojects/12.gradle/.gitignore b/testprojects/12.gradle/.gitignore deleted file mode 100644 index 3b3bd9a1..00000000 --- a/testprojects/12.gradle/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -# Language server somehow recognizes build.gradle and compile this project. -# Ignore following generated files to keep SCM clean. -.gradle/ -.settings/ -.project -.classpath diff --git a/testprojects/12.gradle/build.gradle b/testprojects/12.gradle/build.gradle deleted file mode 100644 index ed50e206..00000000 --- a/testprojects/12.gradle/build.gradle +++ /dev/null @@ -1,6 +0,0 @@ -apply plugin: 'java' - - -sourceSets { - main.java.srcDirs = ['src/main/java'] -} \ No newline at end of file diff --git a/testprojects/12.gradle/src/main/java/GradleTest.java b/testprojects/12.gradle/src/main/java/GradleTest.java deleted file mode 100644 index f741d95e..00000000 --- a/testprojects/12.gradle/src/main/java/GradleTest.java +++ /dev/null @@ -1,5 +0,0 @@ -public class GradleTest { - public static void main(String[] args) { - System.out.println("This is a sample gradle project"); - } -} \ No newline at end of file diff --git a/testprojects/13.customcl/.classpath b/testprojects/13.customcl/.classpath deleted file mode 100644 index 56aca1ab..00000000 --- a/testprojects/13.customcl/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/testprojects/13.customcl/.project b/testprojects/13.customcl/.project deleted file mode 100644 index 815fce5c..00000000 --- a/testprojects/13.customcl/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 13.customcl - - - - org.eclipse.jdt.core.javanature - - - - org.eclipse.jdt.core.javabuilder - - - - - - diff --git a/testprojects/13.customcl/replacement/Foo.class b/testprojects/13.customcl/replacement/Foo.class deleted file mode 100644 index ef0cc914..00000000 Binary files a/testprojects/13.customcl/replacement/Foo.class and /dev/null differ diff --git a/testprojects/13.customcl/src/main/java/CustomCL.java b/testprojects/13.customcl/src/main/java/CustomCL.java deleted file mode 100644 index 76b4e253..00000000 --- a/testprojects/13.customcl/src/main/java/CustomCL.java +++ /dev/null @@ -1,56 +0,0 @@ -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.nio.file.Files; -import java.nio.file.Paths; - -class CustomCL extends ClassLoader { - private String baseFolder; - - public CustomCL(String baseFolder) { - super(null); - this.baseFolder = baseFolder; - } - - @Override - protected Class findClass(String name) throws ClassNotFoundException { - // load from parent - Class result = findLoadedClass(name); - if (result != null) { - return result; - } - - try { - File classFile = new File(baseFolder, name + ".class"); - if (classFile.exists()) { - byte[] bytes = Files.readAllBytes(Paths.get(classFile.getAbsolutePath())); - return defineClass(name, bytes, 0, bytes.length); - } - } catch (IOException e) { - e.printStackTrace(); - } - return getSystemClassLoader().loadClass(name); - - } - - @Override - protected Class loadClass(String name, boolean resolve) - throws ClassNotFoundException { - Class cls; - - cls = findLoadedClass(name); - if (cls == null) { - cls = findClass(name); - } - - if (cls == null) { - throw new ClassNotFoundException(name); - } - - if (resolve) - resolveClass(cls); - return cls; - } - -} \ No newline at end of file diff --git a/testprojects/13.customcl/src/main/java/CustomClassLoaderTest.java b/testprojects/13.customcl/src/main/java/CustomClassLoaderTest.java deleted file mode 100644 index e33d06de..00000000 --- a/testprojects/13.customcl/src/main/java/CustomClassLoaderTest.java +++ /dev/null @@ -1,26 +0,0 @@ -import java.io.File; - -public class CustomClassLoaderTest { - public static void main(String[] args) { - File replacement = new File(new File("").getAbsolutePath(), "replacement"); - if (!replacement.exists()) { - replacement = new File(new File("").getAbsolutePath(), "../replacement"); - } - - - final String replacementFolder = replacement.getAbsolutePath(); - new Thread(()-> { - try { - System.out.println("Using " + replacementFolder); - CustomCL cl = new CustomCL(replacementFolder); - Class cls = cl.loadClass("Foo"); - - IFoo foo = (IFoo)cls.newInstance(); - new Foo().sayHello(); - foo.sayHello(); - } catch(Exception ex) { - ex.printStackTrace(); - } - }).start(); - } -} \ No newline at end of file diff --git a/testprojects/13.customcl/src/main/java/Foo.java b/testprojects/13.customcl/src/main/java/Foo.java deleted file mode 100644 index 847995bb..00000000 --- a/testprojects/13.customcl/src/main/java/Foo.java +++ /dev/null @@ -1,5 +0,0 @@ -public class Foo implements IFoo { - public void sayHello() { - System.out.println("hello world! (version one)"); - } -} \ No newline at end of file diff --git a/testprojects/13.customcl/src/main/java/IFoo.java b/testprojects/13.customcl/src/main/java/IFoo.java deleted file mode 100644 index 3815c908..00000000 --- a/testprojects/13.customcl/src/main/java/IFoo.java +++ /dev/null @@ -1,3 +0,0 @@ -public interface IFoo { - void sayHello(); -} diff --git a/testprojects/14.encoding/.classpath b/testprojects/14.encoding/.classpath deleted file mode 100644 index 56aca1ab..00000000 --- a/testprojects/14.encoding/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/testprojects/14.encoding/.project b/testprojects/14.encoding/.project deleted file mode 100644 index 930649f5..00000000 --- a/testprojects/14.encoding/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 14.encoding - - - - org.eclipse.jdt.core.javanature - - - - org.eclipse.jdt.core.javabuilder - - - - - - diff --git a/testprojects/14.encoding/.settings/org.eclipse.core.resources.prefs b/testprojects/14.encoding/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index e9a7277b..00000000 --- a/testprojects/14.encoding/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -encoding//src/main/java/EncodingTest.java=gbk diff --git a/testprojects/14.encoding/src/main/java/EncodingTest.java b/testprojects/14.encoding/src/main/java/EncodingTest.java deleted file mode 100644 index 9a42422e..00000000 --- a/testprojects/14.encoding/src/main/java/EncodingTest.java +++ /dev/null @@ -1,25 +0,0 @@ -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.OutputStreamWriter; -import java.nio.charset.Charset; - -public class EncodingTest { - public static void main(String[] args) throws Exception { - String var = "abcdef"; - System.out.println(var); - System.out.println(var.length()); - System.out.println("Default Charset=" + Charset.defaultCharset()); - System.out.println("file.encoding=" + System.getProperty("file.encoding")); - System.out.println("Default Charset in Use=" + getDefaultCharSet()); - } - - private static String getDefaultCharSet() { - try (OutputStreamWriter writer = new OutputStreamWriter(new ByteArrayOutputStream())) { - return writer.getEncoding(); - } catch (IOException ex) { - ex.printStackTrace(); - return "exception"; - } - - } -} \ No newline at end of file diff --git a/testprojects/15.specialname/.classpath b/testprojects/15.specialname/.classpath deleted file mode 100644 index 56aca1ab..00000000 --- a/testprojects/15.specialname/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/testprojects/15.specialname/.project b/testprojects/15.specialname/.project deleted file mode 100644 index f64f0862..00000000 --- a/testprojects/15.specialname/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 15.specialname - - - - org.eclipse.jdt.core.javanature - - - - org.eclipse.jdt.core.javabuilder - - - - - - diff --git a/testprojects/15.specialname/src/main/java/ab$c/Hello$orld.java b/testprojects/15.specialname/src/main/java/ab$c/Hello$orld.java deleted file mode 100644 index 7e7eb635..00000000 --- a/testprojects/15.specialname/src/main/java/ab$c/Hello$orld.java +++ /dev/null @@ -1,6 +0,0 @@ -package ab$c; -public class Hello$orld { - public static void main(String args[]) { - System.out.println("Hello$orld"); - } -} \ No newline at end of file diff --git a/testprojects/16.resolvemainclass/.classpath b/testprojects/16.resolvemainclass/.classpath deleted file mode 100644 index 57ee5fb9..00000000 --- a/testprojects/16.resolvemainclass/.classpath +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/testprojects/16.resolvemainclass/.project b/testprojects/16.resolvemainclass/.project deleted file mode 100644 index b72952bc..00000000 --- a/testprojects/16.resolvemainclass/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 16.resolvemainclass - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/testprojects/16.resolvemainclass/build.gradle_ b/testprojects/16.resolvemainclass/build.gradle_ deleted file mode 100644 index fcac9678..00000000 --- a/testprojects/16.resolvemainclass/build.gradle_ +++ /dev/null @@ -1,39 +0,0 @@ -apply plugin: 'java' -apply plugin: 'eclipse' -apply plugin: 'idea' - -buildscript { - repositories { - mavenCentral() - } - dependencies { classpath "commons-io:commons-io:2.5" } -} - -import org.apache.commons.io.FilenameUtils; - -sourceSets { - main.java.srcDirs = ['src/main/java'] -} -dependencies { - testCompile 'junit:junit:4.12' -} - - -repositories { - mavenCentral() -} - -def getShortJar = { e -> FilenameUtils.getName(e) } -eclipse.classpath.file { - withXml{xml -> - def node = xml.asNode() - - node.classpathentry.each{ - if (it.@kind == 'lib') { - it.@path = 'lib/' + getShortJar(it.@path); - it.@sourcepath = 'lib/' + getShortJar(it.@sourcepath); - } - - } - } -} \ No newline at end of file diff --git a/testprojects/16.resolvemainclass/lib/hamcrest-core-1.3-sources.jar b/testprojects/16.resolvemainclass/lib/hamcrest-core-1.3-sources.jar deleted file mode 100644 index c3c110b4..00000000 Binary files a/testprojects/16.resolvemainclass/lib/hamcrest-core-1.3-sources.jar and /dev/null differ diff --git a/testprojects/16.resolvemainclass/lib/hamcrest-core-1.3.jar b/testprojects/16.resolvemainclass/lib/hamcrest-core-1.3.jar deleted file mode 100644 index 9d5fe16e..00000000 Binary files a/testprojects/16.resolvemainclass/lib/hamcrest-core-1.3.jar and /dev/null differ diff --git a/testprojects/16.resolvemainclass/lib/junit-4.12-sources.jar b/testprojects/16.resolvemainclass/lib/junit-4.12-sources.jar deleted file mode 100644 index 884f92f5..00000000 Binary files a/testprojects/16.resolvemainclass/lib/junit-4.12-sources.jar and /dev/null differ diff --git a/testprojects/16.resolvemainclass/lib/junit-4.12.jar b/testprojects/16.resolvemainclass/lib/junit-4.12.jar deleted file mode 100644 index 3a7fc266..00000000 Binary files a/testprojects/16.resolvemainclass/lib/junit-4.12.jar and /dev/null differ diff --git a/testprojects/16.resolvemainclass/src/main/java/MyApp.java b/testprojects/16.resolvemainclass/src/main/java/MyApp.java deleted file mode 100644 index 2ca40d87..00000000 --- a/testprojects/16.resolvemainclass/src/main/java/MyApp.java +++ /dev/null @@ -1,14 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2017 Microsoft Corporation and others. All rights reserved. - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: Microsoft Corporation - initial API and implementation - *******************************************************************************/ - -public class MyApp { - public static void main(String agrsp[]) { - System.out.println("Hello App!"); - } -} diff --git a/testprojects/16.resolvemainclass/src/test/java/MyAppTest.java b/testprojects/16.resolvemainclass/src/test/java/MyAppTest.java deleted file mode 100644 index 90c0d58f..00000000 --- a/testprojects/16.resolvemainclass/src/test/java/MyAppTest.java +++ /dev/null @@ -1,7 +0,0 @@ - -public class MyAppTest { - - public static void main(String agrsp[]) { - System.out.println("Hello test App!"); - } -} \ No newline at end of file diff --git a/testprojects/17.argstest/.classpath b/testprojects/17.argstest/.classpath deleted file mode 100644 index 51a8bbad..00000000 --- a/testprojects/17.argstest/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/testprojects/17.argstest/.project b/testprojects/17.argstest/.project deleted file mode 100644 index 587e9cc6..00000000 --- a/testprojects/17.argstest/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 17.argstest - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/testprojects/17.argstest/.settings/org.eclipse.jdt.core.prefs b/testprojects/17.argstest/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 3a215370..00000000 --- a/testprojects/17.argstest/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,11 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.8 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.8 diff --git a/testprojects/17.argstest/src/test/ArgsTest.java b/testprojects/17.argstest/src/test/ArgsTest.java deleted file mode 100644 index 5d9a2dc8..00000000 --- a/testprojects/17.argstest/src/test/ArgsTest.java +++ /dev/null @@ -1,23 +0,0 @@ -package test; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - - public class ArgsTest { - - public static void main(String[] args) throws IOException { - - List proList=Arrays.asList(args); - - String sysProp1Value = System.getProperty("sysProp1"); - String sysProp2Value = System.getProperty("sysProp2"); - List vmList=new ArrayList<>(); - vmList.add(sysProp1Value ); - vmList.add(sysProp2Value ); - String encoding=System.getProperty("file.encoding"); - System.out.println("Program Arguments:"+String.join(" ", proList)+" VM Arguments:"+String.join(" ",vmList)); - - } - } \ No newline at end of file diff --git a/testprojects/18.attachdebug/.classpath b/testprojects/18.attachdebug/.classpath deleted file mode 100644 index 51a8bbad..00000000 --- a/testprojects/18.attachdebug/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/testprojects/18.attachdebug/.project b/testprojects/18.attachdebug/.project deleted file mode 100644 index e7f95900..00000000 --- a/testprojects/18.attachdebug/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 18.attachdebug - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/testprojects/18.attachdebug/.settings/org.eclipse.jdt.core.prefs b/testprojects/18.attachdebug/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 3a215370..00000000 --- a/testprojects/18.attachdebug/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,11 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.8 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.8 diff --git a/testprojects/18.attachdebug/src/test/attachdebug.java b/testprojects/18.attachdebug/src/test/attachdebug.java deleted file mode 100644 index 75df2e6a..00000000 --- a/testprojects/18.attachdebug/src/test/attachdebug.java +++ /dev/null @@ -1,14 +0,0 @@ -package test; -import java.util.stream.Stream; - -public class attachdebug { - public static void main(String[] args) { - String concat = Stream.of("A", "B", "C", "D").reduce("", String::concat); - Integer[] sixNums = {1, 2, 3, 4, 5, 6}; - int evens = - Stream.of(sixNums).filter(n -> n%2 == 0).reduce(0, Integer::sum); - - System.out.println(concat+" "+evens); - } - -} diff --git a/testprojects/19.java9-app/pom.xml b/testprojects/19.java9-app/pom.xml deleted file mode 100644 index 14f82c29..00000000 --- a/testprojects/19.java9-app/pom.xml +++ /dev/null @@ -1,39 +0,0 @@ - - 4.0.0 - com.microsoft.app - java9-app - jar - 1.0-SNAPSHOT - java9-app - http://maven.apache.org - - - junit - junit - 3.8.1 - test - - - com.google.code.gson - gson - 2.7 - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.7.0 - - 9 - 9 - true - true - - - - - diff --git a/testprojects/19.java9-app/src/main/java/com/microsoft/app/App.java b/testprojects/19.java9-app/src/main/java/com/microsoft/app/App.java deleted file mode 100644 index b9cf3090..00000000 --- a/testprojects/19.java9-app/src/main/java/com/microsoft/app/App.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.microsoft.app; - -import com.google.gson.Gson; - -public class App -{ - public static void main( String[] args ) - { - Gson GSON = new Gson(); - String name = "jinbwan"; - Employee employee = GSON.fromJson("{\"name\": \"" + name + "\"}", Employee.class); - System.out.println(employee.getName()); - } - - static class Employee { - public String name; - - public String getName() { - return this.name; - } - } -} diff --git a/testprojects/19.java9-app/src/main/java/com/microsoft/app/Launcher.java b/testprojects/19.java9-app/src/main/java/com/microsoft/app/Launcher.java deleted file mode 100644 index 868c8242..00000000 --- a/testprojects/19.java9-app/src/main/java/com/microsoft/app/Launcher.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.microsoft.app; - -import java.nio.file.Paths; - -public class Launcher { - public static void main(String[] args) { - System.out.println(Paths.get("").toAbsolutePath().toString()); - - System.out.println(System.getenv("Path")); - } -} \ No newline at end of file diff --git a/testprojects/19.java9-app/src/main/java/module-info.java b/testprojects/19.java9-app/src/main/java/module-info.java deleted file mode 100644 index b5f133eb..00000000 --- a/testprojects/19.java9-app/src/main/java/module-info.java +++ /dev/null @@ -1,6 +0,0 @@ -module com.microsoft.app.mymodule { - requires gson; - requires java.base; - requires java.sql; - opens com.microsoft.app; -} \ No newline at end of file diff --git a/testprojects/19.java9-app/src/test/java/com/microsoft/app/AppTest.java b/testprojects/19.java9-app/src/test/java/com/microsoft/app/AppTest.java deleted file mode 100644 index 1fc30107..00000000 --- a/testprojects/19.java9-app/src/test/java/com/microsoft/app/AppTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.microsoft.app; - -import junit.framework.Test; -import junit.framework.TestCase; -import junit.framework.TestSuite; - -/** - * Unit test for simple App. - */ -public class AppTest - extends TestCase -{ - /** - * Create the test case - * - * @param testName name of the test case - */ - public AppTest( String testName ) - { - super( testName ); - } - - /** - * @return the suite of tests being tested - */ - public static Test suite() - { - return new TestSuite( AppTest.class ); - } - - /** - * Rigourous Test :-) - */ - public void testApp() - { - assertTrue( true ); - } -} diff --git a/testprojects/2.callstack/.classpath b/testprojects/2.callstack/.classpath deleted file mode 100644 index 56aca1ab..00000000 --- a/testprojects/2.callstack/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/testprojects/2.callstack/.project b/testprojects/2.callstack/.project deleted file mode 100644 index 3b77e1d5..00000000 --- a/testprojects/2.callstack/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 2.callstack - - - - org.eclipse.jdt.core.javanature - - - - org.eclipse.jdt.core.javabuilder - - - - - - diff --git a/testprojects/2.callstack/src/main/java/Bar.java b/testprojects/2.callstack/src/main/java/Bar.java deleted file mode 100644 index cdd93c15..00000000 --- a/testprojects/2.callstack/src/main/java/Bar.java +++ /dev/null @@ -1,5 +0,0 @@ -public class Bar { - public void testBar(int i) { - System.out.println("This is test method in bar."); - } -} diff --git a/testprojects/2.callstack/src/main/java/CallStack.java b/testprojects/2.callstack/src/main/java/CallStack.java deleted file mode 100644 index aeecfa00..00000000 --- a/testprojects/2.callstack/src/main/java/CallStack.java +++ /dev/null @@ -1,6 +0,0 @@ -public class CallStack { - public static void main(String[] args) { - Foo foo = new Foo(); - foo.testFoo(10); - } -} \ No newline at end of file diff --git a/testprojects/2.callstack/src/main/java/Foo.java b/testprojects/2.callstack/src/main/java/Foo.java deleted file mode 100644 index 5ef022f5..00000000 --- a/testprojects/2.callstack/src/main/java/Foo.java +++ /dev/null @@ -1,9 +0,0 @@ -public class Foo { - private Bar bar = new Bar(); - - public void testFoo(int j) { - System.out.println("This is test method in foo."); - bar.testBar(j + 10); - } - -} diff --git a/testprojects/20.usersettings/.classpath b/testprojects/20.usersettings/.classpath deleted file mode 100644 index 02610159..00000000 --- a/testprojects/20.usersettings/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/testprojects/20.usersettings/.project b/testprojects/20.usersettings/.project deleted file mode 100644 index 5924af8d..00000000 --- a/testprojects/20.usersettings/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 20.usersettings - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/testprojects/20.usersettings/src/main/java/usersettings/UserSettings.java b/testprojects/20.usersettings/src/main/java/usersettings/UserSettings.java deleted file mode 100644 index d94a506e..00000000 --- a/testprojects/20.usersettings/src/main/java/usersettings/UserSettings.java +++ /dev/null @@ -1,13 +0,0 @@ -package usersettings; - -public class UserSettings { - private static int number = 20; - - public static void main(String[] args) { - - String testName = "usersettings"; - System.out.println("Test name is " + testName + " and the test number is " + number); - - } - -} diff --git a/testprojects/21.evaluate/.classpath b/testprojects/21.evaluate/.classpath deleted file mode 100644 index 02610159..00000000 --- a/testprojects/21.evaluate/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/testprojects/21.evaluate/.project b/testprojects/21.evaluate/.project deleted file mode 100644 index 90a74613..00000000 --- a/testprojects/21.evaluate/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 21.evaluate - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/testprojects/21.evaluate/src/main/java/evaluate/EvaluateTest.java b/testprojects/21.evaluate/src/main/java/evaluate/EvaluateTest.java deleted file mode 100644 index 656a86f4..00000000 --- a/testprojects/21.evaluate/src/main/java/evaluate/EvaluateTest.java +++ /dev/null @@ -1,14 +0,0 @@ -package evaluate; - -public class EvaluateTest { - public static void main(String[] args) { - int i = 0; - i++; - int test1 = new EvaluateTest().test(); - System.out.print(test1 + i); - } - - public static int test() { - return 3; - } -} diff --git a/testprojects/21.single-file/Main.java b/testprojects/21.single-file/Main.java deleted file mode 100644 index 1063e696..00000000 --- a/testprojects/21.single-file/Main.java +++ /dev/null @@ -1,14 +0,0 @@ -public class Main{ - public static void main(String[] args) { - String s = "1"; - char sr = 'c'; - int t = 1; - t++; - test(t); - } - - private static void test(int t) { - int s = 1; - System.out.println("test" + s + t); - } -} \ No newline at end of file diff --git a/testprojects/22.jdkversion/.classpath b/testprojects/22.jdkversion/.classpath deleted file mode 100644 index 02610159..00000000 --- a/testprojects/22.jdkversion/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/testprojects/22.jdkversion/.project b/testprojects/22.jdkversion/.project deleted file mode 100644 index 9bd45461..00000000 --- a/testprojects/22.jdkversion/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 22.jdkversion - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/testprojects/22.jdkversion/src/main/java/JdkVersion.java b/testprojects/22.jdkversion/src/main/java/JdkVersion.java deleted file mode 100644 index 754f339d..00000000 --- a/testprojects/22.jdkversion/src/main/java/JdkVersion.java +++ /dev/null @@ -1,13 +0,0 @@ -import java.util.Arrays; -import java.util.List; - -public class JdkVersion { - public static void main(String[] args) { - String jdkVersion = System.getProperty("java.version"); - - List nums = Arrays.asList(1, 2, 3, 4); - float squareNums = nums.stream().map(n -> n * n).reduce((sum, n) -> sum + n).get().floatValue(); - System.out.println(jdkVersion); - System.out.println(squareNums); - } -} \ No newline at end of file diff --git a/testprojects/23.console-app/pom.xml b/testprojects/23.console-app/pom.xml deleted file mode 100644 index 2c1477a3..00000000 --- a/testprojects/23.console-app/pom.xml +++ /dev/null @@ -1,18 +0,0 @@ - - 4.0.0 - com.microsoft.test - console-app - jar - 1.0-SNAPSHOT - console-app - http://maven.apache.org - - - junit - junit - 3.8.1 - test - - - diff --git a/testprojects/23.console-app/src/main/java/com/microsoft/test/App.java b/testprojects/23.console-app/src/main/java/com/microsoft/test/App.java deleted file mode 100644 index 956e736c..00000000 --- a/testprojects/23.console-app/src/main/java/com/microsoft/test/App.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.microsoft.test; - -import java.util.Scanner; - -public class App -{ - public static void main( String[] args ) - { - System.out.println("Please input your name:"); - - Scanner in = new Scanner(System.in); - String name = in.nextLine(); - - System.out.println("Thanks, " + name); - } -} diff --git a/testprojects/23.console-app/src/test/java/com/microsoft/test/AppTest.java b/testprojects/23.console-app/src/test/java/com/microsoft/test/AppTest.java deleted file mode 100644 index fe41eec4..00000000 --- a/testprojects/23.console-app/src/test/java/com/microsoft/test/AppTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.microsoft.test; - -import junit.framework.Test; -import junit.framework.TestCase; -import junit.framework.TestSuite; - -/** - * Unit test for simple App. - */ -public class AppTest - extends TestCase -{ - /** - * Create the test case - * - * @param testName name of the test case - */ - public AppTest( String testName ) - { - super( testName ); - } - - /** - * @return the suite of tests being tested - */ - public static Test suite() - { - return new TestSuite( AppTest.class ); - } - - /** - * Rigourous Test :-) - */ - public void testApp() - { - assertTrue( true ); - } -} diff --git a/testprojects/24.hotCodeReplace/.classpath b/testprojects/24.hotCodeReplace/.classpath deleted file mode 100644 index 63b7e892..00000000 --- a/testprojects/24.hotCodeReplace/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/testprojects/24.hotCodeReplace/.project b/testprojects/24.hotCodeReplace/.project deleted file mode 100644 index ac71c487..00000000 --- a/testprojects/24.hotCodeReplace/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - HelloWorld - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/testprojects/24.hotCodeReplace/.settings/org.eclipse.jdt.core.prefs b/testprojects/24.hotCodeReplace/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index bb35fa0a..00000000 --- a/testprojects/24.hotCodeReplace/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,11 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.8 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.8 diff --git a/testprojects/24.hotCodeReplace/src/com/microsoft/debug/HelloWorld.java b/testprojects/24.hotCodeReplace/src/com/microsoft/debug/HelloWorld.java deleted file mode 100644 index 0c8591f7..00000000 --- a/testprojects/24.hotCodeReplace/src/com/microsoft/debug/HelloWorld.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.microsoft.debug; - - -public class HelloWorld { - static class InnerType { - public static void print() { - System.out.println("Inner Type."); - } - } - - private static int value = 0; - - public static void main(String[] args) throws Exception { - new Thread() { - public void run() { - while (true) { - try { - Thread.sleep(500); - - System.out.println("thread 1"); - - Person person = new Person("c4"); - System.out.println(person.getName()); - person.toString(); - } catch (InterruptedException e) { - } - } - } - }.start(); - - - new Thread() { - public void run() { - while (true) { - try { - Thread.sleep(500); - - System.out.println("thread 2"); - - Person person = new Person("c4"); - System.out.println(person.getName()); - person.toString(); - } catch (InterruptedException e) { - } - } - } - }.start(); - - change(); - while (true) { - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - - } - } - } - - public static void change() { - value++; - System.out.println(value); - } - -} diff --git a/testprojects/24.hotCodeReplace/src/com/microsoft/debug/NameProvider.java b/testprojects/24.hotCodeReplace/src/com/microsoft/debug/NameProvider.java deleted file mode 100644 index 23509548..00000000 --- a/testprojects/24.hotCodeReplace/src/com/microsoft/debug/NameProvider.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.microsoft.debug; - -public class NameProvider { - - public String fieldName; - - public NameProvider(String fieldName) { - this.fieldName = fieldName; - } - - public String getName() { - return " + Provider" + this.fieldName; - } -} \ No newline at end of file diff --git a/testprojects/24.hotCodeReplace/src/com/microsoft/debug/Person.java b/testprojects/24.hotCodeReplace/src/com/microsoft/debug/Person.java deleted file mode 100644 index c4e84f9d..00000000 --- a/testprojects/24.hotCodeReplace/src/com/microsoft/debug/Person.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.microsoft.debug; - -public class Person { - - private String name; - - public Person(String name) { - this.name = name; - } - - public String getName() { - String res = "old"; - for (int i = 0; i < 2; i++) { - res += i; - } - res += this.getInternalName(); - return res; - } - - public void setName(String name) { - this.name = name; - } - - private String getInternalName() { - int i = 2; - NameProvider provider = new NameProvider(""); - i++; - return provider.getName(); - } -} diff --git a/testprojects/25.restartFrame/.classpath b/testprojects/25.restartFrame/.classpath deleted file mode 100644 index 63b7e892..00000000 --- a/testprojects/25.restartFrame/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/testprojects/25.restartFrame/.project b/testprojects/25.restartFrame/.project deleted file mode 100644 index ac71c487..00000000 --- a/testprojects/25.restartFrame/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - HelloWorld - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/testprojects/25.restartFrame/.settings/org.eclipse.jdt.core.prefs b/testprojects/25.restartFrame/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index bb35fa0a..00000000 --- a/testprojects/25.restartFrame/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,11 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.8 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.8 diff --git a/testprojects/25.restartFrame/src/com/microsoft/debug/HelloWorld.java b/testprojects/25.restartFrame/src/com/microsoft/debug/HelloWorld.java deleted file mode 100644 index 0c8591f7..00000000 --- a/testprojects/25.restartFrame/src/com/microsoft/debug/HelloWorld.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.microsoft.debug; - - -public class HelloWorld { - static class InnerType { - public static void print() { - System.out.println("Inner Type."); - } - } - - private static int value = 0; - - public static void main(String[] args) throws Exception { - new Thread() { - public void run() { - while (true) { - try { - Thread.sleep(500); - - System.out.println("thread 1"); - - Person person = new Person("c4"); - System.out.println(person.getName()); - person.toString(); - } catch (InterruptedException e) { - } - } - } - }.start(); - - - new Thread() { - public void run() { - while (true) { - try { - Thread.sleep(500); - - System.out.println("thread 2"); - - Person person = new Person("c4"); - System.out.println(person.getName()); - person.toString(); - } catch (InterruptedException e) { - } - } - } - }.start(); - - change(); - while (true) { - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - - } - } - } - - public static void change() { - value++; - System.out.println(value); - } - -} diff --git a/testprojects/25.restartFrame/src/com/microsoft/debug/NameProvider.java b/testprojects/25.restartFrame/src/com/microsoft/debug/NameProvider.java deleted file mode 100644 index 23509548..00000000 --- a/testprojects/25.restartFrame/src/com/microsoft/debug/NameProvider.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.microsoft.debug; - -public class NameProvider { - - public String fieldName; - - public NameProvider(String fieldName) { - this.fieldName = fieldName; - } - - public String getName() { - return " + Provider" + this.fieldName; - } -} \ No newline at end of file diff --git a/testprojects/25.restartFrame/src/com/microsoft/debug/Person.java b/testprojects/25.restartFrame/src/com/microsoft/debug/Person.java deleted file mode 100644 index c4e84f9d..00000000 --- a/testprojects/25.restartFrame/src/com/microsoft/debug/Person.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.microsoft.debug; - -public class Person { - - private String name; - - public Person(String name) { - this.name = name; - } - - public String getName() { - String res = "old"; - for (int i = 0; i < 2; i++) { - res += i; - } - res += this.getInternalName(); - return res; - } - - public void setName(String name) { - this.name = name; - } - - private String getInternalName() { - int i = 2; - NameProvider provider = new NameProvider(""); - i++; - return provider.getName(); - } -} diff --git a/testprojects/26.environmentVariables/.classpath b/testprojects/26.environmentVariables/.classpath deleted file mode 100644 index 02610159..00000000 --- a/testprojects/26.environmentVariables/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/testprojects/26.environmentVariables/.project b/testprojects/26.environmentVariables/.project deleted file mode 100644 index 9c16656a..00000000 --- a/testprojects/26.environmentVariables/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 26.environmentVariables - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/testprojects/26.environmentVariables/.vscode/launch.json b/testprojects/26.environmentVariables/.vscode/launch.json deleted file mode 100644 index 8bd81fb1..00000000 --- a/testprojects/26.environmentVariables/.vscode/launch.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - - { - "type": "java", - "name": "Debug (Launch)-EnvrionmentVariable<26.environmentVariables>", - "request": "launch", - "cwd": "${workspaceFolder}", - "console": "internalConsole", - "stopOnEntry": false, - "mainClass": "EnvrionmentVariable", - "args": "", - "projectName": "26.environmentVariables", - "env": { - "CUSTOM_ENV_FOR_TEST_PLAN": "This env is for test plan." - } - } - ] -} \ No newline at end of file diff --git a/testprojects/26.environmentVariables/src/main/java/EnvrionmentVariable.java b/testprojects/26.environmentVariables/src/main/java/EnvrionmentVariable.java deleted file mode 100644 index 2efe8edd..00000000 --- a/testprojects/26.environmentVariables/src/main/java/EnvrionmentVariable.java +++ /dev/null @@ -1,8 +0,0 @@ -public class EnvrionmentVariable { - public static void main(String[] args) { - String customEnv = System.getenv("CUSTOM_ENV_FOR_TEST_PLAN"); - String systemPath = System.getenv("PATH"); - System.out.println(String.format("CustomEnv: %s", customEnv)); - System.out.println(String.format("SystemPath: %s", systemPath)); - } -} \ No newline at end of file diff --git a/testprojects/27.runtimeClassEntry/pom.xml b/testprojects/27.runtimeClassEntry/pom.xml deleted file mode 100644 index c723fdf9..00000000 --- a/testprojects/27.runtimeClassEntry/pom.xml +++ /dev/null @@ -1,63 +0,0 @@ - - - 4.0.0 - - com.github.kdvolder - hello-world-service - 0.0.1-SNAPSHOT - jar - - demo - Demo project for Spring Boot - - - org.springframework.boot - spring-boot-starter-parent - 2.0.0.RELEASE - - - - - UTF-8 - UTF-8 - 1.8 - - - - - org.springframework.boot - spring-boot-starter-actuator - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-test - test - - - org.springframework.boot - spring-boot-devtools - runtime - - - org.springframework.boot - spring-boot-configuration-processor - true - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - - diff --git a/testprojects/27.runtimeClassEntry/src/main/java/com/github/kdvolder/helloworldservice/Constants.java b/testprojects/27.runtimeClassEntry/src/main/java/com/github/kdvolder/helloworldservice/Constants.java deleted file mode 100644 index 20f31b5e..00000000 --- a/testprojects/27.runtimeClassEntry/src/main/java/com/github/kdvolder/helloworldservice/Constants.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.github.kdvolder.helloworldservice; - -public class Constants { - public static final String GREETER_ID = "greeets"; -} \ No newline at end of file diff --git a/testprojects/27.runtimeClassEntry/src/main/java/com/github/kdvolder/helloworldservice/DemoApplication.java b/testprojects/27.runtimeClassEntry/src/main/java/com/github/kdvolder/helloworldservice/DemoApplication.java deleted file mode 100644 index d4d22015..00000000 --- a/testprojects/27.runtimeClassEntry/src/main/java/com/github/kdvolder/helloworldservice/DemoApplication.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.github.kdvolder.helloworldservice; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.Bean; -import org.springframework.scheduling.annotation.EnableScheduling; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RestController; - - -@SpringBootApplication -@RestController -@EnableScheduling -public class DemoApplication { - - public static class Bar { - } - - public static class Foo { - } - - @Autowired(required=false) void foo(@Qualifier("foobar")Foo foo) { - System.out.println("a Foo got injected"); - } - - @Autowired(required=false) void bar(@Qualifier("foobar")Bar bar) { - System.out.println("a Bar got injected"); - } - - public static void main(String[] args) { - SpringApplication.run(DemoApplication.class, args); - } - - @GetMapping(value="/") - public String mainpage() { - return "Hello "+System.getProperty("greeting"); - } - - - @GetMapping(value = "/hello/{name}") - public String getMethodName(@PathVariable String name) { - return "Hello "+name; - } - - - @Bean Foo foobar() { - return new Foo(); - } -} diff --git a/testprojects/27.runtimeClassEntry/src/main/java/com/github/kdvolder/helloworldservice/Greeter.java b/testprojects/27.runtimeClassEntry/src/main/java/com/github/kdvolder/helloworldservice/Greeter.java deleted file mode 100644 index b0788c77..00000000 --- a/testprojects/27.runtimeClassEntry/src/main/java/com/github/kdvolder/helloworldservice/Greeter.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.github.kdvolder.helloworldservice; - -import org.springframework.stereotype.Component; - - -@Component -public class Greeter { - - String greeting(String name) { - return "Hello "+name; - } - -} \ No newline at end of file diff --git a/testprojects/27.runtimeClassEntry/src/main/java/com/github/kdvolder/helloworldservice/MyProperties.java b/testprojects/27.runtimeClassEntry/src/main/java/com/github/kdvolder/helloworldservice/MyProperties.java deleted file mode 100644 index b6443a7d..00000000 --- a/testprojects/27.runtimeClassEntry/src/main/java/com/github/kdvolder/helloworldservice/MyProperties.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.github.kdvolder.helloworldservice; - -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.boot.context.properties.DeprecatedConfigurationProperty; - -@ConfigurationProperties("my") -public class MyProperties { - - private String hello; - - /** - * @return the hello - */ - @DeprecatedConfigurationProperty(replacement="new.my.hello") - public String getHello() { - return hello; - } - - /** - * @param hello the hello to set - */ - public void setHello(String hello) { - this.hello = hello; - } - -} \ No newline at end of file diff --git a/testprojects/27.runtimeClassEntry/src/main/resources/application.properties b/testprojects/27.runtimeClassEntry/src/main/resources/application.properties deleted file mode 100644 index 5c6675f9..00000000 --- a/testprojects/27.runtimeClassEntry/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ -my.hello=Yadaya diff --git a/testprojects/27.runtimeClassEntry/src/main/resources/application.yml b/testprojects/27.runtimeClassEntry/src/main/resources/application.yml deleted file mode 100644 index 0e4e2fc0..00000000 --- a/testprojects/27.runtimeClassEntry/src/main/resources/application.yml +++ /dev/null @@ -1,6 +0,0 @@ -my: - other: stuff - hello: blah -new: - my: - other: stuff \ No newline at end of file diff --git a/testprojects/27.runtimeClassEntry/src/test/java/com/github/kdvolder/helloworldservice/DemoApplicationTests.java b/testprojects/27.runtimeClassEntry/src/test/java/com/github/kdvolder/helloworldservice/DemoApplicationTests.java deleted file mode 100644 index d7ac76c4..00000000 --- a/testprojects/27.runtimeClassEntry/src/test/java/com/github/kdvolder/helloworldservice/DemoApplicationTests.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.github.kdvolder.helloworldservice; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -@RunWith(SpringRunner.class) -@SpringBootTest -public class DemoApplicationTests { - - @Test - public void contextLoads() { - } - -} diff --git a/testprojects/3.thread/.classpath b/testprojects/3.thread/.classpath deleted file mode 100644 index 56aca1ab..00000000 --- a/testprojects/3.thread/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/testprojects/3.thread/.project b/testprojects/3.thread/.project deleted file mode 100644 index 65e43cdf..00000000 --- a/testprojects/3.thread/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 3.thread - - - - org.eclipse.jdt.core.javanature - - - - org.eclipse.jdt.core.javabuilder - - - - - - diff --git a/testprojects/3.thread/src/main/java/ThreadTest.java b/testprojects/3.thread/src/main/java/ThreadTest.java deleted file mode 100644 index 651d7b92..00000000 --- a/testprojects/3.thread/src/main/java/ThreadTest.java +++ /dev/null @@ -1,39 +0,0 @@ -import java.util.concurrent.atomic.AtomicInteger; - -public class ThreadTest { - public static void main(String[] args) throws Exception { - Object object = new Object(); - AtomicInteger ai = new AtomicInteger(); - Thread thread1 = new Thread(() -> { - for (;;) { - try { - synchronized(object) { - object.wait(); - } - System.out.println(String.format("Print %d in %d" , ai.incrementAndGet(), Thread.currentThread().getId())); - } catch (InterruptedException e) { - e.printStackTrace(); - break; - } - } - }); - Thread thread2 = new Thread(() -> { - for (;;) { - System.out.println(String.format("Print %d in %d" , ai.incrementAndGet(), Thread.currentThread().getId())); - synchronized(object) { - object.notify(); - } - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - e.printStackTrace(); - break; - } - } - }); - thread1.start(); - thread2.start(); - thread1.join(); - thread2.join(); - } -} \ No newline at end of file diff --git a/testprojects/4.variable/.classpath b/testprojects/4.variable/.classpath deleted file mode 100644 index 56aca1ab..00000000 --- a/testprojects/4.variable/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/testprojects/4.variable/.project b/testprojects/4.variable/.project deleted file mode 100644 index f3d75545..00000000 --- a/testprojects/4.variable/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 4.variable - - - - org.eclipse.jdt.core.javanature - - - - org.eclipse.jdt.core.javabuilder - - - - - - diff --git a/testprojects/4.variable/src/main/java/VariableTest.java b/testprojects/4.variable/src/main/java/VariableTest.java deleted file mode 100644 index 87980d05..00000000 --- a/testprojects/4.variable/src/main/java/VariableTest.java +++ /dev/null @@ -1,106 +0,0 @@ -import java.lang.reflect.Array; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@SuppressWarnings("unused") -public class VariableTest extends Foo { - private static int x = 100; - - @SuppressWarnings("unchecked") - public static T[] createArray(Class type, int size) { - return (T[]) Array.newInstance(type, size); - } - - private int i = 19099; - @SuppressWarnings({ "rawtypes", "unchecked" }) - public void test() { - int[] arrays = new int[] { 1 }; - int i = 100; - i += 10; - String nullstr = null; - String str = "string test"; - for (int l = 0; l < 1000; l++) { - str += "a"; - } - Object obj = new Object(); - Object test = new VariableTest(); - Object a = new A(); - Class b = A.class; - int[] intarray = new int[] { 1, 2, 3 }; - List strList = new ArrayList<>(); - strList.add(str); - strList.add(null); - Map map = new HashMap(); - String[] t = new String[] { "hello" }; - - String[][] genericArray = createArray((Class) t.getClass(), 10); - String[][][] multi = new String[5][10][32]; - genericArray[0] = t; - map.put("a", 1); - i++; - ArrayList[] d = new ArrayList[0]; - System.out.println(d.length); - - GenericsFoo dd = new GenericsFoo(new Foo()); - ArrayList list = new ArrayList<>(); - list.add(new int[] { 1 }); - i++; - } - - public static void main(String[] args) { - new VariableTest().test(); - } -} - - -@SuppressWarnings("unused") -interface BBB { - static void test() { - int j = 0; - j++; - } -} - -class BaseA { - - class BBB { - } - - int baseI = 10; -} - -class A { - class BB { - public void test() { - A.this.new BB(); - } - - class CC { - class DD { - - } - } - } -} -@SuppressWarnings("unused") -class Foo { - private int x; -} - -class GenericsFoo { - private G x; - - public GenericsFoo(G x) { - this.x = x; - } - - public G getX() { - return x; - } - - public void setX(G x) { - this.x = x; - } -} \ No newline at end of file diff --git a/testprojects/5.breakpoint/.classpath b/testprojects/5.breakpoint/.classpath deleted file mode 100644 index 56aca1ab..00000000 --- a/testprojects/5.breakpoint/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/testprojects/5.breakpoint/.project b/testprojects/5.breakpoint/.project deleted file mode 100644 index 3a2ca6ba..00000000 --- a/testprojects/5.breakpoint/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 5.breakpoint - - - - org.eclipse.jdt.core.javanature - - - - org.eclipse.jdt.core.javabuilder - - - - - - diff --git a/testprojects/5.breakpoint/src/main/java/BreakPointTest.java b/testprojects/5.breakpoint/src/main/java/BreakPointTest.java deleted file mode 100644 index 343d21a2..00000000 --- a/testprojects/5.breakpoint/src/main/java/BreakPointTest.java +++ /dev/null @@ -1,41 +0,0 @@ -class A { - void m() { - System.out.println("outer"); - } -} - -public class BreakPointTest { - public static void main(String[] args) { - new BreakPointTest().go(); - int j = 0; - new A() { - void m() { - System.out.println("anonymous"); - } - }.m(); - for (int i = 1; i <= 100; i++) { - if (i <= 99) { - j++; - } else { - System.out.println(j); - } - - } - } - - void go() { - new A().m(); - class A { - void m() { - System.out.println("inner"); - } - } - new A().m(); - } - - static class A { - void m() { - System.out.println("middle"); - } - } -} \ No newline at end of file diff --git a/testprojects/6.recursivefunction/.classpath b/testprojects/6.recursivefunction/.classpath deleted file mode 100644 index 56aca1ab..00000000 --- a/testprojects/6.recursivefunction/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/testprojects/6.recursivefunction/.project b/testprojects/6.recursivefunction/.project deleted file mode 100644 index eb30c6f3..00000000 --- a/testprojects/6.recursivefunction/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 6.recursivefunction - - - - org.eclipse.jdt.core.javanature - - - - org.eclipse.jdt.core.javabuilder - - - - - - diff --git a/testprojects/6.recursivefunction/src/main/java/RecursiveTest.java b/testprojects/6.recursivefunction/src/main/java/RecursiveTest.java deleted file mode 100644 index f4d8646d..00000000 --- a/testprojects/6.recursivefunction/src/main/java/RecursiveTest.java +++ /dev/null @@ -1,14 +0,0 @@ -public class RecursiveTest { - public static void main(String[] args) { - testRecursion(1000); - } - - public static int testRecursion(int number) { - if (number == 1) { - return 1; - } else { - int result = 1 + testRecursion(number - 1); - return result; - } - } -} \ No newline at end of file diff --git a/testprojects/7.variableperformance/.classpath b/testprojects/7.variableperformance/.classpath deleted file mode 100644 index 56aca1ab..00000000 --- a/testprojects/7.variableperformance/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/testprojects/7.variableperformance/.project b/testprojects/7.variableperformance/.project deleted file mode 100644 index 780c6568..00000000 --- a/testprojects/7.variableperformance/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 7.variableperformance - - - - org.eclipse.jdt.core.javanature - - - - org.eclipse.jdt.core.javabuilder - - - - - - diff --git a/testprojects/7.variableperformance/src/main/java/TooManyVariables.java b/testprojects/7.variableperformance/src/main/java/TooManyVariables.java deleted file mode 100644 index 9dd36ee1..00000000 --- a/testprojects/7.variableperformance/src/main/java/TooManyVariables.java +++ /dev/null @@ -1,5256 +0,0 @@ -import java.util.*; -public class TooManyVariables { - public void test() { - System.out.println("variable perf test."); - } - int i_0 = 0; - boolean j_0 = false; - String str_0 = new String("the 0-th string."); - int[] ia_0 = new int[]{0}; - Object obj_0 = new Object(); - List strList_0 = new ArrayList<>(); - String[][][] multi_0 = new String[5][10][32]; - int i_1 = 1; - boolean j_1 = true; - String str_1 = new String("the 1-th string."); - int[] ia_1 = new int[]{1}; - Object obj_1 = new Object(); - List strList_1 = new ArrayList<>(); - String[][][] multi_1 = new String[5][10][32]; - int i_2 = 2; - boolean j_2 = false; - String str_2 = new String("the 2-th string."); - int[] ia_2 = new int[]{2}; - Object obj_2 = new Object(); - List strList_2 = new ArrayList<>(); - String[][][] multi_2 = new String[5][10][32]; - int i_3 = 3; - boolean j_3 = true; - String str_3 = new String("the 3-th string."); - int[] ia_3 = new int[]{3}; - Object obj_3 = new Object(); - List strList_3 = new ArrayList<>(); - String[][][] multi_3 = new String[5][10][32]; - int i_4 = 4; - boolean j_4 = false; - String str_4 = new String("the 4-th string."); - int[] ia_4 = new int[]{4}; - Object obj_4 = new Object(); - List strList_4 = new ArrayList<>(); - String[][][] multi_4 = new String[5][10][32]; - int i_5 = 5; - boolean j_5 = true; - String str_5 = new String("the 5-th string."); - int[] ia_5 = new int[]{5}; - Object obj_5 = new Object(); - List strList_5 = new ArrayList<>(); - String[][][] multi_5 = new String[5][10][32]; - int i_6 = 6; - boolean j_6 = false; - String str_6 = new String("the 6-th string."); - int[] ia_6 = new int[]{6}; - Object obj_6 = new Object(); - List strList_6 = new ArrayList<>(); - String[][][] multi_6 = new String[5][10][32]; - int i_7 = 7; - boolean j_7 = true; - String str_7 = new String("the 7-th string."); - int[] ia_7 = new int[]{7}; - Object obj_7 = new Object(); - List strList_7 = new ArrayList<>(); - String[][][] multi_7 = new String[5][10][32]; - int i_8 = 8; - boolean j_8 = false; - String str_8 = new String("the 8-th string."); - int[] ia_8 = new int[]{8}; - Object obj_8 = new Object(); - List strList_8 = new ArrayList<>(); - String[][][] multi_8 = new String[5][10][32]; - int i_9 = 9; - boolean j_9 = true; - String str_9 = new String("the 9-th string."); - int[] ia_9 = new int[]{9}; - Object obj_9 = new Object(); - List strList_9 = new ArrayList<>(); - String[][][] multi_9 = new String[5][10][32]; - int i_10 = 10; - boolean j_10 = false; - String str_10 = new String("the 10-th string."); - int[] ia_10 = new int[]{10}; - Object obj_10 = new Object(); - List strList_10 = new ArrayList<>(); - String[][][] multi_10 = new String[5][10][32]; - int i_11 = 11; - boolean j_11 = true; - String str_11 = new String("the 11-th string."); - int[] ia_11 = new int[]{11}; - Object obj_11 = new Object(); - List strList_11 = new ArrayList<>(); - String[][][] multi_11 = new String[5][10][32]; - int i_12 = 12; - boolean j_12 = false; - String str_12 = new String("the 12-th string."); - int[] ia_12 = new int[]{12}; - Object obj_12 = new Object(); - List strList_12 = new ArrayList<>(); - String[][][] multi_12 = new String[5][10][32]; - int i_13 = 13; - boolean j_13 = true; - String str_13 = new String("the 13-th string."); - int[] ia_13 = new int[]{13}; - Object obj_13 = new Object(); - List strList_13 = new ArrayList<>(); - String[][][] multi_13 = new String[5][10][32]; - int i_14 = 14; - boolean j_14 = false; - String str_14 = new String("the 14-th string."); - int[] ia_14 = new int[]{14}; - Object obj_14 = new Object(); - List strList_14 = new ArrayList<>(); - String[][][] multi_14 = new String[5][10][32]; - int i_15 = 15; - boolean j_15 = true; - String str_15 = new String("the 15-th string."); - int[] ia_15 = new int[]{15}; - Object obj_15 = new Object(); - List strList_15 = new ArrayList<>(); - String[][][] multi_15 = new String[5][10][32]; - int i_16 = 16; - boolean j_16 = false; - String str_16 = new String("the 16-th string."); - int[] ia_16 = new int[]{16}; - Object obj_16 = new Object(); - List strList_16 = new ArrayList<>(); - String[][][] multi_16 = new String[5][10][32]; - int i_17 = 17; - boolean j_17 = true; - String str_17 = new String("the 17-th string."); - int[] ia_17 = new int[]{17}; - Object obj_17 = new Object(); - List strList_17 = new ArrayList<>(); - String[][][] multi_17 = new String[5][10][32]; - int i_18 = 18; - boolean j_18 = false; - String str_18 = new String("the 18-th string."); - int[] ia_18 = new int[]{18}; - Object obj_18 = new Object(); - List strList_18 = new ArrayList<>(); - String[][][] multi_18 = new String[5][10][32]; - int i_19 = 19; - boolean j_19 = true; - String str_19 = new String("the 19-th string."); - int[] ia_19 = new int[]{19}; - Object obj_19 = new Object(); - List strList_19 = new ArrayList<>(); - String[][][] multi_19 = new String[5][10][32]; - int i_20 = 20; - boolean j_20 = false; - String str_20 = new String("the 20-th string."); - int[] ia_20 = new int[]{20}; - Object obj_20 = new Object(); - List strList_20 = new ArrayList<>(); - String[][][] multi_20 = new String[5][10][32]; - int i_21 = 21; - boolean j_21 = true; - String str_21 = new String("the 21-th string."); - int[] ia_21 = new int[]{21}; - Object obj_21 = new Object(); - List strList_21 = new ArrayList<>(); - String[][][] multi_21 = new String[5][10][32]; - int i_22 = 22; - boolean j_22 = false; - String str_22 = new String("the 22-th string."); - int[] ia_22 = new int[]{22}; - Object obj_22 = new Object(); - List strList_22 = new ArrayList<>(); - String[][][] multi_22 = new String[5][10][32]; - int i_23 = 23; - boolean j_23 = true; - String str_23 = new String("the 23-th string."); - int[] ia_23 = new int[]{23}; - Object obj_23 = new Object(); - List strList_23 = new ArrayList<>(); - String[][][] multi_23 = new String[5][10][32]; - int i_24 = 24; - boolean j_24 = false; - String str_24 = new String("the 24-th string."); - int[] ia_24 = new int[]{24}; - Object obj_24 = new Object(); - List strList_24 = new ArrayList<>(); - String[][][] multi_24 = new String[5][10][32]; - int i_25 = 25; - boolean j_25 = true; - String str_25 = new String("the 25-th string."); - int[] ia_25 = new int[]{25}; - Object obj_25 = new Object(); - List strList_25 = new ArrayList<>(); - String[][][] multi_25 = new String[5][10][32]; - int i_26 = 26; - boolean j_26 = false; - String str_26 = new String("the 26-th string."); - int[] ia_26 = new int[]{26}; - Object obj_26 = new Object(); - List strList_26 = new ArrayList<>(); - String[][][] multi_26 = new String[5][10][32]; - int i_27 = 27; - boolean j_27 = true; - String str_27 = new String("the 27-th string."); - int[] ia_27 = new int[]{27}; - Object obj_27 = new Object(); - List strList_27 = new ArrayList<>(); - String[][][] multi_27 = new String[5][10][32]; - int i_28 = 28; - boolean j_28 = false; - String str_28 = new String("the 28-th string."); - int[] ia_28 = new int[]{28}; - Object obj_28 = new Object(); - List strList_28 = new ArrayList<>(); - String[][][] multi_28 = new String[5][10][32]; - int i_29 = 29; - boolean j_29 = true; - String str_29 = new String("the 29-th string."); - int[] ia_29 = new int[]{29}; - Object obj_29 = new Object(); - List strList_29 = new ArrayList<>(); - String[][][] multi_29 = new String[5][10][32]; - int i_30 = 30; - boolean j_30 = false; - String str_30 = new String("the 30-th string."); - int[] ia_30 = new int[]{30}; - Object obj_30 = new Object(); - List strList_30 = new ArrayList<>(); - String[][][] multi_30 = new String[5][10][32]; - int i_31 = 31; - boolean j_31 = true; - String str_31 = new String("the 31-th string."); - int[] ia_31 = new int[]{31}; - Object obj_31 = new Object(); - List strList_31 = new ArrayList<>(); - String[][][] multi_31 = new String[5][10][32]; - int i_32 = 32; - boolean j_32 = false; - String str_32 = new String("the 32-th string."); - int[] ia_32 = new int[]{32}; - Object obj_32 = new Object(); - List strList_32 = new ArrayList<>(); - String[][][] multi_32 = new String[5][10][32]; - int i_33 = 33; - boolean j_33 = true; - String str_33 = new String("the 33-th string."); - int[] ia_33 = new int[]{33}; - Object obj_33 = new Object(); - List strList_33 = new ArrayList<>(); - String[][][] multi_33 = new String[5][10][32]; - int i_34 = 34; - boolean j_34 = false; - String str_34 = new String("the 34-th string."); - int[] ia_34 = new int[]{34}; - Object obj_34 = new Object(); - List strList_34 = new ArrayList<>(); - String[][][] multi_34 = new String[5][10][32]; - int i_35 = 35; - boolean j_35 = true; - String str_35 = new String("the 35-th string."); - int[] ia_35 = new int[]{35}; - Object obj_35 = new Object(); - List strList_35 = new ArrayList<>(); - String[][][] multi_35 = new String[5][10][32]; - int i_36 = 36; - boolean j_36 = false; - String str_36 = new String("the 36-th string."); - int[] ia_36 = new int[]{36}; - Object obj_36 = new Object(); - List strList_36 = new ArrayList<>(); - String[][][] multi_36 = new String[5][10][32]; - int i_37 = 37; - boolean j_37 = true; - String str_37 = new String("the 37-th string."); - int[] ia_37 = new int[]{37}; - Object obj_37 = new Object(); - List strList_37 = new ArrayList<>(); - String[][][] multi_37 = new String[5][10][32]; - int i_38 = 38; - boolean j_38 = false; - String str_38 = new String("the 38-th string."); - int[] ia_38 = new int[]{38}; - Object obj_38 = new Object(); - List strList_38 = new ArrayList<>(); - String[][][] multi_38 = new String[5][10][32]; - int i_39 = 39; - boolean j_39 = true; - String str_39 = new String("the 39-th string."); - int[] ia_39 = new int[]{39}; - Object obj_39 = new Object(); - List strList_39 = new ArrayList<>(); - String[][][] multi_39 = new String[5][10][32]; - int i_40 = 40; - boolean j_40 = false; - String str_40 = new String("the 40-th string."); - int[] ia_40 = new int[]{40}; - Object obj_40 = new Object(); - List strList_40 = new ArrayList<>(); - String[][][] multi_40 = new String[5][10][32]; - int i_41 = 41; - boolean j_41 = true; - String str_41 = new String("the 41-th string."); - int[] ia_41 = new int[]{41}; - Object obj_41 = new Object(); - List strList_41 = new ArrayList<>(); - String[][][] multi_41 = new String[5][10][32]; - int i_42 = 42; - boolean j_42 = false; - String str_42 = new String("the 42-th string."); - int[] ia_42 = new int[]{42}; - Object obj_42 = new Object(); - List strList_42 = new ArrayList<>(); - String[][][] multi_42 = new String[5][10][32]; - int i_43 = 43; - boolean j_43 = true; - String str_43 = new String("the 43-th string."); - int[] ia_43 = new int[]{43}; - Object obj_43 = new Object(); - List strList_43 = new ArrayList<>(); - String[][][] multi_43 = new String[5][10][32]; - int i_44 = 44; - boolean j_44 = false; - String str_44 = new String("the 44-th string."); - int[] ia_44 = new int[]{44}; - Object obj_44 = new Object(); - List strList_44 = new ArrayList<>(); - String[][][] multi_44 = new String[5][10][32]; - int i_45 = 45; - boolean j_45 = true; - String str_45 = new String("the 45-th string."); - int[] ia_45 = new int[]{45}; - Object obj_45 = new Object(); - List strList_45 = new ArrayList<>(); - String[][][] multi_45 = new String[5][10][32]; - int i_46 = 46; - boolean j_46 = false; - String str_46 = new String("the 46-th string."); - int[] ia_46 = new int[]{46}; - Object obj_46 = new Object(); - List strList_46 = new ArrayList<>(); - String[][][] multi_46 = new String[5][10][32]; - int i_47 = 47; - boolean j_47 = true; - String str_47 = new String("the 47-th string."); - int[] ia_47 = new int[]{47}; - Object obj_47 = new Object(); - List strList_47 = new ArrayList<>(); - String[][][] multi_47 = new String[5][10][32]; - int i_48 = 48; - boolean j_48 = false; - String str_48 = new String("the 48-th string."); - int[] ia_48 = new int[]{48}; - Object obj_48 = new Object(); - List strList_48 = new ArrayList<>(); - String[][][] multi_48 = new String[5][10][32]; - int i_49 = 49; - boolean j_49 = true; - String str_49 = new String("the 49-th string."); - int[] ia_49 = new int[]{49}; - Object obj_49 = new Object(); - List strList_49 = new ArrayList<>(); - String[][][] multi_49 = new String[5][10][32]; - int i_50 = 50; - boolean j_50 = false; - String str_50 = new String("the 50-th string."); - int[] ia_50 = new int[]{50}; - Object obj_50 = new Object(); - List strList_50 = new ArrayList<>(); - String[][][] multi_50 = new String[5][10][32]; - int i_51 = 51; - boolean j_51 = true; - String str_51 = new String("the 51-th string."); - int[] ia_51 = new int[]{51}; - Object obj_51 = new Object(); - List strList_51 = new ArrayList<>(); - String[][][] multi_51 = new String[5][10][32]; - int i_52 = 52; - boolean j_52 = false; - String str_52 = new String("the 52-th string."); - int[] ia_52 = new int[]{52}; - Object obj_52 = new Object(); - List strList_52 = new ArrayList<>(); - String[][][] multi_52 = new String[5][10][32]; - int i_53 = 53; - boolean j_53 = true; - String str_53 = new String("the 53-th string."); - int[] ia_53 = new int[]{53}; - Object obj_53 = new Object(); - List strList_53 = new ArrayList<>(); - String[][][] multi_53 = new String[5][10][32]; - int i_54 = 54; - boolean j_54 = false; - String str_54 = new String("the 54-th string."); - int[] ia_54 = new int[]{54}; - Object obj_54 = new Object(); - List strList_54 = new ArrayList<>(); - String[][][] multi_54 = new String[5][10][32]; - int i_55 = 55; - boolean j_55 = true; - String str_55 = new String("the 55-th string."); - int[] ia_55 = new int[]{55}; - Object obj_55 = new Object(); - List strList_55 = new ArrayList<>(); - String[][][] multi_55 = new String[5][10][32]; - int i_56 = 56; - boolean j_56 = false; - String str_56 = new String("the 56-th string."); - int[] ia_56 = new int[]{56}; - Object obj_56 = new Object(); - List strList_56 = new ArrayList<>(); - String[][][] multi_56 = new String[5][10][32]; - int i_57 = 57; - boolean j_57 = true; - String str_57 = new String("the 57-th string."); - int[] ia_57 = new int[]{57}; - Object obj_57 = new Object(); - List strList_57 = new ArrayList<>(); - String[][][] multi_57 = new String[5][10][32]; - int i_58 = 58; - boolean j_58 = false; - String str_58 = new String("the 58-th string."); - int[] ia_58 = new int[]{58}; - Object obj_58 = new Object(); - List strList_58 = new ArrayList<>(); - String[][][] multi_58 = new String[5][10][32]; - int i_59 = 59; - boolean j_59 = true; - String str_59 = new String("the 59-th string."); - int[] ia_59 = new int[]{59}; - Object obj_59 = new Object(); - List strList_59 = new ArrayList<>(); - String[][][] multi_59 = new String[5][10][32]; - int i_60 = 60; - boolean j_60 = false; - String str_60 = new String("the 60-th string."); - int[] ia_60 = new int[]{60}; - Object obj_60 = new Object(); - List strList_60 = new ArrayList<>(); - String[][][] multi_60 = new String[5][10][32]; - int i_61 = 61; - boolean j_61 = true; - String str_61 = new String("the 61-th string."); - int[] ia_61 = new int[]{61}; - Object obj_61 = new Object(); - List strList_61 = new ArrayList<>(); - String[][][] multi_61 = new String[5][10][32]; - int i_62 = 62; - boolean j_62 = false; - String str_62 = new String("the 62-th string."); - int[] ia_62 = new int[]{62}; - Object obj_62 = new Object(); - List strList_62 = new ArrayList<>(); - String[][][] multi_62 = new String[5][10][32]; - int i_63 = 63; - boolean j_63 = true; - String str_63 = new String("the 63-th string."); - int[] ia_63 = new int[]{63}; - Object obj_63 = new Object(); - List strList_63 = new ArrayList<>(); - String[][][] multi_63 = new String[5][10][32]; - int i_64 = 64; - boolean j_64 = false; - String str_64 = new String("the 64-th string."); - int[] ia_64 = new int[]{64}; - Object obj_64 = new Object(); - List strList_64 = new ArrayList<>(); - String[][][] multi_64 = new String[5][10][32]; - int i_65 = 65; - boolean j_65 = true; - String str_65 = new String("the 65-th string."); - int[] ia_65 = new int[]{65}; - Object obj_65 = new Object(); - List strList_65 = new ArrayList<>(); - String[][][] multi_65 = new String[5][10][32]; - int i_66 = 66; - boolean j_66 = false; - String str_66 = new String("the 66-th string."); - int[] ia_66 = new int[]{66}; - Object obj_66 = new Object(); - List strList_66 = new ArrayList<>(); - String[][][] multi_66 = new String[5][10][32]; - int i_67 = 67; - boolean j_67 = true; - String str_67 = new String("the 67-th string."); - int[] ia_67 = new int[]{67}; - Object obj_67 = new Object(); - List strList_67 = new ArrayList<>(); - String[][][] multi_67 = new String[5][10][32]; - int i_68 = 68; - boolean j_68 = false; - String str_68 = new String("the 68-th string."); - int[] ia_68 = new int[]{68}; - Object obj_68 = new Object(); - List strList_68 = new ArrayList<>(); - String[][][] multi_68 = new String[5][10][32]; - int i_69 = 69; - boolean j_69 = true; - String str_69 = new String("the 69-th string."); - int[] ia_69 = new int[]{69}; - Object obj_69 = new Object(); - List strList_69 = new ArrayList<>(); - String[][][] multi_69 = new String[5][10][32]; - int i_70 = 70; - boolean j_70 = false; - String str_70 = new String("the 70-th string."); - int[] ia_70 = new int[]{70}; - Object obj_70 = new Object(); - List strList_70 = new ArrayList<>(); - String[][][] multi_70 = new String[5][10][32]; - int i_71 = 71; - boolean j_71 = true; - String str_71 = new String("the 71-th string."); - int[] ia_71 = new int[]{71}; - Object obj_71 = new Object(); - List strList_71 = new ArrayList<>(); - String[][][] multi_71 = new String[5][10][32]; - int i_72 = 72; - boolean j_72 = false; - String str_72 = new String("the 72-th string."); - int[] ia_72 = new int[]{72}; - Object obj_72 = new Object(); - List strList_72 = new ArrayList<>(); - String[][][] multi_72 = new String[5][10][32]; - int i_73 = 73; - boolean j_73 = true; - String str_73 = new String("the 73-th string."); - int[] ia_73 = new int[]{73}; - Object obj_73 = new Object(); - List strList_73 = new ArrayList<>(); - String[][][] multi_73 = new String[5][10][32]; - int i_74 = 74; - boolean j_74 = false; - String str_74 = new String("the 74-th string."); - int[] ia_74 = new int[]{74}; - Object obj_74 = new Object(); - List strList_74 = new ArrayList<>(); - String[][][] multi_74 = new String[5][10][32]; - int i_75 = 75; - boolean j_75 = true; - String str_75 = new String("the 75-th string."); - int[] ia_75 = new int[]{75}; - Object obj_75 = new Object(); - List strList_75 = new ArrayList<>(); - String[][][] multi_75 = new String[5][10][32]; - int i_76 = 76; - boolean j_76 = false; - String str_76 = new String("the 76-th string."); - int[] ia_76 = new int[]{76}; - Object obj_76 = new Object(); - List strList_76 = new ArrayList<>(); - String[][][] multi_76 = new String[5][10][32]; - int i_77 = 77; - boolean j_77 = true; - String str_77 = new String("the 77-th string."); - int[] ia_77 = new int[]{77}; - Object obj_77 = new Object(); - List strList_77 = new ArrayList<>(); - String[][][] multi_77 = new String[5][10][32]; - int i_78 = 78; - boolean j_78 = false; - String str_78 = new String("the 78-th string."); - int[] ia_78 = new int[]{78}; - Object obj_78 = new Object(); - List strList_78 = new ArrayList<>(); - String[][][] multi_78 = new String[5][10][32]; - int i_79 = 79; - boolean j_79 = true; - String str_79 = new String("the 79-th string."); - int[] ia_79 = new int[]{79}; - Object obj_79 = new Object(); - List strList_79 = new ArrayList<>(); - String[][][] multi_79 = new String[5][10][32]; - int i_80 = 80; - boolean j_80 = false; - String str_80 = new String("the 80-th string."); - int[] ia_80 = new int[]{80}; - Object obj_80 = new Object(); - List strList_80 = new ArrayList<>(); - String[][][] multi_80 = new String[5][10][32]; - int i_81 = 81; - boolean j_81 = true; - String str_81 = new String("the 81-th string."); - int[] ia_81 = new int[]{81}; - Object obj_81 = new Object(); - List strList_81 = new ArrayList<>(); - String[][][] multi_81 = new String[5][10][32]; - int i_82 = 82; - boolean j_82 = false; - String str_82 = new String("the 82-th string."); - int[] ia_82 = new int[]{82}; - Object obj_82 = new Object(); - List strList_82 = new ArrayList<>(); - String[][][] multi_82 = new String[5][10][32]; - int i_83 = 83; - boolean j_83 = true; - String str_83 = new String("the 83-th string."); - int[] ia_83 = new int[]{83}; - Object obj_83 = new Object(); - List strList_83 = new ArrayList<>(); - String[][][] multi_83 = new String[5][10][32]; - int i_84 = 84; - boolean j_84 = false; - String str_84 = new String("the 84-th string."); - int[] ia_84 = new int[]{84}; - Object obj_84 = new Object(); - List strList_84 = new ArrayList<>(); - String[][][] multi_84 = new String[5][10][32]; - int i_85 = 85; - boolean j_85 = true; - String str_85 = new String("the 85-th string."); - int[] ia_85 = new int[]{85}; - Object obj_85 = new Object(); - List strList_85 = new ArrayList<>(); - String[][][] multi_85 = new String[5][10][32]; - int i_86 = 86; - boolean j_86 = false; - String str_86 = new String("the 86-th string."); - int[] ia_86 = new int[]{86}; - Object obj_86 = new Object(); - List strList_86 = new ArrayList<>(); - String[][][] multi_86 = new String[5][10][32]; - int i_87 = 87; - boolean j_87 = true; - String str_87 = new String("the 87-th string."); - int[] ia_87 = new int[]{87}; - Object obj_87 = new Object(); - List strList_87 = new ArrayList<>(); - String[][][] multi_87 = new String[5][10][32]; - int i_88 = 88; - boolean j_88 = false; - String str_88 = new String("the 88-th string."); - int[] ia_88 = new int[]{88}; - Object obj_88 = new Object(); - List strList_88 = new ArrayList<>(); - String[][][] multi_88 = new String[5][10][32]; - int i_89 = 89; - boolean j_89 = true; - String str_89 = new String("the 89-th string."); - int[] ia_89 = new int[]{89}; - Object obj_89 = new Object(); - List strList_89 = new ArrayList<>(); - String[][][] multi_89 = new String[5][10][32]; - int i_90 = 90; - boolean j_90 = false; - String str_90 = new String("the 90-th string."); - int[] ia_90 = new int[]{90}; - Object obj_90 = new Object(); - List strList_90 = new ArrayList<>(); - String[][][] multi_90 = new String[5][10][32]; - int i_91 = 91; - boolean j_91 = true; - String str_91 = new String("the 91-th string."); - int[] ia_91 = new int[]{91}; - Object obj_91 = new Object(); - List strList_91 = new ArrayList<>(); - String[][][] multi_91 = new String[5][10][32]; - int i_92 = 92; - boolean j_92 = false; - String str_92 = new String("the 92-th string."); - int[] ia_92 = new int[]{92}; - Object obj_92 = new Object(); - List strList_92 = new ArrayList<>(); - String[][][] multi_92 = new String[5][10][32]; - int i_93 = 93; - boolean j_93 = true; - String str_93 = new String("the 93-th string."); - int[] ia_93 = new int[]{93}; - Object obj_93 = new Object(); - List strList_93 = new ArrayList<>(); - String[][][] multi_93 = new String[5][10][32]; - int i_94 = 94; - boolean j_94 = false; - String str_94 = new String("the 94-th string."); - int[] ia_94 = new int[]{94}; - Object obj_94 = new Object(); - List strList_94 = new ArrayList<>(); - String[][][] multi_94 = new String[5][10][32]; - int i_95 = 95; - boolean j_95 = true; - String str_95 = new String("the 95-th string."); - int[] ia_95 = new int[]{95}; - Object obj_95 = new Object(); - List strList_95 = new ArrayList<>(); - String[][][] multi_95 = new String[5][10][32]; - int i_96 = 96; - boolean j_96 = false; - String str_96 = new String("the 96-th string."); - int[] ia_96 = new int[]{96}; - Object obj_96 = new Object(); - List strList_96 = new ArrayList<>(); - String[][][] multi_96 = new String[5][10][32]; - int i_97 = 97; - boolean j_97 = true; - String str_97 = new String("the 97-th string."); - int[] ia_97 = new int[]{97}; - Object obj_97 = new Object(); - List strList_97 = new ArrayList<>(); - String[][][] multi_97 = new String[5][10][32]; - int i_98 = 98; - boolean j_98 = false; - String str_98 = new String("the 98-th string."); - int[] ia_98 = new int[]{98}; - Object obj_98 = new Object(); - List strList_98 = new ArrayList<>(); - String[][][] multi_98 = new String[5][10][32]; - int i_99 = 99; - boolean j_99 = true; - String str_99 = new String("the 99-th string."); - int[] ia_99 = new int[]{99}; - Object obj_99 = new Object(); - List strList_99 = new ArrayList<>(); - String[][][] multi_99 = new String[5][10][32]; - int i_100 = 100; - boolean j_100 = false; - String str_100 = new String("the 100-th string."); - int[] ia_100 = new int[]{100}; - Object obj_100 = new Object(); - List strList_100 = new ArrayList<>(); - String[][][] multi_100 = new String[5][10][32]; - int i_101 = 101; - boolean j_101 = true; - String str_101 = new String("the 101-th string."); - int[] ia_101 = new int[]{101}; - Object obj_101 = new Object(); - List strList_101 = new ArrayList<>(); - String[][][] multi_101 = new String[5][10][32]; - int i_102 = 102; - boolean j_102 = false; - String str_102 = new String("the 102-th string."); - int[] ia_102 = new int[]{102}; - Object obj_102 = new Object(); - List strList_102 = new ArrayList<>(); - String[][][] multi_102 = new String[5][10][32]; - int i_103 = 103; - boolean j_103 = true; - String str_103 = new String("the 103-th string."); - int[] ia_103 = new int[]{103}; - Object obj_103 = new Object(); - List strList_103 = new ArrayList<>(); - String[][][] multi_103 = new String[5][10][32]; - int i_104 = 104; - boolean j_104 = false; - String str_104 = new String("the 104-th string."); - int[] ia_104 = new int[]{104}; - Object obj_104 = new Object(); - List strList_104 = new ArrayList<>(); - String[][][] multi_104 = new String[5][10][32]; - int i_105 = 105; - boolean j_105 = true; - String str_105 = new String("the 105-th string."); - int[] ia_105 = new int[]{105}; - Object obj_105 = new Object(); - List strList_105 = new ArrayList<>(); - String[][][] multi_105 = new String[5][10][32]; - int i_106 = 106; - boolean j_106 = false; - String str_106 = new String("the 106-th string."); - int[] ia_106 = new int[]{106}; - Object obj_106 = new Object(); - List strList_106 = new ArrayList<>(); - String[][][] multi_106 = new String[5][10][32]; - int i_107 = 107; - boolean j_107 = true; - String str_107 = new String("the 107-th string."); - int[] ia_107 = new int[]{107}; - Object obj_107 = new Object(); - List strList_107 = new ArrayList<>(); - String[][][] multi_107 = new String[5][10][32]; - int i_108 = 108; - boolean j_108 = false; - String str_108 = new String("the 108-th string."); - int[] ia_108 = new int[]{108}; - Object obj_108 = new Object(); - List strList_108 = new ArrayList<>(); - String[][][] multi_108 = new String[5][10][32]; - int i_109 = 109; - boolean j_109 = true; - String str_109 = new String("the 109-th string."); - int[] ia_109 = new int[]{109}; - Object obj_109 = new Object(); - List strList_109 = new ArrayList<>(); - String[][][] multi_109 = new String[5][10][32]; - int i_110 = 110; - boolean j_110 = false; - String str_110 = new String("the 110-th string."); - int[] ia_110 = new int[]{110}; - Object obj_110 = new Object(); - List strList_110 = new ArrayList<>(); - String[][][] multi_110 = new String[5][10][32]; - int i_111 = 111; - boolean j_111 = true; - String str_111 = new String("the 111-th string."); - int[] ia_111 = new int[]{111}; - Object obj_111 = new Object(); - List strList_111 = new ArrayList<>(); - String[][][] multi_111 = new String[5][10][32]; - int i_112 = 112; - boolean j_112 = false; - String str_112 = new String("the 112-th string."); - int[] ia_112 = new int[]{112}; - Object obj_112 = new Object(); - List strList_112 = new ArrayList<>(); - String[][][] multi_112 = new String[5][10][32]; - int i_113 = 113; - boolean j_113 = true; - String str_113 = new String("the 113-th string."); - int[] ia_113 = new int[]{113}; - Object obj_113 = new Object(); - List strList_113 = new ArrayList<>(); - String[][][] multi_113 = new String[5][10][32]; - int i_114 = 114; - boolean j_114 = false; - String str_114 = new String("the 114-th string."); - int[] ia_114 = new int[]{114}; - Object obj_114 = new Object(); - List strList_114 = new ArrayList<>(); - String[][][] multi_114 = new String[5][10][32]; - int i_115 = 115; - boolean j_115 = true; - String str_115 = new String("the 115-th string."); - int[] ia_115 = new int[]{115}; - Object obj_115 = new Object(); - List strList_115 = new ArrayList<>(); - String[][][] multi_115 = new String[5][10][32]; - int i_116 = 116; - boolean j_116 = false; - String str_116 = new String("the 116-th string."); - int[] ia_116 = new int[]{116}; - Object obj_116 = new Object(); - List strList_116 = new ArrayList<>(); - String[][][] multi_116 = new String[5][10][32]; - int i_117 = 117; - boolean j_117 = true; - String str_117 = new String("the 117-th string."); - int[] ia_117 = new int[]{117}; - Object obj_117 = new Object(); - List strList_117 = new ArrayList<>(); - String[][][] multi_117 = new String[5][10][32]; - int i_118 = 118; - boolean j_118 = false; - String str_118 = new String("the 118-th string."); - int[] ia_118 = new int[]{118}; - Object obj_118 = new Object(); - List strList_118 = new ArrayList<>(); - String[][][] multi_118 = new String[5][10][32]; - int i_119 = 119; - boolean j_119 = true; - String str_119 = new String("the 119-th string."); - int[] ia_119 = new int[]{119}; - Object obj_119 = new Object(); - List strList_119 = new ArrayList<>(); - String[][][] multi_119 = new String[5][10][32]; - int i_120 = 120; - boolean j_120 = false; - String str_120 = new String("the 120-th string."); - int[] ia_120 = new int[]{120}; - Object obj_120 = new Object(); - List strList_120 = new ArrayList<>(); - String[][][] multi_120 = new String[5][10][32]; - int i_121 = 121; - boolean j_121 = true; - String str_121 = new String("the 121-th string."); - int[] ia_121 = new int[]{121}; - Object obj_121 = new Object(); - List strList_121 = new ArrayList<>(); - String[][][] multi_121 = new String[5][10][32]; - int i_122 = 122; - boolean j_122 = false; - String str_122 = new String("the 122-th string."); - int[] ia_122 = new int[]{122}; - Object obj_122 = new Object(); - List strList_122 = new ArrayList<>(); - String[][][] multi_122 = new String[5][10][32]; - int i_123 = 123; - boolean j_123 = true; - String str_123 = new String("the 123-th string."); - int[] ia_123 = new int[]{123}; - Object obj_123 = new Object(); - List strList_123 = new ArrayList<>(); - String[][][] multi_123 = new String[5][10][32]; - int i_124 = 124; - boolean j_124 = false; - String str_124 = new String("the 124-th string."); - int[] ia_124 = new int[]{124}; - Object obj_124 = new Object(); - List strList_124 = new ArrayList<>(); - String[][][] multi_124 = new String[5][10][32]; - int i_125 = 125; - boolean j_125 = true; - String str_125 = new String("the 125-th string."); - int[] ia_125 = new int[]{125}; - Object obj_125 = new Object(); - List strList_125 = new ArrayList<>(); - String[][][] multi_125 = new String[5][10][32]; - int i_126 = 126; - boolean j_126 = false; - String str_126 = new String("the 126-th string."); - int[] ia_126 = new int[]{126}; - Object obj_126 = new Object(); - List strList_126 = new ArrayList<>(); - String[][][] multi_126 = new String[5][10][32]; - int i_127 = 127; - boolean j_127 = true; - String str_127 = new String("the 127-th string."); - int[] ia_127 = new int[]{127}; - Object obj_127 = new Object(); - List strList_127 = new ArrayList<>(); - String[][][] multi_127 = new String[5][10][32]; - int i_128 = 128; - boolean j_128 = false; - String str_128 = new String("the 128-th string."); - int[] ia_128 = new int[]{128}; - Object obj_128 = new Object(); - List strList_128 = new ArrayList<>(); - String[][][] multi_128 = new String[5][10][32]; - int i_129 = 129; - boolean j_129 = true; - String str_129 = new String("the 129-th string."); - int[] ia_129 = new int[]{129}; - Object obj_129 = new Object(); - List strList_129 = new ArrayList<>(); - String[][][] multi_129 = new String[5][10][32]; - int i_130 = 130; - boolean j_130 = false; - String str_130 = new String("the 130-th string."); - int[] ia_130 = new int[]{130}; - Object obj_130 = new Object(); - List strList_130 = new ArrayList<>(); - String[][][] multi_130 = new String[5][10][32]; - int i_131 = 131; - boolean j_131 = true; - String str_131 = new String("the 131-th string."); - int[] ia_131 = new int[]{131}; - Object obj_131 = new Object(); - List strList_131 = new ArrayList<>(); - String[][][] multi_131 = new String[5][10][32]; - int i_132 = 132; - boolean j_132 = false; - String str_132 = new String("the 132-th string."); - int[] ia_132 = new int[]{132}; - Object obj_132 = new Object(); - List strList_132 = new ArrayList<>(); - String[][][] multi_132 = new String[5][10][32]; - int i_133 = 133; - boolean j_133 = true; - String str_133 = new String("the 133-th string."); - int[] ia_133 = new int[]{133}; - Object obj_133 = new Object(); - List strList_133 = new ArrayList<>(); - String[][][] multi_133 = new String[5][10][32]; - int i_134 = 134; - boolean j_134 = false; - String str_134 = new String("the 134-th string."); - int[] ia_134 = new int[]{134}; - Object obj_134 = new Object(); - List strList_134 = new ArrayList<>(); - String[][][] multi_134 = new String[5][10][32]; - int i_135 = 135; - boolean j_135 = true; - String str_135 = new String("the 135-th string."); - int[] ia_135 = new int[]{135}; - Object obj_135 = new Object(); - List strList_135 = new ArrayList<>(); - String[][][] multi_135 = new String[5][10][32]; - int i_136 = 136; - boolean j_136 = false; - String str_136 = new String("the 136-th string."); - int[] ia_136 = new int[]{136}; - Object obj_136 = new Object(); - List strList_136 = new ArrayList<>(); - String[][][] multi_136 = new String[5][10][32]; - int i_137 = 137; - boolean j_137 = true; - String str_137 = new String("the 137-th string."); - int[] ia_137 = new int[]{137}; - Object obj_137 = new Object(); - List strList_137 = new ArrayList<>(); - String[][][] multi_137 = new String[5][10][32]; - int i_138 = 138; - boolean j_138 = false; - String str_138 = new String("the 138-th string."); - int[] ia_138 = new int[]{138}; - Object obj_138 = new Object(); - List strList_138 = new ArrayList<>(); - String[][][] multi_138 = new String[5][10][32]; - int i_139 = 139; - boolean j_139 = true; - String str_139 = new String("the 139-th string."); - int[] ia_139 = new int[]{139}; - Object obj_139 = new Object(); - List strList_139 = new ArrayList<>(); - String[][][] multi_139 = new String[5][10][32]; - int i_140 = 140; - boolean j_140 = false; - String str_140 = new String("the 140-th string."); - int[] ia_140 = new int[]{140}; - Object obj_140 = new Object(); - List strList_140 = new ArrayList<>(); - String[][][] multi_140 = new String[5][10][32]; - int i_141 = 141; - boolean j_141 = true; - String str_141 = new String("the 141-th string."); - int[] ia_141 = new int[]{141}; - Object obj_141 = new Object(); - List strList_141 = new ArrayList<>(); - String[][][] multi_141 = new String[5][10][32]; - int i_142 = 142; - boolean j_142 = false; - String str_142 = new String("the 142-th string."); - int[] ia_142 = new int[]{142}; - Object obj_142 = new Object(); - List strList_142 = new ArrayList<>(); - String[][][] multi_142 = new String[5][10][32]; - int i_143 = 143; - boolean j_143 = true; - String str_143 = new String("the 143-th string."); - int[] ia_143 = new int[]{143}; - Object obj_143 = new Object(); - List strList_143 = new ArrayList<>(); - String[][][] multi_143 = new String[5][10][32]; - int i_144 = 144; - boolean j_144 = false; - String str_144 = new String("the 144-th string."); - int[] ia_144 = new int[]{144}; - Object obj_144 = new Object(); - List strList_144 = new ArrayList<>(); - String[][][] multi_144 = new String[5][10][32]; - int i_145 = 145; - boolean j_145 = true; - String str_145 = new String("the 145-th string."); - int[] ia_145 = new int[]{145}; - Object obj_145 = new Object(); - List strList_145 = new ArrayList<>(); - String[][][] multi_145 = new String[5][10][32]; - int i_146 = 146; - boolean j_146 = false; - String str_146 = new String("the 146-th string."); - int[] ia_146 = new int[]{146}; - Object obj_146 = new Object(); - List strList_146 = new ArrayList<>(); - String[][][] multi_146 = new String[5][10][32]; - int i_147 = 147; - boolean j_147 = true; - String str_147 = new String("the 147-th string."); - int[] ia_147 = new int[]{147}; - Object obj_147 = new Object(); - List strList_147 = new ArrayList<>(); - String[][][] multi_147 = new String[5][10][32]; - int i_148 = 148; - boolean j_148 = false; - String str_148 = new String("the 148-th string."); - int[] ia_148 = new int[]{148}; - Object obj_148 = new Object(); - List strList_148 = new ArrayList<>(); - String[][][] multi_148 = new String[5][10][32]; - int i_149 = 149; - boolean j_149 = true; - String str_149 = new String("the 149-th string."); - int[] ia_149 = new int[]{149}; - Object obj_149 = new Object(); - List strList_149 = new ArrayList<>(); - String[][][] multi_149 = new String[5][10][32]; - int i_150 = 150; - boolean j_150 = false; - String str_150 = new String("the 150-th string."); - int[] ia_150 = new int[]{150}; - Object obj_150 = new Object(); - List strList_150 = new ArrayList<>(); - String[][][] multi_150 = new String[5][10][32]; - int i_151 = 151; - boolean j_151 = true; - String str_151 = new String("the 151-th string."); - int[] ia_151 = new int[]{151}; - Object obj_151 = new Object(); - List strList_151 = new ArrayList<>(); - String[][][] multi_151 = new String[5][10][32]; - int i_152 = 152; - boolean j_152 = false; - String str_152 = new String("the 152-th string."); - int[] ia_152 = new int[]{152}; - Object obj_152 = new Object(); - List strList_152 = new ArrayList<>(); - String[][][] multi_152 = new String[5][10][32]; - int i_153 = 153; - boolean j_153 = true; - String str_153 = new String("the 153-th string."); - int[] ia_153 = new int[]{153}; - Object obj_153 = new Object(); - List strList_153 = new ArrayList<>(); - String[][][] multi_153 = new String[5][10][32]; - int i_154 = 154; - boolean j_154 = false; - String str_154 = new String("the 154-th string."); - int[] ia_154 = new int[]{154}; - Object obj_154 = new Object(); - List strList_154 = new ArrayList<>(); - String[][][] multi_154 = new String[5][10][32]; - int i_155 = 155; - boolean j_155 = true; - String str_155 = new String("the 155-th string."); - int[] ia_155 = new int[]{155}; - Object obj_155 = new Object(); - List strList_155 = new ArrayList<>(); - String[][][] multi_155 = new String[5][10][32]; - int i_156 = 156; - boolean j_156 = false; - String str_156 = new String("the 156-th string."); - int[] ia_156 = new int[]{156}; - Object obj_156 = new Object(); - List strList_156 = new ArrayList<>(); - String[][][] multi_156 = new String[5][10][32]; - int i_157 = 157; - boolean j_157 = true; - String str_157 = new String("the 157-th string."); - int[] ia_157 = new int[]{157}; - Object obj_157 = new Object(); - List strList_157 = new ArrayList<>(); - String[][][] multi_157 = new String[5][10][32]; - int i_158 = 158; - boolean j_158 = false; - String str_158 = new String("the 158-th string."); - int[] ia_158 = new int[]{158}; - Object obj_158 = new Object(); - List strList_158 = new ArrayList<>(); - String[][][] multi_158 = new String[5][10][32]; - int i_159 = 159; - boolean j_159 = true; - String str_159 = new String("the 159-th string."); - int[] ia_159 = new int[]{159}; - Object obj_159 = new Object(); - List strList_159 = new ArrayList<>(); - String[][][] multi_159 = new String[5][10][32]; - int i_160 = 160; - boolean j_160 = false; - String str_160 = new String("the 160-th string."); - int[] ia_160 = new int[]{160}; - Object obj_160 = new Object(); - List strList_160 = new ArrayList<>(); - String[][][] multi_160 = new String[5][10][32]; - int i_161 = 161; - boolean j_161 = true; - String str_161 = new String("the 161-th string."); - int[] ia_161 = new int[]{161}; - Object obj_161 = new Object(); - List strList_161 = new ArrayList<>(); - String[][][] multi_161 = new String[5][10][32]; - int i_162 = 162; - boolean j_162 = false; - String str_162 = new String("the 162-th string."); - int[] ia_162 = new int[]{162}; - Object obj_162 = new Object(); - List strList_162 = new ArrayList<>(); - String[][][] multi_162 = new String[5][10][32]; - int i_163 = 163; - boolean j_163 = true; - String str_163 = new String("the 163-th string."); - int[] ia_163 = new int[]{163}; - Object obj_163 = new Object(); - List strList_163 = new ArrayList<>(); - String[][][] multi_163 = new String[5][10][32]; - int i_164 = 164; - boolean j_164 = false; - String str_164 = new String("the 164-th string."); - int[] ia_164 = new int[]{164}; - Object obj_164 = new Object(); - List strList_164 = new ArrayList<>(); - String[][][] multi_164 = new String[5][10][32]; - int i_165 = 165; - boolean j_165 = true; - String str_165 = new String("the 165-th string."); - int[] ia_165 = new int[]{165}; - Object obj_165 = new Object(); - List strList_165 = new ArrayList<>(); - String[][][] multi_165 = new String[5][10][32]; - int i_166 = 166; - boolean j_166 = false; - String str_166 = new String("the 166-th string."); - int[] ia_166 = new int[]{166}; - Object obj_166 = new Object(); - List strList_166 = new ArrayList<>(); - String[][][] multi_166 = new String[5][10][32]; - int i_167 = 167; - boolean j_167 = true; - String str_167 = new String("the 167-th string."); - int[] ia_167 = new int[]{167}; - Object obj_167 = new Object(); - List strList_167 = new ArrayList<>(); - String[][][] multi_167 = new String[5][10][32]; - int i_168 = 168; - boolean j_168 = false; - String str_168 = new String("the 168-th string."); - int[] ia_168 = new int[]{168}; - Object obj_168 = new Object(); - List strList_168 = new ArrayList<>(); - String[][][] multi_168 = new String[5][10][32]; - int i_169 = 169; - boolean j_169 = true; - String str_169 = new String("the 169-th string."); - int[] ia_169 = new int[]{169}; - Object obj_169 = new Object(); - List strList_169 = new ArrayList<>(); - String[][][] multi_169 = new String[5][10][32]; - int i_170 = 170; - boolean j_170 = false; - String str_170 = new String("the 170-th string."); - int[] ia_170 = new int[]{170}; - Object obj_170 = new Object(); - List strList_170 = new ArrayList<>(); - String[][][] multi_170 = new String[5][10][32]; - int i_171 = 171; - boolean j_171 = true; - String str_171 = new String("the 171-th string."); - int[] ia_171 = new int[]{171}; - Object obj_171 = new Object(); - List strList_171 = new ArrayList<>(); - String[][][] multi_171 = new String[5][10][32]; - int i_172 = 172; - boolean j_172 = false; - String str_172 = new String("the 172-th string."); - int[] ia_172 = new int[]{172}; - Object obj_172 = new Object(); - List strList_172 = new ArrayList<>(); - String[][][] multi_172 = new String[5][10][32]; - int i_173 = 173; - boolean j_173 = true; - String str_173 = new String("the 173-th string."); - int[] ia_173 = new int[]{173}; - Object obj_173 = new Object(); - List strList_173 = new ArrayList<>(); - String[][][] multi_173 = new String[5][10][32]; - int i_174 = 174; - boolean j_174 = false; - String str_174 = new String("the 174-th string."); - int[] ia_174 = new int[]{174}; - Object obj_174 = new Object(); - List strList_174 = new ArrayList<>(); - String[][][] multi_174 = new String[5][10][32]; - int i_175 = 175; - boolean j_175 = true; - String str_175 = new String("the 175-th string."); - int[] ia_175 = new int[]{175}; - Object obj_175 = new Object(); - List strList_175 = new ArrayList<>(); - String[][][] multi_175 = new String[5][10][32]; - int i_176 = 176; - boolean j_176 = false; - String str_176 = new String("the 176-th string."); - int[] ia_176 = new int[]{176}; - Object obj_176 = new Object(); - List strList_176 = new ArrayList<>(); - String[][][] multi_176 = new String[5][10][32]; - int i_177 = 177; - boolean j_177 = true; - String str_177 = new String("the 177-th string."); - int[] ia_177 = new int[]{177}; - Object obj_177 = new Object(); - List strList_177 = new ArrayList<>(); - String[][][] multi_177 = new String[5][10][32]; - int i_178 = 178; - boolean j_178 = false; - String str_178 = new String("the 178-th string."); - int[] ia_178 = new int[]{178}; - Object obj_178 = new Object(); - List strList_178 = new ArrayList<>(); - String[][][] multi_178 = new String[5][10][32]; - int i_179 = 179; - boolean j_179 = true; - String str_179 = new String("the 179-th string."); - int[] ia_179 = new int[]{179}; - Object obj_179 = new Object(); - List strList_179 = new ArrayList<>(); - String[][][] multi_179 = new String[5][10][32]; - int i_180 = 180; - boolean j_180 = false; - String str_180 = new String("the 180-th string."); - int[] ia_180 = new int[]{180}; - Object obj_180 = new Object(); - List strList_180 = new ArrayList<>(); - String[][][] multi_180 = new String[5][10][32]; - int i_181 = 181; - boolean j_181 = true; - String str_181 = new String("the 181-th string."); - int[] ia_181 = new int[]{181}; - Object obj_181 = new Object(); - List strList_181 = new ArrayList<>(); - String[][][] multi_181 = new String[5][10][32]; - int i_182 = 182; - boolean j_182 = false; - String str_182 = new String("the 182-th string."); - int[] ia_182 = new int[]{182}; - Object obj_182 = new Object(); - List strList_182 = new ArrayList<>(); - String[][][] multi_182 = new String[5][10][32]; - int i_183 = 183; - boolean j_183 = true; - String str_183 = new String("the 183-th string."); - int[] ia_183 = new int[]{183}; - Object obj_183 = new Object(); - List strList_183 = new ArrayList<>(); - String[][][] multi_183 = new String[5][10][32]; - int i_184 = 184; - boolean j_184 = false; - String str_184 = new String("the 184-th string."); - int[] ia_184 = new int[]{184}; - Object obj_184 = new Object(); - List strList_184 = new ArrayList<>(); - String[][][] multi_184 = new String[5][10][32]; - int i_185 = 185; - boolean j_185 = true; - String str_185 = new String("the 185-th string."); - int[] ia_185 = new int[]{185}; - Object obj_185 = new Object(); - List strList_185 = new ArrayList<>(); - String[][][] multi_185 = new String[5][10][32]; - int i_186 = 186; - boolean j_186 = false; - String str_186 = new String("the 186-th string."); - int[] ia_186 = new int[]{186}; - Object obj_186 = new Object(); - List strList_186 = new ArrayList<>(); - String[][][] multi_186 = new String[5][10][32]; - int i_187 = 187; - boolean j_187 = true; - String str_187 = new String("the 187-th string."); - int[] ia_187 = new int[]{187}; - Object obj_187 = new Object(); - List strList_187 = new ArrayList<>(); - String[][][] multi_187 = new String[5][10][32]; - int i_188 = 188; - boolean j_188 = false; - String str_188 = new String("the 188-th string."); - int[] ia_188 = new int[]{188}; - Object obj_188 = new Object(); - List strList_188 = new ArrayList<>(); - String[][][] multi_188 = new String[5][10][32]; - int i_189 = 189; - boolean j_189 = true; - String str_189 = new String("the 189-th string."); - int[] ia_189 = new int[]{189}; - Object obj_189 = new Object(); - List strList_189 = new ArrayList<>(); - String[][][] multi_189 = new String[5][10][32]; - int i_190 = 190; - boolean j_190 = false; - String str_190 = new String("the 190-th string."); - int[] ia_190 = new int[]{190}; - Object obj_190 = new Object(); - List strList_190 = new ArrayList<>(); - String[][][] multi_190 = new String[5][10][32]; - int i_191 = 191; - boolean j_191 = true; - String str_191 = new String("the 191-th string."); - int[] ia_191 = new int[]{191}; - Object obj_191 = new Object(); - List strList_191 = new ArrayList<>(); - String[][][] multi_191 = new String[5][10][32]; - int i_192 = 192; - boolean j_192 = false; - String str_192 = new String("the 192-th string."); - int[] ia_192 = new int[]{192}; - Object obj_192 = new Object(); - List strList_192 = new ArrayList<>(); - String[][][] multi_192 = new String[5][10][32]; - int i_193 = 193; - boolean j_193 = true; - String str_193 = new String("the 193-th string."); - int[] ia_193 = new int[]{193}; - Object obj_193 = new Object(); - List strList_193 = new ArrayList<>(); - String[][][] multi_193 = new String[5][10][32]; - int i_194 = 194; - boolean j_194 = false; - String str_194 = new String("the 194-th string."); - int[] ia_194 = new int[]{194}; - Object obj_194 = new Object(); - List strList_194 = new ArrayList<>(); - String[][][] multi_194 = new String[5][10][32]; - int i_195 = 195; - boolean j_195 = true; - String str_195 = new String("the 195-th string."); - int[] ia_195 = new int[]{195}; - Object obj_195 = new Object(); - List strList_195 = new ArrayList<>(); - String[][][] multi_195 = new String[5][10][32]; - int i_196 = 196; - boolean j_196 = false; - String str_196 = new String("the 196-th string."); - int[] ia_196 = new int[]{196}; - Object obj_196 = new Object(); - List strList_196 = new ArrayList<>(); - String[][][] multi_196 = new String[5][10][32]; - int i_197 = 197; - boolean j_197 = true; - String str_197 = new String("the 197-th string."); - int[] ia_197 = new int[]{197}; - Object obj_197 = new Object(); - List strList_197 = new ArrayList<>(); - String[][][] multi_197 = new String[5][10][32]; - int i_198 = 198; - boolean j_198 = false; - String str_198 = new String("the 198-th string."); - int[] ia_198 = new int[]{198}; - Object obj_198 = new Object(); - List strList_198 = new ArrayList<>(); - String[][][] multi_198 = new String[5][10][32]; - int i_199 = 199; - boolean j_199 = true; - String str_199 = new String("the 199-th string."); - int[] ia_199 = new int[]{199}; - Object obj_199 = new Object(); - List strList_199 = new ArrayList<>(); - String[][][] multi_199 = new String[5][10][32]; - int i_200 = 200; - boolean j_200 = false; - String str_200 = new String("the 200-th string."); - int[] ia_200 = new int[]{200}; - Object obj_200 = new Object(); - List strList_200 = new ArrayList<>(); - String[][][] multi_200 = new String[5][10][32]; - int i_201 = 201; - boolean j_201 = true; - String str_201 = new String("the 201-th string."); - int[] ia_201 = new int[]{201}; - Object obj_201 = new Object(); - List strList_201 = new ArrayList<>(); - String[][][] multi_201 = new String[5][10][32]; - int i_202 = 202; - boolean j_202 = false; - String str_202 = new String("the 202-th string."); - int[] ia_202 = new int[]{202}; - Object obj_202 = new Object(); - List strList_202 = new ArrayList<>(); - String[][][] multi_202 = new String[5][10][32]; - int i_203 = 203; - boolean j_203 = true; - String str_203 = new String("the 203-th string."); - int[] ia_203 = new int[]{203}; - Object obj_203 = new Object(); - List strList_203 = new ArrayList<>(); - String[][][] multi_203 = new String[5][10][32]; - int i_204 = 204; - boolean j_204 = false; - String str_204 = new String("the 204-th string."); - int[] ia_204 = new int[]{204}; - Object obj_204 = new Object(); - List strList_204 = new ArrayList<>(); - String[][][] multi_204 = new String[5][10][32]; - int i_205 = 205; - boolean j_205 = true; - String str_205 = new String("the 205-th string."); - int[] ia_205 = new int[]{205}; - Object obj_205 = new Object(); - List strList_205 = new ArrayList<>(); - String[][][] multi_205 = new String[5][10][32]; - int i_206 = 206; - boolean j_206 = false; - String str_206 = new String("the 206-th string."); - int[] ia_206 = new int[]{206}; - Object obj_206 = new Object(); - List strList_206 = new ArrayList<>(); - String[][][] multi_206 = new String[5][10][32]; - int i_207 = 207; - boolean j_207 = true; - String str_207 = new String("the 207-th string."); - int[] ia_207 = new int[]{207}; - Object obj_207 = new Object(); - List strList_207 = new ArrayList<>(); - String[][][] multi_207 = new String[5][10][32]; - int i_208 = 208; - boolean j_208 = false; - String str_208 = new String("the 208-th string."); - int[] ia_208 = new int[]{208}; - Object obj_208 = new Object(); - List strList_208 = new ArrayList<>(); - String[][][] multi_208 = new String[5][10][32]; - int i_209 = 209; - boolean j_209 = true; - String str_209 = new String("the 209-th string."); - int[] ia_209 = new int[]{209}; - Object obj_209 = new Object(); - List strList_209 = new ArrayList<>(); - String[][][] multi_209 = new String[5][10][32]; - int i_210 = 210; - boolean j_210 = false; - String str_210 = new String("the 210-th string."); - int[] ia_210 = new int[]{210}; - Object obj_210 = new Object(); - List strList_210 = new ArrayList<>(); - String[][][] multi_210 = new String[5][10][32]; - int i_211 = 211; - boolean j_211 = true; - String str_211 = new String("the 211-th string."); - int[] ia_211 = new int[]{211}; - Object obj_211 = new Object(); - List strList_211 = new ArrayList<>(); - String[][][] multi_211 = new String[5][10][32]; - int i_212 = 212; - boolean j_212 = false; - String str_212 = new String("the 212-th string."); - int[] ia_212 = new int[]{212}; - Object obj_212 = new Object(); - List strList_212 = new ArrayList<>(); - String[][][] multi_212 = new String[5][10][32]; - int i_213 = 213; - boolean j_213 = true; - String str_213 = new String("the 213-th string."); - int[] ia_213 = new int[]{213}; - Object obj_213 = new Object(); - List strList_213 = new ArrayList<>(); - String[][][] multi_213 = new String[5][10][32]; - int i_214 = 214; - boolean j_214 = false; - String str_214 = new String("the 214-th string."); - int[] ia_214 = new int[]{214}; - Object obj_214 = new Object(); - List strList_214 = new ArrayList<>(); - String[][][] multi_214 = new String[5][10][32]; - int i_215 = 215; - boolean j_215 = true; - String str_215 = new String("the 215-th string."); - int[] ia_215 = new int[]{215}; - Object obj_215 = new Object(); - List strList_215 = new ArrayList<>(); - String[][][] multi_215 = new String[5][10][32]; - int i_216 = 216; - boolean j_216 = false; - String str_216 = new String("the 216-th string."); - int[] ia_216 = new int[]{216}; - Object obj_216 = new Object(); - List strList_216 = new ArrayList<>(); - String[][][] multi_216 = new String[5][10][32]; - int i_217 = 217; - boolean j_217 = true; - String str_217 = new String("the 217-th string."); - int[] ia_217 = new int[]{217}; - Object obj_217 = new Object(); - List strList_217 = new ArrayList<>(); - String[][][] multi_217 = new String[5][10][32]; - int i_218 = 218; - boolean j_218 = false; - String str_218 = new String("the 218-th string."); - int[] ia_218 = new int[]{218}; - Object obj_218 = new Object(); - List strList_218 = new ArrayList<>(); - String[][][] multi_218 = new String[5][10][32]; - int i_219 = 219; - boolean j_219 = true; - String str_219 = new String("the 219-th string."); - int[] ia_219 = new int[]{219}; - Object obj_219 = new Object(); - List strList_219 = new ArrayList<>(); - String[][][] multi_219 = new String[5][10][32]; - int i_220 = 220; - boolean j_220 = false; - String str_220 = new String("the 220-th string."); - int[] ia_220 = new int[]{220}; - Object obj_220 = new Object(); - List strList_220 = new ArrayList<>(); - String[][][] multi_220 = new String[5][10][32]; - int i_221 = 221; - boolean j_221 = true; - String str_221 = new String("the 221-th string."); - int[] ia_221 = new int[]{221}; - Object obj_221 = new Object(); - List strList_221 = new ArrayList<>(); - String[][][] multi_221 = new String[5][10][32]; - int i_222 = 222; - boolean j_222 = false; - String str_222 = new String("the 222-th string."); - int[] ia_222 = new int[]{222}; - Object obj_222 = new Object(); - List strList_222 = new ArrayList<>(); - String[][][] multi_222 = new String[5][10][32]; - int i_223 = 223; - boolean j_223 = true; - String str_223 = new String("the 223-th string."); - int[] ia_223 = new int[]{223}; - Object obj_223 = new Object(); - List strList_223 = new ArrayList<>(); - String[][][] multi_223 = new String[5][10][32]; - int i_224 = 224; - boolean j_224 = false; - String str_224 = new String("the 224-th string."); - int[] ia_224 = new int[]{224}; - Object obj_224 = new Object(); - List strList_224 = new ArrayList<>(); - String[][][] multi_224 = new String[5][10][32]; - int i_225 = 225; - boolean j_225 = true; - String str_225 = new String("the 225-th string."); - int[] ia_225 = new int[]{225}; - Object obj_225 = new Object(); - List strList_225 = new ArrayList<>(); - String[][][] multi_225 = new String[5][10][32]; - int i_226 = 226; - boolean j_226 = false; - String str_226 = new String("the 226-th string."); - int[] ia_226 = new int[]{226}; - Object obj_226 = new Object(); - List strList_226 = new ArrayList<>(); - String[][][] multi_226 = new String[5][10][32]; - int i_227 = 227; - boolean j_227 = true; - String str_227 = new String("the 227-th string."); - int[] ia_227 = new int[]{227}; - Object obj_227 = new Object(); - List strList_227 = new ArrayList<>(); - String[][][] multi_227 = new String[5][10][32]; - int i_228 = 228; - boolean j_228 = false; - String str_228 = new String("the 228-th string."); - int[] ia_228 = new int[]{228}; - Object obj_228 = new Object(); - List strList_228 = new ArrayList<>(); - String[][][] multi_228 = new String[5][10][32]; - int i_229 = 229; - boolean j_229 = true; - String str_229 = new String("the 229-th string."); - int[] ia_229 = new int[]{229}; - Object obj_229 = new Object(); - List strList_229 = new ArrayList<>(); - String[][][] multi_229 = new String[5][10][32]; - int i_230 = 230; - boolean j_230 = false; - String str_230 = new String("the 230-th string."); - int[] ia_230 = new int[]{230}; - Object obj_230 = new Object(); - List strList_230 = new ArrayList<>(); - String[][][] multi_230 = new String[5][10][32]; - int i_231 = 231; - boolean j_231 = true; - String str_231 = new String("the 231-th string."); - int[] ia_231 = new int[]{231}; - Object obj_231 = new Object(); - List strList_231 = new ArrayList<>(); - String[][][] multi_231 = new String[5][10][32]; - int i_232 = 232; - boolean j_232 = false; - String str_232 = new String("the 232-th string."); - int[] ia_232 = new int[]{232}; - Object obj_232 = new Object(); - List strList_232 = new ArrayList<>(); - String[][][] multi_232 = new String[5][10][32]; - int i_233 = 233; - boolean j_233 = true; - String str_233 = new String("the 233-th string."); - int[] ia_233 = new int[]{233}; - Object obj_233 = new Object(); - List strList_233 = new ArrayList<>(); - String[][][] multi_233 = new String[5][10][32]; - int i_234 = 234; - boolean j_234 = false; - String str_234 = new String("the 234-th string."); - int[] ia_234 = new int[]{234}; - Object obj_234 = new Object(); - List strList_234 = new ArrayList<>(); - String[][][] multi_234 = new String[5][10][32]; - int i_235 = 235; - boolean j_235 = true; - String str_235 = new String("the 235-th string."); - int[] ia_235 = new int[]{235}; - Object obj_235 = new Object(); - List strList_235 = new ArrayList<>(); - String[][][] multi_235 = new String[5][10][32]; - int i_236 = 236; - boolean j_236 = false; - String str_236 = new String("the 236-th string."); - int[] ia_236 = new int[]{236}; - Object obj_236 = new Object(); - List strList_236 = new ArrayList<>(); - String[][][] multi_236 = new String[5][10][32]; - int i_237 = 237; - boolean j_237 = true; - String str_237 = new String("the 237-th string."); - int[] ia_237 = new int[]{237}; - Object obj_237 = new Object(); - List strList_237 = new ArrayList<>(); - String[][][] multi_237 = new String[5][10][32]; - int i_238 = 238; - boolean j_238 = false; - String str_238 = new String("the 238-th string."); - int[] ia_238 = new int[]{238}; - Object obj_238 = new Object(); - List strList_238 = new ArrayList<>(); - String[][][] multi_238 = new String[5][10][32]; - int i_239 = 239; - boolean j_239 = true; - String str_239 = new String("the 239-th string."); - int[] ia_239 = new int[]{239}; - Object obj_239 = new Object(); - List strList_239 = new ArrayList<>(); - String[][][] multi_239 = new String[5][10][32]; - int i_240 = 240; - boolean j_240 = false; - String str_240 = new String("the 240-th string."); - int[] ia_240 = new int[]{240}; - Object obj_240 = new Object(); - List strList_240 = new ArrayList<>(); - String[][][] multi_240 = new String[5][10][32]; - int i_241 = 241; - boolean j_241 = true; - String str_241 = new String("the 241-th string."); - int[] ia_241 = new int[]{241}; - Object obj_241 = new Object(); - List strList_241 = new ArrayList<>(); - String[][][] multi_241 = new String[5][10][32]; - int i_242 = 242; - boolean j_242 = false; - String str_242 = new String("the 242-th string."); - int[] ia_242 = new int[]{242}; - Object obj_242 = new Object(); - List strList_242 = new ArrayList<>(); - String[][][] multi_242 = new String[5][10][32]; - int i_243 = 243; - boolean j_243 = true; - String str_243 = new String("the 243-th string."); - int[] ia_243 = new int[]{243}; - Object obj_243 = new Object(); - List strList_243 = new ArrayList<>(); - String[][][] multi_243 = new String[5][10][32]; - int i_244 = 244; - boolean j_244 = false; - String str_244 = new String("the 244-th string."); - int[] ia_244 = new int[]{244}; - Object obj_244 = new Object(); - List strList_244 = new ArrayList<>(); - String[][][] multi_244 = new String[5][10][32]; - int i_245 = 245; - boolean j_245 = true; - String str_245 = new String("the 245-th string."); - int[] ia_245 = new int[]{245}; - Object obj_245 = new Object(); - List strList_245 = new ArrayList<>(); - String[][][] multi_245 = new String[5][10][32]; - int i_246 = 246; - boolean j_246 = false; - String str_246 = new String("the 246-th string."); - int[] ia_246 = new int[]{246}; - Object obj_246 = new Object(); - List strList_246 = new ArrayList<>(); - String[][][] multi_246 = new String[5][10][32]; - int i_247 = 247; - boolean j_247 = true; - String str_247 = new String("the 247-th string."); - int[] ia_247 = new int[]{247}; - Object obj_247 = new Object(); - List strList_247 = new ArrayList<>(); - String[][][] multi_247 = new String[5][10][32]; - int i_248 = 248; - boolean j_248 = false; - String str_248 = new String("the 248-th string."); - int[] ia_248 = new int[]{248}; - Object obj_248 = new Object(); - List strList_248 = new ArrayList<>(); - String[][][] multi_248 = new String[5][10][32]; - int i_249 = 249; - boolean j_249 = true; - String str_249 = new String("the 249-th string."); - int[] ia_249 = new int[]{249}; - Object obj_249 = new Object(); - List strList_249 = new ArrayList<>(); - String[][][] multi_249 = new String[5][10][32]; - int i_250 = 250; - boolean j_250 = false; - String str_250 = new String("the 250-th string."); - int[] ia_250 = new int[]{250}; - Object obj_250 = new Object(); - List strList_250 = new ArrayList<>(); - String[][][] multi_250 = new String[5][10][32]; - int i_251 = 251; - boolean j_251 = true; - String str_251 = new String("the 251-th string."); - int[] ia_251 = new int[]{251}; - Object obj_251 = new Object(); - List strList_251 = new ArrayList<>(); - String[][][] multi_251 = new String[5][10][32]; - int i_252 = 252; - boolean j_252 = false; - String str_252 = new String("the 252-th string."); - int[] ia_252 = new int[]{252}; - Object obj_252 = new Object(); - List strList_252 = new ArrayList<>(); - String[][][] multi_252 = new String[5][10][32]; - int i_253 = 253; - boolean j_253 = true; - String str_253 = new String("the 253-th string."); - int[] ia_253 = new int[]{253}; - Object obj_253 = new Object(); - List strList_253 = new ArrayList<>(); - String[][][] multi_253 = new String[5][10][32]; - int i_254 = 254; - boolean j_254 = false; - String str_254 = new String("the 254-th string."); - int[] ia_254 = new int[]{254}; - Object obj_254 = new Object(); - List strList_254 = new ArrayList<>(); - String[][][] multi_254 = new String[5][10][32]; - int i_255 = 255; - boolean j_255 = true; - String str_255 = new String("the 255-th string."); - int[] ia_255 = new int[]{255}; - Object obj_255 = new Object(); - List strList_255 = new ArrayList<>(); - String[][][] multi_255 = new String[5][10][32]; - int i_256 = 256; - boolean j_256 = false; - String str_256 = new String("the 256-th string."); - int[] ia_256 = new int[]{256}; - Object obj_256 = new Object(); - List strList_256 = new ArrayList<>(); - String[][][] multi_256 = new String[5][10][32]; - int i_257 = 257; - boolean j_257 = true; - String str_257 = new String("the 257-th string."); - int[] ia_257 = new int[]{257}; - Object obj_257 = new Object(); - List strList_257 = new ArrayList<>(); - String[][][] multi_257 = new String[5][10][32]; - int i_258 = 258; - boolean j_258 = false; - String str_258 = new String("the 258-th string."); - int[] ia_258 = new int[]{258}; - Object obj_258 = new Object(); - List strList_258 = new ArrayList<>(); - String[][][] multi_258 = new String[5][10][32]; - int i_259 = 259; - boolean j_259 = true; - String str_259 = new String("the 259-th string."); - int[] ia_259 = new int[]{259}; - Object obj_259 = new Object(); - List strList_259 = new ArrayList<>(); - String[][][] multi_259 = new String[5][10][32]; - int i_260 = 260; - boolean j_260 = false; - String str_260 = new String("the 260-th string."); - int[] ia_260 = new int[]{260}; - Object obj_260 = new Object(); - List strList_260 = new ArrayList<>(); - String[][][] multi_260 = new String[5][10][32]; - int i_261 = 261; - boolean j_261 = true; - String str_261 = new String("the 261-th string."); - int[] ia_261 = new int[]{261}; - Object obj_261 = new Object(); - List strList_261 = new ArrayList<>(); - String[][][] multi_261 = new String[5][10][32]; - int i_262 = 262; - boolean j_262 = false; - String str_262 = new String("the 262-th string."); - int[] ia_262 = new int[]{262}; - Object obj_262 = new Object(); - List strList_262 = new ArrayList<>(); - String[][][] multi_262 = new String[5][10][32]; - int i_263 = 263; - boolean j_263 = true; - String str_263 = new String("the 263-th string."); - int[] ia_263 = new int[]{263}; - Object obj_263 = new Object(); - List strList_263 = new ArrayList<>(); - String[][][] multi_263 = new String[5][10][32]; - int i_264 = 264; - boolean j_264 = false; - String str_264 = new String("the 264-th string."); - int[] ia_264 = new int[]{264}; - Object obj_264 = new Object(); - List strList_264 = new ArrayList<>(); - String[][][] multi_264 = new String[5][10][32]; - int i_265 = 265; - boolean j_265 = true; - String str_265 = new String("the 265-th string."); - int[] ia_265 = new int[]{265}; - Object obj_265 = new Object(); - List strList_265 = new ArrayList<>(); - String[][][] multi_265 = new String[5][10][32]; - int i_266 = 266; - boolean j_266 = false; - String str_266 = new String("the 266-th string."); - int[] ia_266 = new int[]{266}; - Object obj_266 = new Object(); - List strList_266 = new ArrayList<>(); - String[][][] multi_266 = new String[5][10][32]; - int i_267 = 267; - boolean j_267 = true; - String str_267 = new String("the 267-th string."); - int[] ia_267 = new int[]{267}; - Object obj_267 = new Object(); - List strList_267 = new ArrayList<>(); - String[][][] multi_267 = new String[5][10][32]; - int i_268 = 268; - boolean j_268 = false; - String str_268 = new String("the 268-th string."); - int[] ia_268 = new int[]{268}; - Object obj_268 = new Object(); - List strList_268 = new ArrayList<>(); - String[][][] multi_268 = new String[5][10][32]; - int i_269 = 269; - boolean j_269 = true; - String str_269 = new String("the 269-th string."); - int[] ia_269 = new int[]{269}; - Object obj_269 = new Object(); - List strList_269 = new ArrayList<>(); - String[][][] multi_269 = new String[5][10][32]; - int i_270 = 270; - boolean j_270 = false; - String str_270 = new String("the 270-th string."); - int[] ia_270 = new int[]{270}; - Object obj_270 = new Object(); - List strList_270 = new ArrayList<>(); - String[][][] multi_270 = new String[5][10][32]; - int i_271 = 271; - boolean j_271 = true; - String str_271 = new String("the 271-th string."); - int[] ia_271 = new int[]{271}; - Object obj_271 = new Object(); - List strList_271 = new ArrayList<>(); - String[][][] multi_271 = new String[5][10][32]; - int i_272 = 272; - boolean j_272 = false; - String str_272 = new String("the 272-th string."); - int[] ia_272 = new int[]{272}; - Object obj_272 = new Object(); - List strList_272 = new ArrayList<>(); - String[][][] multi_272 = new String[5][10][32]; - int i_273 = 273; - boolean j_273 = true; - String str_273 = new String("the 273-th string."); - int[] ia_273 = new int[]{273}; - Object obj_273 = new Object(); - List strList_273 = new ArrayList<>(); - String[][][] multi_273 = new String[5][10][32]; - int i_274 = 274; - boolean j_274 = false; - String str_274 = new String("the 274-th string."); - int[] ia_274 = new int[]{274}; - Object obj_274 = new Object(); - List strList_274 = new ArrayList<>(); - String[][][] multi_274 = new String[5][10][32]; - int i_275 = 275; - boolean j_275 = true; - String str_275 = new String("the 275-th string."); - int[] ia_275 = new int[]{275}; - Object obj_275 = new Object(); - List strList_275 = new ArrayList<>(); - String[][][] multi_275 = new String[5][10][32]; - int i_276 = 276; - boolean j_276 = false; - String str_276 = new String("the 276-th string."); - int[] ia_276 = new int[]{276}; - Object obj_276 = new Object(); - List strList_276 = new ArrayList<>(); - String[][][] multi_276 = new String[5][10][32]; - int i_277 = 277; - boolean j_277 = true; - String str_277 = new String("the 277-th string."); - int[] ia_277 = new int[]{277}; - Object obj_277 = new Object(); - List strList_277 = new ArrayList<>(); - String[][][] multi_277 = new String[5][10][32]; - int i_278 = 278; - boolean j_278 = false; - String str_278 = new String("the 278-th string."); - int[] ia_278 = new int[]{278}; - Object obj_278 = new Object(); - List strList_278 = new ArrayList<>(); - String[][][] multi_278 = new String[5][10][32]; - int i_279 = 279; - boolean j_279 = true; - String str_279 = new String("the 279-th string."); - int[] ia_279 = new int[]{279}; - Object obj_279 = new Object(); - List strList_279 = new ArrayList<>(); - String[][][] multi_279 = new String[5][10][32]; - int i_280 = 280; - boolean j_280 = false; - String str_280 = new String("the 280-th string."); - int[] ia_280 = new int[]{280}; - Object obj_280 = new Object(); - List strList_280 = new ArrayList<>(); - String[][][] multi_280 = new String[5][10][32]; - int i_281 = 281; - boolean j_281 = true; - String str_281 = new String("the 281-th string."); - int[] ia_281 = new int[]{281}; - Object obj_281 = new Object(); - List strList_281 = new ArrayList<>(); - String[][][] multi_281 = new String[5][10][32]; - int i_282 = 282; - boolean j_282 = false; - String str_282 = new String("the 282-th string."); - int[] ia_282 = new int[]{282}; - Object obj_282 = new Object(); - List strList_282 = new ArrayList<>(); - String[][][] multi_282 = new String[5][10][32]; - int i_283 = 283; - boolean j_283 = true; - String str_283 = new String("the 283-th string."); - int[] ia_283 = new int[]{283}; - Object obj_283 = new Object(); - List strList_283 = new ArrayList<>(); - String[][][] multi_283 = new String[5][10][32]; - int i_284 = 284; - boolean j_284 = false; - String str_284 = new String("the 284-th string."); - int[] ia_284 = new int[]{284}; - Object obj_284 = new Object(); - List strList_284 = new ArrayList<>(); - String[][][] multi_284 = new String[5][10][32]; - int i_285 = 285; - boolean j_285 = true; - String str_285 = new String("the 285-th string."); - int[] ia_285 = new int[]{285}; - Object obj_285 = new Object(); - List strList_285 = new ArrayList<>(); - String[][][] multi_285 = new String[5][10][32]; - int i_286 = 286; - boolean j_286 = false; - String str_286 = new String("the 286-th string."); - int[] ia_286 = new int[]{286}; - Object obj_286 = new Object(); - List strList_286 = new ArrayList<>(); - String[][][] multi_286 = new String[5][10][32]; - int i_287 = 287; - boolean j_287 = true; - String str_287 = new String("the 287-th string."); - int[] ia_287 = new int[]{287}; - Object obj_287 = new Object(); - List strList_287 = new ArrayList<>(); - String[][][] multi_287 = new String[5][10][32]; - int i_288 = 288; - boolean j_288 = false; - String str_288 = new String("the 288-th string."); - int[] ia_288 = new int[]{288}; - Object obj_288 = new Object(); - List strList_288 = new ArrayList<>(); - String[][][] multi_288 = new String[5][10][32]; - int i_289 = 289; - boolean j_289 = true; - String str_289 = new String("the 289-th string."); - int[] ia_289 = new int[]{289}; - Object obj_289 = new Object(); - List strList_289 = new ArrayList<>(); - String[][][] multi_289 = new String[5][10][32]; - int i_290 = 290; - boolean j_290 = false; - String str_290 = new String("the 290-th string."); - int[] ia_290 = new int[]{290}; - Object obj_290 = new Object(); - List strList_290 = new ArrayList<>(); - String[][][] multi_290 = new String[5][10][32]; - int i_291 = 291; - boolean j_291 = true; - String str_291 = new String("the 291-th string."); - int[] ia_291 = new int[]{291}; - Object obj_291 = new Object(); - List strList_291 = new ArrayList<>(); - String[][][] multi_291 = new String[5][10][32]; - int i_292 = 292; - boolean j_292 = false; - String str_292 = new String("the 292-th string."); - int[] ia_292 = new int[]{292}; - Object obj_292 = new Object(); - List strList_292 = new ArrayList<>(); - String[][][] multi_292 = new String[5][10][32]; - int i_293 = 293; - boolean j_293 = true; - String str_293 = new String("the 293-th string."); - int[] ia_293 = new int[]{293}; - Object obj_293 = new Object(); - List strList_293 = new ArrayList<>(); - String[][][] multi_293 = new String[5][10][32]; - int i_294 = 294; - boolean j_294 = false; - String str_294 = new String("the 294-th string."); - int[] ia_294 = new int[]{294}; - Object obj_294 = new Object(); - List strList_294 = new ArrayList<>(); - String[][][] multi_294 = new String[5][10][32]; - int i_295 = 295; - boolean j_295 = true; - String str_295 = new String("the 295-th string."); - int[] ia_295 = new int[]{295}; - Object obj_295 = new Object(); - List strList_295 = new ArrayList<>(); - String[][][] multi_295 = new String[5][10][32]; - int i_296 = 296; - boolean j_296 = false; - String str_296 = new String("the 296-th string."); - int[] ia_296 = new int[]{296}; - Object obj_296 = new Object(); - List strList_296 = new ArrayList<>(); - String[][][] multi_296 = new String[5][10][32]; - int i_297 = 297; - boolean j_297 = true; - String str_297 = new String("the 297-th string."); - int[] ia_297 = new int[]{297}; - Object obj_297 = new Object(); - List strList_297 = new ArrayList<>(); - String[][][] multi_297 = new String[5][10][32]; - int i_298 = 298; - boolean j_298 = false; - String str_298 = new String("the 298-th string."); - int[] ia_298 = new int[]{298}; - Object obj_298 = new Object(); - List strList_298 = new ArrayList<>(); - String[][][] multi_298 = new String[5][10][32]; - int i_299 = 299; - boolean j_299 = true; - String str_299 = new String("the 299-th string."); - int[] ia_299 = new int[]{299}; - Object obj_299 = new Object(); - List strList_299 = new ArrayList<>(); - String[][][] multi_299 = new String[5][10][32]; - int i_300 = 300; - boolean j_300 = false; - String str_300 = new String("the 300-th string."); - int[] ia_300 = new int[]{300}; - Object obj_300 = new Object(); - List strList_300 = new ArrayList<>(); - String[][][] multi_300 = new String[5][10][32]; - int i_301 = 301; - boolean j_301 = true; - String str_301 = new String("the 301-th string."); - int[] ia_301 = new int[]{301}; - Object obj_301 = new Object(); - List strList_301 = new ArrayList<>(); - String[][][] multi_301 = new String[5][10][32]; - int i_302 = 302; - boolean j_302 = false; - String str_302 = new String("the 302-th string."); - int[] ia_302 = new int[]{302}; - Object obj_302 = new Object(); - List strList_302 = new ArrayList<>(); - String[][][] multi_302 = new String[5][10][32]; - int i_303 = 303; - boolean j_303 = true; - String str_303 = new String("the 303-th string."); - int[] ia_303 = new int[]{303}; - Object obj_303 = new Object(); - List strList_303 = new ArrayList<>(); - String[][][] multi_303 = new String[5][10][32]; - int i_304 = 304; - boolean j_304 = false; - String str_304 = new String("the 304-th string."); - int[] ia_304 = new int[]{304}; - Object obj_304 = new Object(); - List strList_304 = new ArrayList<>(); - String[][][] multi_304 = new String[5][10][32]; - int i_305 = 305; - boolean j_305 = true; - String str_305 = new String("the 305-th string."); - int[] ia_305 = new int[]{305}; - Object obj_305 = new Object(); - List strList_305 = new ArrayList<>(); - String[][][] multi_305 = new String[5][10][32]; - int i_306 = 306; - boolean j_306 = false; - String str_306 = new String("the 306-th string."); - int[] ia_306 = new int[]{306}; - Object obj_306 = new Object(); - List strList_306 = new ArrayList<>(); - String[][][] multi_306 = new String[5][10][32]; - int i_307 = 307; - boolean j_307 = true; - String str_307 = new String("the 307-th string."); - int[] ia_307 = new int[]{307}; - Object obj_307 = new Object(); - List strList_307 = new ArrayList<>(); - String[][][] multi_307 = new String[5][10][32]; - int i_308 = 308; - boolean j_308 = false; - String str_308 = new String("the 308-th string."); - int[] ia_308 = new int[]{308}; - Object obj_308 = new Object(); - List strList_308 = new ArrayList<>(); - String[][][] multi_308 = new String[5][10][32]; - int i_309 = 309; - boolean j_309 = true; - String str_309 = new String("the 309-th string."); - int[] ia_309 = new int[]{309}; - Object obj_309 = new Object(); - List strList_309 = new ArrayList<>(); - String[][][] multi_309 = new String[5][10][32]; - int i_310 = 310; - boolean j_310 = false; - String str_310 = new String("the 310-th string."); - int[] ia_310 = new int[]{310}; - Object obj_310 = new Object(); - List strList_310 = new ArrayList<>(); - String[][][] multi_310 = new String[5][10][32]; - int i_311 = 311; - boolean j_311 = true; - String str_311 = new String("the 311-th string."); - int[] ia_311 = new int[]{311}; - Object obj_311 = new Object(); - List strList_311 = new ArrayList<>(); - String[][][] multi_311 = new String[5][10][32]; - int i_312 = 312; - boolean j_312 = false; - String str_312 = new String("the 312-th string."); - int[] ia_312 = new int[]{312}; - Object obj_312 = new Object(); - List strList_312 = new ArrayList<>(); - String[][][] multi_312 = new String[5][10][32]; - int i_313 = 313; - boolean j_313 = true; - String str_313 = new String("the 313-th string."); - int[] ia_313 = new int[]{313}; - Object obj_313 = new Object(); - List strList_313 = new ArrayList<>(); - String[][][] multi_313 = new String[5][10][32]; - int i_314 = 314; - boolean j_314 = false; - String str_314 = new String("the 314-th string."); - int[] ia_314 = new int[]{314}; - Object obj_314 = new Object(); - List strList_314 = new ArrayList<>(); - String[][][] multi_314 = new String[5][10][32]; - int i_315 = 315; - boolean j_315 = true; - String str_315 = new String("the 315-th string."); - int[] ia_315 = new int[]{315}; - Object obj_315 = new Object(); - List strList_315 = new ArrayList<>(); - String[][][] multi_315 = new String[5][10][32]; - int i_316 = 316; - boolean j_316 = false; - String str_316 = new String("the 316-th string."); - int[] ia_316 = new int[]{316}; - Object obj_316 = new Object(); - List strList_316 = new ArrayList<>(); - String[][][] multi_316 = new String[5][10][32]; - int i_317 = 317; - boolean j_317 = true; - String str_317 = new String("the 317-th string."); - int[] ia_317 = new int[]{317}; - Object obj_317 = new Object(); - List strList_317 = new ArrayList<>(); - String[][][] multi_317 = new String[5][10][32]; - int i_318 = 318; - boolean j_318 = false; - String str_318 = new String("the 318-th string."); - int[] ia_318 = new int[]{318}; - Object obj_318 = new Object(); - List strList_318 = new ArrayList<>(); - String[][][] multi_318 = new String[5][10][32]; - int i_319 = 319; - boolean j_319 = true; - String str_319 = new String("the 319-th string."); - int[] ia_319 = new int[]{319}; - Object obj_319 = new Object(); - List strList_319 = new ArrayList<>(); - String[][][] multi_319 = new String[5][10][32]; - int i_320 = 320; - boolean j_320 = false; - String str_320 = new String("the 320-th string."); - int[] ia_320 = new int[]{320}; - Object obj_320 = new Object(); - List strList_320 = new ArrayList<>(); - String[][][] multi_320 = new String[5][10][32]; - int i_321 = 321; - boolean j_321 = true; - String str_321 = new String("the 321-th string."); - int[] ia_321 = new int[]{321}; - Object obj_321 = new Object(); - List strList_321 = new ArrayList<>(); - String[][][] multi_321 = new String[5][10][32]; - int i_322 = 322; - boolean j_322 = false; - String str_322 = new String("the 322-th string."); - int[] ia_322 = new int[]{322}; - Object obj_322 = new Object(); - List strList_322 = new ArrayList<>(); - String[][][] multi_322 = new String[5][10][32]; - int i_323 = 323; - boolean j_323 = true; - String str_323 = new String("the 323-th string."); - int[] ia_323 = new int[]{323}; - Object obj_323 = new Object(); - List strList_323 = new ArrayList<>(); - String[][][] multi_323 = new String[5][10][32]; - int i_324 = 324; - boolean j_324 = false; - String str_324 = new String("the 324-th string."); - int[] ia_324 = new int[]{324}; - Object obj_324 = new Object(); - List strList_324 = new ArrayList<>(); - String[][][] multi_324 = new String[5][10][32]; - int i_325 = 325; - boolean j_325 = true; - String str_325 = new String("the 325-th string."); - int[] ia_325 = new int[]{325}; - Object obj_325 = new Object(); - List strList_325 = new ArrayList<>(); - String[][][] multi_325 = new String[5][10][32]; - int i_326 = 326; - boolean j_326 = false; - String str_326 = new String("the 326-th string."); - int[] ia_326 = new int[]{326}; - Object obj_326 = new Object(); - List strList_326 = new ArrayList<>(); - String[][][] multi_326 = new String[5][10][32]; - int i_327 = 327; - boolean j_327 = true; - String str_327 = new String("the 327-th string."); - int[] ia_327 = new int[]{327}; - Object obj_327 = new Object(); - List strList_327 = new ArrayList<>(); - String[][][] multi_327 = new String[5][10][32]; - int i_328 = 328; - boolean j_328 = false; - String str_328 = new String("the 328-th string."); - int[] ia_328 = new int[]{328}; - Object obj_328 = new Object(); - List strList_328 = new ArrayList<>(); - String[][][] multi_328 = new String[5][10][32]; - int i_329 = 329; - boolean j_329 = true; - String str_329 = new String("the 329-th string."); - int[] ia_329 = new int[]{329}; - Object obj_329 = new Object(); - List strList_329 = new ArrayList<>(); - String[][][] multi_329 = new String[5][10][32]; - int i_330 = 330; - boolean j_330 = false; - String str_330 = new String("the 330-th string."); - int[] ia_330 = new int[]{330}; - Object obj_330 = new Object(); - List strList_330 = new ArrayList<>(); - String[][][] multi_330 = new String[5][10][32]; - int i_331 = 331; - boolean j_331 = true; - String str_331 = new String("the 331-th string."); - int[] ia_331 = new int[]{331}; - Object obj_331 = new Object(); - List strList_331 = new ArrayList<>(); - String[][][] multi_331 = new String[5][10][32]; - int i_332 = 332; - boolean j_332 = false; - String str_332 = new String("the 332-th string."); - int[] ia_332 = new int[]{332}; - Object obj_332 = new Object(); - List strList_332 = new ArrayList<>(); - String[][][] multi_332 = new String[5][10][32]; - int i_333 = 333; - boolean j_333 = true; - String str_333 = new String("the 333-th string."); - int[] ia_333 = new int[]{333}; - Object obj_333 = new Object(); - List strList_333 = new ArrayList<>(); - String[][][] multi_333 = new String[5][10][32]; - int i_334 = 334; - boolean j_334 = false; - String str_334 = new String("the 334-th string."); - int[] ia_334 = new int[]{334}; - Object obj_334 = new Object(); - List strList_334 = new ArrayList<>(); - String[][][] multi_334 = new String[5][10][32]; - int i_335 = 335; - boolean j_335 = true; - String str_335 = new String("the 335-th string."); - int[] ia_335 = new int[]{335}; - Object obj_335 = new Object(); - List strList_335 = new ArrayList<>(); - String[][][] multi_335 = new String[5][10][32]; - int i_336 = 336; - boolean j_336 = false; - String str_336 = new String("the 336-th string."); - int[] ia_336 = new int[]{336}; - Object obj_336 = new Object(); - List strList_336 = new ArrayList<>(); - String[][][] multi_336 = new String[5][10][32]; - int i_337 = 337; - boolean j_337 = true; - String str_337 = new String("the 337-th string."); - int[] ia_337 = new int[]{337}; - Object obj_337 = new Object(); - List strList_337 = new ArrayList<>(); - String[][][] multi_337 = new String[5][10][32]; - int i_338 = 338; - boolean j_338 = false; - String str_338 = new String("the 338-th string."); - int[] ia_338 = new int[]{338}; - Object obj_338 = new Object(); - List strList_338 = new ArrayList<>(); - String[][][] multi_338 = new String[5][10][32]; - int i_339 = 339; - boolean j_339 = true; - String str_339 = new String("the 339-th string."); - int[] ia_339 = new int[]{339}; - Object obj_339 = new Object(); - List strList_339 = new ArrayList<>(); - String[][][] multi_339 = new String[5][10][32]; - int i_340 = 340; - boolean j_340 = false; - String str_340 = new String("the 340-th string."); - int[] ia_340 = new int[]{340}; - Object obj_340 = new Object(); - List strList_340 = new ArrayList<>(); - String[][][] multi_340 = new String[5][10][32]; - int i_341 = 341; - boolean j_341 = true; - String str_341 = new String("the 341-th string."); - int[] ia_341 = new int[]{341}; - Object obj_341 = new Object(); - List strList_341 = new ArrayList<>(); - String[][][] multi_341 = new String[5][10][32]; - int i_342 = 342; - boolean j_342 = false; - String str_342 = new String("the 342-th string."); - int[] ia_342 = new int[]{342}; - Object obj_342 = new Object(); - List strList_342 = new ArrayList<>(); - String[][][] multi_342 = new String[5][10][32]; - int i_343 = 343; - boolean j_343 = true; - String str_343 = new String("the 343-th string."); - int[] ia_343 = new int[]{343}; - Object obj_343 = new Object(); - List strList_343 = new ArrayList<>(); - String[][][] multi_343 = new String[5][10][32]; - int i_344 = 344; - boolean j_344 = false; - String str_344 = new String("the 344-th string."); - int[] ia_344 = new int[]{344}; - Object obj_344 = new Object(); - List strList_344 = new ArrayList<>(); - String[][][] multi_344 = new String[5][10][32]; - int i_345 = 345; - boolean j_345 = true; - String str_345 = new String("the 345-th string."); - int[] ia_345 = new int[]{345}; - Object obj_345 = new Object(); - List strList_345 = new ArrayList<>(); - String[][][] multi_345 = new String[5][10][32]; - int i_346 = 346; - boolean j_346 = false; - String str_346 = new String("the 346-th string."); - int[] ia_346 = new int[]{346}; - Object obj_346 = new Object(); - List strList_346 = new ArrayList<>(); - String[][][] multi_346 = new String[5][10][32]; - int i_347 = 347; - boolean j_347 = true; - String str_347 = new String("the 347-th string."); - int[] ia_347 = new int[]{347}; - Object obj_347 = new Object(); - List strList_347 = new ArrayList<>(); - String[][][] multi_347 = new String[5][10][32]; - int i_348 = 348; - boolean j_348 = false; - String str_348 = new String("the 348-th string."); - int[] ia_348 = new int[]{348}; - Object obj_348 = new Object(); - List strList_348 = new ArrayList<>(); - String[][][] multi_348 = new String[5][10][32]; - int i_349 = 349; - boolean j_349 = true; - String str_349 = new String("the 349-th string."); - int[] ia_349 = new int[]{349}; - Object obj_349 = new Object(); - List strList_349 = new ArrayList<>(); - String[][][] multi_349 = new String[5][10][32]; - int i_350 = 350; - boolean j_350 = false; - String str_350 = new String("the 350-th string."); - int[] ia_350 = new int[]{350}; - Object obj_350 = new Object(); - List strList_350 = new ArrayList<>(); - String[][][] multi_350 = new String[5][10][32]; - int i_351 = 351; - boolean j_351 = true; - String str_351 = new String("the 351-th string."); - int[] ia_351 = new int[]{351}; - Object obj_351 = new Object(); - List strList_351 = new ArrayList<>(); - String[][][] multi_351 = new String[5][10][32]; - int i_352 = 352; - boolean j_352 = false; - String str_352 = new String("the 352-th string."); - int[] ia_352 = new int[]{352}; - Object obj_352 = new Object(); - List strList_352 = new ArrayList<>(); - String[][][] multi_352 = new String[5][10][32]; - int i_353 = 353; - boolean j_353 = true; - String str_353 = new String("the 353-th string."); - int[] ia_353 = new int[]{353}; - Object obj_353 = new Object(); - List strList_353 = new ArrayList<>(); - String[][][] multi_353 = new String[5][10][32]; - int i_354 = 354; - boolean j_354 = false; - String str_354 = new String("the 354-th string."); - int[] ia_354 = new int[]{354}; - Object obj_354 = new Object(); - List strList_354 = new ArrayList<>(); - String[][][] multi_354 = new String[5][10][32]; - int i_355 = 355; - boolean j_355 = true; - String str_355 = new String("the 355-th string."); - int[] ia_355 = new int[]{355}; - Object obj_355 = new Object(); - List strList_355 = new ArrayList<>(); - String[][][] multi_355 = new String[5][10][32]; - int i_356 = 356; - boolean j_356 = false; - String str_356 = new String("the 356-th string."); - int[] ia_356 = new int[]{356}; - Object obj_356 = new Object(); - List strList_356 = new ArrayList<>(); - String[][][] multi_356 = new String[5][10][32]; - int i_357 = 357; - boolean j_357 = true; - String str_357 = new String("the 357-th string."); - int[] ia_357 = new int[]{357}; - Object obj_357 = new Object(); - List strList_357 = new ArrayList<>(); - String[][][] multi_357 = new String[5][10][32]; - int i_358 = 358; - boolean j_358 = false; - String str_358 = new String("the 358-th string."); - int[] ia_358 = new int[]{358}; - Object obj_358 = new Object(); - List strList_358 = new ArrayList<>(); - String[][][] multi_358 = new String[5][10][32]; - int i_359 = 359; - boolean j_359 = true; - String str_359 = new String("the 359-th string."); - int[] ia_359 = new int[]{359}; - Object obj_359 = new Object(); - List strList_359 = new ArrayList<>(); - String[][][] multi_359 = new String[5][10][32]; - int i_360 = 360; - boolean j_360 = false; - String str_360 = new String("the 360-th string."); - int[] ia_360 = new int[]{360}; - Object obj_360 = new Object(); - List strList_360 = new ArrayList<>(); - String[][][] multi_360 = new String[5][10][32]; - int i_361 = 361; - boolean j_361 = true; - String str_361 = new String("the 361-th string."); - int[] ia_361 = new int[]{361}; - Object obj_361 = new Object(); - List strList_361 = new ArrayList<>(); - String[][][] multi_361 = new String[5][10][32]; - int i_362 = 362; - boolean j_362 = false; - String str_362 = new String("the 362-th string."); - int[] ia_362 = new int[]{362}; - Object obj_362 = new Object(); - List strList_362 = new ArrayList<>(); - String[][][] multi_362 = new String[5][10][32]; - int i_363 = 363; - boolean j_363 = true; - String str_363 = new String("the 363-th string."); - int[] ia_363 = new int[]{363}; - Object obj_363 = new Object(); - List strList_363 = new ArrayList<>(); - String[][][] multi_363 = new String[5][10][32]; - int i_364 = 364; - boolean j_364 = false; - String str_364 = new String("the 364-th string."); - int[] ia_364 = new int[]{364}; - Object obj_364 = new Object(); - List strList_364 = new ArrayList<>(); - String[][][] multi_364 = new String[5][10][32]; - int i_365 = 365; - boolean j_365 = true; - String str_365 = new String("the 365-th string."); - int[] ia_365 = new int[]{365}; - Object obj_365 = new Object(); - List strList_365 = new ArrayList<>(); - String[][][] multi_365 = new String[5][10][32]; - int i_366 = 366; - boolean j_366 = false; - String str_366 = new String("the 366-th string."); - int[] ia_366 = new int[]{366}; - Object obj_366 = new Object(); - List strList_366 = new ArrayList<>(); - String[][][] multi_366 = new String[5][10][32]; - int i_367 = 367; - boolean j_367 = true; - String str_367 = new String("the 367-th string."); - int[] ia_367 = new int[]{367}; - Object obj_367 = new Object(); - List strList_367 = new ArrayList<>(); - String[][][] multi_367 = new String[5][10][32]; - int i_368 = 368; - boolean j_368 = false; - String str_368 = new String("the 368-th string."); - int[] ia_368 = new int[]{368}; - Object obj_368 = new Object(); - List strList_368 = new ArrayList<>(); - String[][][] multi_368 = new String[5][10][32]; - int i_369 = 369; - boolean j_369 = true; - String str_369 = new String("the 369-th string."); - int[] ia_369 = new int[]{369}; - Object obj_369 = new Object(); - List strList_369 = new ArrayList<>(); - String[][][] multi_369 = new String[5][10][32]; - int i_370 = 370; - boolean j_370 = false; - String str_370 = new String("the 370-th string."); - int[] ia_370 = new int[]{370}; - Object obj_370 = new Object(); - List strList_370 = new ArrayList<>(); - String[][][] multi_370 = new String[5][10][32]; - int i_371 = 371; - boolean j_371 = true; - String str_371 = new String("the 371-th string."); - int[] ia_371 = new int[]{371}; - Object obj_371 = new Object(); - List strList_371 = new ArrayList<>(); - String[][][] multi_371 = new String[5][10][32]; - int i_372 = 372; - boolean j_372 = false; - String str_372 = new String("the 372-th string."); - int[] ia_372 = new int[]{372}; - Object obj_372 = new Object(); - List strList_372 = new ArrayList<>(); - String[][][] multi_372 = new String[5][10][32]; - int i_373 = 373; - boolean j_373 = true; - String str_373 = new String("the 373-th string."); - int[] ia_373 = new int[]{373}; - Object obj_373 = new Object(); - List strList_373 = new ArrayList<>(); - String[][][] multi_373 = new String[5][10][32]; - int i_374 = 374; - boolean j_374 = false; - String str_374 = new String("the 374-th string."); - int[] ia_374 = new int[]{374}; - Object obj_374 = new Object(); - List strList_374 = new ArrayList<>(); - String[][][] multi_374 = new String[5][10][32]; - int i_375 = 375; - boolean j_375 = true; - String str_375 = new String("the 375-th string."); - int[] ia_375 = new int[]{375}; - Object obj_375 = new Object(); - List strList_375 = new ArrayList<>(); - String[][][] multi_375 = new String[5][10][32]; - int i_376 = 376; - boolean j_376 = false; - String str_376 = new String("the 376-th string."); - int[] ia_376 = new int[]{376}; - Object obj_376 = new Object(); - List strList_376 = new ArrayList<>(); - String[][][] multi_376 = new String[5][10][32]; - int i_377 = 377; - boolean j_377 = true; - String str_377 = new String("the 377-th string."); - int[] ia_377 = new int[]{377}; - Object obj_377 = new Object(); - List strList_377 = new ArrayList<>(); - String[][][] multi_377 = new String[5][10][32]; - int i_378 = 378; - boolean j_378 = false; - String str_378 = new String("the 378-th string."); - int[] ia_378 = new int[]{378}; - Object obj_378 = new Object(); - List strList_378 = new ArrayList<>(); - String[][][] multi_378 = new String[5][10][32]; - int i_379 = 379; - boolean j_379 = true; - String str_379 = new String("the 379-th string."); - int[] ia_379 = new int[]{379}; - Object obj_379 = new Object(); - List strList_379 = new ArrayList<>(); - String[][][] multi_379 = new String[5][10][32]; - int i_380 = 380; - boolean j_380 = false; - String str_380 = new String("the 380-th string."); - int[] ia_380 = new int[]{380}; - Object obj_380 = new Object(); - List strList_380 = new ArrayList<>(); - String[][][] multi_380 = new String[5][10][32]; - int i_381 = 381; - boolean j_381 = true; - String str_381 = new String("the 381-th string."); - int[] ia_381 = new int[]{381}; - Object obj_381 = new Object(); - List strList_381 = new ArrayList<>(); - String[][][] multi_381 = new String[5][10][32]; - int i_382 = 382; - boolean j_382 = false; - String str_382 = new String("the 382-th string."); - int[] ia_382 = new int[]{382}; - Object obj_382 = new Object(); - List strList_382 = new ArrayList<>(); - String[][][] multi_382 = new String[5][10][32]; - int i_383 = 383; - boolean j_383 = true; - String str_383 = new String("the 383-th string."); - int[] ia_383 = new int[]{383}; - Object obj_383 = new Object(); - List strList_383 = new ArrayList<>(); - String[][][] multi_383 = new String[5][10][32]; - int i_384 = 384; - boolean j_384 = false; - String str_384 = new String("the 384-th string."); - int[] ia_384 = new int[]{384}; - Object obj_384 = new Object(); - List strList_384 = new ArrayList<>(); - String[][][] multi_384 = new String[5][10][32]; - int i_385 = 385; - boolean j_385 = true; - String str_385 = new String("the 385-th string."); - int[] ia_385 = new int[]{385}; - Object obj_385 = new Object(); - List strList_385 = new ArrayList<>(); - String[][][] multi_385 = new String[5][10][32]; - int i_386 = 386; - boolean j_386 = false; - String str_386 = new String("the 386-th string."); - int[] ia_386 = new int[]{386}; - Object obj_386 = new Object(); - List strList_386 = new ArrayList<>(); - String[][][] multi_386 = new String[5][10][32]; - int i_387 = 387; - boolean j_387 = true; - String str_387 = new String("the 387-th string."); - int[] ia_387 = new int[]{387}; - Object obj_387 = new Object(); - List strList_387 = new ArrayList<>(); - String[][][] multi_387 = new String[5][10][32]; - int i_388 = 388; - boolean j_388 = false; - String str_388 = new String("the 388-th string."); - int[] ia_388 = new int[]{388}; - Object obj_388 = new Object(); - List strList_388 = new ArrayList<>(); - String[][][] multi_388 = new String[5][10][32]; - int i_389 = 389; - boolean j_389 = true; - String str_389 = new String("the 389-th string."); - int[] ia_389 = new int[]{389}; - Object obj_389 = new Object(); - List strList_389 = new ArrayList<>(); - String[][][] multi_389 = new String[5][10][32]; - int i_390 = 390; - boolean j_390 = false; - String str_390 = new String("the 390-th string."); - int[] ia_390 = new int[]{390}; - Object obj_390 = new Object(); - List strList_390 = new ArrayList<>(); - String[][][] multi_390 = new String[5][10][32]; - int i_391 = 391; - boolean j_391 = true; - String str_391 = new String("the 391-th string."); - int[] ia_391 = new int[]{391}; - Object obj_391 = new Object(); - List strList_391 = new ArrayList<>(); - String[][][] multi_391 = new String[5][10][32]; - int i_392 = 392; - boolean j_392 = false; - String str_392 = new String("the 392-th string."); - int[] ia_392 = new int[]{392}; - Object obj_392 = new Object(); - List strList_392 = new ArrayList<>(); - String[][][] multi_392 = new String[5][10][32]; - int i_393 = 393; - boolean j_393 = true; - String str_393 = new String("the 393-th string."); - int[] ia_393 = new int[]{393}; - Object obj_393 = new Object(); - List strList_393 = new ArrayList<>(); - String[][][] multi_393 = new String[5][10][32]; - int i_394 = 394; - boolean j_394 = false; - String str_394 = new String("the 394-th string."); - int[] ia_394 = new int[]{394}; - Object obj_394 = new Object(); - List strList_394 = new ArrayList<>(); - String[][][] multi_394 = new String[5][10][32]; - int i_395 = 395; - boolean j_395 = true; - String str_395 = new String("the 395-th string."); - int[] ia_395 = new int[]{395}; - Object obj_395 = new Object(); - List strList_395 = new ArrayList<>(); - String[][][] multi_395 = new String[5][10][32]; - int i_396 = 396; - boolean j_396 = false; - String str_396 = new String("the 396-th string."); - int[] ia_396 = new int[]{396}; - Object obj_396 = new Object(); - List strList_396 = new ArrayList<>(); - String[][][] multi_396 = new String[5][10][32]; - int i_397 = 397; - boolean j_397 = true; - String str_397 = new String("the 397-th string."); - int[] ia_397 = new int[]{397}; - Object obj_397 = new Object(); - List strList_397 = new ArrayList<>(); - String[][][] multi_397 = new String[5][10][32]; - int i_398 = 398; - boolean j_398 = false; - String str_398 = new String("the 398-th string."); - int[] ia_398 = new int[]{398}; - Object obj_398 = new Object(); - List strList_398 = new ArrayList<>(); - String[][][] multi_398 = new String[5][10][32]; - int i_399 = 399; - boolean j_399 = true; - String str_399 = new String("the 399-th string."); - int[] ia_399 = new int[]{399}; - Object obj_399 = new Object(); - List strList_399 = new ArrayList<>(); - String[][][] multi_399 = new String[5][10][32]; - int i_400 = 400; - boolean j_400 = false; - String str_400 = new String("the 400-th string."); - int[] ia_400 = new int[]{400}; - Object obj_400 = new Object(); - List strList_400 = new ArrayList<>(); - String[][][] multi_400 = new String[5][10][32]; - int i_401 = 401; - boolean j_401 = true; - String str_401 = new String("the 401-th string."); - int[] ia_401 = new int[]{401}; - Object obj_401 = new Object(); - List strList_401 = new ArrayList<>(); - String[][][] multi_401 = new String[5][10][32]; - int i_402 = 402; - boolean j_402 = false; - String str_402 = new String("the 402-th string."); - int[] ia_402 = new int[]{402}; - Object obj_402 = new Object(); - List strList_402 = new ArrayList<>(); - String[][][] multi_402 = new String[5][10][32]; - int i_403 = 403; - boolean j_403 = true; - String str_403 = new String("the 403-th string."); - int[] ia_403 = new int[]{403}; - Object obj_403 = new Object(); - List strList_403 = new ArrayList<>(); - String[][][] multi_403 = new String[5][10][32]; - int i_404 = 404; - boolean j_404 = false; - String str_404 = new String("the 404-th string."); - int[] ia_404 = new int[]{404}; - Object obj_404 = new Object(); - List strList_404 = new ArrayList<>(); - String[][][] multi_404 = new String[5][10][32]; - int i_405 = 405; - boolean j_405 = true; - String str_405 = new String("the 405-th string."); - int[] ia_405 = new int[]{405}; - Object obj_405 = new Object(); - List strList_405 = new ArrayList<>(); - String[][][] multi_405 = new String[5][10][32]; - int i_406 = 406; - boolean j_406 = false; - String str_406 = new String("the 406-th string."); - int[] ia_406 = new int[]{406}; - Object obj_406 = new Object(); - List strList_406 = new ArrayList<>(); - String[][][] multi_406 = new String[5][10][32]; - int i_407 = 407; - boolean j_407 = true; - String str_407 = new String("the 407-th string."); - int[] ia_407 = new int[]{407}; - Object obj_407 = new Object(); - List strList_407 = new ArrayList<>(); - String[][][] multi_407 = new String[5][10][32]; - int i_408 = 408; - boolean j_408 = false; - String str_408 = new String("the 408-th string."); - int[] ia_408 = new int[]{408}; - Object obj_408 = new Object(); - List strList_408 = new ArrayList<>(); - String[][][] multi_408 = new String[5][10][32]; - int i_409 = 409; - boolean j_409 = true; - String str_409 = new String("the 409-th string."); - int[] ia_409 = new int[]{409}; - Object obj_409 = new Object(); - List strList_409 = new ArrayList<>(); - String[][][] multi_409 = new String[5][10][32]; - int i_410 = 410; - boolean j_410 = false; - String str_410 = new String("the 410-th string."); - int[] ia_410 = new int[]{410}; - Object obj_410 = new Object(); - List strList_410 = new ArrayList<>(); - String[][][] multi_410 = new String[5][10][32]; - int i_411 = 411; - boolean j_411 = true; - String str_411 = new String("the 411-th string."); - int[] ia_411 = new int[]{411}; - Object obj_411 = new Object(); - List strList_411 = new ArrayList<>(); - String[][][] multi_411 = new String[5][10][32]; - int i_412 = 412; - boolean j_412 = false; - String str_412 = new String("the 412-th string."); - int[] ia_412 = new int[]{412}; - Object obj_412 = new Object(); - List strList_412 = new ArrayList<>(); - String[][][] multi_412 = new String[5][10][32]; - int i_413 = 413; - boolean j_413 = true; - String str_413 = new String("the 413-th string."); - int[] ia_413 = new int[]{413}; - Object obj_413 = new Object(); - List strList_413 = new ArrayList<>(); - String[][][] multi_413 = new String[5][10][32]; - int i_414 = 414; - boolean j_414 = false; - String str_414 = new String("the 414-th string."); - int[] ia_414 = new int[]{414}; - Object obj_414 = new Object(); - List strList_414 = new ArrayList<>(); - String[][][] multi_414 = new String[5][10][32]; - int i_415 = 415; - boolean j_415 = true; - String str_415 = new String("the 415-th string."); - int[] ia_415 = new int[]{415}; - Object obj_415 = new Object(); - List strList_415 = new ArrayList<>(); - String[][][] multi_415 = new String[5][10][32]; - int i_416 = 416; - boolean j_416 = false; - String str_416 = new String("the 416-th string."); - int[] ia_416 = new int[]{416}; - Object obj_416 = new Object(); - List strList_416 = new ArrayList<>(); - String[][][] multi_416 = new String[5][10][32]; - int i_417 = 417; - boolean j_417 = true; - String str_417 = new String("the 417-th string."); - int[] ia_417 = new int[]{417}; - Object obj_417 = new Object(); - List strList_417 = new ArrayList<>(); - String[][][] multi_417 = new String[5][10][32]; - int i_418 = 418; - boolean j_418 = false; - String str_418 = new String("the 418-th string."); - int[] ia_418 = new int[]{418}; - Object obj_418 = new Object(); - List strList_418 = new ArrayList<>(); - String[][][] multi_418 = new String[5][10][32]; - int i_419 = 419; - boolean j_419 = true; - String str_419 = new String("the 419-th string."); - int[] ia_419 = new int[]{419}; - Object obj_419 = new Object(); - List strList_419 = new ArrayList<>(); - String[][][] multi_419 = new String[5][10][32]; - int i_420 = 420; - boolean j_420 = false; - String str_420 = new String("the 420-th string."); - int[] ia_420 = new int[]{420}; - Object obj_420 = new Object(); - List strList_420 = new ArrayList<>(); - String[][][] multi_420 = new String[5][10][32]; - int i_421 = 421; - boolean j_421 = true; - String str_421 = new String("the 421-th string."); - int[] ia_421 = new int[]{421}; - Object obj_421 = new Object(); - List strList_421 = new ArrayList<>(); - String[][][] multi_421 = new String[5][10][32]; - int i_422 = 422; - boolean j_422 = false; - String str_422 = new String("the 422-th string."); - int[] ia_422 = new int[]{422}; - Object obj_422 = new Object(); - List strList_422 = new ArrayList<>(); - String[][][] multi_422 = new String[5][10][32]; - int i_423 = 423; - boolean j_423 = true; - String str_423 = new String("the 423-th string."); - int[] ia_423 = new int[]{423}; - Object obj_423 = new Object(); - List strList_423 = new ArrayList<>(); - String[][][] multi_423 = new String[5][10][32]; - int i_424 = 424; - boolean j_424 = false; - String str_424 = new String("the 424-th string."); - int[] ia_424 = new int[]{424}; - Object obj_424 = new Object(); - List strList_424 = new ArrayList<>(); - String[][][] multi_424 = new String[5][10][32]; - int i_425 = 425; - boolean j_425 = true; - String str_425 = new String("the 425-th string."); - int[] ia_425 = new int[]{425}; - Object obj_425 = new Object(); - List strList_425 = new ArrayList<>(); - String[][][] multi_425 = new String[5][10][32]; - int i_426 = 426; - boolean j_426 = false; - String str_426 = new String("the 426-th string."); - int[] ia_426 = new int[]{426}; - Object obj_426 = new Object(); - List strList_426 = new ArrayList<>(); - String[][][] multi_426 = new String[5][10][32]; - int i_427 = 427; - boolean j_427 = true; - String str_427 = new String("the 427-th string."); - int[] ia_427 = new int[]{427}; - Object obj_427 = new Object(); - List strList_427 = new ArrayList<>(); - String[][][] multi_427 = new String[5][10][32]; - int i_428 = 428; - boolean j_428 = false; - String str_428 = new String("the 428-th string."); - int[] ia_428 = new int[]{428}; - Object obj_428 = new Object(); - List strList_428 = new ArrayList<>(); - String[][][] multi_428 = new String[5][10][32]; - int i_429 = 429; - boolean j_429 = true; - String str_429 = new String("the 429-th string."); - int[] ia_429 = new int[]{429}; - Object obj_429 = new Object(); - List strList_429 = new ArrayList<>(); - String[][][] multi_429 = new String[5][10][32]; - int i_430 = 430; - boolean j_430 = false; - String str_430 = new String("the 430-th string."); - int[] ia_430 = new int[]{430}; - Object obj_430 = new Object(); - List strList_430 = new ArrayList<>(); - String[][][] multi_430 = new String[5][10][32]; - int i_431 = 431; - boolean j_431 = true; - String str_431 = new String("the 431-th string."); - int[] ia_431 = new int[]{431}; - Object obj_431 = new Object(); - List strList_431 = new ArrayList<>(); - String[][][] multi_431 = new String[5][10][32]; - int i_432 = 432; - boolean j_432 = false; - String str_432 = new String("the 432-th string."); - int[] ia_432 = new int[]{432}; - Object obj_432 = new Object(); - List strList_432 = new ArrayList<>(); - String[][][] multi_432 = new String[5][10][32]; - int i_433 = 433; - boolean j_433 = true; - String str_433 = new String("the 433-th string."); - int[] ia_433 = new int[]{433}; - Object obj_433 = new Object(); - List strList_433 = new ArrayList<>(); - String[][][] multi_433 = new String[5][10][32]; - int i_434 = 434; - boolean j_434 = false; - String str_434 = new String("the 434-th string."); - int[] ia_434 = new int[]{434}; - Object obj_434 = new Object(); - List strList_434 = new ArrayList<>(); - String[][][] multi_434 = new String[5][10][32]; - int i_435 = 435; - boolean j_435 = true; - String str_435 = new String("the 435-th string."); - int[] ia_435 = new int[]{435}; - Object obj_435 = new Object(); - List strList_435 = new ArrayList<>(); - String[][][] multi_435 = new String[5][10][32]; - int i_436 = 436; - boolean j_436 = false; - String str_436 = new String("the 436-th string."); - int[] ia_436 = new int[]{436}; - Object obj_436 = new Object(); - List strList_436 = new ArrayList<>(); - String[][][] multi_436 = new String[5][10][32]; - int i_437 = 437; - boolean j_437 = true; - String str_437 = new String("the 437-th string."); - int[] ia_437 = new int[]{437}; - Object obj_437 = new Object(); - List strList_437 = new ArrayList<>(); - String[][][] multi_437 = new String[5][10][32]; - int i_438 = 438; - boolean j_438 = false; - String str_438 = new String("the 438-th string."); - int[] ia_438 = new int[]{438}; - Object obj_438 = new Object(); - List strList_438 = new ArrayList<>(); - String[][][] multi_438 = new String[5][10][32]; - int i_439 = 439; - boolean j_439 = true; - String str_439 = new String("the 439-th string."); - int[] ia_439 = new int[]{439}; - Object obj_439 = new Object(); - List strList_439 = new ArrayList<>(); - String[][][] multi_439 = new String[5][10][32]; - int i_440 = 440; - boolean j_440 = false; - String str_440 = new String("the 440-th string."); - int[] ia_440 = new int[]{440}; - Object obj_440 = new Object(); - List strList_440 = new ArrayList<>(); - String[][][] multi_440 = new String[5][10][32]; - int i_441 = 441; - boolean j_441 = true; - String str_441 = new String("the 441-th string."); - int[] ia_441 = new int[]{441}; - Object obj_441 = new Object(); - List strList_441 = new ArrayList<>(); - String[][][] multi_441 = new String[5][10][32]; - int i_442 = 442; - boolean j_442 = false; - String str_442 = new String("the 442-th string."); - int[] ia_442 = new int[]{442}; - Object obj_442 = new Object(); - List strList_442 = new ArrayList<>(); - String[][][] multi_442 = new String[5][10][32]; - int i_443 = 443; - boolean j_443 = true; - String str_443 = new String("the 443-th string."); - int[] ia_443 = new int[]{443}; - Object obj_443 = new Object(); - List strList_443 = new ArrayList<>(); - String[][][] multi_443 = new String[5][10][32]; - int i_444 = 444; - boolean j_444 = false; - String str_444 = new String("the 444-th string."); - int[] ia_444 = new int[]{444}; - Object obj_444 = new Object(); - List strList_444 = new ArrayList<>(); - String[][][] multi_444 = new String[5][10][32]; - int i_445 = 445; - boolean j_445 = true; - String str_445 = new String("the 445-th string."); - int[] ia_445 = new int[]{445}; - Object obj_445 = new Object(); - List strList_445 = new ArrayList<>(); - String[][][] multi_445 = new String[5][10][32]; - int i_446 = 446; - boolean j_446 = false; - String str_446 = new String("the 446-th string."); - int[] ia_446 = new int[]{446}; - Object obj_446 = new Object(); - List strList_446 = new ArrayList<>(); - String[][][] multi_446 = new String[5][10][32]; - int i_447 = 447; - boolean j_447 = true; - String str_447 = new String("the 447-th string."); - int[] ia_447 = new int[]{447}; - Object obj_447 = new Object(); - List strList_447 = new ArrayList<>(); - String[][][] multi_447 = new String[5][10][32]; - int i_448 = 448; - boolean j_448 = false; - String str_448 = new String("the 448-th string."); - int[] ia_448 = new int[]{448}; - Object obj_448 = new Object(); - List strList_448 = new ArrayList<>(); - String[][][] multi_448 = new String[5][10][32]; - int i_449 = 449; - boolean j_449 = true; - String str_449 = new String("the 449-th string."); - int[] ia_449 = new int[]{449}; - Object obj_449 = new Object(); - List strList_449 = new ArrayList<>(); - String[][][] multi_449 = new String[5][10][32]; - int i_450 = 450; - boolean j_450 = false; - String str_450 = new String("the 450-th string."); - int[] ia_450 = new int[]{450}; - Object obj_450 = new Object(); - List strList_450 = new ArrayList<>(); - String[][][] multi_450 = new String[5][10][32]; - int i_451 = 451; - boolean j_451 = true; - String str_451 = new String("the 451-th string."); - int[] ia_451 = new int[]{451}; - Object obj_451 = new Object(); - List strList_451 = new ArrayList<>(); - String[][][] multi_451 = new String[5][10][32]; - int i_452 = 452; - boolean j_452 = false; - String str_452 = new String("the 452-th string."); - int[] ia_452 = new int[]{452}; - Object obj_452 = new Object(); - List strList_452 = new ArrayList<>(); - String[][][] multi_452 = new String[5][10][32]; - int i_453 = 453; - boolean j_453 = true; - String str_453 = new String("the 453-th string."); - int[] ia_453 = new int[]{453}; - Object obj_453 = new Object(); - List strList_453 = new ArrayList<>(); - String[][][] multi_453 = new String[5][10][32]; - int i_454 = 454; - boolean j_454 = false; - String str_454 = new String("the 454-th string."); - int[] ia_454 = new int[]{454}; - Object obj_454 = new Object(); - List strList_454 = new ArrayList<>(); - String[][][] multi_454 = new String[5][10][32]; - int i_455 = 455; - boolean j_455 = true; - String str_455 = new String("the 455-th string."); - int[] ia_455 = new int[]{455}; - Object obj_455 = new Object(); - List strList_455 = new ArrayList<>(); - String[][][] multi_455 = new String[5][10][32]; - int i_456 = 456; - boolean j_456 = false; - String str_456 = new String("the 456-th string."); - int[] ia_456 = new int[]{456}; - Object obj_456 = new Object(); - List strList_456 = new ArrayList<>(); - String[][][] multi_456 = new String[5][10][32]; - int i_457 = 457; - boolean j_457 = true; - String str_457 = new String("the 457-th string."); - int[] ia_457 = new int[]{457}; - Object obj_457 = new Object(); - List strList_457 = new ArrayList<>(); - String[][][] multi_457 = new String[5][10][32]; - int i_458 = 458; - boolean j_458 = false; - String str_458 = new String("the 458-th string."); - int[] ia_458 = new int[]{458}; - Object obj_458 = new Object(); - List strList_458 = new ArrayList<>(); - String[][][] multi_458 = new String[5][10][32]; - int i_459 = 459; - boolean j_459 = true; - String str_459 = new String("the 459-th string."); - int[] ia_459 = new int[]{459}; - Object obj_459 = new Object(); - List strList_459 = new ArrayList<>(); - String[][][] multi_459 = new String[5][10][32]; - int i_460 = 460; - boolean j_460 = false; - String str_460 = new String("the 460-th string."); - int[] ia_460 = new int[]{460}; - Object obj_460 = new Object(); - List strList_460 = new ArrayList<>(); - String[][][] multi_460 = new String[5][10][32]; - int i_461 = 461; - boolean j_461 = true; - String str_461 = new String("the 461-th string."); - int[] ia_461 = new int[]{461}; - Object obj_461 = new Object(); - List strList_461 = new ArrayList<>(); - String[][][] multi_461 = new String[5][10][32]; - int i_462 = 462; - boolean j_462 = false; - String str_462 = new String("the 462-th string."); - int[] ia_462 = new int[]{462}; - Object obj_462 = new Object(); - List strList_462 = new ArrayList<>(); - String[][][] multi_462 = new String[5][10][32]; - int i_463 = 463; - boolean j_463 = true; - String str_463 = new String("the 463-th string."); - int[] ia_463 = new int[]{463}; - Object obj_463 = new Object(); - List strList_463 = new ArrayList<>(); - String[][][] multi_463 = new String[5][10][32]; - int i_464 = 464; - boolean j_464 = false; - String str_464 = new String("the 464-th string."); - int[] ia_464 = new int[]{464}; - Object obj_464 = new Object(); - List strList_464 = new ArrayList<>(); - String[][][] multi_464 = new String[5][10][32]; - int i_465 = 465; - boolean j_465 = true; - String str_465 = new String("the 465-th string."); - int[] ia_465 = new int[]{465}; - Object obj_465 = new Object(); - List strList_465 = new ArrayList<>(); - String[][][] multi_465 = new String[5][10][32]; - int i_466 = 466; - boolean j_466 = false; - String str_466 = new String("the 466-th string."); - int[] ia_466 = new int[]{466}; - Object obj_466 = new Object(); - List strList_466 = new ArrayList<>(); - String[][][] multi_466 = new String[5][10][32]; - int i_467 = 467; - boolean j_467 = true; - String str_467 = new String("the 467-th string."); - int[] ia_467 = new int[]{467}; - Object obj_467 = new Object(); - List strList_467 = new ArrayList<>(); - String[][][] multi_467 = new String[5][10][32]; - int i_468 = 468; - boolean j_468 = false; - String str_468 = new String("the 468-th string."); - int[] ia_468 = new int[]{468}; - Object obj_468 = new Object(); - List strList_468 = new ArrayList<>(); - String[][][] multi_468 = new String[5][10][32]; - int i_469 = 469; - boolean j_469 = true; - String str_469 = new String("the 469-th string."); - int[] ia_469 = new int[]{469}; - Object obj_469 = new Object(); - List strList_469 = new ArrayList<>(); - String[][][] multi_469 = new String[5][10][32]; - int i_470 = 470; - boolean j_470 = false; - String str_470 = new String("the 470-th string."); - int[] ia_470 = new int[]{470}; - Object obj_470 = new Object(); - List strList_470 = new ArrayList<>(); - String[][][] multi_470 = new String[5][10][32]; - int i_471 = 471; - boolean j_471 = true; - String str_471 = new String("the 471-th string."); - int[] ia_471 = new int[]{471}; - Object obj_471 = new Object(); - List strList_471 = new ArrayList<>(); - String[][][] multi_471 = new String[5][10][32]; - int i_472 = 472; - boolean j_472 = false; - String str_472 = new String("the 472-th string."); - int[] ia_472 = new int[]{472}; - Object obj_472 = new Object(); - List strList_472 = new ArrayList<>(); - String[][][] multi_472 = new String[5][10][32]; - int i_473 = 473; - boolean j_473 = true; - String str_473 = new String("the 473-th string."); - int[] ia_473 = new int[]{473}; - Object obj_473 = new Object(); - List strList_473 = new ArrayList<>(); - String[][][] multi_473 = new String[5][10][32]; - int i_474 = 474; - boolean j_474 = false; - String str_474 = new String("the 474-th string."); - int[] ia_474 = new int[]{474}; - Object obj_474 = new Object(); - List strList_474 = new ArrayList<>(); - String[][][] multi_474 = new String[5][10][32]; - int i_475 = 475; - boolean j_475 = true; - String str_475 = new String("the 475-th string."); - int[] ia_475 = new int[]{475}; - Object obj_475 = new Object(); - List strList_475 = new ArrayList<>(); - String[][][] multi_475 = new String[5][10][32]; - int i_476 = 476; - boolean j_476 = false; - String str_476 = new String("the 476-th string."); - int[] ia_476 = new int[]{476}; - Object obj_476 = new Object(); - List strList_476 = new ArrayList<>(); - String[][][] multi_476 = new String[5][10][32]; - int i_477 = 477; - boolean j_477 = true; - String str_477 = new String("the 477-th string."); - int[] ia_477 = new int[]{477}; - Object obj_477 = new Object(); - List strList_477 = new ArrayList<>(); - String[][][] multi_477 = new String[5][10][32]; - int i_478 = 478; - boolean j_478 = false; - String str_478 = new String("the 478-th string."); - int[] ia_478 = new int[]{478}; - Object obj_478 = new Object(); - List strList_478 = new ArrayList<>(); - String[][][] multi_478 = new String[5][10][32]; - int i_479 = 479; - boolean j_479 = true; - String str_479 = new String("the 479-th string."); - int[] ia_479 = new int[]{479}; - Object obj_479 = new Object(); - List strList_479 = new ArrayList<>(); - String[][][] multi_479 = new String[5][10][32]; - int i_480 = 480; - boolean j_480 = false; - String str_480 = new String("the 480-th string."); - int[] ia_480 = new int[]{480}; - Object obj_480 = new Object(); - List strList_480 = new ArrayList<>(); - String[][][] multi_480 = new String[5][10][32]; - int i_481 = 481; - boolean j_481 = true; - String str_481 = new String("the 481-th string."); - int[] ia_481 = new int[]{481}; - Object obj_481 = new Object(); - List strList_481 = new ArrayList<>(); - String[][][] multi_481 = new String[5][10][32]; - int i_482 = 482; - boolean j_482 = false; - String str_482 = new String("the 482-th string."); - int[] ia_482 = new int[]{482}; - Object obj_482 = new Object(); - List strList_482 = new ArrayList<>(); - String[][][] multi_482 = new String[5][10][32]; - int i_483 = 483; - boolean j_483 = true; - String str_483 = new String("the 483-th string."); - int[] ia_483 = new int[]{483}; - Object obj_483 = new Object(); - List strList_483 = new ArrayList<>(); - String[][][] multi_483 = new String[5][10][32]; - int i_484 = 484; - boolean j_484 = false; - String str_484 = new String("the 484-th string."); - int[] ia_484 = new int[]{484}; - Object obj_484 = new Object(); - List strList_484 = new ArrayList<>(); - String[][][] multi_484 = new String[5][10][32]; - int i_485 = 485; - boolean j_485 = true; - String str_485 = new String("the 485-th string."); - int[] ia_485 = new int[]{485}; - Object obj_485 = new Object(); - List strList_485 = new ArrayList<>(); - String[][][] multi_485 = new String[5][10][32]; - int i_486 = 486; - boolean j_486 = false; - String str_486 = new String("the 486-th string."); - int[] ia_486 = new int[]{486}; - Object obj_486 = new Object(); - List strList_486 = new ArrayList<>(); - String[][][] multi_486 = new String[5][10][32]; - int i_487 = 487; - boolean j_487 = true; - String str_487 = new String("the 487-th string."); - int[] ia_487 = new int[]{487}; - Object obj_487 = new Object(); - List strList_487 = new ArrayList<>(); - String[][][] multi_487 = new String[5][10][32]; - int i_488 = 488; - boolean j_488 = false; - String str_488 = new String("the 488-th string."); - int[] ia_488 = new int[]{488}; - Object obj_488 = new Object(); - List strList_488 = new ArrayList<>(); - String[][][] multi_488 = new String[5][10][32]; - int i_489 = 489; - boolean j_489 = true; - String str_489 = new String("the 489-th string."); - int[] ia_489 = new int[]{489}; - Object obj_489 = new Object(); - List strList_489 = new ArrayList<>(); - String[][][] multi_489 = new String[5][10][32]; - int i_490 = 490; - boolean j_490 = false; - String str_490 = new String("the 490-th string."); - int[] ia_490 = new int[]{490}; - Object obj_490 = new Object(); - List strList_490 = new ArrayList<>(); - String[][][] multi_490 = new String[5][10][32]; - int i_491 = 491; - boolean j_491 = true; - String str_491 = new String("the 491-th string."); - int[] ia_491 = new int[]{491}; - Object obj_491 = new Object(); - List strList_491 = new ArrayList<>(); - String[][][] multi_491 = new String[5][10][32]; - int i_492 = 492; - boolean j_492 = false; - String str_492 = new String("the 492-th string."); - int[] ia_492 = new int[]{492}; - Object obj_492 = new Object(); - List strList_492 = new ArrayList<>(); - String[][][] multi_492 = new String[5][10][32]; - int i_493 = 493; - boolean j_493 = true; - String str_493 = new String("the 493-th string."); - int[] ia_493 = new int[]{493}; - Object obj_493 = new Object(); - List strList_493 = new ArrayList<>(); - String[][][] multi_493 = new String[5][10][32]; - int i_494 = 494; - boolean j_494 = false; - String str_494 = new String("the 494-th string."); - int[] ia_494 = new int[]{494}; - Object obj_494 = new Object(); - List strList_494 = new ArrayList<>(); - String[][][] multi_494 = new String[5][10][32]; - int i_495 = 495; - boolean j_495 = true; - String str_495 = new String("the 495-th string."); - int[] ia_495 = new int[]{495}; - Object obj_495 = new Object(); - List strList_495 = new ArrayList<>(); - String[][][] multi_495 = new String[5][10][32]; - int i_496 = 496; - boolean j_496 = false; - String str_496 = new String("the 496-th string."); - int[] ia_496 = new int[]{496}; - Object obj_496 = new Object(); - List strList_496 = new ArrayList<>(); - String[][][] multi_496 = new String[5][10][32]; - int i_497 = 497; - boolean j_497 = true; - String str_497 = new String("the 497-th string."); - int[] ia_497 = new int[]{497}; - Object obj_497 = new Object(); - List strList_497 = new ArrayList<>(); - String[][][] multi_497 = new String[5][10][32]; - int i_498 = 498; - boolean j_498 = false; - String str_498 = new String("the 498-th string."); - int[] ia_498 = new int[]{498}; - Object obj_498 = new Object(); - List strList_498 = new ArrayList<>(); - String[][][] multi_498 = new String[5][10][32]; - int i_499 = 499; - boolean j_499 = true; - String str_499 = new String("the 499-th string."); - int[] ia_499 = new int[]{499}; - Object obj_499 = new Object(); - List strList_499 = new ArrayList<>(); - String[][][] multi_499 = new String[5][10][32]; - int i_500 = 500; - boolean j_500 = false; - String str_500 = new String("the 500-th string."); - int[] ia_500 = new int[]{500}; - Object obj_500 = new Object(); - List strList_500 = new ArrayList<>(); - String[][][] multi_500 = new String[5][10][32]; - int i_501 = 501; - boolean j_501 = true; - String str_501 = new String("the 501-th string."); - int[] ia_501 = new int[]{501}; - Object obj_501 = new Object(); - List strList_501 = new ArrayList<>(); - String[][][] multi_501 = new String[5][10][32]; - int i_502 = 502; - boolean j_502 = false; - String str_502 = new String("the 502-th string."); - int[] ia_502 = new int[]{502}; - Object obj_502 = new Object(); - List strList_502 = new ArrayList<>(); - String[][][] multi_502 = new String[5][10][32]; - int i_503 = 503; - boolean j_503 = true; - String str_503 = new String("the 503-th string."); - int[] ia_503 = new int[]{503}; - Object obj_503 = new Object(); - List strList_503 = new ArrayList<>(); - String[][][] multi_503 = new String[5][10][32]; - int i_504 = 504; - boolean j_504 = false; - String str_504 = new String("the 504-th string."); - int[] ia_504 = new int[]{504}; - Object obj_504 = new Object(); - List strList_504 = new ArrayList<>(); - String[][][] multi_504 = new String[5][10][32]; - int i_505 = 505; - boolean j_505 = true; - String str_505 = new String("the 505-th string."); - int[] ia_505 = new int[]{505}; - Object obj_505 = new Object(); - List strList_505 = new ArrayList<>(); - String[][][] multi_505 = new String[5][10][32]; - int i_506 = 506; - boolean j_506 = false; - String str_506 = new String("the 506-th string."); - int[] ia_506 = new int[]{506}; - Object obj_506 = new Object(); - List strList_506 = new ArrayList<>(); - String[][][] multi_506 = new String[5][10][32]; - int i_507 = 507; - boolean j_507 = true; - String str_507 = new String("the 507-th string."); - int[] ia_507 = new int[]{507}; - Object obj_507 = new Object(); - List strList_507 = new ArrayList<>(); - String[][][] multi_507 = new String[5][10][32]; - int i_508 = 508; - boolean j_508 = false; - String str_508 = new String("the 508-th string."); - int[] ia_508 = new int[]{508}; - Object obj_508 = new Object(); - List strList_508 = new ArrayList<>(); - String[][][] multi_508 = new String[5][10][32]; - int i_509 = 509; - boolean j_509 = true; - String str_509 = new String("the 509-th string."); - int[] ia_509 = new int[]{509}; - Object obj_509 = new Object(); - List strList_509 = new ArrayList<>(); - String[][][] multi_509 = new String[5][10][32]; - int i_510 = 510; - boolean j_510 = false; - String str_510 = new String("the 510-th string."); - int[] ia_510 = new int[]{510}; - Object obj_510 = new Object(); - List strList_510 = new ArrayList<>(); - String[][][] multi_510 = new String[5][10][32]; - int i_511 = 511; - boolean j_511 = true; - String str_511 = new String("the 511-th string."); - int[] ia_511 = new int[]{511}; - Object obj_511 = new Object(); - List strList_511 = new ArrayList<>(); - String[][][] multi_511 = new String[5][10][32]; - int i_512 = 512; - boolean j_512 = false; - String str_512 = new String("the 512-th string."); - int[] ia_512 = new int[]{512}; - Object obj_512 = new Object(); - List strList_512 = new ArrayList<>(); - String[][][] multi_512 = new String[5][10][32]; - int i_513 = 513; - boolean j_513 = true; - String str_513 = new String("the 513-th string."); - int[] ia_513 = new int[]{513}; - Object obj_513 = new Object(); - List strList_513 = new ArrayList<>(); - String[][][] multi_513 = new String[5][10][32]; - int i_514 = 514; - boolean j_514 = false; - String str_514 = new String("the 514-th string."); - int[] ia_514 = new int[]{514}; - Object obj_514 = new Object(); - List strList_514 = new ArrayList<>(); - String[][][] multi_514 = new String[5][10][32]; - int i_515 = 515; - boolean j_515 = true; - String str_515 = new String("the 515-th string."); - int[] ia_515 = new int[]{515}; - Object obj_515 = new Object(); - List strList_515 = new ArrayList<>(); - String[][][] multi_515 = new String[5][10][32]; - int i_516 = 516; - boolean j_516 = false; - String str_516 = new String("the 516-th string."); - int[] ia_516 = new int[]{516}; - Object obj_516 = new Object(); - List strList_516 = new ArrayList<>(); - String[][][] multi_516 = new String[5][10][32]; - int i_517 = 517; - boolean j_517 = true; - String str_517 = new String("the 517-th string."); - int[] ia_517 = new int[]{517}; - Object obj_517 = new Object(); - List strList_517 = new ArrayList<>(); - String[][][] multi_517 = new String[5][10][32]; - int i_518 = 518; - boolean j_518 = false; - String str_518 = new String("the 518-th string."); - int[] ia_518 = new int[]{518}; - Object obj_518 = new Object(); - List strList_518 = new ArrayList<>(); - String[][][] multi_518 = new String[5][10][32]; - int i_519 = 519; - boolean j_519 = true; - String str_519 = new String("the 519-th string."); - int[] ia_519 = new int[]{519}; - Object obj_519 = new Object(); - List strList_519 = new ArrayList<>(); - String[][][] multi_519 = new String[5][10][32]; - int i_520 = 520; - boolean j_520 = false; - String str_520 = new String("the 520-th string."); - int[] ia_520 = new int[]{520}; - Object obj_520 = new Object(); - List strList_520 = new ArrayList<>(); - String[][][] multi_520 = new String[5][10][32]; - int i_521 = 521; - boolean j_521 = true; - String str_521 = new String("the 521-th string."); - int[] ia_521 = new int[]{521}; - Object obj_521 = new Object(); - List strList_521 = new ArrayList<>(); - String[][][] multi_521 = new String[5][10][32]; - int i_522 = 522; - boolean j_522 = false; - String str_522 = new String("the 522-th string."); - int[] ia_522 = new int[]{522}; - Object obj_522 = new Object(); - List strList_522 = new ArrayList<>(); - String[][][] multi_522 = new String[5][10][32]; - int i_523 = 523; - boolean j_523 = true; - String str_523 = new String("the 523-th string."); - int[] ia_523 = new int[]{523}; - Object obj_523 = new Object(); - List strList_523 = new ArrayList<>(); - String[][][] multi_523 = new String[5][10][32]; - int i_524 = 524; - boolean j_524 = false; - String str_524 = new String("the 524-th string."); - int[] ia_524 = new int[]{524}; - Object obj_524 = new Object(); - List strList_524 = new ArrayList<>(); - String[][][] multi_524 = new String[5][10][32]; - int i_525 = 525; - boolean j_525 = true; - String str_525 = new String("the 525-th string."); - int[] ia_525 = new int[]{525}; - Object obj_525 = new Object(); - List strList_525 = new ArrayList<>(); - String[][][] multi_525 = new String[5][10][32]; - int i_526 = 526; - boolean j_526 = false; - String str_526 = new String("the 526-th string."); - int[] ia_526 = new int[]{526}; - Object obj_526 = new Object(); - List strList_526 = new ArrayList<>(); - String[][][] multi_526 = new String[5][10][32]; - int i_527 = 527; - boolean j_527 = true; - String str_527 = new String("the 527-th string."); - int[] ia_527 = new int[]{527}; - Object obj_527 = new Object(); - List strList_527 = new ArrayList<>(); - String[][][] multi_527 = new String[5][10][32]; - int i_528 = 528; - boolean j_528 = false; - String str_528 = new String("the 528-th string."); - int[] ia_528 = new int[]{528}; - Object obj_528 = new Object(); - List strList_528 = new ArrayList<>(); - String[][][] multi_528 = new String[5][10][32]; - int i_529 = 529; - boolean j_529 = true; - String str_529 = new String("the 529-th string."); - int[] ia_529 = new int[]{529}; - Object obj_529 = new Object(); - List strList_529 = new ArrayList<>(); - String[][][] multi_529 = new String[5][10][32]; - int i_530 = 530; - boolean j_530 = false; - String str_530 = new String("the 530-th string."); - int[] ia_530 = new int[]{530}; - Object obj_530 = new Object(); - List strList_530 = new ArrayList<>(); - String[][][] multi_530 = new String[5][10][32]; - int i_531 = 531; - boolean j_531 = true; - String str_531 = new String("the 531-th string."); - int[] ia_531 = new int[]{531}; - Object obj_531 = new Object(); - List strList_531 = new ArrayList<>(); - String[][][] multi_531 = new String[5][10][32]; - int i_532 = 532; - boolean j_532 = false; - String str_532 = new String("the 532-th string."); - int[] ia_532 = new int[]{532}; - Object obj_532 = new Object(); - List strList_532 = new ArrayList<>(); - String[][][] multi_532 = new String[5][10][32]; - int i_533 = 533; - boolean j_533 = true; - String str_533 = new String("the 533-th string."); - int[] ia_533 = new int[]{533}; - Object obj_533 = new Object(); - List strList_533 = new ArrayList<>(); - String[][][] multi_533 = new String[5][10][32]; - int i_534 = 534; - boolean j_534 = false; - String str_534 = new String("the 534-th string."); - int[] ia_534 = new int[]{534}; - Object obj_534 = new Object(); - List strList_534 = new ArrayList<>(); - String[][][] multi_534 = new String[5][10][32]; - int i_535 = 535; - boolean j_535 = true; - String str_535 = new String("the 535-th string."); - int[] ia_535 = new int[]{535}; - Object obj_535 = new Object(); - List strList_535 = new ArrayList<>(); - String[][][] multi_535 = new String[5][10][32]; - int i_536 = 536; - boolean j_536 = false; - String str_536 = new String("the 536-th string."); - int[] ia_536 = new int[]{536}; - Object obj_536 = new Object(); - List strList_536 = new ArrayList<>(); - String[][][] multi_536 = new String[5][10][32]; - int i_537 = 537; - boolean j_537 = true; - String str_537 = new String("the 537-th string."); - int[] ia_537 = new int[]{537}; - Object obj_537 = new Object(); - List strList_537 = new ArrayList<>(); - String[][][] multi_537 = new String[5][10][32]; - int i_538 = 538; - boolean j_538 = false; - String str_538 = new String("the 538-th string."); - int[] ia_538 = new int[]{538}; - Object obj_538 = new Object(); - List strList_538 = new ArrayList<>(); - String[][][] multi_538 = new String[5][10][32]; - int i_539 = 539; - boolean j_539 = true; - String str_539 = new String("the 539-th string."); - int[] ia_539 = new int[]{539}; - Object obj_539 = new Object(); - List strList_539 = new ArrayList<>(); - String[][][] multi_539 = new String[5][10][32]; - int i_540 = 540; - boolean j_540 = false; - String str_540 = new String("the 540-th string."); - int[] ia_540 = new int[]{540}; - Object obj_540 = new Object(); - List strList_540 = new ArrayList<>(); - String[][][] multi_540 = new String[5][10][32]; - int i_541 = 541; - boolean j_541 = true; - String str_541 = new String("the 541-th string."); - int[] ia_541 = new int[]{541}; - Object obj_541 = new Object(); - List strList_541 = new ArrayList<>(); - String[][][] multi_541 = new String[5][10][32]; - int i_542 = 542; - boolean j_542 = false; - String str_542 = new String("the 542-th string."); - int[] ia_542 = new int[]{542}; - Object obj_542 = new Object(); - List strList_542 = new ArrayList<>(); - String[][][] multi_542 = new String[5][10][32]; - int i_543 = 543; - boolean j_543 = true; - String str_543 = new String("the 543-th string."); - int[] ia_543 = new int[]{543}; - Object obj_543 = new Object(); - List strList_543 = new ArrayList<>(); - String[][][] multi_543 = new String[5][10][32]; - int i_544 = 544; - boolean j_544 = false; - String str_544 = new String("the 544-th string."); - int[] ia_544 = new int[]{544}; - Object obj_544 = new Object(); - List strList_544 = new ArrayList<>(); - String[][][] multi_544 = new String[5][10][32]; - int i_545 = 545; - boolean j_545 = true; - String str_545 = new String("the 545-th string."); - int[] ia_545 = new int[]{545}; - Object obj_545 = new Object(); - List strList_545 = new ArrayList<>(); - String[][][] multi_545 = new String[5][10][32]; - int i_546 = 546; - boolean j_546 = false; - String str_546 = new String("the 546-th string."); - int[] ia_546 = new int[]{546}; - Object obj_546 = new Object(); - List strList_546 = new ArrayList<>(); - String[][][] multi_546 = new String[5][10][32]; - int i_547 = 547; - boolean j_547 = true; - String str_547 = new String("the 547-th string."); - int[] ia_547 = new int[]{547}; - Object obj_547 = new Object(); - List strList_547 = new ArrayList<>(); - String[][][] multi_547 = new String[5][10][32]; - int i_548 = 548; - boolean j_548 = false; - String str_548 = new String("the 548-th string."); - int[] ia_548 = new int[]{548}; - Object obj_548 = new Object(); - List strList_548 = new ArrayList<>(); - String[][][] multi_548 = new String[5][10][32]; - int i_549 = 549; - boolean j_549 = true; - String str_549 = new String("the 549-th string."); - int[] ia_549 = new int[]{549}; - Object obj_549 = new Object(); - List strList_549 = new ArrayList<>(); - String[][][] multi_549 = new String[5][10][32]; - int i_550 = 550; - boolean j_550 = false; - String str_550 = new String("the 550-th string."); - int[] ia_550 = new int[]{550}; - Object obj_550 = new Object(); - List strList_550 = new ArrayList<>(); - String[][][] multi_550 = new String[5][10][32]; - int i_551 = 551; - boolean j_551 = true; - String str_551 = new String("the 551-th string."); - int[] ia_551 = new int[]{551}; - Object obj_551 = new Object(); - List strList_551 = new ArrayList<>(); - String[][][] multi_551 = new String[5][10][32]; - int i_552 = 552; - boolean j_552 = false; - String str_552 = new String("the 552-th string."); - int[] ia_552 = new int[]{552}; - Object obj_552 = new Object(); - List strList_552 = new ArrayList<>(); - String[][][] multi_552 = new String[5][10][32]; - int i_553 = 553; - boolean j_553 = true; - String str_553 = new String("the 553-th string."); - int[] ia_553 = new int[]{553}; - Object obj_553 = new Object(); - List strList_553 = new ArrayList<>(); - String[][][] multi_553 = new String[5][10][32]; - int i_554 = 554; - boolean j_554 = false; - String str_554 = new String("the 554-th string."); - int[] ia_554 = new int[]{554}; - Object obj_554 = new Object(); - List strList_554 = new ArrayList<>(); - String[][][] multi_554 = new String[5][10][32]; - int i_555 = 555; - boolean j_555 = true; - String str_555 = new String("the 555-th string."); - int[] ia_555 = new int[]{555}; - Object obj_555 = new Object(); - List strList_555 = new ArrayList<>(); - String[][][] multi_555 = new String[5][10][32]; - int i_556 = 556; - boolean j_556 = false; - String str_556 = new String("the 556-th string."); - int[] ia_556 = new int[]{556}; - Object obj_556 = new Object(); - List strList_556 = new ArrayList<>(); - String[][][] multi_556 = new String[5][10][32]; - int i_557 = 557; - boolean j_557 = true; - String str_557 = new String("the 557-th string."); - int[] ia_557 = new int[]{557}; - Object obj_557 = new Object(); - List strList_557 = new ArrayList<>(); - String[][][] multi_557 = new String[5][10][32]; - int i_558 = 558; - boolean j_558 = false; - String str_558 = new String("the 558-th string."); - int[] ia_558 = new int[]{558}; - Object obj_558 = new Object(); - List strList_558 = new ArrayList<>(); - String[][][] multi_558 = new String[5][10][32]; - int i_559 = 559; - boolean j_559 = true; - String str_559 = new String("the 559-th string."); - int[] ia_559 = new int[]{559}; - Object obj_559 = new Object(); - List strList_559 = new ArrayList<>(); - String[][][] multi_559 = new String[5][10][32]; - int i_560 = 560; - boolean j_560 = false; - String str_560 = new String("the 560-th string."); - int[] ia_560 = new int[]{560}; - Object obj_560 = new Object(); - List strList_560 = new ArrayList<>(); - String[][][] multi_560 = new String[5][10][32]; - int i_561 = 561; - boolean j_561 = true; - String str_561 = new String("the 561-th string."); - int[] ia_561 = new int[]{561}; - Object obj_561 = new Object(); - List strList_561 = new ArrayList<>(); - String[][][] multi_561 = new String[5][10][32]; - int i_562 = 562; - boolean j_562 = false; - String str_562 = new String("the 562-th string."); - int[] ia_562 = new int[]{562}; - Object obj_562 = new Object(); - List strList_562 = new ArrayList<>(); - String[][][] multi_562 = new String[5][10][32]; - int i_563 = 563; - boolean j_563 = true; - String str_563 = new String("the 563-th string."); - int[] ia_563 = new int[]{563}; - Object obj_563 = new Object(); - List strList_563 = new ArrayList<>(); - String[][][] multi_563 = new String[5][10][32]; - int i_564 = 564; - boolean j_564 = false; - String str_564 = new String("the 564-th string."); - int[] ia_564 = new int[]{564}; - Object obj_564 = new Object(); - List strList_564 = new ArrayList<>(); - String[][][] multi_564 = new String[5][10][32]; - int i_565 = 565; - boolean j_565 = true; - String str_565 = new String("the 565-th string."); - int[] ia_565 = new int[]{565}; - Object obj_565 = new Object(); - List strList_565 = new ArrayList<>(); - String[][][] multi_565 = new String[5][10][32]; - int i_566 = 566; - boolean j_566 = false; - String str_566 = new String("the 566-th string."); - int[] ia_566 = new int[]{566}; - Object obj_566 = new Object(); - List strList_566 = new ArrayList<>(); - String[][][] multi_566 = new String[5][10][32]; - int i_567 = 567; - boolean j_567 = true; - String str_567 = new String("the 567-th string."); - int[] ia_567 = new int[]{567}; - Object obj_567 = new Object(); - List strList_567 = new ArrayList<>(); - String[][][] multi_567 = new String[5][10][32]; - int i_568 = 568; - boolean j_568 = false; - String str_568 = new String("the 568-th string."); - int[] ia_568 = new int[]{568}; - Object obj_568 = new Object(); - List strList_568 = new ArrayList<>(); - String[][][] multi_568 = new String[5][10][32]; - int i_569 = 569; - boolean j_569 = true; - String str_569 = new String("the 569-th string."); - int[] ia_569 = new int[]{569}; - Object obj_569 = new Object(); - List strList_569 = new ArrayList<>(); - String[][][] multi_569 = new String[5][10][32]; - int i_570 = 570; - boolean j_570 = false; - String str_570 = new String("the 570-th string."); - int[] ia_570 = new int[]{570}; - Object obj_570 = new Object(); - List strList_570 = new ArrayList<>(); - String[][][] multi_570 = new String[5][10][32]; - int i_571 = 571; - boolean j_571 = true; - String str_571 = new String("the 571-th string."); - int[] ia_571 = new int[]{571}; - Object obj_571 = new Object(); - List strList_571 = new ArrayList<>(); - String[][][] multi_571 = new String[5][10][32]; - int i_572 = 572; - boolean j_572 = false; - String str_572 = new String("the 572-th string."); - int[] ia_572 = new int[]{572}; - Object obj_572 = new Object(); - List strList_572 = new ArrayList<>(); - String[][][] multi_572 = new String[5][10][32]; - int i_573 = 573; - boolean j_573 = true; - String str_573 = new String("the 573-th string."); - int[] ia_573 = new int[]{573}; - Object obj_573 = new Object(); - List strList_573 = new ArrayList<>(); - String[][][] multi_573 = new String[5][10][32]; - int i_574 = 574; - boolean j_574 = false; - String str_574 = new String("the 574-th string."); - int[] ia_574 = new int[]{574}; - Object obj_574 = new Object(); - List strList_574 = new ArrayList<>(); - String[][][] multi_574 = new String[5][10][32]; - int i_575 = 575; - boolean j_575 = true; - String str_575 = new String("the 575-th string."); - int[] ia_575 = new int[]{575}; - Object obj_575 = new Object(); - List strList_575 = new ArrayList<>(); - String[][][] multi_575 = new String[5][10][32]; - int i_576 = 576; - boolean j_576 = false; - String str_576 = new String("the 576-th string."); - int[] ia_576 = new int[]{576}; - Object obj_576 = new Object(); - List strList_576 = new ArrayList<>(); - String[][][] multi_576 = new String[5][10][32]; - int i_577 = 577; - boolean j_577 = true; - String str_577 = new String("the 577-th string."); - int[] ia_577 = new int[]{577}; - Object obj_577 = new Object(); - List strList_577 = new ArrayList<>(); - String[][][] multi_577 = new String[5][10][32]; - int i_578 = 578; - boolean j_578 = false; - String str_578 = new String("the 578-th string."); - int[] ia_578 = new int[]{578}; - Object obj_578 = new Object(); - List strList_578 = new ArrayList<>(); - String[][][] multi_578 = new String[5][10][32]; - int i_579 = 579; - boolean j_579 = true; - String str_579 = new String("the 579-th string."); - int[] ia_579 = new int[]{579}; - Object obj_579 = new Object(); - List strList_579 = new ArrayList<>(); - String[][][] multi_579 = new String[5][10][32]; - int i_580 = 580; - boolean j_580 = false; - String str_580 = new String("the 580-th string."); - int[] ia_580 = new int[]{580}; - Object obj_580 = new Object(); - List strList_580 = new ArrayList<>(); - String[][][] multi_580 = new String[5][10][32]; - int i_581 = 581; - boolean j_581 = true; - String str_581 = new String("the 581-th string."); - int[] ia_581 = new int[]{581}; - Object obj_581 = new Object(); - List strList_581 = new ArrayList<>(); - String[][][] multi_581 = new String[5][10][32]; - int i_582 = 582; - boolean j_582 = false; - String str_582 = new String("the 582-th string."); - int[] ia_582 = new int[]{582}; - Object obj_582 = new Object(); - List strList_582 = new ArrayList<>(); - String[][][] multi_582 = new String[5][10][32]; - int i_583 = 583; - boolean j_583 = true; - String str_583 = new String("the 583-th string."); - int[] ia_583 = new int[]{583}; - Object obj_583 = new Object(); - List strList_583 = new ArrayList<>(); - String[][][] multi_583 = new String[5][10][32]; - int i_584 = 584; - boolean j_584 = false; - String str_584 = new String("the 584-th string."); - int[] ia_584 = new int[]{584}; - Object obj_584 = new Object(); - List strList_584 = new ArrayList<>(); - String[][][] multi_584 = new String[5][10][32]; - int i_585 = 585; - boolean j_585 = true; - String str_585 = new String("the 585-th string."); - int[] ia_585 = new int[]{585}; - Object obj_585 = new Object(); - List strList_585 = new ArrayList<>(); - String[][][] multi_585 = new String[5][10][32]; - int i_586 = 586; - boolean j_586 = false; - String str_586 = new String("the 586-th string."); - int[] ia_586 = new int[]{586}; - Object obj_586 = new Object(); - List strList_586 = new ArrayList<>(); - String[][][] multi_586 = new String[5][10][32]; - int i_587 = 587; - boolean j_587 = true; - String str_587 = new String("the 587-th string."); - int[] ia_587 = new int[]{587}; - Object obj_587 = new Object(); - List strList_587 = new ArrayList<>(); - String[][][] multi_587 = new String[5][10][32]; - int i_588 = 588; - boolean j_588 = false; - String str_588 = new String("the 588-th string."); - int[] ia_588 = new int[]{588}; - Object obj_588 = new Object(); - List strList_588 = new ArrayList<>(); - String[][][] multi_588 = new String[5][10][32]; - int i_589 = 589; - boolean j_589 = true; - String str_589 = new String("the 589-th string."); - int[] ia_589 = new int[]{589}; - Object obj_589 = new Object(); - List strList_589 = new ArrayList<>(); - String[][][] multi_589 = new String[5][10][32]; - int i_590 = 590; - boolean j_590 = false; - String str_590 = new String("the 590-th string."); - int[] ia_590 = new int[]{590}; - Object obj_590 = new Object(); - List strList_590 = new ArrayList<>(); - String[][][] multi_590 = new String[5][10][32]; - int i_591 = 591; - boolean j_591 = true; - String str_591 = new String("the 591-th string."); - int[] ia_591 = new int[]{591}; - Object obj_591 = new Object(); - List strList_591 = new ArrayList<>(); - String[][][] multi_591 = new String[5][10][32]; - int i_592 = 592; - boolean j_592 = false; - String str_592 = new String("the 592-th string."); - int[] ia_592 = new int[]{592}; - Object obj_592 = new Object(); - List strList_592 = new ArrayList<>(); - String[][][] multi_592 = new String[5][10][32]; - int i_593 = 593; - boolean j_593 = true; - String str_593 = new String("the 593-th string."); - int[] ia_593 = new int[]{593}; - Object obj_593 = new Object(); - List strList_593 = new ArrayList<>(); - String[][][] multi_593 = new String[5][10][32]; - int i_594 = 594; - boolean j_594 = false; - String str_594 = new String("the 594-th string."); - int[] ia_594 = new int[]{594}; - Object obj_594 = new Object(); - List strList_594 = new ArrayList<>(); - String[][][] multi_594 = new String[5][10][32]; - int i_595 = 595; - boolean j_595 = true; - String str_595 = new String("the 595-th string."); - int[] ia_595 = new int[]{595}; - Object obj_595 = new Object(); - List strList_595 = new ArrayList<>(); - String[][][] multi_595 = new String[5][10][32]; - int i_596 = 596; - boolean j_596 = false; - String str_596 = new String("the 596-th string."); - int[] ia_596 = new int[]{596}; - Object obj_596 = new Object(); - List strList_596 = new ArrayList<>(); - String[][][] multi_596 = new String[5][10][32]; - int i_597 = 597; - boolean j_597 = true; - String str_597 = new String("the 597-th string."); - int[] ia_597 = new int[]{597}; - Object obj_597 = new Object(); - List strList_597 = new ArrayList<>(); - String[][][] multi_597 = new String[5][10][32]; - int i_598 = 598; - boolean j_598 = false; - String str_598 = new String("the 598-th string."); - int[] ia_598 = new int[]{598}; - Object obj_598 = new Object(); - List strList_598 = new ArrayList<>(); - String[][][] multi_598 = new String[5][10][32]; - int i_599 = 599; - boolean j_599 = true; - String str_599 = new String("the 599-th string."); - int[] ia_599 = new int[]{599}; - Object obj_599 = new Object(); - List strList_599 = new ArrayList<>(); - String[][][] multi_599 = new String[5][10][32]; - int i_600 = 600; - boolean j_600 = false; - String str_600 = new String("the 600-th string."); - int[] ia_600 = new int[]{600}; - Object obj_600 = new Object(); - List strList_600 = new ArrayList<>(); - String[][][] multi_600 = new String[5][10][32]; - int i_601 = 601; - boolean j_601 = true; - String str_601 = new String("the 601-th string."); - int[] ia_601 = new int[]{601}; - Object obj_601 = new Object(); - List strList_601 = new ArrayList<>(); - String[][][] multi_601 = new String[5][10][32]; - int i_602 = 602; - boolean j_602 = false; - String str_602 = new String("the 602-th string."); - int[] ia_602 = new int[]{602}; - Object obj_602 = new Object(); - List strList_602 = new ArrayList<>(); - String[][][] multi_602 = new String[5][10][32]; - int i_603 = 603; - boolean j_603 = true; - String str_603 = new String("the 603-th string."); - int[] ia_603 = new int[]{603}; - Object obj_603 = new Object(); - List strList_603 = new ArrayList<>(); - String[][][] multi_603 = new String[5][10][32]; - int i_604 = 604; - boolean j_604 = false; - String str_604 = new String("the 604-th string."); - int[] ia_604 = new int[]{604}; - Object obj_604 = new Object(); - List strList_604 = new ArrayList<>(); - String[][][] multi_604 = new String[5][10][32]; - int i_605 = 605; - boolean j_605 = true; - String str_605 = new String("the 605-th string."); - int[] ia_605 = new int[]{605}; - Object obj_605 = new Object(); - List strList_605 = new ArrayList<>(); - String[][][] multi_605 = new String[5][10][32]; - int i_606 = 606; - boolean j_606 = false; - String str_606 = new String("the 606-th string."); - int[] ia_606 = new int[]{606}; - Object obj_606 = new Object(); - List strList_606 = new ArrayList<>(); - String[][][] multi_606 = new String[5][10][32]; - int i_607 = 607; - boolean j_607 = true; - String str_607 = new String("the 607-th string."); - int[] ia_607 = new int[]{607}; - Object obj_607 = new Object(); - List strList_607 = new ArrayList<>(); - String[][][] multi_607 = new String[5][10][32]; - int i_608 = 608; - boolean j_608 = false; - String str_608 = new String("the 608-th string."); - int[] ia_608 = new int[]{608}; - Object obj_608 = new Object(); - List strList_608 = new ArrayList<>(); - String[][][] multi_608 = new String[5][10][32]; - int i_609 = 609; - boolean j_609 = true; - String str_609 = new String("the 609-th string."); - int[] ia_609 = new int[]{609}; - Object obj_609 = new Object(); - List strList_609 = new ArrayList<>(); - String[][][] multi_609 = new String[5][10][32]; - int i_610 = 610; - boolean j_610 = false; - String str_610 = new String("the 610-th string."); - int[] ia_610 = new int[]{610}; - Object obj_610 = new Object(); - List strList_610 = new ArrayList<>(); - String[][][] multi_610 = new String[5][10][32]; - int i_611 = 611; - boolean j_611 = true; - String str_611 = new String("the 611-th string."); - int[] ia_611 = new int[]{611}; - Object obj_611 = new Object(); - List strList_611 = new ArrayList<>(); - String[][][] multi_611 = new String[5][10][32]; - int i_612 = 612; - boolean j_612 = false; - String str_612 = new String("the 612-th string."); - int[] ia_612 = new int[]{612}; - Object obj_612 = new Object(); - List strList_612 = new ArrayList<>(); - String[][][] multi_612 = new String[5][10][32]; - int i_613 = 613; - boolean j_613 = true; - String str_613 = new String("the 613-th string."); - int[] ia_613 = new int[]{613}; - Object obj_613 = new Object(); - List strList_613 = new ArrayList<>(); - String[][][] multi_613 = new String[5][10][32]; - int i_614 = 614; - boolean j_614 = false; - String str_614 = new String("the 614-th string."); - int[] ia_614 = new int[]{614}; - Object obj_614 = new Object(); - List strList_614 = new ArrayList<>(); - String[][][] multi_614 = new String[5][10][32]; - int i_615 = 615; - boolean j_615 = true; - String str_615 = new String("the 615-th string."); - int[] ia_615 = new int[]{615}; - Object obj_615 = new Object(); - List strList_615 = new ArrayList<>(); - String[][][] multi_615 = new String[5][10][32]; - int i_616 = 616; - boolean j_616 = false; - String str_616 = new String("the 616-th string."); - int[] ia_616 = new int[]{616}; - Object obj_616 = new Object(); - List strList_616 = new ArrayList<>(); - String[][][] multi_616 = new String[5][10][32]; - int i_617 = 617; - boolean j_617 = true; - String str_617 = new String("the 617-th string."); - int[] ia_617 = new int[]{617}; - Object obj_617 = new Object(); - List strList_617 = new ArrayList<>(); - String[][][] multi_617 = new String[5][10][32]; - int i_618 = 618; - boolean j_618 = false; - String str_618 = new String("the 618-th string."); - int[] ia_618 = new int[]{618}; - Object obj_618 = new Object(); - List strList_618 = new ArrayList<>(); - String[][][] multi_618 = new String[5][10][32]; - int i_619 = 619; - boolean j_619 = true; - String str_619 = new String("the 619-th string."); - int[] ia_619 = new int[]{619}; - Object obj_619 = new Object(); - List strList_619 = new ArrayList<>(); - String[][][] multi_619 = new String[5][10][32]; - int i_620 = 620; - boolean j_620 = false; - String str_620 = new String("the 620-th string."); - int[] ia_620 = new int[]{620}; - Object obj_620 = new Object(); - List strList_620 = new ArrayList<>(); - String[][][] multi_620 = new String[5][10][32]; - int i_621 = 621; - boolean j_621 = true; - String str_621 = new String("the 621-th string."); - int[] ia_621 = new int[]{621}; - Object obj_621 = new Object(); - List strList_621 = new ArrayList<>(); - String[][][] multi_621 = new String[5][10][32]; - int i_622 = 622; - boolean j_622 = false; - String str_622 = new String("the 622-th string."); - int[] ia_622 = new int[]{622}; - Object obj_622 = new Object(); - List strList_622 = new ArrayList<>(); - String[][][] multi_622 = new String[5][10][32]; - int i_623 = 623; - boolean j_623 = true; - String str_623 = new String("the 623-th string."); - int[] ia_623 = new int[]{623}; - Object obj_623 = new Object(); - List strList_623 = new ArrayList<>(); - String[][][] multi_623 = new String[5][10][32]; - int i_624 = 624; - boolean j_624 = false; - String str_624 = new String("the 624-th string."); - int[] ia_624 = new int[]{624}; - Object obj_624 = new Object(); - List strList_624 = new ArrayList<>(); - String[][][] multi_624 = new String[5][10][32]; - int i_625 = 625; - boolean j_625 = true; - String str_625 = new String("the 625-th string."); - int[] ia_625 = new int[]{625}; - Object obj_625 = new Object(); - List strList_625 = new ArrayList<>(); - String[][][] multi_625 = new String[5][10][32]; - int i_626 = 626; - boolean j_626 = false; - String str_626 = new String("the 626-th string."); - int[] ia_626 = new int[]{626}; - Object obj_626 = new Object(); - List strList_626 = new ArrayList<>(); - String[][][] multi_626 = new String[5][10][32]; - int i_627 = 627; - boolean j_627 = true; - String str_627 = new String("the 627-th string."); - int[] ia_627 = new int[]{627}; - Object obj_627 = new Object(); - List strList_627 = new ArrayList<>(); - String[][][] multi_627 = new String[5][10][32]; - int i_628 = 628; - boolean j_628 = false; - String str_628 = new String("the 628-th string."); - int[] ia_628 = new int[]{628}; - Object obj_628 = new Object(); - List strList_628 = new ArrayList<>(); - String[][][] multi_628 = new String[5][10][32]; - int i_629 = 629; - boolean j_629 = true; - String str_629 = new String("the 629-th string."); - int[] ia_629 = new int[]{629}; - Object obj_629 = new Object(); - List strList_629 = new ArrayList<>(); - String[][][] multi_629 = new String[5][10][32]; - int i_630 = 630; - boolean j_630 = false; - String str_630 = new String("the 630-th string."); - int[] ia_630 = new int[]{630}; - Object obj_630 = new Object(); - List strList_630 = new ArrayList<>(); - String[][][] multi_630 = new String[5][10][32]; - int i_631 = 631; - boolean j_631 = true; - String str_631 = new String("the 631-th string."); - int[] ia_631 = new int[]{631}; - Object obj_631 = new Object(); - List strList_631 = new ArrayList<>(); - String[][][] multi_631 = new String[5][10][32]; - int i_632 = 632; - boolean j_632 = false; - String str_632 = new String("the 632-th string."); - int[] ia_632 = new int[]{632}; - Object obj_632 = new Object(); - List strList_632 = new ArrayList<>(); - String[][][] multi_632 = new String[5][10][32]; - int i_633 = 633; - boolean j_633 = true; - String str_633 = new String("the 633-th string."); - int[] ia_633 = new int[]{633}; - Object obj_633 = new Object(); - List strList_633 = new ArrayList<>(); - String[][][] multi_633 = new String[5][10][32]; - int i_634 = 634; - boolean j_634 = false; - String str_634 = new String("the 634-th string."); - int[] ia_634 = new int[]{634}; - Object obj_634 = new Object(); - List strList_634 = new ArrayList<>(); - String[][][] multi_634 = new String[5][10][32]; - int i_635 = 635; - boolean j_635 = true; - String str_635 = new String("the 635-th string."); - int[] ia_635 = new int[]{635}; - Object obj_635 = new Object(); - List strList_635 = new ArrayList<>(); - String[][][] multi_635 = new String[5][10][32]; - int i_636 = 636; - boolean j_636 = false; - String str_636 = new String("the 636-th string."); - int[] ia_636 = new int[]{636}; - Object obj_636 = new Object(); - List strList_636 = new ArrayList<>(); - String[][][] multi_636 = new String[5][10][32]; - int i_637 = 637; - boolean j_637 = true; - String str_637 = new String("the 637-th string."); - int[] ia_637 = new int[]{637}; - Object obj_637 = new Object(); - List strList_637 = new ArrayList<>(); - String[][][] multi_637 = new String[5][10][32]; - int i_638 = 638; - boolean j_638 = false; - String str_638 = new String("the 638-th string."); - int[] ia_638 = new int[]{638}; - Object obj_638 = new Object(); - List strList_638 = new ArrayList<>(); - String[][][] multi_638 = new String[5][10][32]; - int i_639 = 639; - boolean j_639 = true; - String str_639 = new String("the 639-th string."); - int[] ia_639 = new int[]{639}; - Object obj_639 = new Object(); - List strList_639 = new ArrayList<>(); - String[][][] multi_639 = new String[5][10][32]; - int i_640 = 640; - boolean j_640 = false; - String str_640 = new String("the 640-th string."); - int[] ia_640 = new int[]{640}; - Object obj_640 = new Object(); - List strList_640 = new ArrayList<>(); - String[][][] multi_640 = new String[5][10][32]; - int i_641 = 641; - boolean j_641 = true; - String str_641 = new String("the 641-th string."); - int[] ia_641 = new int[]{641}; - Object obj_641 = new Object(); - List strList_641 = new ArrayList<>(); - String[][][] multi_641 = new String[5][10][32]; - int i_642 = 642; - boolean j_642 = false; - String str_642 = new String("the 642-th string."); - int[] ia_642 = new int[]{642}; - Object obj_642 = new Object(); - List strList_642 = new ArrayList<>(); - String[][][] multi_642 = new String[5][10][32]; - int i_643 = 643; - boolean j_643 = true; - String str_643 = new String("the 643-th string."); - int[] ia_643 = new int[]{643}; - Object obj_643 = new Object(); - List strList_643 = new ArrayList<>(); - String[][][] multi_643 = new String[5][10][32]; - int i_644 = 644; - boolean j_644 = false; - String str_644 = new String("the 644-th string."); - int[] ia_644 = new int[]{644}; - Object obj_644 = new Object(); - List strList_644 = new ArrayList<>(); - String[][][] multi_644 = new String[5][10][32]; - int i_645 = 645; - boolean j_645 = true; - String str_645 = new String("the 645-th string."); - int[] ia_645 = new int[]{645}; - Object obj_645 = new Object(); - List strList_645 = new ArrayList<>(); - String[][][] multi_645 = new String[5][10][32]; - int i_646 = 646; - boolean j_646 = false; - String str_646 = new String("the 646-th string."); - int[] ia_646 = new int[]{646}; - Object obj_646 = new Object(); - List strList_646 = new ArrayList<>(); - String[][][] multi_646 = new String[5][10][32]; - int i_647 = 647; - boolean j_647 = true; - String str_647 = new String("the 647-th string."); - int[] ia_647 = new int[]{647}; - Object obj_647 = new Object(); - List strList_647 = new ArrayList<>(); - String[][][] multi_647 = new String[5][10][32]; - int i_648 = 648; - boolean j_648 = false; - String str_648 = new String("the 648-th string."); - int[] ia_648 = new int[]{648}; - Object obj_648 = new Object(); - List strList_648 = new ArrayList<>(); - String[][][] multi_648 = new String[5][10][32]; - int i_649 = 649; - boolean j_649 = true; - String str_649 = new String("the 649-th string."); - int[] ia_649 = new int[]{649}; - Object obj_649 = new Object(); - List strList_649 = new ArrayList<>(); - String[][][] multi_649 = new String[5][10][32]; - int i_650 = 650; - boolean j_650 = false; - String str_650 = new String("the 650-th string."); - int[] ia_650 = new int[]{650}; - Object obj_650 = new Object(); - List strList_650 = new ArrayList<>(); - String[][][] multi_650 = new String[5][10][32]; - int i_651 = 651; - boolean j_651 = true; - String str_651 = new String("the 651-th string."); - int[] ia_651 = new int[]{651}; - Object obj_651 = new Object(); - List strList_651 = new ArrayList<>(); - String[][][] multi_651 = new String[5][10][32]; - int i_652 = 652; - boolean j_652 = false; - String str_652 = new String("the 652-th string."); - int[] ia_652 = new int[]{652}; - Object obj_652 = new Object(); - List strList_652 = new ArrayList<>(); - String[][][] multi_652 = new String[5][10][32]; - int i_653 = 653; - boolean j_653 = true; - String str_653 = new String("the 653-th string."); - int[] ia_653 = new int[]{653}; - Object obj_653 = new Object(); - List strList_653 = new ArrayList<>(); - String[][][] multi_653 = new String[5][10][32]; - int i_654 = 654; - boolean j_654 = false; - String str_654 = new String("the 654-th string."); - int[] ia_654 = new int[]{654}; - Object obj_654 = new Object(); - List strList_654 = new ArrayList<>(); - String[][][] multi_654 = new String[5][10][32]; - int i_655 = 655; - boolean j_655 = true; - String str_655 = new String("the 655-th string."); - int[] ia_655 = new int[]{655}; - Object obj_655 = new Object(); - List strList_655 = new ArrayList<>(); - String[][][] multi_655 = new String[5][10][32]; - int i_656 = 656; - boolean j_656 = false; - String str_656 = new String("the 656-th string."); - int[] ia_656 = new int[]{656}; - Object obj_656 = new Object(); - List strList_656 = new ArrayList<>(); - String[][][] multi_656 = new String[5][10][32]; - int i_657 = 657; - boolean j_657 = true; - String str_657 = new String("the 657-th string."); - int[] ia_657 = new int[]{657}; - Object obj_657 = new Object(); - List strList_657 = new ArrayList<>(); - String[][][] multi_657 = new String[5][10][32]; - int i_658 = 658; - boolean j_658 = false; - String str_658 = new String("the 658-th string."); - int[] ia_658 = new int[]{658}; - Object obj_658 = new Object(); - List strList_658 = new ArrayList<>(); - String[][][] multi_658 = new String[5][10][32]; - int i_659 = 659; - boolean j_659 = true; - String str_659 = new String("the 659-th string."); - int[] ia_659 = new int[]{659}; - Object obj_659 = new Object(); - List strList_659 = new ArrayList<>(); - String[][][] multi_659 = new String[5][10][32]; - int i_660 = 660; - boolean j_660 = false; - String str_660 = new String("the 660-th string."); - int[] ia_660 = new int[]{660}; - Object obj_660 = new Object(); - List strList_660 = new ArrayList<>(); - String[][][] multi_660 = new String[5][10][32]; - int i_661 = 661; - boolean j_661 = true; - String str_661 = new String("the 661-th string."); - int[] ia_661 = new int[]{661}; - Object obj_661 = new Object(); - List strList_661 = new ArrayList<>(); - String[][][] multi_661 = new String[5][10][32]; - int i_662 = 662; - boolean j_662 = false; - String str_662 = new String("the 662-th string."); - int[] ia_662 = new int[]{662}; - Object obj_662 = new Object(); - List strList_662 = new ArrayList<>(); - String[][][] multi_662 = new String[5][10][32]; - int i_663 = 663; - boolean j_663 = true; - String str_663 = new String("the 663-th string."); - int[] ia_663 = new int[]{663}; - Object obj_663 = new Object(); - List strList_663 = new ArrayList<>(); - String[][][] multi_663 = new String[5][10][32]; - int i_664 = 664; - boolean j_664 = false; - String str_664 = new String("the 664-th string."); - int[] ia_664 = new int[]{664}; - Object obj_664 = new Object(); - List strList_664 = new ArrayList<>(); - String[][][] multi_664 = new String[5][10][32]; - int i_665 = 665; - boolean j_665 = true; - String str_665 = new String("the 665-th string."); - int[] ia_665 = new int[]{665}; - Object obj_665 = new Object(); - List strList_665 = new ArrayList<>(); - String[][][] multi_665 = new String[5][10][32]; - int i_666 = 666; - boolean j_666 = false; - String str_666 = new String("the 666-th string."); - int[] ia_666 = new int[]{666}; - Object obj_666 = new Object(); - List strList_666 = new ArrayList<>(); - String[][][] multi_666 = new String[5][10][32]; - int i_667 = 667; - boolean j_667 = true; - String str_667 = new String("the 667-th string."); - int[] ia_667 = new int[]{667}; - Object obj_667 = new Object(); - List strList_667 = new ArrayList<>(); - String[][][] multi_667 = new String[5][10][32]; - int i_668 = 668; - boolean j_668 = false; - String str_668 = new String("the 668-th string."); - int[] ia_668 = new int[]{668}; - Object obj_668 = new Object(); - List strList_668 = new ArrayList<>(); - String[][][] multi_668 = new String[5][10][32]; - int i_669 = 669; - boolean j_669 = true; - String str_669 = new String("the 669-th string."); - int[] ia_669 = new int[]{669}; - Object obj_669 = new Object(); - List strList_669 = new ArrayList<>(); - String[][][] multi_669 = new String[5][10][32]; - int i_670 = 670; - boolean j_670 = false; - String str_670 = new String("the 670-th string."); - int[] ia_670 = new int[]{670}; - Object obj_670 = new Object(); - List strList_670 = new ArrayList<>(); - String[][][] multi_670 = new String[5][10][32]; - int i_671 = 671; - boolean j_671 = true; - String str_671 = new String("the 671-th string."); - int[] ia_671 = new int[]{671}; - Object obj_671 = new Object(); - List strList_671 = new ArrayList<>(); - String[][][] multi_671 = new String[5][10][32]; - int i_672 = 672; - boolean j_672 = false; - String str_672 = new String("the 672-th string."); - int[] ia_672 = new int[]{672}; - Object obj_672 = new Object(); - List strList_672 = new ArrayList<>(); - String[][][] multi_672 = new String[5][10][32]; - int i_673 = 673; - boolean j_673 = true; - String str_673 = new String("the 673-th string."); - int[] ia_673 = new int[]{673}; - Object obj_673 = new Object(); - List strList_673 = new ArrayList<>(); - String[][][] multi_673 = new String[5][10][32]; - int i_674 = 674; - boolean j_674 = false; - String str_674 = new String("the 674-th string."); - int[] ia_674 = new int[]{674}; - Object obj_674 = new Object(); - List strList_674 = new ArrayList<>(); - String[][][] multi_674 = new String[5][10][32]; - int i_675 = 675; - boolean j_675 = true; - String str_675 = new String("the 675-th string."); - int[] ia_675 = new int[]{675}; - Object obj_675 = new Object(); - List strList_675 = new ArrayList<>(); - String[][][] multi_675 = new String[5][10][32]; - int i_676 = 676; - boolean j_676 = false; - String str_676 = new String("the 676-th string."); - int[] ia_676 = new int[]{676}; - Object obj_676 = new Object(); - List strList_676 = new ArrayList<>(); - String[][][] multi_676 = new String[5][10][32]; - int i_677 = 677; - boolean j_677 = true; - String str_677 = new String("the 677-th string."); - int[] ia_677 = new int[]{677}; - Object obj_677 = new Object(); - List strList_677 = new ArrayList<>(); - String[][][] multi_677 = new String[5][10][32]; - int i_678 = 678; - boolean j_678 = false; - String str_678 = new String("the 678-th string."); - int[] ia_678 = new int[]{678}; - Object obj_678 = new Object(); - List strList_678 = new ArrayList<>(); - String[][][] multi_678 = new String[5][10][32]; - int i_679 = 679; - boolean j_679 = true; - String str_679 = new String("the 679-th string."); - int[] ia_679 = new int[]{679}; - Object obj_679 = new Object(); - List strList_679 = new ArrayList<>(); - String[][][] multi_679 = new String[5][10][32]; - int i_680 = 680; - boolean j_680 = false; - String str_680 = new String("the 680-th string."); - int[] ia_680 = new int[]{680}; - Object obj_680 = new Object(); - List strList_680 = new ArrayList<>(); - String[][][] multi_680 = new String[5][10][32]; - int i_681 = 681; - boolean j_681 = true; - String str_681 = new String("the 681-th string."); - int[] ia_681 = new int[]{681}; - Object obj_681 = new Object(); - List strList_681 = new ArrayList<>(); - String[][][] multi_681 = new String[5][10][32]; - int i_682 = 682; - boolean j_682 = false; - String str_682 = new String("the 682-th string."); - int[] ia_682 = new int[]{682}; - Object obj_682 = new Object(); - List strList_682 = new ArrayList<>(); - String[][][] multi_682 = new String[5][10][32]; - int i_683 = 683; - boolean j_683 = true; - String str_683 = new String("the 683-th string."); - int[] ia_683 = new int[]{683}; - Object obj_683 = new Object(); - List strList_683 = new ArrayList<>(); - String[][][] multi_683 = new String[5][10][32]; - int i_684 = 684; - boolean j_684 = false; - String str_684 = new String("the 684-th string."); - int[] ia_684 = new int[]{684}; - Object obj_684 = new Object(); - List strList_684 = new ArrayList<>(); - String[][][] multi_684 = new String[5][10][32]; - int i_685 = 685; - boolean j_685 = true; - String str_685 = new String("the 685-th string."); - int[] ia_685 = new int[]{685}; - Object obj_685 = new Object(); - List strList_685 = new ArrayList<>(); - String[][][] multi_685 = new String[5][10][32]; - int i_686 = 686; - boolean j_686 = false; - String str_686 = new String("the 686-th string."); - int[] ia_686 = new int[]{686}; - Object obj_686 = new Object(); - List strList_686 = new ArrayList<>(); - String[][][] multi_686 = new String[5][10][32]; - int i_687 = 687; - boolean j_687 = true; - String str_687 = new String("the 687-th string."); - int[] ia_687 = new int[]{687}; - Object obj_687 = new Object(); - List strList_687 = new ArrayList<>(); - String[][][] multi_687 = new String[5][10][32]; - int i_688 = 688; - boolean j_688 = false; - String str_688 = new String("the 688-th string."); - int[] ia_688 = new int[]{688}; - Object obj_688 = new Object(); - List strList_688 = new ArrayList<>(); - String[][][] multi_688 = new String[5][10][32]; - int i_689 = 689; - boolean j_689 = true; - String str_689 = new String("the 689-th string."); - int[] ia_689 = new int[]{689}; - Object obj_689 = new Object(); - List strList_689 = new ArrayList<>(); - String[][][] multi_689 = new String[5][10][32]; - int i_690 = 690; - boolean j_690 = false; - String str_690 = new String("the 690-th string."); - int[] ia_690 = new int[]{690}; - Object obj_690 = new Object(); - List strList_690 = new ArrayList<>(); - String[][][] multi_690 = new String[5][10][32]; - int i_691 = 691; - boolean j_691 = true; - String str_691 = new String("the 691-th string."); - int[] ia_691 = new int[]{691}; - Object obj_691 = new Object(); - List strList_691 = new ArrayList<>(); - String[][][] multi_691 = new String[5][10][32]; - int i_692 = 692; - boolean j_692 = false; - String str_692 = new String("the 692-th string."); - int[] ia_692 = new int[]{692}; - Object obj_692 = new Object(); - List strList_692 = new ArrayList<>(); - String[][][] multi_692 = new String[5][10][32]; - int i_693 = 693; - boolean j_693 = true; - String str_693 = new String("the 693-th string."); - int[] ia_693 = new int[]{693}; - Object obj_693 = new Object(); - List strList_693 = new ArrayList<>(); - String[][][] multi_693 = new String[5][10][32]; - int i_694 = 694; - boolean j_694 = false; - String str_694 = new String("the 694-th string."); - int[] ia_694 = new int[]{694}; - Object obj_694 = new Object(); - List strList_694 = new ArrayList<>(); - String[][][] multi_694 = new String[5][10][32]; - int i_695 = 695; - boolean j_695 = true; - String str_695 = new String("the 695-th string."); - int[] ia_695 = new int[]{695}; - Object obj_695 = new Object(); - List strList_695 = new ArrayList<>(); - String[][][] multi_695 = new String[5][10][32]; - int i_696 = 696; - boolean j_696 = false; - String str_696 = new String("the 696-th string."); - int[] ia_696 = new int[]{696}; - Object obj_696 = new Object(); - List strList_696 = new ArrayList<>(); - String[][][] multi_696 = new String[5][10][32]; - int i_697 = 697; - boolean j_697 = true; - String str_697 = new String("the 697-th string."); - int[] ia_697 = new int[]{697}; - Object obj_697 = new Object(); - List strList_697 = new ArrayList<>(); - String[][][] multi_697 = new String[5][10][32]; - int i_698 = 698; - boolean j_698 = false; - String str_698 = new String("the 698-th string."); - int[] ia_698 = new int[]{698}; - Object obj_698 = new Object(); - List strList_698 = new ArrayList<>(); - String[][][] multi_698 = new String[5][10][32]; - int i_699 = 699; - boolean j_699 = true; - String str_699 = new String("the 699-th string."); - int[] ia_699 = new int[]{699}; - Object obj_699 = new Object(); - List strList_699 = new ArrayList<>(); - String[][][] multi_699 = new String[5][10][32]; - int i_700 = 700; - boolean j_700 = false; - String str_700 = new String("the 700-th string."); - int[] ia_700 = new int[]{700}; - Object obj_700 = new Object(); - List strList_700 = new ArrayList<>(); - String[][][] multi_700 = new String[5][10][32]; - int i_701 = 701; - boolean j_701 = true; - String str_701 = new String("the 701-th string."); - int[] ia_701 = new int[]{701}; - Object obj_701 = new Object(); - List strList_701 = new ArrayList<>(); - String[][][] multi_701 = new String[5][10][32]; - int i_702 = 702; - boolean j_702 = false; - String str_702 = new String("the 702-th string."); - int[] ia_702 = new int[]{702}; - Object obj_702 = new Object(); - List strList_702 = new ArrayList<>(); - String[][][] multi_702 = new String[5][10][32]; - int i_703 = 703; - boolean j_703 = true; - String str_703 = new String("the 703-th string."); - int[] ia_703 = new int[]{703}; - Object obj_703 = new Object(); - List strList_703 = new ArrayList<>(); - String[][][] multi_703 = new String[5][10][32]; - int i_704 = 704; - boolean j_704 = false; - String str_704 = new String("the 704-th string."); - int[] ia_704 = new int[]{704}; - Object obj_704 = new Object(); - List strList_704 = new ArrayList<>(); - String[][][] multi_704 = new String[5][10][32]; - int i_705 = 705; - boolean j_705 = true; - String str_705 = new String("the 705-th string."); - int[] ia_705 = new int[]{705}; - Object obj_705 = new Object(); - List strList_705 = new ArrayList<>(); - String[][][] multi_705 = new String[5][10][32]; - int i_706 = 706; - boolean j_706 = false; - String str_706 = new String("the 706-th string."); - int[] ia_706 = new int[]{706}; - Object obj_706 = new Object(); - List strList_706 = new ArrayList<>(); - String[][][] multi_706 = new String[5][10][32]; - int i_707 = 707; - boolean j_707 = true; - String str_707 = new String("the 707-th string."); - int[] ia_707 = new int[]{707}; - Object obj_707 = new Object(); - List strList_707 = new ArrayList<>(); - String[][][] multi_707 = new String[5][10][32]; - int i_708 = 708; - boolean j_708 = false; - String str_708 = new String("the 708-th string."); - int[] ia_708 = new int[]{708}; - Object obj_708 = new Object(); - List strList_708 = new ArrayList<>(); - String[][][] multi_708 = new String[5][10][32]; - int i_709 = 709; - boolean j_709 = true; - String str_709 = new String("the 709-th string."); - int[] ia_709 = new int[]{709}; - Object obj_709 = new Object(); - List strList_709 = new ArrayList<>(); - String[][][] multi_709 = new String[5][10][32]; - int i_710 = 710; - boolean j_710 = false; - String str_710 = new String("the 710-th string."); - int[] ia_710 = new int[]{710}; - Object obj_710 = new Object(); - List strList_710 = new ArrayList<>(); - String[][][] multi_710 = new String[5][10][32]; - int i_711 = 711; - boolean j_711 = true; - String str_711 = new String("the 711-th string."); - int[] ia_711 = new int[]{711}; - Object obj_711 = new Object(); - List strList_711 = new ArrayList<>(); - String[][][] multi_711 = new String[5][10][32]; - int i_712 = 712; - boolean j_712 = false; - String str_712 = new String("the 712-th string."); - int[] ia_712 = new int[]{712}; - Object obj_712 = new Object(); - List strList_712 = new ArrayList<>(); - String[][][] multi_712 = new String[5][10][32]; - int i_713 = 713; - boolean j_713 = true; - String str_713 = new String("the 713-th string."); - int[] ia_713 = new int[]{713}; - Object obj_713 = new Object(); - List strList_713 = new ArrayList<>(); - String[][][] multi_713 = new String[5][10][32]; - int i_714 = 714; - boolean j_714 = false; - String str_714 = new String("the 714-th string."); - int[] ia_714 = new int[]{714}; - Object obj_714 = new Object(); - List strList_714 = new ArrayList<>(); - String[][][] multi_714 = new String[5][10][32]; - int i_715 = 715; - boolean j_715 = true; - String str_715 = new String("the 715-th string."); - int[] ia_715 = new int[]{715}; - Object obj_715 = new Object(); - List strList_715 = new ArrayList<>(); - String[][][] multi_715 = new String[5][10][32]; - int i_716 = 716; - boolean j_716 = false; - String str_716 = new String("the 716-th string."); - int[] ia_716 = new int[]{716}; - Object obj_716 = new Object(); - List strList_716 = new ArrayList<>(); - String[][][] multi_716 = new String[5][10][32]; - int i_717 = 717; - boolean j_717 = true; - String str_717 = new String("the 717-th string."); - int[] ia_717 = new int[]{717}; - Object obj_717 = new Object(); - List strList_717 = new ArrayList<>(); - String[][][] multi_717 = new String[5][10][32]; - int i_718 = 718; - boolean j_718 = false; - String str_718 = new String("the 718-th string."); - int[] ia_718 = new int[]{718}; - Object obj_718 = new Object(); - List strList_718 = new ArrayList<>(); - String[][][] multi_718 = new String[5][10][32]; - int i_719 = 719; - boolean j_719 = true; - String str_719 = new String("the 719-th string."); - int[] ia_719 = new int[]{719}; - Object obj_719 = new Object(); - List strList_719 = new ArrayList<>(); - String[][][] multi_719 = new String[5][10][32]; - int i_720 = 720; - boolean j_720 = false; - String str_720 = new String("the 720-th string."); - int[] ia_720 = new int[]{720}; - Object obj_720 = new Object(); - List strList_720 = new ArrayList<>(); - String[][][] multi_720 = new String[5][10][32]; - int i_721 = 721; - boolean j_721 = true; - String str_721 = new String("the 721-th string."); - int[] ia_721 = new int[]{721}; - Object obj_721 = new Object(); - List strList_721 = new ArrayList<>(); - String[][][] multi_721 = new String[5][10][32]; - int i_722 = 722; - boolean j_722 = false; - String str_722 = new String("the 722-th string."); - int[] ia_722 = new int[]{722}; - Object obj_722 = new Object(); - List strList_722 = new ArrayList<>(); - String[][][] multi_722 = new String[5][10][32]; - int i_723 = 723; - boolean j_723 = true; - String str_723 = new String("the 723-th string."); - int[] ia_723 = new int[]{723}; - Object obj_723 = new Object(); - List strList_723 = new ArrayList<>(); - String[][][] multi_723 = new String[5][10][32]; - int i_724 = 724; - boolean j_724 = false; - String str_724 = new String("the 724-th string."); - int[] ia_724 = new int[]{724}; - Object obj_724 = new Object(); - List strList_724 = new ArrayList<>(); - String[][][] multi_724 = new String[5][10][32]; - int i_725 = 725; - boolean j_725 = true; - String str_725 = new String("the 725-th string."); - int[] ia_725 = new int[]{725}; - Object obj_725 = new Object(); - List strList_725 = new ArrayList<>(); - String[][][] multi_725 = new String[5][10][32]; - int i_726 = 726; - boolean j_726 = false; - String str_726 = new String("the 726-th string."); - int[] ia_726 = new int[]{726}; - Object obj_726 = new Object(); - List strList_726 = new ArrayList<>(); - String[][][] multi_726 = new String[5][10][32]; - int i_727 = 727; - boolean j_727 = true; - String str_727 = new String("the 727-th string."); - int[] ia_727 = new int[]{727}; - Object obj_727 = new Object(); - List strList_727 = new ArrayList<>(); - String[][][] multi_727 = new String[5][10][32]; - int i_728 = 728; - boolean j_728 = false; - String str_728 = new String("the 728-th string."); - int[] ia_728 = new int[]{728}; - Object obj_728 = new Object(); - List strList_728 = new ArrayList<>(); - String[][][] multi_728 = new String[5][10][32]; - int i_729 = 729; - boolean j_729 = true; - String str_729 = new String("the 729-th string."); - int[] ia_729 = new int[]{729}; - Object obj_729 = new Object(); - List strList_729 = new ArrayList<>(); - String[][][] multi_729 = new String[5][10][32]; - int i_730 = 730; - boolean j_730 = false; - String str_730 = new String("the 730-th string."); - int[] ia_730 = new int[]{730}; - Object obj_730 = new Object(); - List strList_730 = new ArrayList<>(); - String[][][] multi_730 = new String[5][10][32]; - int i_731 = 731; - boolean j_731 = true; - String str_731 = new String("the 731-th string."); - int[] ia_731 = new int[]{731}; - Object obj_731 = new Object(); - List strList_731 = new ArrayList<>(); - String[][][] multi_731 = new String[5][10][32]; - int i_732 = 732; - boolean j_732 = false; - String str_732 = new String("the 732-th string."); - int[] ia_732 = new int[]{732}; - Object obj_732 = new Object(); - List strList_732 = new ArrayList<>(); - String[][][] multi_732 = new String[5][10][32]; - int i_733 = 733; - boolean j_733 = true; - String str_733 = new String("the 733-th string."); - int[] ia_733 = new int[]{733}; - Object obj_733 = new Object(); - List strList_733 = new ArrayList<>(); - String[][][] multi_733 = new String[5][10][32]; - int i_734 = 734; - boolean j_734 = false; - String str_734 = new String("the 734-th string."); - int[] ia_734 = new int[]{734}; - Object obj_734 = new Object(); - List strList_734 = new ArrayList<>(); - String[][][] multi_734 = new String[5][10][32]; - int i_735 = 735; - boolean j_735 = true; - String str_735 = new String("the 735-th string."); - int[] ia_735 = new int[]{735}; - Object obj_735 = new Object(); - List strList_735 = new ArrayList<>(); - String[][][] multi_735 = new String[5][10][32]; - int i_736 = 736; - boolean j_736 = false; - String str_736 = new String("the 736-th string."); - int[] ia_736 = new int[]{736}; - Object obj_736 = new Object(); - List strList_736 = new ArrayList<>(); - String[][][] multi_736 = new String[5][10][32]; - int i_737 = 737; - boolean j_737 = true; - String str_737 = new String("the 737-th string."); - int[] ia_737 = new int[]{737}; - Object obj_737 = new Object(); - List strList_737 = new ArrayList<>(); - String[][][] multi_737 = new String[5][10][32]; - int i_738 = 738; - boolean j_738 = false; - String str_738 = new String("the 738-th string."); - int[] ia_738 = new int[]{738}; - Object obj_738 = new Object(); - List strList_738 = new ArrayList<>(); - String[][][] multi_738 = new String[5][10][32]; - int i_739 = 739; - boolean j_739 = true; - String str_739 = new String("the 739-th string."); - int[] ia_739 = new int[]{739}; - Object obj_739 = new Object(); - List strList_739 = new ArrayList<>(); - String[][][] multi_739 = new String[5][10][32]; - int i_740 = 740; - boolean j_740 = false; - String str_740 = new String("the 740-th string."); - int[] ia_740 = new int[]{740}; - Object obj_740 = new Object(); - List strList_740 = new ArrayList<>(); - String[][][] multi_740 = new String[5][10][32]; - int i_741 = 741; - boolean j_741 = true; - String str_741 = new String("the 741-th string."); - int[] ia_741 = new int[]{741}; - Object obj_741 = new Object(); - List strList_741 = new ArrayList<>(); - String[][][] multi_741 = new String[5][10][32]; - int i_742 = 742; - boolean j_742 = false; - String str_742 = new String("the 742-th string."); - int[] ia_742 = new int[]{742}; - Object obj_742 = new Object(); - List strList_742 = new ArrayList<>(); - String[][][] multi_742 = new String[5][10][32]; - int i_743 = 743; - boolean j_743 = true; - String str_743 = new String("the 743-th string."); - int[] ia_743 = new int[]{743}; - Object obj_743 = new Object(); - List strList_743 = new ArrayList<>(); - String[][][] multi_743 = new String[5][10][32]; - int i_744 = 744; - boolean j_744 = false; - String str_744 = new String("the 744-th string."); - int[] ia_744 = new int[]{744}; - Object obj_744 = new Object(); - List strList_744 = new ArrayList<>(); - String[][][] multi_744 = new String[5][10][32]; - int i_745 = 745; - boolean j_745 = true; - String str_745 = new String("the 745-th string."); - int[] ia_745 = new int[]{745}; - Object obj_745 = new Object(); - List strList_745 = new ArrayList<>(); - String[][][] multi_745 = new String[5][10][32]; - int i_746 = 746; - boolean j_746 = false; - String str_746 = new String("the 746-th string."); - int[] ia_746 = new int[]{746}; - Object obj_746 = new Object(); - List strList_746 = new ArrayList<>(); - String[][][] multi_746 = new String[5][10][32]; - int i_747 = 747; - boolean j_747 = true; - String str_747 = new String("the 747-th string."); - int[] ia_747 = new int[]{747}; - Object obj_747 = new Object(); - List strList_747 = new ArrayList<>(); - String[][][] multi_747 = new String[5][10][32]; - int i_748 = 748; - boolean j_748 = false; - String str_748 = new String("the 748-th string."); - int[] ia_748 = new int[]{748}; - Object obj_748 = new Object(); - List strList_748 = new ArrayList<>(); - String[][][] multi_748 = new String[5][10][32]; - int i_749 = 749; - boolean j_749 = true; - String str_749 = new String("the 749-th string."); - int[] ia_749 = new int[]{749}; - Object obj_749 = new Object(); - List strList_749 = new ArrayList<>(); - String[][][] multi_749 = new String[5][10][32]; -} \ No newline at end of file diff --git a/testprojects/7.variableperformance/src/main/java/VariablePerfTest.java b/testprojects/7.variableperformance/src/main/java/VariablePerfTest.java deleted file mode 100644 index 2384a60f..00000000 --- a/testprojects/7.variableperformance/src/main/java/VariablePerfTest.java +++ /dev/null @@ -1,5 +0,0 @@ -public class VariablePerfTest { - public static void main(String[] args) { - new TooManyVariables().test(); - } -} \ No newline at end of file diff --git a/testprojects/8.nosource/.classpath b/testprojects/8.nosource/.classpath deleted file mode 100644 index 8478b966..00000000 --- a/testprojects/8.nosource/.classpath +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/testprojects/8.nosource/.project b/testprojects/8.nosource/.project deleted file mode 100644 index 36c2225a..00000000 --- a/testprojects/8.nosource/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 8.nosource - - - - org.eclipse.jdt.core.javanature - - - - org.eclipse.jdt.core.javabuilder - - - - - - diff --git a/testprojects/8.nosource/build.gradle_ b/testprojects/8.nosource/build.gradle_ deleted file mode 100644 index bef8ff66..00000000 --- a/testprojects/8.nosource/build.gradle_ +++ /dev/null @@ -1,28 +0,0 @@ -apply plugin: 'java' -apply plugin: 'eclipse' -apply plugin: 'idea' - - -sourceSets { - main.java.srcDirs = ['src/main/java'] -} - -dependencies { - compile files("lib/test1.jar") - compile files("lib/commons-io-2.5.jar") -} - - -repositories { - mavenCentral() -} - -eclipse.classpath.file { - withXml{xml -> - def node = xml.asNode() - - node.classpathentry.find{ - it.@kind == 'lib' && it.@path.contains('/test1.jar') - }.@sourcepath = 'lib/test1-sources.jar' - } -} \ No newline at end of file diff --git a/testprojects/8.nosource/lib/commons-io-2.5.jar b/testprojects/8.nosource/lib/commons-io-2.5.jar deleted file mode 100644 index 107b061f..00000000 Binary files a/testprojects/8.nosource/lib/commons-io-2.5.jar and /dev/null differ diff --git a/testprojects/8.nosource/lib/test1-sources.jar b/testprojects/8.nosource/lib/test1-sources.jar deleted file mode 100644 index fa41fc49..00000000 Binary files a/testprojects/8.nosource/lib/test1-sources.jar and /dev/null differ diff --git a/testprojects/8.nosource/lib/test1.jar b/testprojects/8.nosource/lib/test1.jar deleted file mode 100644 index a5afe6c4..00000000 Binary files a/testprojects/8.nosource/lib/test1.jar and /dev/null differ diff --git a/testprojects/8.nosource/src/main/java/NoSourceTest.java b/testprojects/8.nosource/src/main/java/NoSourceTest.java deleted file mode 100644 index da259933..00000000 --- a/testprojects/8.nosource/src/main/java/NoSourceTest.java +++ /dev/null @@ -1,7 +0,0 @@ -public class NoSourceTest { - public static void main(String[] args) throws Exception { - new test.Foo().bar(1,2, i-> { - System.out.println(i+10); - }); - } -} \ No newline at end of file diff --git a/testprojects/9.realcase.lucene/.classpath b/testprojects/9.realcase.lucene/.classpath deleted file mode 100644 index b9eea10f..00000000 --- a/testprojects/9.realcase.lucene/.classpath +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/testprojects/9.realcase.lucene/.project b/testprojects/9.realcase.lucene/.project deleted file mode 100644 index c2e0396c..00000000 --- a/testprojects/9.realcase.lucene/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 9.realcase.lucene - - - - org.eclipse.jdt.core.javanature - - - - org.eclipse.jdt.core.javabuilder - - - - - - diff --git a/testprojects/9.realcase.lucene/build.gradle_ b/testprojects/9.realcase.lucene/build.gradle_ deleted file mode 100644 index 5339a1b8..00000000 --- a/testprojects/9.realcase.lucene/build.gradle_ +++ /dev/null @@ -1,42 +0,0 @@ -apply plugin: 'java' -apply plugin: 'eclipse' -apply plugin: 'idea' - -buildscript { - repositories { - mavenCentral() - } - dependencies { classpath "commons-io:commons-io:2.5" } -} - -import org.apache.commons.io.FilenameUtils; - -sourceSets { - main.java.srcDirs = ['src/main/java'] -} -dependencies { - compile group: 'commons-io', name: 'commons-io', version: '2.5' - compile group: 'org.apache.lucene', name: 'lucene-core', version: '6.6.0' - compile group: 'org.apache.lucene', name: 'lucene-queryparser', version: '6.6.0' - compile group: 'org.apache.lucene', name: 'lucene-analyzers-common', version: '6.6.0' -} - - -repositories { - mavenCentral() -} - -def getShortJar = { e -> FilenameUtils.getName(e) } -eclipse.classpath.file { - withXml{xml -> - def node = xml.asNode() - - node.classpathentry.each{ - if (it.@kind == 'lib') { - it.@path = 'lib/' + getShortJar(it.@path); - it.@sourcepath = 'lib/' + getShortJar(it.@sourcepath); - } - - } - } -} \ No newline at end of file diff --git a/testprojects/9.realcase.lucene/lib/commons-io-2.5-sources.jar b/testprojects/9.realcase.lucene/lib/commons-io-2.5-sources.jar deleted file mode 100644 index 70821f79..00000000 Binary files a/testprojects/9.realcase.lucene/lib/commons-io-2.5-sources.jar and /dev/null differ diff --git a/testprojects/9.realcase.lucene/lib/commons-io-2.5.jar b/testprojects/9.realcase.lucene/lib/commons-io-2.5.jar deleted file mode 100644 index 107b061f..00000000 Binary files a/testprojects/9.realcase.lucene/lib/commons-io-2.5.jar and /dev/null differ diff --git a/testprojects/9.realcase.lucene/lib/lucene-analyzers-common-6.6.0-sources.jar b/testprojects/9.realcase.lucene/lib/lucene-analyzers-common-6.6.0-sources.jar deleted file mode 100644 index 0dfa72b8..00000000 Binary files a/testprojects/9.realcase.lucene/lib/lucene-analyzers-common-6.6.0-sources.jar and /dev/null differ diff --git a/testprojects/9.realcase.lucene/lib/lucene-analyzers-common-6.6.0.jar b/testprojects/9.realcase.lucene/lib/lucene-analyzers-common-6.6.0.jar deleted file mode 100644 index 3695b078..00000000 Binary files a/testprojects/9.realcase.lucene/lib/lucene-analyzers-common-6.6.0.jar and /dev/null differ diff --git a/testprojects/9.realcase.lucene/lib/lucene-core-6.6.0-sources.jar b/testprojects/9.realcase.lucene/lib/lucene-core-6.6.0-sources.jar deleted file mode 100644 index 3855beec..00000000 Binary files a/testprojects/9.realcase.lucene/lib/lucene-core-6.6.0-sources.jar and /dev/null differ diff --git a/testprojects/9.realcase.lucene/lib/lucene-core-6.6.0.jar b/testprojects/9.realcase.lucene/lib/lucene-core-6.6.0.jar deleted file mode 100644 index d9d533c9..00000000 Binary files a/testprojects/9.realcase.lucene/lib/lucene-core-6.6.0.jar and /dev/null differ diff --git a/testprojects/9.realcase.lucene/lib/lucene-queries-6.6.0-sources.jar b/testprojects/9.realcase.lucene/lib/lucene-queries-6.6.0-sources.jar deleted file mode 100644 index 63f22fef..00000000 Binary files a/testprojects/9.realcase.lucene/lib/lucene-queries-6.6.0-sources.jar and /dev/null differ diff --git a/testprojects/9.realcase.lucene/lib/lucene-queries-6.6.0.jar b/testprojects/9.realcase.lucene/lib/lucene-queries-6.6.0.jar deleted file mode 100644 index 85fb0640..00000000 Binary files a/testprojects/9.realcase.lucene/lib/lucene-queries-6.6.0.jar and /dev/null differ diff --git a/testprojects/9.realcase.lucene/lib/lucene-queryparser-6.6.0-sources.jar b/testprojects/9.realcase.lucene/lib/lucene-queryparser-6.6.0-sources.jar deleted file mode 100644 index 9d393652..00000000 Binary files a/testprojects/9.realcase.lucene/lib/lucene-queryparser-6.6.0-sources.jar and /dev/null differ diff --git a/testprojects/9.realcase.lucene/lib/lucene-queryparser-6.6.0.jar b/testprojects/9.realcase.lucene/lib/lucene-queryparser-6.6.0.jar deleted file mode 100644 index 394df7ea..00000000 Binary files a/testprojects/9.realcase.lucene/lib/lucene-queryparser-6.6.0.jar and /dev/null differ diff --git a/testprojects/9.realcase.lucene/lib/lucene-sandbox-6.6.0-sources.jar b/testprojects/9.realcase.lucene/lib/lucene-sandbox-6.6.0-sources.jar deleted file mode 100644 index f7d41b4b..00000000 Binary files a/testprojects/9.realcase.lucene/lib/lucene-sandbox-6.6.0-sources.jar and /dev/null differ diff --git a/testprojects/9.realcase.lucene/lib/lucene-sandbox-6.6.0.jar b/testprojects/9.realcase.lucene/lib/lucene-sandbox-6.6.0.jar deleted file mode 100644 index bfdc911d..00000000 Binary files a/testprojects/9.realcase.lucene/lib/lucene-sandbox-6.6.0.jar and /dev/null differ diff --git a/testprojects/9.realcase.lucene/src/main/java/LuceneTest.java b/testprojects/9.realcase.lucene/src/main/java/LuceneTest.java deleted file mode 100644 index 749ccf93..00000000 --- a/testprojects/9.realcase.lucene/src/main/java/LuceneTest.java +++ /dev/null @@ -1,108 +0,0 @@ -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.List; - -import org.apache.commons.io.FileUtils; -import org.apache.lucene.analysis.standard.StandardAnalyzer; -import org.apache.lucene.document.Document; -import org.apache.lucene.document.Field; -import org.apache.lucene.document.StringField; -import org.apache.lucene.document.TextField; -import org.apache.lucene.index.DirectoryReader; -import org.apache.lucene.index.IndexReader; -import org.apache.lucene.index.IndexWriter; -import org.apache.lucene.index.IndexWriterConfig; -import org.apache.lucene.queryparser.classic.QueryParser; -import org.apache.lucene.search.IndexSearcher; -import org.apache.lucene.search.Query; -import org.apache.lucene.search.ScoreDoc; -import org.apache.lucene.search.TopDocs; -import org.apache.lucene.store.Directory; -import org.apache.lucene.store.FSDirectory; - -public class LuceneTest { - private static String indexDirectory; - - public static void main(String[] args) throws Exception { - File file = Files.createTempDirectory("test_lucene").toFile(); - indexDirectory = file.getAbsolutePath(); - FileUtils.forceDeleteOnExit(file); - IndexWriter writer = createWriter(); - List documents = new ArrayList<>(); - - Document document1 = createDocument(1, "Andy", "XU", "andxu@microsoft.com"); - documents.add(document1); - - Document document2 = createDocument(2, "Jinbo", "Wang", "jinbwan@microsoft.com"); - documents.add(document2); - - //Let's clean everything first - writer.deleteAll(); - - writer.addDocuments(documents); - writer.commit(); - writer.close(); - - IndexSearcher searcher = createSearcher(); - - //Search by ID - TopDocs foundDocs = searchById(2, searcher); - - System.out.println("Total Results :: " + foundDocs.totalHits); - - for (ScoreDoc sd : foundDocs.scoreDocs) { - Document d = searcher.doc(sd.doc); - System.out.println(String.format("%s, %s, %s", d.get("id"), d.get("email"), d.get("firstName"))); - } - - //Search by firstName - TopDocs foundDocs2 = searchByFirstName("Andy", searcher); - - System.out.println("Total Results :: " + foundDocs2.totalHits); - - for (ScoreDoc sd : foundDocs2.scoreDocs) { - Document d = searcher.doc(sd.doc); - System.out.println(String.format("%s, %s, %s", d.get("id"), d.get("email"), d.get("firstName"))); - } - } - - private static Document createDocument(Integer id, String firstName, String lastName, String email) { - Document document = new Document(); - document.add(new StringField("id", id.toString(), Field.Store.YES)); - document.add(new TextField("firstName", firstName, Field.Store.YES)); - document.add(new TextField("lastName", lastName, Field.Store.YES)); - document.add(new TextField("email", email, Field.Store.YES)); - return document; - } - - private static IndexWriter createWriter() throws IOException { - FSDirectory dir = FSDirectory.open(Paths.get(indexDirectory)); - IndexWriterConfig config = new IndexWriterConfig(new StandardAnalyzer()); - IndexWriter writer = new IndexWriter(dir, config); - return writer; - } - - private static TopDocs searchByFirstName(String firstName, IndexSearcher searcher) throws Exception { - QueryParser qp = new QueryParser("firstName", new StandardAnalyzer()); - Query firstNameQuery = qp.parse(firstName); - TopDocs hits = searcher.search(firstNameQuery, 10); - return hits; - } - - private static TopDocs searchById(Integer id, IndexSearcher searcher) throws Exception { - QueryParser qp = new QueryParser("id", new StandardAnalyzer()); - Query idQuery = qp.parse(id.toString()); - TopDocs hits = searcher.search(idQuery, 10); - return hits; - } - - private static IndexSearcher createSearcher() throws IOException { - Directory dir = FSDirectory.open(Paths.get(indexDirectory)); - IndexReader reader = DirectoryReader.open(dir); - IndexSearcher searcher = new IndexSearcher(reader); - return searcher; - } -} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index a63aeea4..5e963013 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,12 +3,18 @@ "module": "commonjs", "target": "es6", "outDir": "out", - "alwaysStrict": true, "lib": [ "es6" ], "sourceMap": true, - "rootDir": "." + "rootDir": ".", + "noUnusedLocals": true, + "noImplicitThis": true, + "noImplicitAny": true, + "noImplicitReturns": true, + "noUnusedParameters": true, + "strictNullChecks": true, + "alwaysStrict": true }, "exclude": [ "node_modules", diff --git a/tslint.json b/tslint.json index 3d37384c..d9005209 100644 --- a/tslint.json +++ b/tslint.json @@ -7,10 +7,11 @@ ], "no-unused-expression": true, "no-duplicate-variable": true, - "max-classes-per-file": [ - false + "max-classes-per-file": false, + "no-implicit-dependencies": [ + false, + "dev" ], - "no-implicit-dependencies": [true, "dev"], "no-empty": false, "object-literal-sort-keys": false, "curly": true, @@ -24,15 +25,18 @@ "check-separator", "check-type" ], - "semicolon": [ - "always" - ], + "semicolon": true, "triple-equals": true, "max-line-length": [ true, 150 - ], + ], "no-angle-bracket-type-assertion": false, - "no-console": ["log","error"] + "no-console": [ + true, + "log", + "error" + ], + "no-submodule-imports": false } } diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 00000000..54342f8d --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,43 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +const path = require('path'); + +module.exports = function (env, argv) { + env = env || {}; + return [{ + name: 'extension', + target: 'node', + mode: 'none', + entry: { + extension: './src/extension.ts' + }, + module: { + rules: [{ + test: /\.ts$/, + exclude: /node_modules/, + use: 'ts-loader' + }] + }, + resolve: { + modules: ['node_modules', path.resolve(__dirname, 'src')], + mainFiles: ['index'], + extensions: ['.js', '.ts', '.json'] + }, + output: { + filename: '[name].js', + path: path.resolve(__dirname, 'dist'), + libraryTarget: "commonjs2", + publicPath: '/', + devtoolModuleFilenameTemplate: "../[resource-path]" + }, + externals: { + 'applicationinsights-native-metrics': 'commonjs applicationinsights-native-metrics', // ignored because we don't ship native module + vscode: 'commonjs vscode' + }, + devtool: 'source-map', + infrastructureLogging: { + level: 'log' + } + }]; +}; \ No newline at end of file