diff --git a/-49648473.jar b/-49648473.jar new file mode 100644 index 0000000..69f5559 Binary files /dev/null and b/-49648473.jar differ diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..341d0d2 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,6 @@ +{ + "recommendations": [ + "thongdong7.thongdong7-snippets", + "eamodio.gitlens" + ] +} \ No newline at end of file diff --git a/Blank.pages b/Blank.pages new file mode 100644 index 0000000..063525a Binary files /dev/null and b/Blank.pages differ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..6bece0e --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,99 @@ +# Contributing to VS Code + +Welcome, and thank you for your interest in contributing to VS Code! + +There are several ways in which you can contribute, beyond writing code. The goal of this document is to provide a high-level overview of how you can get involved. + +## Asking Questions + + +Have a question? Instead of opening an issue, please ask on [Stack Overflow](https://stackoverflow.com/questions/tagged/visual-studio-code) using the tag `visual-studio-code`. + +The active community will be eager to assist you. Your well-worded question will serve as a resource to others searching for help. + +## Providing Feedback + +Your comments and feedback are welcome, and the development team is available via a handful of different channels. + +See the [Feedback Channels](https://github.com/microsoft/vscode/wiki/Feedback-Channels) wiki page for details on how to share your thoughts. + +## Reporting Issues + +Have you identified a reproducible problem in VS Code? Do you have a feature request? We want to hear about it! Here's how you can report your issue as effectively as possible. + +### Identify Where to Report + +The VS Code project is distributed across multiple repositories. Try to file the issue against the correct repository. Check the list of [Related Projects](https://github.com/microsoft/vscode/wiki/Related-Projects) if you aren't sure which repo is correct. + +Can you recreate the issue even after [disabling all extensions](https://code.visualstudio.com/docs/editor/extension-gallery#_disable-an-extension)? If you find the issue is caused by an extension you have installed, please file an issue on the extension's repo directly. + +### Look For an Existing Issue + +Before you create a new issue, please do a search in [open issues](https://github.com/microsoft/vscode/issues) to see if the issue or feature request has already been filed. + +Be sure to scan through the [most popular](https://github.com/microsoft/vscode/issues?q=is%3Aopen+is%3Aissue+label%3Afeature-request+sort%3Areactions-%2B1-desc) feature requests. + +If you find your issue already exists, make relevant comments and add your [reaction](https://github.com/blog/2119-add-reactions-to-pull-requests-issues-and-comments). Use a reaction in place of a "+1" comment: + +* ๐Ÿ‘ - upvote +* ๐Ÿ‘Ž - downvote + +If you cannot find an existing issue that describes your bug or feature, create a new issue using the guidelines below. + +### Writing Good Bug Reports and Feature Requests + +File a single issue per problem and feature request. Do not enumerate multiple bugs or feature requests in the same issue. + +Do not add your issue as a comment to an existing issue unless it's for the identical input. Many issues look similar but have different causes. + +The more information you can provide, the more likely someone will be successful at reproducing the issue and finding a fix. + +The built-in tool for reporting an issue, which you can access by using `Report Issue` in VS Code's Help menu, can help streamline this process by automatically providing the version of VS Code, all your installed extensions, and your system info. Additionally, the tool will search among existing issues to see if a similar issue already exists. + +Please include the following with each issue: + +* Version of VS Code +* Your operating system +* List of extensions that you have installed +* Reproducible steps (1... 2... 3...) that cause the issue +* What you expected to see, versus what you actually saw +* Images, animations, or a link to a video showing the issue occurring +* A code snippet that demonstrates the issue or a link to a code repository the developers can easily pull down to recreate the issue locally + * **Note:** Because the developers need to copy and paste the code snippet, including a code snippet as a media file (i.e. .gif) is not sufficient. +* Errors from the Dev Tools Console (open from the menu: Help > Toggle Developer Tools) + +### Creating Pull Requests + +* Please refer to the article on [creating pull requests](https://github.com/microsoft/vscode/wiki/How-to-Contribute#pull-requests) and contributing to this project. + +### Final Checklist + +Please remember to do the following: + +* [ ] Search the issue repository to ensure your report is a new issue +* [ ] Recreate the issue after disabling all extensions +* [ ] Simplify your code around the issue to better isolate the problem + +Don't feel bad if the developers can't reproduce the issue right away. They will simply ask for more information! + +### Follow Your Issue + +Once submitted, your report will go into the [issue tracking](https://github.com/microsoft/vscode/wiki/Issue-Tracking) workflow. Be sure to understand what will happen next, so you know what to expect and how to continue to assist throughout the process. + +## Automated Issue Management + +We use GitHub Actions to help us manage issues. These Actions and their descriptions can be [viewed here](https://github.com/microsoft/vscode-github-triage-actions). Some examples of what these Actions do are: + +* Automatically close any issue marked `info-needed` if there has been no response in the past 7 days. +* Automatically lock issues 45 days after they are closed. +* Automatically implement the VS Code [feature request pipeline](https://github.com/microsoft/vscode/wiki/Issues-Triaging#managing-feature-requests). + +If you believe the bot got something wrong, please open a new issue and let us know. + +## Contributing Fixes + +If you are interested in writing code to fix issues, please see [How to Contribute](https://github.com/microsoft/vscode/wiki/How-to-Contribute) in the wiki. + +## Thank You + +Your contributions to open source, large or small, make great projects like this possible. Thank you for taking the time to contribute. diff --git a/CodeQL.yml b/CodeQL.yml new file mode 100644 index 0000000..ca99d17 --- /dev/null +++ b/CodeQL.yml @@ -0,0 +1,30 @@ +path_classifiers: + test: + # Classify all files in the top-level directories test/ and testsuites/ as test code. + - test + # Classify all files with suffix `.test` as test code. + # Note: use only forward slash / as a path separator. + # * Matches any sequence of characters except a forward slash. + # ** Matches any sequence of characters, including a forward slash. + # This wildcard must either be surrounded by forward slash symbols, or used as the first segment of a path. + # It matches zero or more whole directory segments. There is no need to use a wildcard at the end of a directory path because all sub-directories are automatically matched. + # That is, /anything/ matches the anything directory and all its subdirectories. + # Always enclose the expression in double quotes if it includes *. + - "**/*.test.ts" + + # The default behavior is to tag all files created during the + # build as `generated`. Results are hidden for generated code. You can tag + # further files as being generated by adding them to the `generated` section. + generated: + # generated code. + - out + - "out-build" + - "out-vscode" + - "**/out/**" + - ".build/distro/cli-patches/index.js" + + # The default behavior is to tag library code as `library`. Results are hidden + # for library code. You can tag further files as being library code by adding them + # to the `library` section. + library: + - "**/node_modules/**" diff --git a/IMG_5406.png b/IMG_5406.png new file mode 100644 index 0000000..ce6170c Binary files /dev/null and b/IMG_5406.png differ diff --git a/IMG_5407.png b/IMG_5407.png new file mode 100644 index 0000000..e8b523d Binary files /dev/null and b/IMG_5407.png differ diff --git a/IMG_5409.jpeg b/IMG_5409.jpeg new file mode 100644 index 0000000..dce1b2a Binary files /dev/null and b/IMG_5409.jpeg differ diff --git a/IMG_5410.jpeg b/IMG_5410.jpeg new file mode 100644 index 0000000..6cb43e5 Binary files /dev/null and b/IMG_5410.jpeg differ diff --git a/IMG_5411.png b/IMG_5411.png new file mode 100644 index 0000000..1bb07b8 Binary files /dev/null and b/IMG_5411.png differ diff --git a/IMG_5412.png b/IMG_5412.png new file mode 100644 index 0000000..e8487b1 Binary files /dev/null and b/IMG_5412.png differ diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..7d58428 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2015 - present Microsoft Corporation + +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. diff --git a/README.md b/README.md index d19cd60..d6f0b7c 100644 --- a/README.md +++ b/README.md @@ -1,36 +1,21 @@ - - +# Git static contributions and remote repository picker -# Codespaces Host Image Configurations -## Stable -**Version**: 20240113001 +**Notice:** This extension is bundled with Visual Studio Code. It can be disabled but not uninstalled. -**Host OS**: Ubuntu 22.04.3 LTS (Jammy Jellyfish) +## Features -### Installed Packages -| Package | Version | Description | -|---|---|---| -| moby-engine | 24.0.x | Docker container platform (engine package) | -| docker-compose | 2.22.x | Define and run multi-container applications with Docker. | -| nodejs | 18.19.x | Node.js event-based server-side javascript engine | -| python3 | 3.10.x | interactive high-level object-oriented language (default python3 version) | -| azcopy | 10.22.x | A command-line utility designed for copying data to/from Microsoft Azure Blob, File, and Table storage. (path: `/.codespaces/azcopy`) | +Git static contributions and remote repository picker. +## API -**Quality**: stable; **Codename**: blueberry -## Beta -**Version**: 20240113001 +The Git extension exposes an API, reachable by any other extension. -**Host OS**: Ubuntu 22.04.3 LTS (Jammy Jellyfish) +1. Copy `src/api/git-base.d.ts` to your extension's sources; +2. Include `git-base.d.ts` in your extension's compilation. +3. Get a hold of the API with the following snippet: -### Installed Packages -| Package | Version | Description | -|---|---|---| -| moby-engine | 24.0.x | Docker container platform (engine package) | -| docker-compose | 2.22.x | Define and run multi-container applications with Docker. | -| nodejs | 18.19.x | Node.js event-based server-side javascript engine | -| python3 | 3.10.x | interactive high-level object-oriented language (default python3 version) | -| azcopy | 10.22.x | A command-line utility designed for copying data to/from Microsoft Azure Blob, File, and Table storage. (path: `/.codespaces/azcopy`) | + ```ts + const gitBaseExtension = vscode.extensions.getExtension('vscode.git-base').exports; + const git = gitBaseExtension.getAPI(1); - -**Quality**: stable; **Codename**: blueberry + ``` diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..4fa5946 --- /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://docs.microsoft.com/en-us/previous-versions/tn-archive/cc751383(v=technet.10)), 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://msrc.microsoft.com/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://www.microsoft.com/en-us/msrc/pgp-key-msrc). + +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://www.microsoft.com/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://microsoft.com/msrc/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://www.microsoft.com/en-us/msrc/cvd). + + diff --git a/ThirdPartyNotices.txt b/ThirdPartyNotices.txt new file mode 100644 index 0000000..2aedbe0 --- /dev/null +++ b/ThirdPartyNotices.txt @@ -0,0 +1,2782 @@ +NOTICES + +This repository incorporates material as listed below or described in the code. + + + +--------------------------------------------------------- + +@iktakahiro/markdown-it-katex 4.0.2 - MIT +https://github.com/mjbvz/markdown-it-katex + +The MIT License (MIT) + +Copyright (c) 2016 Waylon Flinn + +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. + +--- + +The MIT License (MIT) + +Copyright (c) 2018 Takahiro Ethan Ikeuchi @iktakahiro + +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. +--------------------------------------------------------- + +--------------------------------------------------------- + +atom/language-clojure 0.22.8 - MIT +https://github.com/atom/language-clojure + +Copyright (c) 2014 GitHub Inc. + +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. + + +This package was derived from a TextMate bundle located at +https://github.com/mmcgrana/textmate-clojure and distributed under the +following license, located in `LICENSE.md`: + +The MIT License (MIT) + +Copyright (c) 2010- Mark McGranaghan + +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. +--------------------------------------------------------- + +--------------------------------------------------------- + +atom/language-coffee-script 0.49.3 - MIT +https://github.com/atom/language-coffee-script + +The MIT License (MIT) + +Copyright (c) 2014 GitHub Inc. + +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. + + +This package was derived from a TextMate bundle located at +https://github.com/jashkenas/coffee-script-tmbundle and distributed under the +following license, located in `LICENSE`: + +Copyright (c) 2009-2014 Jeremy Ashkenas + +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. +--------------------------------------------------------- + +--------------------------------------------------------- + +atom/language-sass 0.62.1 - MIT +https://github.com/atom/language-sass + +The MIT License (MIT) + +Copyright (c) 2014 GitHub Inc. + +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. + + +This package was derived from a TextMate bundle located at +https://github.com/alexsancho/Sass.tmbundle and distributed under the following +license, located in `LICENSE.md`: + +Copyright (c) 2012 Alex Sancho, http://alexsancho.name/ + +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. +--------------------------------------------------------- + +--------------------------------------------------------- + +atom/language-xml 0.35.2 - MIT +https://github.com/atom/language-xml + +The MIT License (MIT) + +Copyright (c) 2014 GitHub Inc. + +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. + + +This package was derived from a TextMate bundle located at +https://github.com/textmate/xml.tmbundle and distributed under the following +license, located in `README.mdown`: + +Permission to copy, use, modify, sell and distribute this +software is granted. This software is provided "as is" without +express or implied warranty, and with no claim as to its +suitability for any purpose. +--------------------------------------------------------- + +--------------------------------------------------------- + +Colorsublime-Themes 0.1.0 +https://github.com/Colorsublime/Colorsublime-Themes + +Copyright (c) 2015 Colorsublime.com + +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. +--------------------------------------------------------- + +--------------------------------------------------------- + +daaain/Handlebars 1.8.0 - MIT +https://github.com/daaain/Handlebars + +-- Credits + +Adapted from the great sublime-text-handlebars package by Nicholas Westlake. + +Thanks a lot to all the generous contributors (in alphabetical order): @bittersweetryan, @bradcliffe, @calumbrodie, @duncanbeevers, @hlvnst, @jonschlinkert, @Krutius, @samselikoff, @utkarshkukreti, @zeppelin + +-- License + +(The MIT License) + +Copyright (c) daaain/Handlebars project authors + +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. +--------------------------------------------------------- + +--------------------------------------------------------- + +dart-lang/dart-syntax-highlight 0.0.0 - BSD +https://github.com/dart-lang/dart-syntax-highlight + +Copyright 2020, the Dart project authors. + +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. + * Neither the name of Google LLC nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +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 +OWNER 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. +--------------------------------------------------------- + +--------------------------------------------------------- + +davidrios/pug-tmbundle 0.0.0 - MIT +https://github.com/davidrios/pug-tmbundle + +The MIT License (MIT) + +Copyright (c) 2016 David Rios + +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. +--------------------------------------------------------- + +--------------------------------------------------------- + +definitelytyped - MIT +https://github.com/DefinitelyTyped/DefinitelyTyped + +This project is licensed under the MIT license. +Copyrights are respective of each contributor listed at the beginning of each definition file. + +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. +--------------------------------------------------------- + +--------------------------------------------------------- + +Document Object Model 4.0.0 - W3C License +https://www.w3.org/DOM/ + +W3C License +This work is being provided by the copyright holders under the following license. +By obtaining and/or copying this work, you (the licensee) agree that you have read, understood, and will comply with the following terms and conditions. +Permission to copy, modify, and distribute this work, with or without modification, for any purpose and without fee or royalty is hereby granted, provided that you include the following +on ALL copies of the work or portions thereof, including modifications: +* The full text of this NOTICE in a location viewable to users of the redistributed or derivative work. +* Any pre-existing intellectual property disclaimers, notices, or terms and conditions. If none exist, the W3C Software and Document Short Notice should be included. +* Notice of any changes or modifications, through a copyright statement on the new code or document such as "This software or document includes material copied from or derived +from Document Object Model. Copyright ยฉ 2015 W3Cยฎ (MIT, ERCIM, Keio, Beihang)." +Disclaimers +THIS WORK IS PROVIDED "AS IS + AND COPYRIGHT HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY OR +FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE OR DOCUMENT WILL NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS. +COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR DOCUMENT. +The name and trademarks of copyright holders may NOT be used in advertising or publicity pertaining to the work without specific, written prior permission. +Title to copyright in this work will at all times remain with copyright holders. +--------------------------------------------------------- + +--------------------------------------------------------- + +dotnet/csharp-tmLanguage 0.1.0 - MIT +https://github.com/dotnet/csharp-tmLanguage + +MIT License + +Copyright (c) 2016 .NET Foundation + +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. +--------------------------------------------------------- + +--------------------------------------------------------- + +dotnet/razor 1.0.0 - MIT +https://github.com/dotnet/razor + +MIT License + +Copyright (c) .NET Foundation and Contributors +All Rights Reserved + +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. +--------------------------------------------------------- + +--------------------------------------------------------- + +expand-abbreviation 0.5.8 - MIT +https://github.com/emmetio/expand-abbreviation + +MIT License + +Copyright (c) 2017 Emmet.io + +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. +--------------------------------------------------------- + +--------------------------------------------------------- + +fadeevab/make.tmbundle 0.0.0 - TextMate Bundle License +https://github.com/fadeevab/make.tmbundle + +Copyright (c) textmate-make.tmbundle project authors + +If not otherwise specified (see below), files in this repository fall under the following license: + +Permission to copy, use, modify, sell and distribute this +software is granted. This software is provided "as is" without +express or implied warranty, and with no claim as to its +suitability for any purpose. + +An exception is made for files in readable text which contain their own license information, +or files where an accompanying file exists (in the same directory) with a "-license" suffix added +to the base-name name of the original file, and an extension of txt, html, or similar. For example +"tidy" is accompanied by "tidy-license.txt". +--------------------------------------------------------- + +--------------------------------------------------------- + +go-syntax 0.5.1 - MIT +https://github.com/worlpaker/go-syntax + +MIT License + +Copyright (c) 2023 Furkan Ozalp + +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. +--------------------------------------------------------- + +--------------------------------------------------------- + +HTML 5.1 W3C Working Draft 08 October 2015 - W3C Document License +http://www.w3.org/TR/2015/WD-html51-20151008/ + +Copyright ยฉ 2015 W3Cยฎ (MIT, ERCIM, Keio, Beihang). This software or document includes material copied +from or derived from HTML 5.1 W3C Working Draft (http://www.w3.org/TR/2015/WD-html51-20151008/.) + +THIS DOCUMENT IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING, BUT +NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, OR TITLE; THAT THE CONTENTS OF +THE DOCUMENT ARE SUITABLE FOR ANY PURPOSE; NOR THAT THE IMPLEMENTATION OF SUCH CONTENTS WILL NOT INFRINGE ANY THIRD PARTY +PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS. + +COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE +DOCUMENT OR THE PERFORMANCE OR IMPLEMENTATION OF THE CONTENTS THEREOF. + +The name and trademarks of copyright holders may NOT be used in advertising or publicity pertaining to this document or its contents +without specific, written prior permission. Title to copyright in this document will at all times remain with copyright holders. +--------------------------------------------------------- + +--------------------------------------------------------- + +Ionic documentation 1.2.4 - Apache2 +https://github.com/ionic-team/ionic-site + +Copyright Drifty Co. http://drifty.com/. + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + +You must give any other recipients of the Work or Derivative Works a copy of this License; and + +You must cause any modified files to carry prominent notices stating that You changed the files; and + +You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + +If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS +--------------------------------------------------------- + +--------------------------------------------------------- + +ionide/ionide-fsgrammar 0.0.0 - MIT +https://github.com/ionide/ionide-fsgrammar + +The MIT License (MIT) + +Copyright (c) 2015 Krzysztof Cieslak + +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. +--------------------------------------------------------- + +--------------------------------------------------------- + +James-Yu/LaTeX-Workshop 8.19.1 - MIT +https://github.com/James-Yu/LaTeX-Workshop + +The MIT License (MIT) + +Copyright (c) 2016 James Yu + +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. +--------------------------------------------------------- + +--------------------------------------------------------- + +jeff-hykin/better-c-syntax 1.13.2 - MIT +https://github.com/jeff-hykin/better-c-syntax + +MIT License + +Copyright (c) 2019 Jeff Hykin + +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. +--------------------------------------------------------- + +--------------------------------------------------------- + +jeff-hykin/better-cpp-syntax 1.17.4 - MIT +https://github.com/jeff-hykin/better-cpp-syntax + +MIT License,,Copyright (c) 2019 Jeff Hykin,,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. +--------------------------------------------------------- + +--------------------------------------------------------- + +jeff-hykin/better-objc-syntax 0.2.0 - MIT +https://github.com/jeff-hykin/better-objc-syntax + +MIT License + +Copyright (c) 2019 Jeff Hykin + +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. +--------------------------------------------------------- + +--------------------------------------------------------- + +jeff-hykin/better-objcpp-syntax 0.1.0 - MIT +https://github.com/jeff-hykin/better-objcpp-syntax + +MIT License + +Copyright (c) 2019 Jeff Hykin + +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. +--------------------------------------------------------- + +--------------------------------------------------------- + +jeff-hykin/better-shell-syntax 1.6.2 - MIT +https://github.com/jeff-hykin/better-shell-syntax + +MIT License + +Copyright (c) 2019 Jeff Hykin + +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. +--------------------------------------------------------- + +--------------------------------------------------------- + +jeff-hykin/better-snippet-syntax 1.0.2 - MIT +https://github.com/jeff-hykin/better-snippet-syntax + +MIT License + +Copyright (c) 2019 Jeff Hykin + +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. +--------------------------------------------------------- + +--------------------------------------------------------- + +jlelong/vscode-latex-basics 1.5.4 - MIT +https://github.com/jlelong/vscode-latex-basics + +Copyright (c) vscode-latex-basics authors + +If not otherwise specified (see below), files in this repository fall under the MIT License + + +The file syntaxes/LaTeX.tmLanguage.json is based on https://github.com/textmate/latex.tmbundle/blob/master/Syntaxes/LaTeX.plist +but has been largely modified. The original file falls under the following license + +Permission to copy, use, modify, sell and distribute this +software is granted. This software is provided "as is" without +express or implied warranty, and with no claim as to its +suitability for any purpose. + +The file syntaxes/markdown-latex-combined.tmLanguage.json is generated from the Markdown grammar +included in VSCode and falls under the license described in markdown-latex-combined-license.txt. + +The file syntaxes/cpp-grammar-bailout.tmLanguage.json is generated from https://github.com/jeff-hykin/better-cpp-syntax +and falls under the license described in cpp-bailout-license.txt. +--------------------------------------------------------- + +--------------------------------------------------------- + +js-beautify 1.6.8 - MIT +https://github.com/beautify-web/js-beautify + +The MIT License (MIT) + +Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and 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. +--------------------------------------------------------- + +--------------------------------------------------------- + +jtbandes/swift-tmlanguage - MIT +https://github.com/jtbandes/swift-tmlanguage + +The MIT License (MIT) + +Copyright 2023 Jacob Bandes-Storch + +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. +--------------------------------------------------------- + +--------------------------------------------------------- + +JuliaEditorSupport/atom-language-julia 0.22.1 - MIT +https://github.com/JuliaEditorSupport/atom-language-julia + +The atom-language-julia package is licensed under the MIT "Expat" License: + +> Copyright (c) 2015 +> +> 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. +--------------------------------------------------------- + +--------------------------------------------------------- + +Jxck/assert 1.0.0 - MIT +https://github.com/Jxck/assert + +The MIT License (MIT) + +Copyright (c) 2011 Jxck + +Originally from node.js (http://nodejs.org) +Copyright Joyent, Inc. + +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. +--------------------------------------------------------- + +--------------------------------------------------------- + +language-docker 0.0.0 - Apache2 +https://github.com/moby/moby + +Apache License + Version 2.0, January 2004 + https://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + Copyright 2013-2018 Docker, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--------------------------------------------------------- + +--------------------------------------------------------- + +language-less 0.6.1 - MIT +https://github.com/radium-v/Better-Less + +MIT License + +Copyright (c) 2017 John Kreitlow + +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. +--------------------------------------------------------- + +--------------------------------------------------------- + +language-php 0.49.0 - MIT +https://github.com/KapitanOczywisty/language-php + +The MIT License (MIT) + +Copyright (c) 2014 GitHub Inc. + +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. + + +This package was derived from a TextMate bundle located at +https://github.com/textmate/php.tmbundle and distributed under the following +license, located in `README.mdown`: + +Permission to copy, use, modify, sell and distribute this +software is granted. This software is provided "as is" without +express or implied warranty, and with no claim as to its +suitability for any purpose. +--------------------------------------------------------- + +--------------------------------------------------------- + +MagicStack/MagicPython 1.1.1 - MIT +https://github.com/MagicStack/MagicPython + +The MIT License + +Copyright (c) 2015-present MagicStack Inc. http://magic.io + +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. +--------------------------------------------------------- + +--------------------------------------------------------- + +marked 4.1.0 - MIT +https://github.com/markedjs/marked + +information + +## Contribution License Agreement + +If you contribute code to this project, you are implicitly allowing your code +to be distributed under the MIT license. You are also implicitly verifying that +all code is your original work. `` + +## Marked + +Copyright (c) 2018+, MarkedJS (https://github.com/markedjs/) +Copyright (c) 2011-2018, Christopher Jeffrey (https://github.com/chjj/) + +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. + +## Markdown + +Copyright ยฉ 2004, John Gruber +http://daringfireball.net/ +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. +* Neither the name "Markdown" nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +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 owner 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. +--------------------------------------------------------- + +--------------------------------------------------------- + +microsoft/TypeScript-TmLanguage 0.0.1 - MIT +https://github.com/microsoft/TypeScript-TmLanguage + +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. +--------------------------------------------------------- + +--------------------------------------------------------- + +microsoft/vscode-css 0.0.0 - MIT License +https://github.com/microsoft/vscode-css + +MIT License + +Copyright (c) Microsoft Corporation. + +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. + +-------------------------------------------------------------------- + +This package was derived from a TextMate bundle located at +https://github.com/textmate/css.tmbundle and distributed under the following +license, located in `README.mdown`: + +Permission to copy, use, modify, sell and distribute this +software is granted. This software is provided "as is" without +express or implied warranty, and with no claim as to its +suitability for any purpose. +--------------------------------------------------------- + +--------------------------------------------------------- + +microsoft/vscode-JSON.tmLanguage 0.0.0 - MIT +https://github.com/microsoft/vscode-JSON.tmLanguage + +vscode-JSON.tmLanguage + +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. +--------------------------------------------------------- + +--------------------------------------------------------- + +microsoft/vscode-markdown-tm-grammar 1.0.0 - MIT +https://github.com/microsoft/vscode-markdown-tm-grammar + +The MIT License (MIT) + +Copyright (c) Microsoft 2018 + +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. +--------------------------------------------------------- + +--------------------------------------------------------- + +microsoft/vscode-mssql 1.23.0 - MIT +https://github.com/microsoft/vscode-mssql + +------------------------------------------ START OF LICENSE ----------------------------------------- +vscode-mssql +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: +Copyright (c) 2016 Microsoft +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 LICENSE ----------------------------------------- +--------------------------------------------------------- + +--------------------------------------------------------- + +mmims/language-batchfile 0.7.6 - MIT +https://github.com/mmims/language-batchfile + +The MIT License (MIT) + +Copyright (c) 2021 Michael Mims + +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. +--------------------------------------------------------- + +--------------------------------------------------------- + +NVIDIA/cuda-cpp-grammar 0.0.0 - MIT +https://github.com/NVIDIA/cuda-cpp-grammar + +The MIT License (MIT) + +Copyright 2021 NVIDIA Corporation + +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. +--------------------------------------------------------- + +--------------------------------------------------------- + +PowerShell/EditorSyntax 1.0.0 - MIT +https://github.com/PowerShell/EditorSyntax + +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. +--------------------------------------------------------- + +--------------------------------------------------------- + +redhat-developer/vscode-java 1.26.0 - MIT +https://github.com/redhat-developer/vscode-java + +The MIT License (MIT) + +Copyright (c) 2014 GitHub Inc. + +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. + +-------------------------------------------------------------------- + +This package was derived from a TextMate bundle located at +https://github.com/textmate/java.tmbundle and distributed under the following +license, located in `README.mdown`: + +Permission to copy, use, modify, sell and distribute this +software is granted. This software is provided "as is" without +express or implied warranty, and with no claim as to its +suitability for any purpose. +--------------------------------------------------------- + +--------------------------------------------------------- + +REditorSupport/vscode-R 2.8.1 - MIT +https://github.com/REditorSupport/vscode-R + +MIT License + +Copyright (c) 2022 REditorSupport + +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. +--------------------------------------------------------- + +--------------------------------------------------------- + +rust-syntax 0.6.1 - MIT +https://github.com/dustypomerleau/rust-syntax + +MIT License + +Copyright (c) 2020 Dustin Pomerleau + +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. +--------------------------------------------------------- + +--------------------------------------------------------- + +semver 5.5.0 - The ISC License +https://github.com/npm/node-semver + +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +--------------------------------------------------------- + +--------------------------------------------------------- + +seti-ui 0.1.0 +https://github.com/jesseweed/seti-ui + +Copyright (c) 2014 Jesse Weed + +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. +--------------------------------------------------------- + +--------------------------------------------------------- + +shaders-tmLanguage 0.1.0 - MIT +https://github.com/tgjones/shaders-tmLanguage + +MIT License + +Copyright (c) 2017 Tim Jones + +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. +--------------------------------------------------------- + +--------------------------------------------------------- + +sumneko/lua.tmbundle 1.0.0 - TextMate Bundle License +https://github.com/sumneko/lua.tmbundle + +Copyright (c) sumneko-lua.tmbundle project authors + +If not otherwise specified (see below), files in this repository fall under the following license: + +Permission to copy, use, modify, sell and distribute this +software is granted. This software is provided "as is" without +express or implied warranty, and with no claim as to its +suitability for any purpose. + +An exception is made for files in readable text which contain their own license information, +or files where an accompanying file exists (in the same directory) with a "-license" suffix added +to the base-name name of the original file, and an extension of txt, html, or similar. For example +"tidy" is accompanied by "tidy-license.txt". +--------------------------------------------------------- + +--------------------------------------------------------- + +textmate/asp.vb.net.tmbundle 0.0.0 - TextMate Bundle License +https://github.com/textmate/asp.vb.net.tmbundle + +Copyright (c) textmate-asp.vb.net.tmbundle project authors + +If not otherwise specified (see below), files in this folder fall under the following license: + +Permission to copy, use, modify, sell and distribute this +software is granted. This software is provided "as is" without +express or implied warranty, and with no claim as to its +suitability for any purpose. + +An exception is made for files in readable text which contain their own license information, +or files where an accompanying file exists (in the same directory) with a "-license" suffix added +to the base-name name of the original file, and an extension of txt, html, or similar. For example +"tidy" is accompanied by "tidy-license.txt". +--------------------------------------------------------- + +--------------------------------------------------------- + +textmate/c.tmbundle 0.0.0 - TextMate Bundle License +https://github.com/textmate/c.tmbundle + +Copyright (c) textmate-c.tmbundle authors + +If not otherwise specified (see below), files in this repository fall under the following license: + +Permission to copy, use, modify, sell and distribute this +software is granted. This software is provided "as is" without +express or implied warranty, and with no claim as to its +suitability for any purpose. + +An exception is made for files in readable text which contain their own license information, +or files where an accompanying file exists (in the same directory) with a "-license" suffix added +to the base-name name of the original file, and an extension of txt, html, or similar. For example +"tidy" is accompanied by "tidy-license.txt". +--------------------------------------------------------- + +--------------------------------------------------------- + +textmate/diff.tmbundle 0.0.0 - TextMate Bundle License +https://github.com/textmate/diff.tmbundle + +Copyright (c) textmate-diff.tmbundle project authors + +If not otherwise specified (see below), files in this repository fall under the following license: + +Permission to copy, use, modify, sell and distribute this +software is granted. This software is provided "as is" without +express or implied warranty, and with no claim as to its +suitability for any purpose. + +An exception is made for files in readable text which contain their own license information, +or files where an accompanying file exists (in the same directory) with a "-license" suffix added +to the base-name name of the original file, and an extension of txt, html, or similar. For example +"tidy" is accompanied by "tidy-license.txt". +--------------------------------------------------------- + +--------------------------------------------------------- + +textmate/git.tmbundle 0.0.0 - MIT +https://github.com/textmate/git.tmbundle + +The MIT License (MIT) + +Copyright (c) 2008 Tim Harper + +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. +--------------------------------------------------------- + +--------------------------------------------------------- + +textmate/groovy.tmbundle 0.0.0 - TextMate Bundle License +https://github.com/textmate/groovy.tmbundle + +Copyright (c) textmate-groovy.tmbundle project authors + +If not otherwise specified (see below), files in this repository fall under the following license: + +Permission to copy, use, modify, sell and distribute this +software is granted. This software is provided "as is" without +express or implied warranty, and with no claim as to its +suitability for any purpose. + +An exception is made for files in readable text which contain their own license information, +or files where an accompanying file exists (in the same directory) with a "-license" suffix added +to the base-name name of the original file, and an extension of txt, html, or similar. For example +"tidy" is accompanied by "tidy-license.txt". +--------------------------------------------------------- + +--------------------------------------------------------- + +textmate/html.tmbundle 0.0.0 - TextMate Bundle License +https://github.com/textmate/html.tmbundle + +Copyright (c) textmate-html.tmbundle project authors + +If not otherwise specified (see below), files in this repository fall under the following license: + +Permission to copy, use, modify, sell and distribute this +software is granted. This software is provided "as is" without +express or implied warranty, and with no claim as to its +suitability for any purpose. + +An exception is made for files in readable text which contain their own license information, +or files where an accompanying file exists (in the same directory) with a "-license" suffix added +to the base-name name of the original file, and an extension of txt, html, or similar. For example +"tidy" is accompanied by "tidy-license.txt". +--------------------------------------------------------- + +--------------------------------------------------------- + +textmate/ini.tmbundle 0.0.0 - TextMate Bundle License +https://github.com/textmate/ini.tmbundle + +Copyright (c) textmate-ini.tmbundle project authors + +If not otherwise specified (see below), files in this folder fall under the following license: + +Permission to copy, use, modify, sell and distribute this +software is granted. This software is provided "as is" without +express or implied warranty, and with no claim as to its +suitability for any purpose. + +An exception is made for files in readable text which contain their own license information, +or files where an accompanying file exists (in the same directory) with a "-license" suffix added +to the base-name name of the original file, and an extension of txt, html, or similar. For example +"tidy" is accompanied by "tidy-license.txt". +--------------------------------------------------------- + +--------------------------------------------------------- + +textmate/javascript.tmbundle 0.0.0 - TextMate Bundle License +https://github.com/textmate/javascript.tmbundle + +Copyright (c) textmate-javascript.tmbundle project authors + +If not otherwise specified (see below), files in this repository fall under the following license: + +Permission to copy, use, modify, sell and distribute this +software is granted. This software is provided "as is" without +express or implied warranty, and with no claim as to its +suitability for any purpose. + +An exception is made for files in readable text which contain their own license information, +or files where an accompanying file exists (in the same directory) with a "-license" suffix added +to the base-name name of the original file, and an extension of txt, html, or similar. For example +"tidy" is accompanied by "tidy-license.txt". +--------------------------------------------------------- + +--------------------------------------------------------- + +textmate/markdown.tmbundle 0.0.0 - TextMate Bundle License +https://github.com/textmate/markdown.tmbundle + +Copyright (c) markdown.tmbundle authors + +If not otherwise specified (see below), files in this repository fall under the following license: + +Permission to copy, use, modify, sell and distribute this +software is granted. This software is provided "as is" without +express or implied warranty, and with no claim as to its +suitability for any purpose. + +An exception is made for files in readable text which contain their own license information, +or files where an accompanying file exists (in the same directory) with a "-license" suffix added +to the base-name name of the original file, and an extension of txt, html, or similar. For example +"tidy" is accompanied by "tidy-license.txt". +--------------------------------------------------------- + +--------------------------------------------------------- + +textmate/perl.tmbundle 0.0.0 - TextMate Bundle License +https://github.com/textmate/perl.tmbundle + +Copyright (c) textmate-perl.tmbundle project authors + +If not otherwise specified (see below), files in this repository fall under the following license: + +Permission to copy, use, modify, sell and distribute this +software is granted. This software is provided "as is" without +express or implied warranty, and with no claim as to its +suitability for any purpose. + +An exception is made for files in readable text which contain their own license information, +or files where an accompanying file exists (in the same directory) with a "-license" suffix added +to the base-name name of the original file, and an extension of txt, html, or similar. For example +"tidy" is accompanied by "tidy-license.txt". +--------------------------------------------------------- + +--------------------------------------------------------- + +textmate/ruby.tmbundle 0.0.0 - TextMate Bundle License +https://github.com/textmate/ruby.tmbundle + +Copyright (c) textmate-ruby.tmbundle project authors + +If not otherwise specified (see below), files in this folder fall under the following license: + +Permission to copy, use, modify, sell and distribute this +software is granted. This software is provided "as is" without +express or implied warranty, and with no claim as to its +suitability for any purpose. + +An exception is made for files in readable text which contain their own license information, +or files where an accompanying file exists (in the same directory) with a "-license" suffix added +to the base-name name of the original file, and an extension of txt, html, or similar. For example +"tidy" is accompanied by "tidy-license.txt". +--------------------------------------------------------- + +--------------------------------------------------------- + +textmate/yaml.tmbundle 0.0.0 - TextMate Bundle License +https://github.com/textmate/yaml.tmbundle + +Copyright (c) 2015 FichteFoll + +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. +--------------------------------------------------------- + +--------------------------------------------------------- + +trond-snekvik/vscode-rst 1.5.3 - MIT +https://github.com/trond-snekvik/vscode-rst + +The MIT License (MIT) + +Copyright 2021 Trond Snekvik + +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. +--------------------------------------------------------- + +--------------------------------------------------------- + +TypeScript-TmLanguage 0.1.8 - MIT +TypeScript-TmLanguage 1.0.0 - MIT +https://github.com/microsoft/TypeScript-TmLanguage + +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. +--------------------------------------------------------- + +--------------------------------------------------------- + +Unicode 12.0.0 - UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE +https://home.unicode.org/ + +Unicode Data Files include all data files under the directories +https://www.unicode.org/Public/, https://www.unicode.org/reports/, +https://cldr.unicode.org, https://github.com/unicode-org/icu, and +https://www.unicode.org/utility/trac/browser/. + +Unicode Data Files do not include PDF online code charts under the +directory https://www.unicode.org/Public/. + +Software includes any source code published in the Unicode Standard +or under the directories +https://www.unicode.org/Public/, https://www.unicode.org/reports/, +https://cldr.unicode.org, https://github.com/unicode-org/icu, and +https://www.unicode.org/utility/trac/browser/. + +NOTICE TO USER: Carefully read the following legal agreement. +BY DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S +DATA FILES ("DATA FILES"), AND/OR SOFTWARE ("SOFTWARE"), +YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE +TERMS AND CONDITIONS OF THIS AGREEMENT. +IF YOU DO NOT AGREE, DO NOT DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE +THE DATA FILES OR SOFTWARE. + +COPYRIGHT AND PERMISSION NOTICE + +Copyright (c) 1991-2017 Unicode, Inc. All rights reserved. +Distributed under the Terms of Use in http://www.unicode.org/copyright.html. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Unicode data files and any associated documentation +(the "Data Files") or Unicode software and any associated documentation +(the "Software") to deal in the Data Files or Software +without restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, and/or sell copies of +the Data Files or Software, and to permit persons to whom the Data Files +or Software are furnished to do so, provided that either +(a) this copyright and permission notice appear with all copies +of the Data Files or Software, or +(b) this copyright and permission notice appear in associated +Documentation. + +THE DATA FILES AND SOFTWARE ARE 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 OF THIRD PARTY RIGHTS. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS +NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL +DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THE DATA FILES OR SOFTWARE. + +Except as contained in this notice, the name of a copyright holder +shall not be used in advertising or otherwise to promote the sale, +use or other dealings in these Data Files or Software without prior +written authorization of the copyright holder. +--------------------------------------------------------- + +--------------------------------------------------------- + +vscode-codicons 0.0.14 - MIT and Creative Commons Attribution 4.0 +https://github.com/microsoft/vscode-codicons + +Attribution 4.0 International + +======================================================================= + +Creative Commons Corporation ("Creative Commons") is not a law firm and +does not provide legal services or legal advice. Distribution of +Creative Commons public licenses does not create a lawyer-client or +other relationship. Creative Commons makes its licenses and related +information available on an "as-is" basis. Creative Commons gives no +warranties regarding its licenses, any material licensed under their +terms and conditions, or any related information. Creative Commons +disclaims all liability for damages resulting from their use to the +fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and +conditions that creators and other rights holders may use to share +original works of authorship and other material subject to copyright +and certain other rights specified in the public license below. The +following considerations are for informational purposes only, are not +exhaustive, and do not form part of our licenses. + + Considerations for licensors: Our public licenses are + intended for use by those authorized to give the public + permission to use material in ways otherwise restricted by + copyright and certain other rights. Our licenses are + irrevocable. Licensors should read and understand the terms + and conditions of the license they choose before applying it. + Licensors should also secure all rights necessary before + applying our licenses so that the public can reuse the + material as expected. Licensors should clearly mark any + material not subject to the license. This includes other CC- + licensed material, or material used under an exception or + limitation to copyright. More considerations for licensors: + wiki.creativecommons.org/Considerations_for_licensors + + Considerations for the public: By using one of our public + licenses, a licensor grants the public permission to use the + licensed material under specified terms and conditions. If + the licensor's permission is not necessary for any reason--for + example, because of any applicable exception or limitation to + copyright--then that use is not regulated by the license. Our + licenses grant only permissions under copyright and certain + other rights that a licensor has authority to grant. Use of + the licensed material may still be restricted for other + reasons, including because others have copyright or other + rights in the material. A licensor may make special requests, + such as asking that all changes be marked or described. + Although not required by our licenses, you are encouraged to + respect those requests where reasonable. More_considerations + for the public: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Attribution 4.0 International Public License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution 4.0 International Public License ("Public License"). To the +extent this Public License may be interpreted as a contract, You are +granted the Licensed Rights in consideration of Your acceptance of +these terms and conditions, and the Licensor grants You such rights in +consideration of benefits the Licensor receives from making the +Licensed Material available under these terms and conditions. + + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + + c. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + + d. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + + e. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + + f. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + g. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + h. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + i. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + j. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + k. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part; and + + b. produce, reproduce, and Share Adapted Material. + + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + + 3. Term. The term of this Public License is specified in Section + 6(a). + + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + + 5. Downstream recipients. + + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + + b. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this + Public License. + + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties. + + +Section 3 -- License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified + form), You must: + + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of + warranties; + + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + + 3. If requested by the Licensor, You must remove any of the + information required by Section 3(a)(1)(A) to the extent + reasonably practicable. + + 4. If You Share Adapted Material You produce, the Adapter's + License You apply must not prevent recipients of the Adapted + Material from complying with this Public License. + + +Section 4 -- Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that +apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database; + + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material; and + + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + + +Section 5 -- Disclaimer of Warranties and Limitation of Liability. + + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + + +Section 6 -- Term and Termination. + + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + + +Section 7 -- Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + + +Section 8 -- Interpretation. + + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. + + +======================================================================= + +Creative Commons is not a party to its public +licenses. Notwithstanding, Creative Commons may elect to apply one of +its public licenses to material it publishes and in those instances +will be considered the "Licensor." The text of the Creative Commons +public licenses is dedicated to the public domain under the CC0 Public +Domain Dedication. Except for the limited purpose of indicating that +material is shared under a Creative Commons public license or as +otherwise permitted by the Creative Commons policies published at +creativecommons.org/policies, Creative Commons does not authorize the +use of the trademark "Creative Commons" or any other trademark or logo +of Creative Commons without its prior written consent including, +without limitation, in connection with any unauthorized modifications +to any of its public licenses or any other arrangements, +understandings, or agreements concerning use of licensed material. For +the avoidance of doubt, this paragraph does not form part of the +public licenses. + +Creative Commons may be contacted at creativecommons.org. +--------------------------------------------------------- + +--------------------------------------------------------- + +vscode-logfile-highlighter 2.15.0 - MIT +https://github.com/emilast/vscode-logfile-highlighter + +The MIT License (MIT) + +Copyright (c) 2015 emilast + +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. +--------------------------------------------------------- + +--------------------------------------------------------- + +vscode-swift 0.0.1 - MIT +https://github.com/owensd/vscode-swift + +The MIT License (MIT) + +Copyright (c) 2015 David Owens II + +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. +--------------------------------------------------------- + +--------------------------------------------------------- + +vscode-win32-app-container-tokens +https://github.com/microsoft/vscode-win32-app-container-tokens + +MIT License + +Copyright (c) Microsoft Corporation. + +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 +--------------------------------------------------------- + +--------------------------------------------------------- + +walles/git-commit-message-plus 1.0.0 - MIT +https://github.com/walles/git-commit-message-plus + +The MIT License (MIT) + +Copyright (c) 2023 Johan Walles + +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. +--------------------------------------------------------- + +--------------------------------------------------------- + +Web Background Synchronization - Apache2 +https://github.com/WICG/background-sync + +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--------------------------------------------------------- \ No newline at end of file diff --git a/api.ts b/api.ts new file mode 100644 index 0000000..5c408f6 --- /dev/null +++ b/api.ts @@ -0,0 +1,36 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as vscode from 'vscode'; +import { PluginManager } from './tsServer/plugins'; + +class ApiV0 { + public constructor( + public readonly onCompletionAccepted: vscode.Event, + private readonly _pluginManager: PluginManager, + ) { } + + configurePlugin(pluginId: string, configuration: {}): void { + this._pluginManager.setConfiguration(pluginId, configuration); + } +} + +export interface Api { + getAPI(version: 0): ApiV0 | undefined; +} + +export function getExtensionApi( + onCompletionAccepted: vscode.Event, + pluginManager: PluginManager, +): Api { + return { + getAPI(version) { + if (version === 0) { + return new ApiV0(onCompletionAccepted, pluginManager); + } + return undefined; + } + }; +} diff --git a/archive_browser 2.html b/archive_browser 2.html new file mode 100644 index 0000000..f06ea74 --- /dev/null +++ b/archive_browser 2.html @@ -0,0 +1,478 @@ +Google Data Export Archive Contents

Archive for brnmoore1978@gmail.com

Jan 9, 2024, 2:04:37โ€ฏAM PST โ€ข 1.5 MB โ€ข Learn more about Google archives and your deleted data
Products in Archive (1)
\ No newline at end of file diff --git a/archive_browser.html b/archive_browser.html new file mode 100644 index 0000000..f06ea74 --- /dev/null +++ b/archive_browser.html @@ -0,0 +1,478 @@ +Google Data Export Archive Contents

Archive for brnmoore1978@gmail.com

Jan 9, 2024, 2:04:37โ€ฏAM PST โ€ข 1.5 MB โ€ข Learn more about Google archives and your deleted data
Products in Archive (1)
\ No newline at end of file diff --git a/auth.css b/auth.css new file mode 100644 index 0000000..45c42c7 --- /dev/null +++ b/auth.css @@ -0,0 +1,100 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +html { + height: 100%; +} + +body { + box-sizing: border-box; + min-height: 100%; + margin: 0; + padding: 15px 30px; + display: flex; + flex-direction: column; + color: white; + font-family: "Segoe UI","Helvetica Neue","Helvetica",Arial,sans-serif; + background-color: #2C2C32; +} + +.branding { + background-image: url('data:image/png;base64,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'); + background-size: 24px; + background-repeat: no-repeat; + background-position: left center; + padding-left: 36px; + font-size: 20px; + letter-spacing: -0.04rem; + font-weight: 400; + color: white; + text-decoration: none; +} + +.message-container { + flex-grow: 1; + display: flex; + align-items: center; + justify-content: center; + margin: 0 30px; +} + +.message { + font-weight: 300; + font-size: 1.4rem; +} + +body.error .message { + display: none; +} + +body.error .error-message { + display: block; +} + +.error-message { + display: none; + font-weight: 300; + font-size: 1.3rem; +} + +.error-text { + color: red; + font-size: 1rem; +} + +@font-face { + font-family: 'Segoe UI'; + src: url("https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/light/latest.eot"),url("https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/light/latest.eot?#iefix") format("embedded-opentype"); + src: local("Segoe UI Light"),url("https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/light/latest.woff2") format("woff2"),url("https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/light/latest.woff") format("woff"),url("https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/light/latest.ttf") format("truetype"),url("https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/light/latest.svg#web") format("svg"); + font-weight: 200 +} + +@font-face { + font-family: 'Segoe UI'; + src: url("https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/semilight/latest.eot"),url("https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/semilight/latest.eot?#iefix") format("embedded-opentype"); + src: local("Segoe UI Semilight"),url("https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/semilight/latest.woff2") format("woff2"),url("https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/semilight/latest.woff") format("woff"),url("https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/semilight/latest.ttf") format("truetype"),url("https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/semilight/latest.svg#web") format("svg"); + font-weight: 300 +} + +@font-face { + font-family: 'Segoe UI'; + src: url("https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/normal/latest.eot"),url("https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/normal/latest.eot?#iefix") format("embedded-opentype"); + src: local("Segoe UI"),url("https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/normal/latest.woff2") format("woff"),url("https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/normal/latest.woff") format("woff"),url("https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/normal/latest.ttf") format("truetype"),url("https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/normal/latest.svg#web") format("svg"); + font-weight: 400 +} + +@font-face { + font-family: 'Segoe UI'; + src: url("https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/semibold/latest.eot"),url("https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/semibold/latest.eot?#iefix") format("embedded-opentype"); + src: local("Segoe UI Semibold"),url("https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/semibold/latest.woff2") format("woff"),url("https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/semibold/latest.woff") format("woff"),url("https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/semibold/latest.ttf") format("truetype"),url("https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/semibold/latest.svg#web") format("svg"); + font-weight: 600 +} + +@font-face { + font-family: 'Segoe UI'; + src: url("https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/bold/latest.eot"),url("https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/bold/latest.eot?#iefix") format("embedded-opentype"); + src: local("Segoe UI Bold"),url("https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/bold/latest.woff2") format("woff"),url("https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/bold/latest.woff") format("woff"),url("https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/bold/latest.ttf") format("truetype"),url("https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/bold/latest.svg#web") format("svg"); + font-weight: 700 +} diff --git a/autoInstallerFs.ts b/autoInstallerFs.ts new file mode 100644 index 0000000..4e69fce --- /dev/null +++ b/autoInstallerFs.ts @@ -0,0 +1,252 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as vscode from 'vscode'; +import { MemFs } from './memFs'; +import { URI } from 'vscode-uri'; +import { PackageManager, FileSystem, packagePath } from '@vscode/ts-package-manager'; +import { join, basename, dirname } from 'path'; + +const TEXT_DECODER = new TextDecoder('utf-8'); +const TEXT_ENCODER = new TextEncoder(); + +export class AutoInstallerFs implements vscode.FileSystemProvider { + + private readonly memfs = new MemFs(); + private readonly fs: FileSystem; + private readonly projectCache = new Map>(); + private readonly watcher: vscode.FileSystemWatcher; + private readonly _emitter = new vscode.EventEmitter(); + + readonly onDidChangeFile: vscode.Event = this._emitter.event; + + constructor() { + this.watcher = vscode.workspace.createFileSystemWatcher('**/{package.json,package-lock.json,package-lock.kdl}'); + const handler = (uri: URI) => { + const root = dirname(uri.path); + if (this.projectCache.delete(root)) { + (async () => { + const pm = new PackageManager(this.fs); + const opts = await this.getInstallOpts(uri, root); + const proj = await pm.resolveProject(root, opts); + proj.pruneExtraneous(); + // TODO: should this fire on vscode-node-modules instead? + // NB(kmarchan): This should tell TSServer that there's + // been changes inside node_modules and it needs to + // re-evaluate things. + this._emitter.fire([{ + type: vscode.FileChangeType.Changed, + uri: uri.with({ path: join(root, 'node_modules') }) + }]); + })(); + } + }; + this.watcher.onDidChange(handler); + this.watcher.onDidCreate(handler); + this.watcher.onDidDelete(handler); + const memfs = this.memfs; + memfs.onDidChangeFile((e) => { + this._emitter.fire(e.map(ev => ({ + type: ev.type, + // TODO: we're gonna need a MappedUri dance... + uri: ev.uri.with({ scheme: 'memfs' }) + }))); + }); + this.fs = { + readDirectory(path: string, _extensions?: readonly string[], _exclude?: readonly string[], _include?: readonly string[], _depth?: number): string[] { + return memfs.readDirectory(URI.file(path)).map(([name, _]) => name); + }, + + deleteFile(path: string): void { + memfs.delete(URI.file(path)); + }, + + createDirectory(path: string): void { + memfs.createDirectory(URI.file(path)); + }, + + writeFile(path: string, data: string, _writeByteOrderMark?: boolean): void { + memfs.writeFile(URI.file(path), TEXT_ENCODER.encode(data), { overwrite: true, create: true }); + }, + + directoryExists(path: string): boolean { + try { + const stat = memfs.stat(URI.file(path)); + return stat.type === vscode.FileType.Directory; + } catch (e) { + return false; + } + }, + + readFile(path: string, _encoding?: string): string | undefined { + try { + return TEXT_DECODER.decode(memfs.readFile(URI.file(path))); + } catch (e) { + return undefined; + } + } + }; + } + + watch(resource: vscode.Uri): vscode.Disposable { + const mapped = URI.file(new MappedUri(resource).path); + console.log('watching', mapped); + return this.memfs.watch(mapped); + } + + async stat(uri: vscode.Uri): Promise { + // console.log('stat', uri.toString()); + const mapped = new MappedUri(uri); + + // TODO: case sensitivity configuration + + // We pretend every single node_modules or @types directory ever actually + // exists. + if (basename(mapped.path) === 'node_modules' || basename(mapped.path) === '@types') { + return { + mtime: 0, + ctime: 0, + type: vscode.FileType.Directory, + size: 0 + }; + } + + await this.ensurePackageContents(mapped); + + return this.memfs.stat(URI.file(mapped.path)); + } + + async readDirectory(uri: vscode.Uri): Promise<[string, vscode.FileType][]> { + // console.log('readDirectory', uri.toString()); + const mapped = new MappedUri(uri); + await this.ensurePackageContents(mapped); + + return this.memfs.readDirectory(URI.file(mapped.path)); + } + + async readFile(uri: vscode.Uri): Promise { + // console.log('readFile', uri.toString()); + const mapped = new MappedUri(uri); + await this.ensurePackageContents(mapped); + + return this.memfs.readFile(URI.file(mapped.path)); + } + + writeFile(_uri: vscode.Uri, _content: Uint8Array, _options: { create: boolean; overwrite: boolean }): void { + throw new Error('not implemented'); + } + + rename(_oldUri: vscode.Uri, _newUri: vscode.Uri, _options: { overwrite: boolean }): void { + throw new Error('not implemented'); + } + + delete(_uri: vscode.Uri): void { + throw new Error('not implemented'); + } + + createDirectory(_uri: vscode.Uri): void { + throw new Error('not implemented'); + } + + private async ensurePackageContents(incomingUri: MappedUri): Promise { + // console.log('ensurePackageContents', incomingUri.path); + + // If we're not looking for something inside node_modules, bail early. + if (!incomingUri.path.includes('node_modules')) { + throw vscode.FileSystemError.FileNotFound(); + } + + // standard lib files aren't handled through here + if (incomingUri.path.includes('node_modules/@typescript') || incomingUri.path.includes('node_modules/@types/typescript__')) { + throw vscode.FileSystemError.FileNotFound(); + } + + const root = this.getProjectRoot(incomingUri.path); + + const pkgPath = packagePath(incomingUri.path); + if (!root || this.projectCache.get(root)?.has(pkgPath)) { + return; + } + + const proj = await (new PackageManager(this.fs)).resolveProject(root, await this.getInstallOpts(incomingUri.original, root)); + + const restore = proj.restorePackageAt(incomingUri.path); + try { + await restore; + } catch (e) { + console.error(`failed to restore package at ${incomingUri.path}: `, e); + throw e; + } + if (!this.projectCache.has(root)) { + this.projectCache.set(root, new Set()); + } + this.projectCache.get(root)!.add(pkgPath); + } + + private async getInstallOpts(originalUri: URI, root: string) { + const vsfs = vscode.workspace.fs; + let pkgJson; + try { + pkgJson = TEXT_DECODER.decode(await vsfs.readFile(originalUri.with({ path: join(root, 'package.json') }))); + } catch (e) { } + + let kdlLock; + try { + kdlLock = TEXT_DECODER.decode(await vsfs.readFile(originalUri.with({ path: join(root, 'package-lock.kdl') }))); + } catch (e) { } + + let npmLock; + try { + npmLock = TEXT_DECODER.decode(await vsfs.readFile(originalUri.with({ path: join(root, 'package-lock.json') }))); + } catch (e) { } + + return { + pkgJson, + kdlLock, + npmLock + }; + } + + private getProjectRoot(path: string): string | undefined { + const pkgPath = path.match(/(^.*)\/node_modules/); + return pkgPath?.[1]; + } + + // --- manage file events + +} + +class MappedUri { + readonly raw: vscode.Uri; + readonly original: vscode.Uri; + readonly mapped: vscode.Uri; + constructor(uri: vscode.Uri) { + this.raw = uri; + + const parts = uri.path.match(/^\/([^\/]+)\/([^\/]*)(?:\/(.+))?$/); + if (!parts) { + throw new Error(`Invalid path: ${uri.path}`); + } + + const scheme = parts[1]; + const authority = parts[2] === 'ts-nul-authority' ? '' : parts[2]; + const path = parts[3]; + this.original = URI.from({ scheme, authority, path: (path ? '/' + path : path) }); + this.mapped = this.original.with({ scheme: this.raw.scheme, authority: this.raw.authority }); + } + + get path() { + return this.mapped.path; + } + get scheme() { + return this.mapped.scheme; + } + get authority() { + return this.mapped.authority; + } + get flatPath() { + return join('/', this.scheme, this.authority, this.path); + } +} diff --git a/batchfile.code-snippets b/batchfile.code-snippets new file mode 100644 index 0000000..3759e25 --- /dev/null +++ b/batchfile.code-snippets @@ -0,0 +1,16 @@ +{ + "Region Start": { + "prefix": "#region", + "body": [ + "::#region" + ], + "description": "Folding Region Start" + }, + "Region End": { + "prefix": "#endregion", + "body": [ + "::#endregion" + ], + "description": "Folding Region End" + } +} diff --git a/bufferSyncSupport.ts b/bufferSyncSupport.ts new file mode 100644 index 0000000..90151ea --- /dev/null +++ b/bufferSyncSupport.ts @@ -0,0 +1,763 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as vscode from 'vscode'; +import { officeScript, vscodeNotebookCell } from '../configuration/fileSchemes'; +import * as languageModeIds from '../configuration/languageIds'; +import * as typeConverters from '../typeConverters'; +import { ClientCapability, ITypeScriptServiceClient } from '../typescriptService'; +import { inMemoryResourcePrefix } from '../typescriptServiceClient'; +import { coalesce } from '../utils/arrays'; +import { Delayer, setImmediate } from '../utils/async'; +import { nulToken } from '../utils/cancellation'; +import { Disposable } from '../utils/dispose'; +import { ResourceMap } from '../utils/resourceMap'; +import { API } from './api'; +import type * as Proto from './protocol/protocol'; + +type ScriptKind = 'TS' | 'TSX' | 'JS' | 'JSX'; + +function mode2ScriptKind(mode: string): ScriptKind | undefined { + switch (mode) { + case languageModeIds.typescript: return 'TS'; + case languageModeIds.typescriptreact: return 'TSX'; + case languageModeIds.javascript: return 'JS'; + case languageModeIds.javascriptreact: return 'JSX'; + } + return undefined; +} + +const enum BufferState { Initial, Open, Closed } + +const enum BufferOperationType { Close, Open, Change } + +class CloseOperation { + readonly type = BufferOperationType.Close; + constructor( + public readonly args: string, + public readonly scriptKind: ScriptKind | undefined, + ) { } +} + +class OpenOperation { + readonly type = BufferOperationType.Open; + constructor( + public readonly args: Proto.OpenRequestArgs, + public readonly scriptKind: ScriptKind | undefined, + ) { } +} + +class ChangeOperation { + readonly type = BufferOperationType.Change; + constructor( + public readonly args: Proto.FileCodeEdits + ) { } +} + +type BufferOperation = CloseOperation | OpenOperation | ChangeOperation; + +/** + * Manages synchronization of buffers with the TS server. + * + * If supported, batches together file changes. This allows the TS server to more efficiently process changes. + */ +class BufferSynchronizer { + + private readonly _pending: ResourceMap; + + constructor( + private readonly client: ITypeScriptServiceClient, + pathNormalizer: (path: vscode.Uri) => string | undefined, + onCaseInsensitiveFileSystem: boolean + ) { + this._pending = new ResourceMap(pathNormalizer, { + onCaseInsensitiveFileSystem + }); + } + + public open(resource: vscode.Uri, args: Proto.OpenRequestArgs) { + if (this.supportsBatching) { + this.updatePending(resource, new OpenOperation(args, args.scriptKindName)); + } else { + this.client.executeWithoutWaitingForResponse('open', args); + } + } + + /** + * @return Was the buffer open? + */ + public close(resource: vscode.Uri, filepath: string, scriptKind: ScriptKind | undefined): boolean { + if (this.supportsBatching) { + return this.updatePending(resource, new CloseOperation(filepath, scriptKind)); + } else { + const args: Proto.FileRequestArgs = { file: filepath }; + this.client.executeWithoutWaitingForResponse('close', args); + return true; + } + } + + public change(resource: vscode.Uri, filepath: string, events: readonly vscode.TextDocumentContentChangeEvent[]) { + if (!events.length) { + return; + } + + if (this.supportsBatching) { + this.updatePending(resource, new ChangeOperation({ + fileName: filepath, + textChanges: events.map((change): Proto.CodeEdit => ({ + newText: change.text, + start: typeConverters.Position.toLocation(change.range.start), + end: typeConverters.Position.toLocation(change.range.end), + })).reverse(), // Send the edits end-of-document to start-of-document order + })); + } else { + for (const { range, text } of events) { + const args: Proto.ChangeRequestArgs = { + insertString: text, + ...typeConverters.Range.toFormattingRequestArgs(filepath, range) + }; + this.client.executeWithoutWaitingForResponse('change', args); + } + } + } + + public reset(): void { + this._pending.clear(); + } + + public beforeCommand(command: string): void { + if (command === 'updateOpen') { + return; + } + + this.flush(); + } + + private flush() { + if (!this.supportsBatching) { + // We've already eagerly synchronized + this._pending.clear(); + return; + } + + if (this._pending.size > 0) { + const closedFiles: string[] = []; + const openFiles: Proto.OpenRequestArgs[] = []; + const changedFiles: Proto.FileCodeEdits[] = []; + for (const change of this._pending.values()) { + switch (change.type) { + case BufferOperationType.Change: changedFiles.push(change.args); break; + case BufferOperationType.Open: openFiles.push(change.args); break; + case BufferOperationType.Close: closedFiles.push(change.args); break; + } + } + this.client.execute('updateOpen', { changedFiles, closedFiles, openFiles }, nulToken, { nonRecoverable: true }); + this._pending.clear(); + } + } + + private get supportsBatching(): boolean { + return this.client.apiVersion.gte(API.v340); + } + + private updatePending(resource: vscode.Uri, op: BufferOperation): boolean { + switch (op.type) { + case BufferOperationType.Close: { + const existing = this._pending.get(resource); + switch (existing?.type) { + case BufferOperationType.Open: + if (existing.scriptKind === op.scriptKind) { + this._pending.delete(resource); + return false; // Open then close. No need to do anything + } + } + break; + } + } + + if (this._pending.has(resource)) { + // we saw this file before, make sure we flush before working with it again + this.flush(); + } + this._pending.set(resource, op); + return true; + } +} + +class SyncedBuffer { + + private state = BufferState.Initial; + + constructor( + private readonly document: vscode.TextDocument, + public readonly filepath: string, + private readonly client: ITypeScriptServiceClient, + private readonly synchronizer: BufferSynchronizer, + ) { } + + public open(): void { + const args: Proto.OpenRequestArgs = { + file: this.filepath, + fileContent: this.document.getText(), + projectRootPath: this.getProjectRootPath(this.document.uri), + }; + + const scriptKind = mode2ScriptKind(this.document.languageId); + if (scriptKind) { + args.scriptKindName = scriptKind; + } + + const tsPluginsForDocument = this.client.pluginManager.plugins + .filter(x => x.languages.indexOf(this.document.languageId) >= 0); + + if (tsPluginsForDocument.length) { + (args as any).plugins = tsPluginsForDocument.map(plugin => plugin.name); + } + + this.synchronizer.open(this.resource, args); + this.state = BufferState.Open; + } + + private getProjectRootPath(resource: vscode.Uri): string | undefined { + const workspaceRoot = this.client.getWorkspaceRootForResource(resource); + if (workspaceRoot) { + const tsRoot = this.client.toTsFilePath(workspaceRoot); + return tsRoot?.startsWith(inMemoryResourcePrefix) ? undefined : tsRoot; + } + + return resource.scheme === officeScript ? '/' : undefined; + } + + public get resource(): vscode.Uri { + return this.document.uri; + } + + public get lineCount(): number { + return this.document.lineCount; + } + + public get languageId(): string { + return this.document.languageId; + } + + /** + * @return Was the buffer open? + */ + public close(): boolean { + if (this.state !== BufferState.Open) { + this.state = BufferState.Closed; + return false; + } + this.state = BufferState.Closed; + return this.synchronizer.close(this.resource, this.filepath, mode2ScriptKind(this.document.languageId)); + } + + public onContentChanged(events: readonly vscode.TextDocumentContentChangeEvent[]): void { + if (this.state !== BufferState.Open) { + console.error(`Unexpected buffer state: ${this.state}`); + } + + this.synchronizer.change(this.resource, this.filepath, events); + } +} + +class SyncedBufferMap extends ResourceMap { + + public getForPath(filePath: string): SyncedBuffer | undefined { + return this.get(vscode.Uri.file(filePath)); + } + + public get allBuffers(): Iterable { + return this.values(); + } +} + +class PendingDiagnostics extends ResourceMap { + public getOrderedFileSet(): ResourceMap { + const orderedResources = Array.from(this.entries()) + .sort((a, b) => a.value - b.value) + .map(entry => entry.resource); + + const map = new ResourceMap(this._normalizePath, this.config); + for (const resource of orderedResources) { + map.set(resource, undefined); + } + return map; + } +} + +class GetErrRequest { + + public static executeGetErrRequest( + client: ITypeScriptServiceClient, + files: ResourceMap, + onDone: () => void + ) { + return new GetErrRequest(client, files, onDone); + } + + private _done: boolean = false; + private readonly _token: vscode.CancellationTokenSource = new vscode.CancellationTokenSource(); + + private constructor( + private readonly client: ITypeScriptServiceClient, + public readonly files: ResourceMap, + onDone: () => void + ) { + if (!this.isErrorReportingEnabled()) { + this._done = true; + setImmediate(onDone); + return; + } + + const supportsSyntaxGetErr = this.client.apiVersion.gte(API.v440); + const allFiles = coalesce(Array.from(files.entries()) + .filter(entry => supportsSyntaxGetErr || client.hasCapabilityForResource(entry.resource, ClientCapability.Semantic)) + .map(entry => client.toTsFilePath(entry.resource))); + + if (!allFiles.length) { + this._done = true; + setImmediate(onDone); + } else { + const request = this.areProjectDiagnosticsEnabled() + // Note that geterrForProject is almost certainly not the api we want here as it ends up computing far + // too many diagnostics + ? client.executeAsync('geterrForProject', { delay: 0, file: allFiles[0] }, this._token.token) + : client.executeAsync('geterr', { delay: 0, files: allFiles }, this._token.token); + + request.finally(() => { + if (this._done) { + return; + } + this._done = true; + onDone(); + }); + } + } + + private isErrorReportingEnabled() { + if (this.client.apiVersion.gte(API.v440)) { + return true; + } else { + // Older TS versions only support `getErr` on semantic server + return this.client.capabilities.has(ClientCapability.Semantic); + } + } + + private areProjectDiagnosticsEnabled() { + return this.client.configuration.enableProjectDiagnostics && this.client.capabilities.has(ClientCapability.Semantic); + } + + public cancel(): any { + if (!this._done) { + this._token.cancel(); + } + + this._token.dispose(); + } +} + +class TabResourceTracker extends Disposable { + + private readonly _onDidChange = this._register(new vscode.EventEmitter<{ + readonly closed: Iterable; + readonly opened: Iterable; + }>()); + public readonly onDidChange = this._onDidChange.event; + + private readonly _tabResources: ResourceMap<{ readonly tabs: Set }>; + + constructor( + normalizePath: (resource: vscode.Uri) => string | undefined, + config: { + readonly onCaseInsensitiveFileSystem: boolean; + }, + ) { + super(); + + this._tabResources = new ResourceMap<{ readonly tabs: Set }>(normalizePath, config); + + for (const tabGroup of vscode.window.tabGroups.all) { + for (const tab of tabGroup.tabs) { + this.add(tab); + } + } + + this._register(vscode.window.tabGroups.onDidChangeTabs(e => { + const closed = e.closed.flatMap(tab => this.delete(tab)); + const opened = e.opened.flatMap(tab => this.add(tab)); + if (closed.length || opened.length) { + this._onDidChange.fire({ closed, opened }); + } + })); + } + + public has(resource: vscode.Uri): boolean { + if (resource.scheme === vscodeNotebookCell) { + const notebook = vscode.workspace.notebookDocuments.find(doc => + doc.getCells().some(cell => cell.document.uri.toString() === resource.toString())); + + return !!notebook && this.has(notebook.uri); + } + + const entry = this._tabResources.get(resource); + return !!entry && entry.tabs.size > 0; + } + + private add(tab: vscode.Tab): vscode.Uri[] { + const addedResources: vscode.Uri[] = []; + for (const uri of this.getResourcesForTab(tab)) { + const entry = this._tabResources.get(uri); + if (entry) { + entry.tabs.add(tab); + } else { + this._tabResources.set(uri, { tabs: new Set([tab]) }); + addedResources.push(uri); + } + } + return addedResources; + } + + private delete(tab: vscode.Tab): vscode.Uri[] { + const closedResources: vscode.Uri[] = []; + for (const uri of this.getResourcesForTab(tab)) { + const entry = this._tabResources.get(uri); + if (!entry) { + continue; + } + + entry.tabs.delete(tab); + if (entry.tabs.size === 0) { + this._tabResources.delete(uri); + closedResources.push(uri); + } + } + return closedResources; + } + + private getResourcesForTab(tab: vscode.Tab): vscode.Uri[] { + if (tab.input instanceof vscode.TabInputText) { + return [tab.input.uri]; + } else if (tab.input instanceof vscode.TabInputTextDiff) { + return [tab.input.original, tab.input.modified]; + } else if (tab.input instanceof vscode.TabInputNotebook) { + return [tab.input.uri]; + } else { + return []; + } + } +} + + +export default class BufferSyncSupport extends Disposable { + + private readonly client: ITypeScriptServiceClient; + + private _validateJavaScript = true; + private _validateTypeScript = true; + + private readonly modeIds: Set; + private readonly syncedBuffers: SyncedBufferMap; + private readonly pendingDiagnostics: PendingDiagnostics; + private readonly diagnosticDelayer: Delayer; + private pendingGetErr: GetErrRequest | undefined; + private listening: boolean = false; + private readonly synchronizer: BufferSynchronizer; + + private readonly _tabResources: TabResourceTracker; + + constructor( + client: ITypeScriptServiceClient, + modeIds: readonly string[], + onCaseInsensitiveFileSystem: boolean + ) { + super(); + this.client = client; + this.modeIds = new Set(modeIds); + + this.diagnosticDelayer = new Delayer(300); + + const pathNormalizer = (path: vscode.Uri) => this.client.toTsFilePath(path); + this.syncedBuffers = new SyncedBufferMap(pathNormalizer, { onCaseInsensitiveFileSystem }); + this.pendingDiagnostics = new PendingDiagnostics(pathNormalizer, { onCaseInsensitiveFileSystem }); + this.synchronizer = new BufferSynchronizer(client, pathNormalizer, onCaseInsensitiveFileSystem); + + this._tabResources = this._register(new TabResourceTracker(pathNormalizer, { onCaseInsensitiveFileSystem })); + this._register(this._tabResources.onDidChange(e => { + if (this.client.configuration.enableProjectDiagnostics) { + return; + } + + for (const closed of e.closed) { + const syncedBuffer = this.syncedBuffers.get(closed); + if (syncedBuffer) { + this.pendingDiagnostics.delete(closed); + this.pendingGetErr?.files.delete(closed); + } + } + + for (const opened of e.opened) { + const syncedBuffer = this.syncedBuffers.get(opened); + if (syncedBuffer) { + this.requestDiagnostic(syncedBuffer); + } + } + })); + + this.updateConfiguration(); + vscode.workspace.onDidChangeConfiguration(this.updateConfiguration, this, this._disposables); + } + + private readonly _onDelete = this._register(new vscode.EventEmitter()); + public readonly onDelete = this._onDelete.event; + + private readonly _onWillChange = this._register(new vscode.EventEmitter()); + public readonly onWillChange = this._onWillChange.event; + + public listen(): void { + if (this.listening) { + return; + } + this.listening = true; + vscode.workspace.onDidOpenTextDocument(this.openTextDocument, this, this._disposables); + vscode.workspace.onDidCloseTextDocument(this.onDidCloseTextDocument, this, this._disposables); + vscode.workspace.onDidChangeTextDocument(this.onDidChangeTextDocument, this, this._disposables); + vscode.window.onDidChangeVisibleTextEditors(e => { + for (const { document } of e) { + const syncedBuffer = this.syncedBuffers.get(document.uri); + if (syncedBuffer) { + this.requestDiagnostic(syncedBuffer); + } + } + }, this, this._disposables); + vscode.workspace.textDocuments.forEach(this.openTextDocument, this); + } + + public handles(resource: vscode.Uri): boolean { + return this.syncedBuffers.has(resource); + } + + public ensureHasBuffer(resource: vscode.Uri): boolean { + if (this.syncedBuffers.has(resource)) { + return true; + } + + const existingDocument = vscode.workspace.textDocuments.find(doc => doc.uri.toString() === resource.toString()); + if (existingDocument) { + return this.openTextDocument(existingDocument); + } + + return false; + } + + public toVsCodeResource(resource: vscode.Uri): vscode.Uri { + const filepath = this.client.toTsFilePath(resource); + for (const buffer of this.syncedBuffers.allBuffers) { + if (buffer.filepath === filepath) { + return buffer.resource; + } + } + return resource; + } + + public toResource(filePath: string): vscode.Uri { + const buffer = this.syncedBuffers.getForPath(filePath); + if (buffer) { + return buffer.resource; + } + return vscode.Uri.file(filePath); + } + + public reset(): void { + this.pendingGetErr?.cancel(); + this.pendingDiagnostics.clear(); + this.synchronizer.reset(); + } + + public reinitialize(): void { + this.reset(); + for (const buffer of this.syncedBuffers.allBuffers) { + buffer.open(); + } + } + + public openTextDocument(document: vscode.TextDocument): boolean { + if (!this.modeIds.has(document.languageId)) { + return false; + } + const resource = document.uri; + const filepath = this.client.toTsFilePath(resource); + if (!filepath) { + return false; + } + + if (this.syncedBuffers.has(resource)) { + return true; + } + + const syncedBuffer = new SyncedBuffer(document, filepath, this.client, this.synchronizer); + this.syncedBuffers.set(resource, syncedBuffer); + syncedBuffer.open(); + this.requestDiagnostic(syncedBuffer); + return true; + } + + public closeResource(resource: vscode.Uri): void { + const syncedBuffer = this.syncedBuffers.get(resource); + if (!syncedBuffer) { + return; + } + + this.pendingDiagnostics.delete(resource); + this.pendingGetErr?.files.delete(resource); + this.syncedBuffers.delete(resource); + const wasBufferOpen = syncedBuffer.close(); + this._onDelete.fire(resource); + if (wasBufferOpen) { + this.requestAllDiagnostics(); + } + } + + public interruptGetErr(f: () => R): R { + if (!this.pendingGetErr + || this.client.configuration.enableProjectDiagnostics // `geterr` happens on separate server so no need to cancel it. + ) { + return f(); + } + + this.pendingGetErr.cancel(); + this.pendingGetErr = undefined; + const result = f(); + this.triggerDiagnostics(); + return result; + } + + public beforeCommand(command: string): void { + this.synchronizer.beforeCommand(command); + } + + private onDidCloseTextDocument(document: vscode.TextDocument): void { + this.closeResource(document.uri); + } + + private onDidChangeTextDocument(e: vscode.TextDocumentChangeEvent): void { + const syncedBuffer = this.syncedBuffers.get(e.document.uri); + if (!syncedBuffer) { + return; + } + + this._onWillChange.fire(syncedBuffer.resource); + + syncedBuffer.onContentChanged(e.contentChanges); + const didTrigger = this.requestDiagnostic(syncedBuffer); + + if (!didTrigger && this.pendingGetErr) { + // In this case we always want to re-trigger all diagnostics + this.pendingGetErr.cancel(); + this.pendingGetErr = undefined; + this.triggerDiagnostics(); + } + } + + public requestAllDiagnostics() { + for (const buffer of this.syncedBuffers.allBuffers) { + if (this.shouldValidate(buffer)) { + this.pendingDiagnostics.set(buffer.resource, Date.now()); + } + } + this.triggerDiagnostics(); + } + + public getErr(resources: readonly vscode.Uri[]): any { + const handledResources = resources.filter(resource => this.handles(resource)); + if (!handledResources.length) { + return; + } + + for (const resource of handledResources) { + this.pendingDiagnostics.set(resource, Date.now()); + } + + this.triggerDiagnostics(); + } + + private triggerDiagnostics(delay: number = 200) { + this.diagnosticDelayer.trigger(() => { + this.sendPendingDiagnostics(); + }, delay); + } + + private requestDiagnostic(buffer: SyncedBuffer): boolean { + if (!this.shouldValidate(buffer)) { + return false; + } + + this.pendingDiagnostics.set(buffer.resource, Date.now()); + + const delay = Math.min(Math.max(Math.ceil(buffer.lineCount / 20), 300), 800); + this.triggerDiagnostics(delay); + return true; + } + + public hasPendingDiagnostics(resource: vscode.Uri): boolean { + return this.pendingDiagnostics.has(resource); + } + + private sendPendingDiagnostics(): void { + const orderedFileSet = this.pendingDiagnostics.getOrderedFileSet(); + + if (this.pendingGetErr) { + this.pendingGetErr.cancel(); + + for (const { resource } of this.pendingGetErr.files.entries()) { + if (this.syncedBuffers.get(resource)) { + orderedFileSet.set(resource, undefined); + } + } + + this.pendingGetErr = undefined; + } + + // Add all open TS buffers to the geterr request. They might be visible + for (const buffer of this.syncedBuffers.values()) { + orderedFileSet.set(buffer.resource, undefined); + } + + if (orderedFileSet.size) { + const getErr = this.pendingGetErr = GetErrRequest.executeGetErrRequest(this.client, orderedFileSet, () => { + if (this.pendingGetErr === getErr) { + this.pendingGetErr = undefined; + } + }); + } + + this.pendingDiagnostics.clear(); + } + + private updateConfiguration() { + const jsConfig = vscode.workspace.getConfiguration('javascript', null); + const tsConfig = vscode.workspace.getConfiguration('typescript', null); + + this._validateJavaScript = jsConfig.get('validate.enable', true); + this._validateTypeScript = tsConfig.get('validate.enable', true); + } + + private shouldValidate(buffer: SyncedBuffer): boolean { + if (!this.client.configuration.enableProjectDiagnostics && !this._tabResources.has(buffer.resource)) { // Only validate resources that are showing to the user + return false; + } + + switch (buffer.languageId) { + case languageModeIds.javascript: + case languageModeIds.javascriptreact: + return this._validateJavaScript; + + case languageModeIds.typescript: + case languageModeIds.typescriptreact: + default: + return this._validateTypeScript; + } + } +} diff --git a/cachedResponse.ts b/cachedResponse.ts new file mode 100644 index 0000000..cedc580 --- /dev/null +++ b/cachedResponse.ts @@ -0,0 +1,48 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as vscode from 'vscode'; +import { ServerResponse } from '../typescriptService'; +import type * as Proto from './protocol/protocol'; + +type Resolve = () => Promise>; + +/** + * Caches a class of TS Server request based on document. + */ +export class CachedResponse { + private response?: Promise>; + private version: number = -1; + private document: string = ''; + + /** + * Execute a request. May return cached value or resolve the new value + * + * Caller must ensure that all input `resolve` functions return equivilent results (keyed only off of document). + */ + public execute( + document: vscode.TextDocument, + resolve: Resolve + ): Promise> { + if (this.response && this.matches(document)) { + // Chain so that on cancellation we fall back to the next resolve + return this.response = this.response.then(result => result.type === 'cancelled' ? resolve() : result); + } + return this.reset(document, resolve); + } + + private matches(document: vscode.TextDocument): boolean { + return this.version === document.version && this.document === document.uri.toString(); + } + + private async reset( + document: vscode.TextDocument, + resolve: Resolve + ): Promise> { + this.version = document.version; + this.document = document.uri.toString(); + return this.response = resolve(); + } +} diff --git a/callbackMap.ts b/callbackMap.ts new file mode 100644 index 0000000..57a8005 --- /dev/null +++ b/callbackMap.ts @@ -0,0 +1,51 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { ServerResponse } from '../typescriptService'; +import type * as Proto from './protocol/protocol'; + +export interface CallbackItem { + readonly onSuccess: (value: R) => void; + readonly onError: (err: Error) => void; + readonly queuingStartTime: number; + readonly isAsync: boolean; +} + +export class CallbackMap { + private readonly _callbacks = new Map | undefined>>(); + private readonly _asyncCallbacks = new Map | undefined>>(); + + public destroy(cause: string): void { + const cancellation = new ServerResponse.Cancelled(cause); + for (const callback of this._callbacks.values()) { + callback.onSuccess(cancellation); + } + this._callbacks.clear(); + for (const callback of this._asyncCallbacks.values()) { + callback.onSuccess(cancellation); + } + this._asyncCallbacks.clear(); + } + + public add(seq: number, callback: CallbackItem | undefined>, isAsync: boolean) { + if (isAsync) { + this._asyncCallbacks.set(seq, callback); + } else { + this._callbacks.set(seq, callback); + } + } + + public fetch(seq: number): CallbackItem | undefined> | undefined { + const callback = this._callbacks.get(seq) || this._asyncCallbacks.get(seq); + this.delete(seq); + return callback; + } + + private delete(seq: number) { + if (!this._callbacks.delete(seq)) { + this._asyncCallbacks.delete(seq); + } + } +} diff --git a/cancellation.electron.ts b/cancellation.electron.ts new file mode 100644 index 0000000..3e1ad0a --- /dev/null +++ b/cancellation.electron.ts @@ -0,0 +1,40 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as fs from 'fs'; +import Tracer from '../logging/tracer'; +import { getTempFile } from '../utils/temp.electron'; +import { OngoingRequestCanceller, OngoingRequestCancellerFactory } from './cancellation'; + +export class NodeRequestCanceller implements OngoingRequestCanceller { + public readonly cancellationPipeName: string; + + public constructor( + private readonly _serverId: string, + private readonly _tracer: Tracer, + ) { + this.cancellationPipeName = getTempFile('tscancellation'); + } + + public tryCancelOngoingRequest(seq: number): boolean { + if (!this.cancellationPipeName) { + return false; + } + this._tracer.trace(this._serverId, `TypeScript Server: trying to cancel ongoing request with sequence number ${seq}`); + try { + fs.writeFileSync(this.cancellationPipeName + seq, ''); + } catch { + // noop + } + return true; + } +} + + +export const nodeRequestCancellerFactory = new class implements OngoingRequestCancellerFactory { + create(serverId: string, tracer: Tracer): OngoingRequestCanceller { + return new NodeRequestCanceller(serverId, tracer); + } +}; diff --git a/cancellation.ts b/cancellation.ts new file mode 100644 index 0000000..7267266 --- /dev/null +++ b/cancellation.ts @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as vscode from 'vscode'; + +const noopDisposable = vscode.Disposable.from(); + +export const nulToken: vscode.CancellationToken = { + isCancellationRequested: false, + onCancellationRequested: () => noopDisposable +}; diff --git a/cellAttachmentRenderer.ts b/cellAttachmentRenderer.ts new file mode 100644 index 0000000..02166f7 --- /dev/null +++ b/cellAttachmentRenderer.ts @@ -0,0 +1,55 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import type * as MarkdownIt from 'markdown-it'; +import type * as MarkdownItToken from 'markdown-it/lib/token'; +import type { RendererContext } from 'vscode-notebook-renderer'; + +interface MarkdownItRenderer { + extendMarkdownIt(fn: (md: MarkdownIt) => void): void; +} + +export async function activate(ctx: RendererContext) { + const markdownItRenderer = (await ctx.getRenderer('vscode.markdown-it-renderer')) as MarkdownItRenderer | any; + if (!markdownItRenderer) { + throw new Error(`Could not load 'vscode.markdown-it-renderer'`); + } + + markdownItRenderer.extendMarkdownIt((md: MarkdownIt) => { + const original = md.renderer.rules.image; + md.renderer.rules.image = (tokens: MarkdownItToken[], idx: number, options, env, self) => { + const token = tokens[idx]; + const src = token.attrGet('src'); + const attachments: Record> | undefined = env.outputItem.metadata?.attachments; + if (attachments && src && src.startsWith('attachment:')) { + const imageAttachment = attachments[tryDecodeURIComponent(src.replace('attachment:', ''))]; + if (imageAttachment) { + // objEntries will always be length 1, with objEntries[0] holding [0]=mime,[1]=b64 + // if length = 0, something is wrong with the attachment, mime/b64 weren't copied over + const objEntries = Object.entries(imageAttachment); + if (objEntries.length) { + const [attachmentKey, attachmentVal] = objEntries[0]; + const b64Markdown = 'data:' + attachmentKey + ';base64,' + attachmentVal; + token.attrSet('src', b64Markdown); + } + } + } + + if (original) { + return original(tokens, idx, options, env, self); + } else { + return self.renderToken(tokens, idx, options); + } + }; + }); +} + +function tryDecodeURIComponent(uri: string) { + try { + return decodeURIComponent(uri); + } catch { + return uri; + } +} diff --git a/cglicenses.json b/cglicenses.json new file mode 100644 index 0000000..d61164a --- /dev/null +++ b/cglicenses.json @@ -0,0 +1,593 @@ +// ----------------------------------------------------------------------------------------- +// ----------------------------------------------------------------------------------------- +// This file overrides licenses only for OSS components which do not appear in `cgmanifest.json`. +// i.e. for OSS components that are detected from `yarn.lock` or `Cargo.lock` files. +// +// DO NOT EDIT THIS FILE UNLESS THE OSS TOOL INDICATES THAT YOU SHOULD. +// +[ + { + // Reason: The license at https://github.com/aadsm/jschardet/blob/master/LICENSE + // does not include a clear Copyright statement and does not credit authors. + "name": "jschardet", + "prependLicenseText": [ + "Chardet was originally ported from C++ by Mark Pilgrim. It is now maintained", + " by Dan Blanchard and Ian Cordasco, and was formerly maintained by Erik Rose.", + " JSChardet was ported from python to JavaScript by Antรณnio Afonso ", + " (https://github.com/aadsm/jschardet) and transformed into an npm package by ", + "Markus Ast (https://github.com/brainafk)" + ] + }, + { + // Reason: The license at https://github.com/microsoft/TypeScript/blob/master/LICENSE.txt + // does not include a clear Copyright statement. + "name": "typescript", + "prependLicenseText": [ + "Copyright (c) Microsoft Corporation. All rights reserved." + ] + }, + { + "name": "tunnel-agent", + "prependLicenseText": [ + "Copyright (c) tunnel-agent authors" + ] + }, + { + // Reason: The license at https://github.com/rbuckton/reflect-metadata/blob/master/LICENSE + // does not include a clear Copyright statement (it's in https://github.com/rbuckton/reflect-metadata/blob/master/CopyrightNotice.txt). + "name": "reflect-metadata", + "prependLicenseText": [ + "Copyright (c) Microsoft Corporation. All rights reserved." + ] + }, + { + "name": "big-integer", + "prependLicenseText": [ + "Copyright released to public domain" + ] + }, + { + // Reason: The license cannot be found by the tool due to access controls on the repository + "name": "vscode-tas-client", + "fullLicenseText": [ + "MIT License", + "Copyright (c) 2020 - present Microsoft Corporation", + "", + "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." + ] + }, + { + // Reason: The license cannot be found by the tool due to access controls on the repository + "name": "tas-client", + "fullLicenseText": [ + "MIT License", + "Copyright (c) 2020 - present Microsoft Corporation", + "", + "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." + ] + }, + { + // Reason: The license cannot be found by the tool due to access controls on the repository + "name": "tas-client-umd", + "fullLicenseText": [ + "MIT License", + "Copyright (c) 2020 - present Microsoft Corporation", + "", + "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." + ] + }, + { + // Reason: Repository lacks license text. + // https://github.com/tjwebb/fnv-plus/blob/master/package.json declares MIT. + // https://github.com/tjwebb/fnv-plus/issues/14 + "name": "@enonic/fnv-plus", + "fullLicenseText": [ + "MIT License", + "Copyright (c) 2014 - present, Travis Webb ", + "", + "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." + ] + }, + { + "name": "@vscode/win32-app-container-tokens", + "fullLicenseText": [ + "MIT License", + "", + "Copyright (c) Microsoft Corporation.", + "", + "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" + ] + }, + { + // Reason: Missing license file + "name": "@tokenizer/token", + "fullLicenseText": [ + "(The MIT License)", + "", + "Copyright (c) 2020 Borewit", + "", + "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." + ] + }, + { + // Reason: Missing license file + "name": "readable-web-to-node-stream", + "fullLicenseText": [ + "(The MIT License)", + "", + "Copyright (c) 2019 Borewit", + "", + "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." + ] + }, + { + // Reason: The substack org has been deleted on GH + "name": "concat-map", + "fullLicenseText": [ + "This software is released under the 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." + ] + }, + { + // Reason: The substack org has been deleted on GH + "name": "github-from-package", + "fullLicenseText": [ + "This software is released under the 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." + ] + }, + { + // Reason: The substack org has been deleted on GH + "name": "minimist", + "fullLicenseText": [ + "This software is released under the 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." + ] + }, + { + // Reason: The substack org has been deleted on GH + "name": "mkdirp", + "fullLicenseText": [ + "Copyright 2010 James Halliday (mail@substack.net)", + "", + "This project is free software released under the MIT/X11 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." + ] + }, + { + // Reason: repo URI is wrong on crate, pending https://github.com/warp-tech/russh/pull/53 + "name": "russh-cryptovec", + "fullLicenseTextUri": "https://raw.githubusercontent.com/warp-tech/russh/1da80d0d599b6ee2d257c544c0d6af4f649c9029/LICENSE-2.0.txt" + }, + { + // Reason: repo URI is wrong on crate, pending https://github.com/warp-tech/russh/pull/53 + "name": "russh-keys", + "fullLicenseTextUri": "https://raw.githubusercontent.com/warp-tech/russh/1da80d0d599b6ee2d257c544c0d6af4f649c9029/LICENSE-2.0.txt" + }, + { + // Reason: license is in a subdirectory in repo + "name": "dirs-next", + "fullLicenseTextUri": "https://raw.githubusercontent.com/xdg-rs/dirs/af4aa39daba0ac68e222962a5aca17360158b7cc/dirs/LICENSE-MIT" + }, + { + // Reason: license is in a subdirectory in repo + "name": "openssl", + "fullLicenseTextUri": "https://raw.githubusercontent.com/sfackler/rust-openssl/e43eb58540b27a17f8029c397e3edc12bbc9011f/openssl/LICENSE" + }, + { + // Reason: license is in a subdirectory in repo + "name": "openssl-sys", + "fullLicenseTextUri": "https://raw.githubusercontent.com/sfackler/rust-openssl/e43eb58540b27a17f8029c397e3edc12bbc9011f/openssl-sys/LICENSE-MIT" + }, + { + // Reason: Missing license file + "name": "openssl-macros", + "fullLicenseText": [ + "This software is released under the 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." + ] + }, + { // Reason: Missing license file + "name": "const_format_proc_macros", + "fullLicenseTextUri": "https://raw.githubusercontent.com/rodrimati1992/const_format_crates/b2207af46bfbd9f1a6bd12dbffd10feeea3d9fd7/LICENSE-ZLIB.md" + }, + { // Reason: Missing license file + "name": "const_format", + "fullLicenseTextUri": "https://raw.githubusercontent.com/rodrimati1992/const_format_crates/b2207af46bfbd9f1a6bd12dbffd10feeea3d9fd7/LICENSE-ZLIB.md" + }, + { // License is MIT/Apache and tool doesn't look in subfolders + "name": "toml", + "fullLicenseTextUri": "https://raw.githubusercontent.com/toml-rs/toml/main/crates/toml/LICENSE-MIT" + }, + { // License is MIT/Apache and tool doesn't look in subfolders + "name": "dirs-sys-next", + "fullLicenseTextUri": "https://raw.githubusercontent.com/xdg-rs/dirs/master/dirs-sys/LICENSE-MIT" + }, + { + "name": "https-proxy-agent", + "fullLicenseText": [ + "(The MIT License)", + "Copyright (c) 2013 Nathan Rajlich ", + "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." + ] + }, + { + "name": "data-uri-to-buffer", + "fullLicenseText": [ + "(The MIT License)", + "Copyright (c) 2014 Nathan Rajlich ", + "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." + ] + }, + { + "name": "socks-proxy-agent", + "fullLicenseText": [ + "(The MIT License)", + "Copyright (c) 2013 Nathan Rajlich ", + "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." + ] + }, + { + "name": "http-proxy-agent", + "fullLicenseText": [ + "(The MIT License)", + "Copyright (c) 2013 Nathan Rajlich ", + "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." + ] + }, + { + "name": "agent-base", + "fullLicenseText": [ + "(The MIT License)", + "Copyright (c) 2013 Nathan Rajlich ", + "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." + ] + }, + { + "name": "anstyle", + "fullLicenseText": [ + "This software is released under the 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." + ] + }, + { + "name": "anstyle-query", + "fullLicenseText": [ + "This software is released under the 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." + ] + }, + { + "name": "anstyle-parse", + "fullLicenseText": [ + "This software is released under the 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." + ] + }, + { + "name": "anstyle-wincon", + "fullLicenseText": [ + "This software is released under the 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." + ] + }, + { + "name": "anstream", + "fullLicenseText": [ + "This software is released under the 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." + ] + }, + { + "name": "colorchoice", + "fullLicenseText": [ + "This software is released under the 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." + ] + }, + { + "name": "cacheable-request", + "prependLicenseText": [ + "Copyright (c) cacheable-request authors" + ] + }, + { + "name": "@vscode/ts-package-manager", + "fullLicenseText": [ + "MIT License", + "", + "Copyright (c) Microsoft Corporation.", + "", + "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" + ] + }, + { + // Reason: missing repository property on package.json + // Issue: https://github.com/microsoft/vscode-v8-heap-tools/issues/14 + "name": "@vscode/v8-heap-parser", + "fullLicenseText": [ + "The code in this package is built upon that in the Chrome devtools", + "(https://github.com/ChromeDevTools/devtools-frontend) which is made available", + "under the following license:", + "", + "// Copyright 2014 The Chromium Authors. 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.", + "// * Neither the name of Google Inc. nor the names of its", + "// contributors may be used to endorse or promote products derived from", + "// this software without specific prior written permission.", + "//", + "// 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", + "// OWNER 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." + ] + }, + { + // Reason: missing copyright statement + // Issue: https://github.com/qiao/heap.js/issues/33 + "name": "heap", + "prependLicenseText": [ + "Copyright (c) heap.js authors" + ] + } +] diff --git a/cgmanifest.json b/cgmanifest.json new file mode 100644 index 0000000..4968a06 --- /dev/null +++ b/cgmanifest.json @@ -0,0 +1,16 @@ +{ + "registrations": [ + { + "component": { + "type": "git", + "git": { + "name": "Colorsublime-Themes", + "repositoryUrl": "https://github.com/Colorsublime/Colorsublime-Themes", + "commitHash": "c10fdd8b144486b7a4f3cb4e2251c66df222a825" + } + }, + "version": "0.1.0" + } + ], + "version": 1 +} diff --git a/configurePlugin.ts b/configurePlugin.ts new file mode 100644 index 0000000..3567382 --- /dev/null +++ b/configurePlugin.ts @@ -0,0 +1,19 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { PluginManager } from '../tsServer/plugins'; +import { Command } from './commandManager'; + +export class ConfigurePluginCommand implements Command { + public readonly id = '_typescript.configurePlugin'; + + public constructor( + private readonly pluginManager: PluginManager, + ) { } + + public execute(pluginId: string, configuration: any) { + this.pluginManager.setConfiguration(pluginId, configuration); + } +} diff --git a/content.srt.txt b/content.srt.txt new file mode 100644 index 0000000..679124a --- /dev/null +++ b/content.srt.txt @@ -0,0 +1,3608 @@ +1 +00:00:01,000 --> 00:00:11,000 +[Music] + +2 +00:00:08,000 --> 00:00:13,000 +all right hello everyone + +3 +00:00:11,000 --> 00:00:16,000 +I've got a lot of content to get through + +4 +00:00:13,000 --> 00:00:18,000 +so I'm gonna move fast Buckle in if you + +5 +00:00:17,000 --> 00:00:21,000 +are looking for a startup idea right now + +6 +00:00:19,000 --> 00:00:22,000 +I'm going to try to help but more + +7 +00:00:21,000 --> 00:00:24,000 +importantly I'm going to try to give you + +8 +00:00:22,000 --> 00:00:26,000 +the conceptual tools to think about + +9 +00:00:24,000 --> 00:00:28,000 +startup ideas in a sophisticated way the + +10 +00:00:27,000 --> 00:00:31,000 +way that we think about them at YC + +11 +00:00:28,000 --> 00:00:33,000 +here's the thing uh no one not even YC + +12 +00:00:31,000 --> 00:00:36,000 +knows for sure which ideas will succeed + +13 +00:00:34,000 --> 00:00:38,000 +and in any case if your idea succeeds + +14 +00:00:37,000 --> 00:00:41,000 +has much to do with how well you execute + +15 +00:00:38,000 --> 00:00:43,000 +as your initial idea anyway but certain + +16 +00:00:41,000 --> 00:00:45,000 +ideas are much more likely to succeed + +17 +00:00:43,000 --> 00:00:47,000 +than others and so my goal here is to + +18 +00:00:46,000 --> 00:00:50,000 +help you stack the deck in your favor by + +19 +00:00:48,000 --> 00:00:51,000 +starting with a promising idea the + +20 +00:00:50,000 --> 00:00:55,000 +advice in this talk came from several + +21 +00:00:52,000 --> 00:00:57,000 +places first I analyzed the top 100 YC + +22 +00:00:55,000 --> 00:00:58,000 +companies by evaluation and I looked at + +23 +00:00:57,000 --> 00:01:01,000 +how they all got their idea so I started + +24 +00:00:59,000 --> 00:01:02,000 +with some hard quantitative data on how + +25 +00:01:01,000 --> 00:01:05,000 +recent billion dollar companies actually + +26 +00:01:03,000 --> 00:01:07,000 +came up with their idea it also draws on + +27 +00:01:06,000 --> 00:01:09,000 +a classic essay by Paul Graham that I + +28 +00:01:08,000 --> 00:01:11,000 +really recommend it's called how to get + +29 +00:01:09,000 --> 00:01:12,000 +startup ideas + +30 +00:01:11,000 --> 00:01:14,000 +um it also comes from helping YC + +31 +00:01:12,000 --> 00:01:15,000 +companies that pivot in the middle of + +32 +00:01:15,000 --> 00:01:19,000 +the batch and learning over the years + +33 +00:01:16,000 --> 00:01:20,000 +what advice helps them to find a new + +34 +00:01:19,000 --> 00:01:22,000 +good startup idea + +35 +00:01:20,000 --> 00:01:24,000 +and then finally it comes from Reading + +36 +00:01:23,000 --> 00:01:27,000 +thousands of YC applications that we + +37 +00:01:25,000 --> 00:01:29,000 +rejected and looking at the mistakes + +38 +00:01:27,000 --> 00:01:30,000 +that caused good Founders to come up + +39 +00:01:29,000 --> 00:01:32,000 +with bad ideas and those are the + +40 +00:01:31,000 --> 00:01:35,000 +mistakes I want to help you all avoid + +41 +00:01:33,000 --> 00:01:36,000 +this Talk's got three parts first I'm + +42 +00:01:35,000 --> 00:01:37,000 +going to tell you the most common + +43 +00:01:36,000 --> 00:01:38,000 +mistakes Founders make with startup + +44 +00:01:38,000 --> 00:01:40,000 +ideas + +45 +00:01:39,000 --> 00:01:42,000 +then I'm going to talk about how to know + +46 +00:01:40,000 --> 00:01:44,000 +if your idea is good and then about how + +47 +00:01:42,000 --> 00:01:46,000 +to come up with new ones okay the four + +48 +00:01:45,000 --> 00:01:49,000 +most common mistakes with startup ideas + +49 +00:01:47,000 --> 00:01:51,000 +so the most common mistake is just + +50 +00:01:49,000 --> 00:01:53,000 +building something that doesn't solve a + +51 +00:01:51,000 --> 00:01:54,000 +real problem for your users typically + +52 +00:01:54,000 --> 00:01:56,000 +you can + +53 +00:01:55,000 --> 00:01:58,000 +articulate the problem that you're + +54 +00:01:57,000 --> 00:02:00,000 +solving you can put it in words but when + +55 +00:01:59,000 --> 00:02:03,000 +you actually go and talk to the users + +56 +00:02:00,000 --> 00:02:03,000 +it's just not something that they really + +57 +00:02:03,000 --> 00:02:06,000 +care about + +58 +00:02:04,000 --> 00:02:08,000 +we call it a solution in search of a + +59 +00:02:06,000 --> 00:02:10,000 +problem or a cisp + +60 +00:02:09,000 --> 00:02:13,000 +let's go through an example so a lot of + +61 +00:02:11,000 --> 00:02:16,000 +Founders come up with an idea with this + +62 +00:02:13,000 --> 00:02:19,000 +kind of thought process they go hmm AI + +63 +00:02:16,000 --> 00:02:21,000 +is cool what could I apply AI to + +64 +00:02:20,000 --> 00:02:23,000 +and then they go look for a problem that + +65 +00:02:21,000 --> 00:02:24,000 +they could solve with AI That's a + +66 +00:02:24,000 --> 00:02:27,000 +solution in search of a problem and the + +67 +00:02:25,000 --> 00:02:29,000 +reason it's dangerous is that if you do + +68 +00:02:27,000 --> 00:02:31,000 +that you'll probably find a problem but + +69 +00:02:30,000 --> 00:02:33,000 +it will it will be a superficially + +70 +00:02:31,000 --> 00:02:34,000 +plausible problem it'll be a made-up + +71 +00:02:33,000 --> 00:02:36,000 +problem that people don't really care + +72 +00:02:35,000 --> 00:02:39,000 +about rather than a real problem that + +73 +00:02:37,000 --> 00:02:40,000 +people actually care about + +74 +00:02:39,000 --> 00:02:42,000 +and if people don't really care about + +75 +00:02:40,000 --> 00:02:44,000 +the problem they won't really care about + +76 +00:02:43,000 --> 00:02:48,000 +your solution so instead you want to + +77 +00:02:45,000 --> 00:02:49,000 +fall in love with a problem + +78 +00:02:48,000 --> 00:02:53,000 +the best way to find a startup idea is + +79 +00:02:50,000 --> 00:02:54,000 +to start with a high quality problem now + +80 +00:02:53,000 --> 00:02:57,000 +Sunrise Founders hear this and they + +81 +00:02:55,000 --> 00:02:59,000 +decide to interpret that as guidance to + +82 +00:02:58,000 --> 00:03:02,000 +work on some like huge societal problem + +83 +00:03:00,000 --> 00:03:03,000 +like I don't know Global poverty or + +84 +00:03:02,000 --> 00:03:05,000 +something + +85 +00:03:03,000 --> 00:03:06,000 +um no doubt those are real problems but + +86 +00:03:05,000 --> 00:03:07,000 +they're they're too abstract to make + +87 +00:03:07,000 --> 00:03:10,000 +good starting points for startup ideas + +88 +00:03:08,000 --> 00:03:11,000 +you need something that's more specific + +89 +00:03:10,000 --> 00:03:12,000 +something that's tractable with a + +90 +00:03:11,000 --> 00:03:15,000 +startup the next mistake is getting + +91 +00:03:13,000 --> 00:03:19,000 +stuck on what we call tar pit ideas + +92 +00:03:16,000 --> 00:03:21,000 +what's a tar pit idea so there's this + +93 +00:03:19,000 --> 00:03:23,000 +certain set of common startup ideas that + +94 +00:03:22,000 --> 00:03:26,000 +have been around for forever they have + +95 +00:03:24,000 --> 00:03:28,000 +been applying inroves to YC batch after + +96 +00:03:26,000 --> 00:03:30,000 +batch for years and when founders start + +97 +00:03:29,000 --> 00:03:32,000 +working on these ideas it's like they've + +98 +00:03:31,000 --> 00:03:35,000 +gotten stuck in tar they never seem to + +99 +00:03:33,000 --> 00:03:37,000 +go anywhere so we call them tar pit + +100 +00:03:35,000 --> 00:03:39,000 +ideas here's what causes tarpet ideas + +101 +00:03:37,000 --> 00:03:40,000 +they all form around some like + +102 +00:03:40,000 --> 00:03:44,000 +widespread problem that lots of + +103 +00:03:41,000 --> 00:03:45,000 +potential Founders encounter and it's a + +104 +00:03:44,000 --> 00:03:47,000 +problem it seems like it could be easily + +105 +00:03:46,000 --> 00:03:50,000 +solved with a startup but it's an + +106 +00:03:48,000 --> 00:03:52,000 +illusion there's actually a structural + +107 +00:03:50,000 --> 00:03:54,000 +reason why it's very hard or impossible + +108 +00:03:52,000 --> 00:03:56,000 +to solve which is why after all these + +109 +00:03:54,000 --> 00:03:57,000 +years no one has solved it + +110 +00:03:56,000 --> 00:03:59,000 +and you can see why ideas like this + +111 +00:03:58,000 --> 00:04:01,000 +would be so dangerous why they will + +112 +00:04:00,000 --> 00:04:03,000 +cause so many Founders to waste months + +113 +00:04:02,000 --> 00:04:05,000 +of their life stuck on a tarpet like + +114 +00:04:04,000 --> 00:04:07,000 +they're very tantalizing from a distance + +115 +00:04:05,000 --> 00:04:08,000 +because they're so superficially + +116 +00:04:07,000 --> 00:04:10,000 +plausible as startup ideas here's a + +117 +00:04:09,000 --> 00:04:12,000 +concrete example this is a very common + +118 +00:04:11,000 --> 00:04:14,000 +tarpet idea that's been applied to YC + +119 +00:04:12,000 --> 00:04:16,000 +for like 20 years this is like the + +120 +00:04:14,000 --> 00:04:19,000 +stereotypical college student idea and + +121 +00:04:17,000 --> 00:04:22,000 +it goes like this you think + +122 +00:04:19,000 --> 00:04:23,000 +man every Friday or Saturday Saturday + +123 +00:04:22,000 --> 00:04:26,000 +night when I'm making plans to meet up + +124 +00:04:24,000 --> 00:04:27,000 +with my friends it's so inefficient I'm + +125 +00:04:26,000 --> 00:04:30,000 +in all these different text threads and + +126 +00:04:28,000 --> 00:04:31,000 +chat groups and we're like trying to + +127 +00:04:30,000 --> 00:04:33,000 +make plans to meet up I'm just going to + +128 +00:04:32,000 --> 00:04:35,000 +make an app to make it more efficient + +129 +00:04:34,000 --> 00:04:37,000 +Well turns out that there are some + +130 +00:04:35,000 --> 00:04:39,000 +structural reasons why this idea is hard + +131 +00:04:37,000 --> 00:04:41,000 +which is why in like 20 years of people + +132 +00:04:40,000 --> 00:04:44,000 +applying to YC with this idea nobody has + +133 +00:04:42,000 --> 00:04:45,000 +actually pulled it off you can see why + +134 +00:04:44,000 --> 00:04:47,000 +so many people have been attracted to it + +135 +00:04:45,000 --> 00:04:48,000 +it's like it's a problem that almost + +136 +00:04:47,000 --> 00:04:50,000 +everyone encounters at some point and it + +137 +00:04:49,000 --> 00:04:51,000 +seems like it would be so easy to solve + +138 +00:04:51,000 --> 00:04:54,000 +like you can just imagine the app it's + +139 +00:04:52,000 --> 00:04:55,000 +just got like a list of events and you + +140 +00:04:54,000 --> 00:04:57,000 +invite friends to it like it seems so + +141 +00:04:55,000 --> 00:04:59,000 +simple the thing about tarpet ideas is + +142 +00:04:58,000 --> 00:05:02,000 +that they are not necessarily impossible + +143 +00:05:00,000 --> 00:05:03,000 +like I'm even open-minded that somebody + +144 +00:05:02,000 --> 00:05:05,000 +will eventually make the like app to + +145 +00:05:04,000 --> 00:05:08,000 +meet up with your friends idea of work + +146 +00:05:06,000 --> 00:05:11,000 +is more accurate to think of them as + +147 +00:05:08,000 --> 00:05:12,000 +common ideas that are much harder than + +148 +00:05:11,000 --> 00:05:15,000 +they seem + +149 +00:05:13,000 --> 00:05:19,000 +so if you want to work on one + +150 +00:05:15,000 --> 00:05:20,000 +um here's my advice first Google it it's + +151 +00:05:19,000 --> 00:05:22,000 +amazing how many Founders skip the step + +152 +00:05:21,000 --> 00:05:24,000 +of just like Googling for their own + +153 +00:05:23,000 --> 00:05:27,000 +startup idea to see who has worked on it + +154 +00:05:25,000 --> 00:05:29,000 +in the past you should find who's worked + +155 +00:05:27,000 --> 00:05:31,000 +on this in the past and actually talk to + +156 +00:05:29,000 --> 00:05:35,000 +them if you can try to figure out what + +157 +00:05:32,000 --> 00:05:37,000 +the hard part of this idea is that has + +158 +00:05:35,000 --> 00:05:38,000 +caused other people to not be able to + +159 +00:05:37,000 --> 00:05:42,000 +solve it yet the next mistake is simple + +160 +00:05:39,000 --> 00:05:43,000 +it is amazing how many Founders will + +161 +00:05:43,000 --> 00:05:46,000 +basically just like jump into the first + +162 +00:05:44,000 --> 00:05:47,000 +idea they have without even stopping to + +163 +00:05:46,000 --> 00:05:49,000 +consider whether it would actually make + +164 +00:05:48,000 --> 00:05:51,000 +a good business + +165 +00:05:49,000 --> 00:05:53,000 +but more dangerous is the founders on + +166 +00:05:52,000 --> 00:05:55,000 +the opposite side of the spectrum who + +167 +00:05:54,000 --> 00:05:57,000 +sit around waiting for the perfect + +168 +00:05:55,000 --> 00:05:58,000 +startup idea and of course there is no + +169 +00:05:57,000 --> 00:06:00,000 +such thing so these people just never + +170 +00:05:59,000 --> 00:06:02,000 +actually start a company so if you + +171 +00:06:00,000 --> 00:06:03,000 +imagine that there's like a spectrum + +172 +00:06:02,000 --> 00:06:05,000 +between picking the first idea that + +173 +00:06:04,000 --> 00:06:08,000 +comes to mind and waiting for the + +174 +00:06:05,000 --> 00:06:08,000 +perfect idea and you know somewhere in + +175 +00:06:08,000 --> 00:06:11,000 +the middle there is this like happy + +176 +00:06:09,000 --> 00:06:12,000 +place which is the place that you want + +177 +00:06:11,000 --> 00:06:15,000 +to be right and the way that Paul Graham + +178 +00:06:13,000 --> 00:06:18,000 +put this is that you should think of + +179 +00:06:15,000 --> 00:06:20,000 +your idea as a good starting point + +180 +00:06:19,000 --> 00:06:22,000 +new startup idea is perfect and no + +181 +00:06:21,000 --> 00:06:24,000 +matter what you start with it's probably + +182 +00:06:22,000 --> 00:06:26,000 +going to morph anyway so you just want + +183 +00:06:24,000 --> 00:06:28,000 +to have an initial idea that has enough + +184 +00:06:26,000 --> 00:06:30,000 +interesting qualities that can morph in + +185 +00:06:29,000 --> 00:06:32,000 +the right direction so now suppose you + +186 +00:06:30,000 --> 00:06:33,000 +have a startup idea and you want to know + +187 +00:06:32,000 --> 00:06:36,000 +if it's good I'm going to give you a + +188 +00:06:34,000 --> 00:06:38,000 +framework for this and the format of the + +189 +00:06:37,000 --> 00:06:41,000 +framework is 10 key questions to ask + +190 +00:06:39,000 --> 00:06:44,000 +about any startup idea so the first one + +191 +00:06:41,000 --> 00:06:45,000 +is do you have founder market fit if I + +192 +00:06:44,000 --> 00:06:48,000 +depict like one most important criteria + +193 +00:06:46,000 --> 00:06:50,000 +it'd probably be this one and what I + +194 +00:06:48,000 --> 00:06:51,000 +mean by founder market fit is just are + +195 +00:06:50,000 --> 00:06:53,000 +you the right team to be working on this + +196 +00:06:52,000 --> 00:06:55,000 +idea + +197 +00:06:53,000 --> 00:06:57,000 +and a great example of what good founder + +198 +00:06:56,000 --> 00:07:01,000 +market fit looks like is plan grid so + +199 +00:06:58,000 --> 00:07:03,000 +plan grid makes an iPad app to view + +200 +00:07:01,000 --> 00:07:05,000 +construction Blueprints and to the + +201 +00:07:03,000 --> 00:07:07,000 +founders of plan grid were Tracy and + +202 +00:07:05,000 --> 00:07:09,000 +Ralph and Tracy had worked in the + +203 +00:07:08,000 --> 00:07:11,000 +construction industry and she knew a lot + +204 +00:07:09,000 --> 00:07:13,000 +about construction and Ralph was an + +205 +00:07:12,000 --> 00:07:15,000 +awesome developer who was like the + +206 +00:07:14,000 --> 00:07:17,000 +perfect person to build this iPad out if + +207 +00:07:15,000 --> 00:07:18,000 +you're going to imagine a team to start + +208 +00:07:17,000 --> 00:07:20,000 +playing grid the team that you would + +209 +00:07:19,000 --> 00:07:22,000 +imagine would look you know something + +210 +00:07:21,000 --> 00:07:24,000 +like that and that's what good founder + +211 +00:07:22,000 --> 00:07:25,000 +market fit looks like it's like this + +212 +00:07:24,000 --> 00:07:27,000 +team is obviously the right team to work + +213 +00:07:26,000 --> 00:07:29,000 +on the idea in fact founder market fit + +214 +00:07:28,000 --> 00:07:33,000 +is so important + +215 +00:07:30,000 --> 00:07:36,000 +that I would recast your search for a + +216 +00:07:33,000 --> 00:07:38,000 +startup idea when most people go to pick + +217 +00:07:36,000 --> 00:07:41,000 +a startup idea they try to look for a + +218 +00:07:39,000 --> 00:07:43,000 +good startup idea like in the abstract + +219 +00:07:42,000 --> 00:07:46,000 +and instead I would think about this + +220 +00:07:44,000 --> 00:07:49,000 +exercise as an exercise to pick a good + +221 +00:07:46,000 --> 00:07:50,000 +idea for your team you with me it + +222 +00:07:49,000 --> 00:07:52,000 +doesn't matter if something is a good + +223 +00:07:51,000 --> 00:07:55,000 +startup idea for someone else if it's + +224 +00:07:53,000 --> 00:07:57,000 +not a good idea for your team so you may + +225 +00:07:56,000 --> 00:07:59,000 +as well just look for ideas that you + +226 +00:07:58,000 --> 00:08:01,000 +would actually be good at executing okay + +227 +00:07:59,000 --> 00:08:02,000 +number two how big is the market + +228 +00:08:01,000 --> 00:08:04,000 +obviously you need a big Market which + +229 +00:08:03,000 --> 00:08:07,000 +for startups typically means like a + +230 +00:08:04,000 --> 00:08:08,000 +billion dollar market but actually less + +231 +00:08:07,000 --> 00:08:10,000 +obviously there are two kinds of markets + +232 +00:08:09,000 --> 00:08:12,000 +for startups that are good + +233 +00:08:11,000 --> 00:08:15,000 +um ones that are big now and ones that + +234 +00:08:13,000 --> 00:08:17,000 +are small but rapidly growing + +235 +00:08:15,000 --> 00:08:19,000 +and an example of the second one is + +236 +00:08:17,000 --> 00:08:21,000 +coinbase so when coinbase got started in + +237 +00:08:20,000 --> 00:08:24,000 +2012 the Bitcoin trading Market was + +238 +00:08:22,000 --> 00:08:26,000 +minuscule but even at that time it was + +239 +00:08:24,000 --> 00:08:28,000 +pretty obvious that if Bitcoin succeeded + +240 +00:08:27,000 --> 00:08:30,000 +the way people hoped that it would that + +241 +00:08:29,000 --> 00:08:31,000 +this would eventually be a billion + +242 +00:08:30,000 --> 00:08:34,000 +dollar market + +243 +00:08:31,000 --> 00:08:36,000 +number three how acute is this problem + +244 +00:08:34,000 --> 00:08:37,000 +so as I said earlier the most common + +245 +00:08:36,000 --> 00:08:39,000 +mistake is just like working on + +246 +00:08:38,000 --> 00:08:41,000 +something that just isn't really a + +247 +00:08:39,000 --> 00:08:43,000 +problem or it's just not a problem that + +248 +00:08:41,000 --> 00:08:44,000 +people care enough about + +249 +00:08:43,000 --> 00:08:46,000 +um here's an example of the opposite + +250 +00:08:45,000 --> 00:08:49,000 +here's an example of what a good problem + +251 +00:08:47,000 --> 00:08:53,000 +looks like Rex + +252 +00:08:50,000 --> 00:08:55,000 +so Brax from Winter 2017 makes a credit + +253 +00:08:53,000 --> 00:08:57,000 +card for startups + +254 +00:08:55,000 --> 00:08:59,000 +and before brex if a startup NYC wanted + +255 +00:08:58,000 --> 00:09:01,000 +a corporate credit card they literally + +256 +00:09:00,000 --> 00:09:04,000 +could not get one because a no bank + +257 +00:09:02,000 --> 00:09:06,000 +would give a credit card to a startup + +258 +00:09:05,000 --> 00:09:08,000 +that's a good problem like if you're if + +259 +00:09:07,000 --> 00:09:10,000 +the alternative to your solution is + +260 +00:09:09,000 --> 00:09:13,000 +literally nothing that's what a good + +261 +00:09:10,000 --> 00:09:13,000 +problem looks like okay next do you have + +262 +00:09:13,000 --> 00:09:16,000 +competition + +263 +00:09:14,000 --> 00:09:17,000 +now most Founders think that if you have + +264 +00:09:16,000 --> 00:09:21,000 +competition that that's bad but + +265 +00:09:18,000 --> 00:09:23,000 +counter-intuitively it is the opposite + +266 +00:09:21,000 --> 00:09:25,000 +most good startup ideas have competition + +267 +00:09:24,000 --> 00:09:28,000 +but if you were going up against + +268 +00:09:26,000 --> 00:09:31,000 +especially entrenched competition you + +269 +00:09:28,000 --> 00:09:33,000 +typically need a new insight next one is + +270 +00:09:31,000 --> 00:09:36,000 +like do you want this personally + +271 +00:09:34,000 --> 00:09:39,000 +do you know people personally who want + +272 +00:09:36,000 --> 00:09:41,000 +this it's amazing how often people start + +273 +00:09:39,000 --> 00:09:44,000 +companies where the answer to both these + +274 +00:09:41,000 --> 00:09:45,000 +questions is no if that's the case you + +275 +00:09:44,000 --> 00:09:47,000 +definitely got to worry that you know + +276 +00:09:46,000 --> 00:09:50,000 +maybe nobody wants this so definitely + +277 +00:09:48,000 --> 00:09:53,000 +time to go talk to some users + +278 +00:09:51,000 --> 00:09:55,000 +only recently become possible or only + +279 +00:09:53,000 --> 00:09:57,000 +recently become necessary + +280 +00:09:55,000 --> 00:09:59,000 +so something has recently changed in the + +281 +00:09:57,000 --> 00:10:03,000 +world like a new technology regulatory + +282 +00:10:00,000 --> 00:10:06,000 +change or a new problem that is often + +283 +00:10:04,000 --> 00:10:08,000 +what creates a new opportunity + +284 +00:10:06,000 --> 00:10:09,000 +and a great example of this is company + +285 +00:10:08,000 --> 00:10:13,000 +called Checker which does background + +286 +00:10:10,000 --> 00:10:16,000 +checks via VIA an API so it's an API for + +287 +00:10:14,000 --> 00:10:19,000 +doing background checks on people and + +288 +00:10:16,000 --> 00:10:22,000 +roughly the story of Checker is delivery + +289 +00:10:20,000 --> 00:10:24,000 +services like doordash and instacart and + +290 +00:10:23,000 --> 00:10:27,000 +Uber started to take off + +291 +00:10:25,000 --> 00:10:29,000 +and they were all hiring huge pools of + +292 +00:10:27,000 --> 00:10:30,000 +delivery people and workers and they + +293 +00:10:29,000 --> 00:10:33,000 +needed to run background checks on all + +294 +00:10:30,000 --> 00:10:34,000 +of these people and there were at the + +295 +00:10:33,000 --> 00:10:36,000 +time already a bunch of large existing + +296 +00:10:35,000 --> 00:10:38,000 +companies that run background checks but + +297 +00:10:37,000 --> 00:10:42,000 +they weren't well suited for this very + +298 +00:10:39,000 --> 00:10:44,000 +new use case and that is like exactly + +299 +00:10:42,000 --> 00:10:46,000 +the kind of change in the world that + +300 +00:10:44,000 --> 00:10:48,000 +creates a new opportunity let's talk + +301 +00:10:47,000 --> 00:10:52,000 +about proxies + +302 +00:10:48,000 --> 00:10:53,000 +so a proxy is a large company that does + +303 +00:10:52,000 --> 00:10:56,000 +something similar to your startup but it + +304 +00:10:54,000 --> 00:10:58,000 +is not a direct competitor + +305 +00:10:56,000 --> 00:10:59,000 +and so um + +306 +00:10:58,000 --> 00:11:01,000 +a good example of this in practice is a + +307 +00:11:00,000 --> 00:11:03,000 +company called rapid which does food + +308 +00:11:02,000 --> 00:11:05,000 +delivery in Latin America and when + +309 +00:11:04,000 --> 00:11:07,000 +rapping got started there were already a + +310 +00:11:06,000 --> 00:11:09,000 +few delivery companies in other parts of + +311 +00:11:07,000 --> 00:11:10,000 +the world like doordash they're doing + +312 +00:11:09,000 --> 00:11:14,000 +very well they just hadn't caught on in + +313 +00:11:11,000 --> 00:11:15,000 +Latin America yet and so doordash was a + +314 +00:11:14,000 --> 00:11:17,000 +great proxy to show that this idea of + +315 +00:11:16,000 --> 00:11:19,000 +doing food delivery in Latin America + +316 +00:11:17,000 --> 00:11:22,000 +would probably work is this an idea + +317 +00:11:19,000 --> 00:11:23,000 +you'd want to work on for years but this + +318 +00:11:22,000 --> 00:11:25,000 +is a tricky one like sure if the answer + +319 +00:11:24,000 --> 00:11:28,000 +to this question is yes that's a good + +320 +00:11:26,000 --> 00:11:31,000 +sign but often it's not often an idea + +321 +00:11:29,000 --> 00:11:34,000 +grows on Founders over time as it starts + +322 +00:11:32,000 --> 00:11:35,000 +to work as I'm going to talk about in a + +323 +00:11:34,000 --> 00:11:38,000 +moment a lot of the best startup ideas + +324 +00:11:35,000 --> 00:11:39,000 +are in boring spaces like tax accounting + +325 +00:11:39,000 --> 00:11:41,000 +software or something like that like no + +326 +00:11:40,000 --> 00:11:43,000 +one is particularly passionate about + +327 +00:11:41,000 --> 00:11:45,000 +like nobody starts off being passionate + +328 +00:11:44,000 --> 00:11:47,000 +about tax accounting software + +329 +00:11:46,000 --> 00:11:49,000 +um but tax accounting software is + +330 +00:11:48,000 --> 00:11:51,000 +probably a good business and if you're + +331 +00:11:50,000 --> 00:11:54,000 +actually running a successful business + +332 +00:11:52,000 --> 00:11:56,000 +you tend to become passionate about it + +333 +00:11:54,000 --> 00:11:57,000 +over time okay is this a scalable + +334 +00:11:57,000 --> 00:12:00,000 +business + +335 +00:11:57,000 --> 00:12:00,000 +so if you're building pure software the + +336 +00:12:00,000 --> 00:12:03,000 +answer is yes because software skills + +337 +00:12:01,000 --> 00:12:04,000 +infinitely and you can just like check + +338 +00:12:03,000 --> 00:12:06,000 +this one off + +339 +00:12:04,000 --> 00:12:07,000 +um the place for Founders most often get + +340 +00:12:06,000 --> 00:12:10,000 +into trouble here is with Services + +341 +00:12:08,000 --> 00:12:12,000 +businesses like agencies or Dev shops + +342 +00:12:10,000 --> 00:12:13,000 +anything that requires like high skill + +343 +00:12:12,000 --> 00:12:16,000 +human labor in order to serve your + +344 +00:12:14,000 --> 00:12:19,000 +customers okay and my last question is + +345 +00:12:17,000 --> 00:12:22,000 +is this a good idea space which of + +346 +00:12:20,000 --> 00:12:24,000 +course means I need to tell you what an + +347 +00:12:22,000 --> 00:12:25,000 +idea space is this is a concept from my + +348 +00:12:24,000 --> 00:12:27,000 +colleague Dalton who you'll hear from + +349 +00:12:26,000 --> 00:12:30,000 +later in this course + +350 +00:12:27,000 --> 00:12:31,000 +an idea space is like one level of + +351 +00:12:30,000 --> 00:12:34,000 +abstraction out from a particular + +352 +00:12:32,000 --> 00:12:36,000 +startup idea it is a class of closely + +353 +00:12:35,000 --> 00:12:40,000 +related startup ideas + +354 +00:12:37,000 --> 00:12:42,000 +like software for hospitals or + +355 +00:12:40,000 --> 00:12:45,000 +infrastructure monitoring tools or food + +356 +00:12:42,000 --> 00:12:47,000 +delivery services and here's the thing + +357 +00:12:45,000 --> 00:12:49,000 +different idea spaces have wildly + +358 +00:12:48,000 --> 00:12:52,000 +different hit rates + +359 +00:12:49,000 --> 00:12:53,000 +over the last 10 years if you started a + +360 +00:12:52,000 --> 00:12:56,000 +company that did like fintech + +361 +00:12:54,000 --> 00:12:59,000 +infrastructure or vertical SAS for + +362 +00:12:57,000 --> 00:13:01,000 +Enterprise the the probability that your + +363 +00:12:59,000 --> 00:13:02,000 +company became a billion dollar company + +364 +00:13:01,000 --> 00:13:05,000 +was astonishingly High + +365 +00:13:03,000 --> 00:13:08,000 +whereas if you started something in + +366 +00:13:05,000 --> 00:13:11,000 +consumer Hardware or social networks or + +367 +00:13:08,000 --> 00:13:13,000 +ad Tech the success rate was like orders + +368 +00:13:12,000 --> 00:13:15,000 +of magnitude loader and I can't say that + +369 +00:13:13,000 --> 00:13:16,000 +that will continue to be the case for + +370 +00:13:15,000 --> 00:13:19,000 +those specific areas because spaces + +371 +00:13:17,000 --> 00:13:22,000 +flipped from hot to cold over time but + +372 +00:13:19,000 --> 00:13:23,000 +it is still worth thinking about picking + +373 +00:13:22,000 --> 00:13:26,000 +a good idea space + +374 +00:13:24,000 --> 00:13:28,000 +and a good idea Space is really just one + +375 +00:13:26,000 --> 00:13:29,000 +that like you expect is going to have a + +376 +00:13:28,000 --> 00:13:31,000 +reasonable hit rate for new startup + +377 +00:13:30,000 --> 00:13:32,000 +ideas and one that has founder market + +378 +00:13:32,000 --> 00:13:35,000 +fit + +379 +00:13:33,000 --> 00:13:37,000 +that way even if your initial idea isn't + +380 +00:13:35,000 --> 00:13:38,000 +quite right there are probably good + +381 +00:13:37,000 --> 00:13:40,000 +adjacent ideas that you can sort of like + +382 +00:13:39,000 --> 00:13:41,000 +drift into + +383 +00:13:40,000 --> 00:13:43,000 +I'm going to give a good example of like + +384 +00:13:42,000 --> 00:13:45,000 +how this played out in practice so a + +385 +00:13:43,000 --> 00:13:46,000 +good example of picking a good idea + +386 +00:13:45,000 --> 00:13:50,000 +space is this company called 5tran from + +387 +00:13:47,000 --> 00:13:52,000 +yc1213 and basically it's already 5tran + +388 +00:13:50,000 --> 00:13:53,000 +is they started making this tool for + +389 +00:13:52,000 --> 00:13:55,000 +data analysis + +390 +00:13:54,000 --> 00:13:58,000 +and they went to some companies and they + +391 +00:13:56,000 --> 00:14:00,000 +tried to sell it and the companies + +392 +00:13:58,000 --> 00:14:02,000 +didn't want it so they pivoted and they + +393 +00:14:00,000 --> 00:14:03,000 +built a different tool for data analysis + +394 +00:14:02,000 --> 00:14:05,000 +and they went back to the same companies + +395 +00:14:04,000 --> 00:14:07,000 +and they tried to sell them that one and + +396 +00:14:06,000 --> 00:14:09,000 +the companies didn't want that either + +397 +00:14:08,000 --> 00:14:11,000 +but each time they went to companies and + +398 +00:14:10,000 --> 00:14:13,000 +tried to sell them some tool for data + +399 +00:14:12,000 --> 00:14:15,000 +analysis they would learn more about + +400 +00:14:13,000 --> 00:14:16,000 +what those companies actually wanted and + +401 +00:14:15,000 --> 00:14:18,000 +So eventually they sort of stumbled into + +402 +00:14:17,000 --> 00:14:20,000 +an actual problem into an actual tool + +403 +00:14:19,000 --> 00:14:22,000 +for data analysis that companies + +404 +00:14:21,000 --> 00:14:23,000 +actually wanted + +405 +00:14:22,000 --> 00:14:26,000 +and + +406 +00:14:23,000 --> 00:14:27,000 +this is why picking a good idea space to + +407 +00:14:26,000 --> 00:14:30,000 +start with is so important like because + +408 +00:14:28,000 --> 00:14:32,000 +the five Tran Founders were shopping for + +409 +00:14:30,000 --> 00:14:34,000 +ideas and a fertile idea space they put + +410 +00:14:33,000 --> 00:14:37,000 +themselves in a good position to like + +411 +00:14:35,000 --> 00:14:39,000 +bump into a good startup idea if they + +412 +00:14:37,000 --> 00:14:40,000 +had picked a bad idea space they + +413 +00:14:39,000 --> 00:14:43,000 +probably wouldn't have found anything + +414 +00:14:40,000 --> 00:14:45,000 +okay before I talk about how to generate + +415 +00:14:43,000 --> 00:14:46,000 +startup ideas I've got one important + +416 +00:14:45,000 --> 00:14:49,000 +topic to tell you about + +417 +00:14:47,000 --> 00:14:52,000 +these are three things that make your + +418 +00:14:50,000 --> 00:14:55,000 +startup idea seem bad + +419 +00:14:53,000 --> 00:14:57,000 +but actually make them good and the + +420 +00:14:55,000 --> 00:14:59,000 +reason that they make them good is that + +421 +00:14:57,000 --> 00:15:01,000 +most Founders will shy away from ideas + +422 +00:15:00,000 --> 00:15:04,000 +like these which leaves them on the + +423 +00:15:02,000 --> 00:15:06,000 +table for smarter Founders to go and + +424 +00:15:04,000 --> 00:15:09,000 +grab them and here they are + +425 +00:15:06,000 --> 00:15:11,000 +ideas that are hard to get started ideas + +426 +00:15:09,000 --> 00:15:13,000 +that are in a boring space and ideas + +427 +00:15:12,000 --> 00:15:16,000 +that have existing competitors + +428 +00:15:14,000 --> 00:15:18,000 +ideas that are hard to get started so + +429 +00:15:17,000 --> 00:15:20,000 +Paul Graham wrote a terrific article + +430 +00:15:19,000 --> 00:15:22,000 +about this called schlep blindness which + +431 +00:15:21,000 --> 00:15:24,000 +I'd really recommend reading and the + +432 +00:15:22,000 --> 00:15:25,000 +example that Paul discusses is stripe + +433 +00:15:24,000 --> 00:15:27,000 +you all know stripe they make it easy to + +434 +00:15:26,000 --> 00:15:28,000 +integrate credit card payments to your + +435 +00:15:28,000 --> 00:15:31,000 +website + +436 +00:15:28,000 --> 00:15:32,000 +and the fascinating thing about stripe + +437 +00:15:31,000 --> 00:15:36,000 +is that when stripe launched there were + +438 +00:15:33,000 --> 00:15:38,000 +thousands of developers who already knew + +439 +00:15:36,000 --> 00:15:39,000 +that this was a problem they had tried + +440 +00:15:39,000 --> 00:15:41,000 +to integrate credit card payments to + +441 +00:15:40,000 --> 00:15:43,000 +their site and they realized that the + +442 +00:15:41,000 --> 00:15:46,000 +existing options sucked + +443 +00:15:43,000 --> 00:15:49,000 +but strangely not one of them even tried + +444 +00:15:47,000 --> 00:15:51,000 +to start striping and it's kind of a + +445 +00:15:50,000 --> 00:15:53,000 +kind of a fascinating question why + +446 +00:15:51,000 --> 00:15:54,000 +nobody else tried when so many people + +447 +00:15:53,000 --> 00:15:56,000 +were in a perfect position to see this + +448 +00:15:55,000 --> 00:16:00,000 +problem + +449 +00:15:56,000 --> 00:16:02,000 +and the reason is that getting + +450 +00:16:00,000 --> 00:16:04,000 +started building stripe required some + +451 +00:16:03,000 --> 00:16:07,000 +things that seemed really hard you had + +452 +00:16:05,000 --> 00:16:09,000 +to get a special deal with a bank you + +453 +00:16:08,000 --> 00:16:11,000 +get to learn a lot about the + +454 +00:16:09,000 --> 00:16:13,000 +nitty-gritty details of credit card + +455 +00:16:11,000 --> 00:16:16,000 +infrastructure those things seemed so + +456 +00:16:14,000 --> 00:16:18,000 +hard that they scared off all the other + +457 +00:16:17,000 --> 00:16:21,000 +people who might have started stripe + +458 +00:16:18,000 --> 00:16:22,000 +which caused them to leave this like 100 + +459 +00:16:21,000 --> 00:16:24,000 +billion dollar opportunity on the table + +460 +00:16:22,000 --> 00:16:26,000 +for the stripe Founders to go and pick + +461 +00:16:24,000 --> 00:16:30,000 +up okay the second one is ideas that are + +462 +00:16:27,000 --> 00:16:31,000 +in a boring space and a great example of + +463 +00:16:30,000 --> 00:16:33,000 +this is Gusto which makes payroll + +464 +00:16:32,000 --> 00:16:36,000 +software + +465 +00:16:34,000 --> 00:16:38,000 +payroll software pretty boring right + +466 +00:16:37,000 --> 00:16:40,000 +the thing is there are thousands of + +467 +00:16:39,000 --> 00:16:42,000 +people who must have realized that + +468 +00:16:40,000 --> 00:16:43,000 +payroll software sucked but because it + +469 +00:16:42,000 --> 00:16:45,000 +was kind of a boring problem nobody + +470 +00:16:44,000 --> 00:16:47,000 +tried to fix it until the Gusto Founders + +471 +00:16:45,000 --> 00:16:49,000 +came along and the thing is that because + +472 +00:16:47,000 --> 00:16:50,000 +most Founders shy away from ideas like + +473 +00:16:50,000 --> 00:16:53,000 +this + +474 +00:16:51,000 --> 00:16:56,000 +boring ideas like payroll software have + +475 +00:16:53,000 --> 00:16:57,000 +a much higher hit rate than fun ideas + +476 +00:16:56,000 --> 00:16:59,000 +like + +477 +00:16:57,000 --> 00:17:01,000 +apps to find new restaurants to eat at + +478 +00:17:00,000 --> 00:17:04,000 +or like apps to find the next song to + +479 +00:17:02,000 --> 00:17:06,000 +listen to something like that like fun + +480 +00:17:04,000 --> 00:17:09,000 +ideas get picked over boring ideas get + +481 +00:17:07,000 --> 00:17:13,000 +left on the table for a long time + +482 +00:17:10,000 --> 00:17:14,000 +now you might be thinking Jared why + +483 +00:17:13,000 --> 00:17:16,000 +would I want to work on a boring idea + +484 +00:17:15,000 --> 00:17:19,000 +that sounds you know boring + +485 +00:17:17,000 --> 00:17:22,000 +but here's the thing even if you work on + +486 +00:17:19,000 --> 00:17:23,000 +an idea that sounds fun at the outset + +487 +00:17:22,000 --> 00:17:27,000 +the day-to-day reality of your startup + +488 +00:17:24,000 --> 00:17:29,000 +is going to be mostly the same anyway + +489 +00:17:27,000 --> 00:17:33,000 +either way you'll be mostly writing code + +490 +00:17:30,000 --> 00:17:36,000 +fixing bugs talking to users like pretty + +491 +00:17:34,000 --> 00:17:39,000 +much the same stuff and so I would argue + +492 +00:17:36,000 --> 00:17:42,000 +that once the initial excitement of your + +493 +00:17:39,000 --> 00:17:45,000 +idea has worn off and you are 6 or 12 + +494 +00:17:43,000 --> 00:17:47,000 +months in and you are grinding out the + +495 +00:17:45,000 --> 00:17:48,000 +execution that makes your idea actually + +496 +00:17:47,000 --> 00:17:51,000 +work + +497 +00:17:49,000 --> 00:17:53,000 +how fun the initial idea sounded + +498 +00:17:51,000 --> 00:17:55,000 +actually has little to no correlation + +499 +00:17:53,000 --> 00:17:58,000 +with how much fun you will actually be + +500 +00:17:56,000 --> 00:18:00,000 +having working on your company + +501 +00:17:59,000 --> 00:18:03,000 +and the last one is that Founders + +502 +00:18:01,000 --> 00:18:04,000 +incorrectly shy away from spaces where + +503 +00:18:03,000 --> 00:18:07,000 +there are existing competitors + +504 +00:18:04,000 --> 00:18:08,000 +counter-intuitively most startup ideas + +505 +00:18:07,000 --> 00:18:11,000 +most good startup ideas have existing + +506 +00:18:09,000 --> 00:18:13,000 +competitors when founders go into spaces + +507 +00:18:11,000 --> 00:18:14,000 +with no existing competitors they often + +508 +00:18:13,000 --> 00:18:16,000 +find out that the reason that there are + +509 +00:18:15,000 --> 00:18:18,000 +no competitors is because no one wants + +510 +00:18:17,000 --> 00:18:20,000 +the product + +511 +00:18:18,000 --> 00:18:22,000 +a great situation is actually a market + +512 +00:18:21,000 --> 00:18:24,000 +where there are existing competitors but + +513 +00:18:23,000 --> 00:18:26,000 +you've noticed something that they all + +514 +00:18:24,000 --> 00:18:27,000 +seem to have missed or they all just + +515 +00:18:26,000 --> 00:18:31,000 +kind of suck a classic example of this + +516 +00:18:28,000 --> 00:18:34,000 +is Dropbox so when Dropbox launched they + +517 +00:18:31,000 --> 00:18:36,000 +were already about 20. + +518 +00:18:34,000 --> 00:18:38,000 +cloud-based file storage companies + +519 +00:18:37,000 --> 00:18:41,000 +Dropbox was like the 20th company and + +520 +00:18:39,000 --> 00:18:42,000 +it's space to launch naively you might + +521 +00:18:41,000 --> 00:18:44,000 +have thought that that made this a bad + +522 +00:18:42,000 --> 00:18:44,000 +Market I mean you would have gone and + +523 +00:18:44,000 --> 00:18:46,000 +looked and said like oh there are + +524 +00:18:45,000 --> 00:18:48,000 +already 20 competitors it seems like a + +525 +00:18:46,000 --> 00:18:49,000 +bad Market to go into but if you were + +526 +00:18:48,000 --> 00:18:51,000 +Savvy about startup ideas you would have + +527 +00:18:50,000 --> 00:18:54,000 +realized that it actually made it a + +528 +00:18:52,000 --> 00:18:56,000 +great Market and the reason is that even + +529 +00:18:54,000 --> 00:18:59,000 +though there were like 20 companies + +530 +00:18:56,000 --> 00:19:02,000 +doing this most people didn't use any of + +531 +00:18:59,000 --> 00:19:03,000 +them and that strongly suggests that + +532 +00:19:02,000 --> 00:19:06,000 +there actually was a problem here but + +533 +00:19:04,000 --> 00:19:09,000 +the existing products hadn't solved it + +534 +00:19:07,000 --> 00:19:12,000 +and Drew the founder of Dropbox had a + +535 +00:19:10,000 --> 00:19:14,000 +very specific insight about what all of + +536 +00:19:12,000 --> 00:19:15,000 +them were missing his Insight was + +537 +00:19:14,000 --> 00:19:18,000 +basically their UI sucked and the reason + +538 +00:19:16,000 --> 00:19:19,000 +their UI stopped was that at the time + +539 +00:19:18,000 --> 00:19:22,000 +the way that they all worked is you had + +540 +00:19:20,000 --> 00:19:24,000 +to like go to their website and manually + +541 +00:19:22,000 --> 00:19:26,000 +upload your files one at a time into + +542 +00:19:24,000 --> 00:19:28,000 +their website which sucked of course and + +543 +00:19:27,000 --> 00:19:31,000 +Drew had really a technical Insight + +544 +00:19:29,000 --> 00:19:33,000 +which was that if he integrated directly + +545 +00:19:31,000 --> 00:19:34,000 +into the host operating system he could + +546 +00:19:33,000 --> 00:19:36,000 +just sync your files automatically + +547 +00:19:34,000 --> 00:19:38,000 +without you having to do anything and + +548 +00:19:36,000 --> 00:19:40,000 +that was a real step function change in + +549 +00:19:38,000 --> 00:19:42,000 +how convenient these Services were to + +550 +00:19:40,000 --> 00:19:45,000 +use and that was the right insight okay + +551 +00:19:43,000 --> 00:19:49,000 +let's talk about how to come up with + +552 +00:19:46,000 --> 00:19:51,000 +startup ideas so it is possible to sit + +553 +00:19:49,000 --> 00:19:52,000 +down and explicitly think of startup + +554 +00:19:51,000 --> 00:19:55,000 +ideas and in a moment I'm going to talk + +555 +00:19:53,000 --> 00:19:57,000 +about how to do this but it is actually + +556 +00:19:55,000 --> 00:19:58,000 +not the best way the best way to have + +557 +00:19:57,000 --> 00:20:01,000 +startup ideas is to just notice them + +558 +00:19:59,000 --> 00:20:03,000 +organically and if you look at the YC + +559 +00:20:01,000 --> 00:20:04,000 +top 100 companies at least 70 percent of + +560 +00:20:04,000 --> 00:20:07,000 +them have their startup ideas + +561 +00:20:05,000 --> 00:20:08,000 +organically rather than by like sitting + +562 +00:20:07,000 --> 00:20:10,000 +down and explicitly trying to think of a + +563 +00:20:09,000 --> 00:20:13,000 +startup idea and the problem is that + +564 +00:20:11,000 --> 00:20:15,000 +when people sit down and try to think of + +565 +00:20:13,000 --> 00:20:17,000 +startup ideas they tend to think of bad + +566 +00:20:15,000 --> 00:20:19,000 +ones they're especially likely to think + +567 +00:20:18,000 --> 00:20:22,000 +of the same set of tar pit ideas that I + +568 +00:20:20,000 --> 00:20:24,000 +talked about earlier whereas startup + +569 +00:20:22,000 --> 00:20:26,000 +ideas that occur to you organically are + +570 +00:20:24,000 --> 00:20:27,000 +more likely to be good ones so if you're + +571 +00:20:27,000 --> 00:20:29,000 +not planning on starting a company + +572 +00:20:28,000 --> 00:20:31,000 +imminently and you just want to put + +573 +00:20:30,000 --> 00:20:34,000 +yourself in a position to have organic + +574 +00:20:32,000 --> 00:20:36,000 +startup ideas in the future here are + +575 +00:20:34,000 --> 00:20:37,000 +three ways to do that this is like + +576 +00:20:36,000 --> 00:20:39,000 +playing the long game to set yourself up + +577 +00:20:38,000 --> 00:20:41,000 +for future success + +578 +00:20:39,000 --> 00:20:43,000 +um first is just like become an expert + +579 +00:20:41,000 --> 00:20:45,000 +on something valuable if you're working + +580 +00:20:44,000 --> 00:20:48,000 +at the Forefront of some field you'll + +581 +00:20:46,000 --> 00:20:50,000 +see good startup ideas in that field + +582 +00:20:48,000 --> 00:20:52,000 +and a great way to do that is to go work + +583 +00:20:50,000 --> 00:20:53,000 +at a startup Harge talked about this in + +584 +00:20:52,000 --> 00:20:55,000 +his talk last week if you're working at + +585 +00:20:54,000 --> 00:20:57,000 +a startup you will become an expert in + +586 +00:20:56,000 --> 00:20:59,000 +the thing that that startup does and + +587 +00:20:57,000 --> 00:21:00,000 +that is really putting yourself in a + +588 +00:20:59,000 --> 00:21:03,000 +position to have great startup ideas and + +589 +00:21:01,000 --> 00:21:04,000 +finally if you're a programmer one thing + +590 +00:21:03,000 --> 00:21:06,000 +that can work is to just build things + +591 +00:21:05,000 --> 00:21:08,000 +that you find interesting even if + +592 +00:21:07,000 --> 00:21:10,000 +they're not businesses they're not + +593 +00:21:08,000 --> 00:21:11,000 +clearly startup ideas sometimes they + +594 +00:21:10,000 --> 00:21:15,000 +like + +595 +00:21:12,000 --> 00:21:18,000 +turn into them over time and a really + +596 +00:21:16,000 --> 00:21:20,000 +striking example of this is the story of + +597 +00:21:18,000 --> 00:21:21,000 +replica this is exactly how replica + +598 +00:21:20,000 --> 00:21:23,000 +started it was just something that amjad + +599 +00:21:22,000 --> 00:21:25,000 +found interesting it wasn't supposed to + +600 +00:21:24,000 --> 00:21:27,000 +be a startup originally okay but if you + +601 +00:21:26,000 --> 00:21:29,000 +want to generate ideas for startups + +602 +00:21:28,000 --> 00:21:32,000 +right now I'm going to walk through + +603 +00:21:29,000 --> 00:21:33,000 +seven recipes for doing that I've tried + +604 +00:21:32,000 --> 00:21:36,000 +to list these in order of How likely + +605 +00:21:34,000 --> 00:21:39,000 +they are to lead to actually good ideas + +606 +00:21:37,000 --> 00:21:43,000 +so start with the first ones okay here's + +607 +00:21:40,000 --> 00:21:45,000 +the first one and the best one + +608 +00:21:43,000 --> 00:21:47,000 +start with what your team is especially + +609 +00:21:46,000 --> 00:21:49,000 +good at + +610 +00:21:47,000 --> 00:21:51,000 +and think of ideas that take advantage + +611 +00:21:49,000 --> 00:21:53,000 +of your expertise the reason that this + +612 +00:21:52,000 --> 00:21:56,000 +is so effective is that any idea you + +613 +00:21:54,000 --> 00:21:58,000 +come up with this way has automatic + +614 +00:21:56,000 --> 00:21:59,000 +founder market fit do you see how this + +615 +00:21:58,000 --> 00:22:02,000 +is almost like a hack to generate the + +616 +00:22:00,000 --> 00:22:04,000 +set of ideas that has founder market fit + +617 +00:22:02,000 --> 00:22:05,000 +here's a great example of like how this + +618 +00:22:04,000 --> 00:22:07,000 +worked in practice + +619 +00:22:05,000 --> 00:22:09,000 +so a good example is this company resi + +620 +00:22:08,000 --> 00:22:13,000 +which is like open door for rental + +621 +00:22:10,000 --> 00:22:14,000 +apartments and before starting resi the + +622 +00:22:13,000 --> 00:22:17,000 +founders have worked in real estate and + +623 +00:22:15,000 --> 00:22:18,000 +debt financing and they were experts in + +624 +00:22:17,000 --> 00:22:20,000 +those areas + +625 +00:22:18,000 --> 00:22:22,000 +and where they got into YC they spent + +626 +00:22:21,000 --> 00:22:25,000 +the first month looking for ideas + +627 +00:22:23,000 --> 00:22:27,000 +but the smart thing that they did is + +628 +00:22:25,000 --> 00:22:29,000 +they only looked at ideas in that idea + +629 +00:22:28,000 --> 00:22:31,000 +space in like the rough idea space at + +630 +00:22:30,000 --> 00:22:33,000 +like the intersection of like real + +631 +00:22:31,000 --> 00:22:36,000 +estate and fintech and that was a smart + +632 +00:22:34,000 --> 00:22:38,000 +move because that is a very fertile idea + +633 +00:22:36,000 --> 00:22:39,000 +space for startups like many billion + +634 +00:22:39,000 --> 00:22:42,000 +dollar companies have come out of that + +635 +00:22:40,000 --> 00:22:43,000 +idea space and the resi founders were + +636 +00:22:42,000 --> 00:22:45,000 +experts in that idea space and so + +637 +00:22:44,000 --> 00:22:47,000 +because of that + +638 +00:22:45,000 --> 00:22:49,000 +their search for a startup idea was + +639 +00:22:47,000 --> 00:22:50,000 +pretty quick and painless and pretty + +640 +00:22:49,000 --> 00:22:52,000 +quickly they came up with the idea for + +641 +00:22:51,000 --> 00:22:55,000 +Rezi which is like an excellent idea and + +642 +00:22:53,000 --> 00:22:57,000 +has perfect founder market fit so if you + +643 +00:22:56,000 --> 00:23:00,000 +have specific expertise like the resi + +644 +00:22:58,000 --> 00:23:03,000 +founders did you should definitely start + +645 +00:23:00,000 --> 00:23:04,000 +by looking at ideas in you know the + +646 +00:23:03,000 --> 00:23:08,000 +things that you're experts in + +647 +00:23:05,000 --> 00:23:10,000 +um it is weird how many startups apply + +648 +00:23:08,000 --> 00:23:11,000 +to YC and we look at their applications + +649 +00:23:10,000 --> 00:23:13,000 +and the founders like are actually + +650 +00:23:11,000 --> 00:23:14,000 +legitimate experts in something but the + +651 +00:23:13,000 --> 00:23:16,000 +idea that they're applying with is like + +652 +00:23:15,000 --> 00:23:19,000 +something completely different + +653 +00:23:17,000 --> 00:23:20,000 +now if you're if you're a young founder + +654 +00:23:19,000 --> 00:23:22,000 +if you're in college or something you + +655 +00:23:21,000 --> 00:23:25,000 +may not have had a chance to develop + +656 +00:23:23,000 --> 00:23:27,000 +it's like the level of domain expertise + +657 +00:23:25,000 --> 00:23:29,000 +that the resi founders had so this may + +658 +00:23:27,000 --> 00:23:30,000 +not be the right recipe for you so let's + +659 +00:23:29,000 --> 00:23:32,000 +talk about some other ones + +660 +00:23:31,000 --> 00:23:35,000 +the next recipe is to start with a + +661 +00:23:33,000 --> 00:23:38,000 +problem you've personally encountered + +662 +00:23:35,000 --> 00:23:43,000 +ideally one that you're in an unusual + +663 +00:23:38,000 --> 00:23:45,000 +position to see so vetco is a website + +664 +00:23:43,000 --> 00:23:47,000 +for veterinarians to order supplies so + +665 +00:23:46,000 --> 00:23:49,000 +you can think about it like amazon.com + +666 +00:23:48,000 --> 00:23:51,000 +for vets + +667 +00:23:49,000 --> 00:23:52,000 +and the short story of vetcove is that + +668 +00:23:52,000 --> 00:23:56,000 +the founders are brothers + +669 +00:23:53,000 --> 00:23:58,000 +and their dad is a veterinarian + +670 +00:23:56,000 --> 00:24:00,000 +and growing up they would notice that + +671 +00:23:58,000 --> 00:24:01,000 +the way he ordered supplies was like + +672 +00:24:00,000 --> 00:24:04,000 +super old-fashioned like you'd have to + +673 +00:24:02,000 --> 00:24:06,000 +like call up a supplier on the phone and + +674 +00:24:05,000 --> 00:24:09,000 +like order stuff through like a 1-800 + +675 +00:24:07,000 --> 00:24:11,000 +number or something it was like very + +676 +00:24:10,000 --> 00:24:12,000 +obvious that you could build an + +677 +00:24:11,000 --> 00:24:13,000 +amazon.com kind of thing that would + +678 +00:24:13,000 --> 00:24:16,000 +replace that + +679 +00:24:14,000 --> 00:24:20,000 +and I I love the story of vetco because + +680 +00:24:16,000 --> 00:24:21,000 +it's such a great example of what a + +681 +00:24:20,000 --> 00:24:24,000 +great startup opportunity looks like + +682 +00:24:22,000 --> 00:24:27,000 +because thousands of veterinarians must + +683 +00:24:25,000 --> 00:24:28,000 +have known that this was a real problem + +684 +00:24:27,000 --> 00:24:30,000 +that it was really annoying there wasn't + +685 +00:24:28,000 --> 00:24:31,000 +like a basic website where you could + +686 +00:24:30,000 --> 00:24:34,000 +just go to order supplies but the thing + +687 +00:24:32,000 --> 00:24:36,000 +is veterinarians don't start Tech + +688 +00:24:34,000 --> 00:24:38,000 +startups very often and then on the + +689 +00:24:36,000 --> 00:24:39,000 +other hand you had like thousands of + +690 +00:24:38,000 --> 00:24:42,000 +programmers in Silicon Valley who were + +691 +00:24:40,000 --> 00:24:45,000 +begging their heads against cisps and + +692 +00:24:42,000 --> 00:24:46,000 +tarpet ideas totally unaware that over + +693 +00:24:45,000 --> 00:24:50,000 +here there was like a really great + +694 +00:24:47,000 --> 00:24:51,000 +genuine problem to work on + +695 +00:24:50,000 --> 00:24:54,000 +and because of this when the vet + +696 +00:24:52,000 --> 00:24:56,000 +co-founders got started they had no + +697 +00:24:54,000 --> 00:24:58,000 +competition so this amazing idea just + +698 +00:24:56,000 --> 00:25:00,000 +got left on the table for years so if + +699 +00:24:59,000 --> 00:25:03,000 +you want to try to actually use recipes + +700 +00:25:01,000 --> 00:25:05,000 +one and two here's a specific set of + +701 +00:25:03,000 --> 00:25:06,000 +instructions for how to do it this is + +702 +00:25:05,000 --> 00:25:08,000 +advice I often give to Founders NYC who + +703 +00:25:07,000 --> 00:25:11,000 +are pivoting and who are looking for a + +704 +00:25:09,000 --> 00:25:14,000 +new idea here's how it works + +705 +00:25:12,000 --> 00:25:17,000 +for each founder on your team + +706 +00:25:14,000 --> 00:25:19,000 +go through every job you've ever had + +707 +00:25:17,000 --> 00:25:22,000 +plus all your internships plus like + +708 +00:25:20,000 --> 00:25:25,000 +other life experiences + +709 +00:25:23,000 --> 00:25:26,000 +and think really carefully about each of + +710 +00:25:25,000 --> 00:25:29,000 +them + +711 +00:25:26,000 --> 00:25:31,000 +what problems did you come across + +712 +00:25:30,000 --> 00:25:33,000 +what did you learn that other people + +713 +00:25:32,000 --> 00:25:35,000 +don't know + +714 +00:25:34,000 --> 00:25:38,000 +What are problems or opportunities that + +715 +00:25:36,000 --> 00:25:39,000 +you've been in kind of a special + +716 +00:25:38,000 --> 00:25:42,000 +position to see + +717 +00:25:40,000 --> 00:25:45,000 +those are the best places to start + +718 +00:25:42,000 --> 00:25:46,000 +looking for startup ideas okay the next + +719 +00:25:45,000 --> 00:25:48,000 +one is to just think of things you + +720 +00:25:47,000 --> 00:25:50,000 +personally wish existed this is like a + +721 +00:25:49,000 --> 00:25:52,000 +really classic recipe this is very + +722 +00:25:50,000 --> 00:25:54,000 +common advice great example of this is + +723 +00:25:52,000 --> 00:25:55,000 +doordash the short story of doordash is + +724 +00:25:55,000 --> 00:25:58,000 +that the founders of doordash were + +725 +00:25:56,000 --> 00:25:59,000 +undergrads at Stanford and the thing + +726 +00:25:58,000 --> 00:26:01,000 +they really wanted was to be able to + +727 +00:26:00,000 --> 00:26:03,000 +just order food from local restaurants + +728 +00:26:01,000 --> 00:26:04,000 +and have it delivered to their dorm and + +729 +00:26:03,000 --> 00:26:07,000 +before doordash you couldn't do that so + +730 +00:26:05,000 --> 00:26:09,000 +they started doordash and this is a + +731 +00:26:08,000 --> 00:26:12,000 +great recipe but + +732 +00:26:10,000 --> 00:26:14,000 +this is the recipe that is most + +733 +00:26:13,000 --> 00:26:17,000 +dangerous and potentially leading to tar + +734 +00:26:15,000 --> 00:26:18,000 +pit ideas so if you're using this recipe + +735 +00:26:17,000 --> 00:26:20,000 +you just gotta stop and think for a + +736 +00:26:19,000 --> 00:26:22,000 +second is there a reason why this thing + +737 +00:26:20,000 --> 00:26:24,000 +doesn't exist yet okay the next one is + +738 +00:26:23,000 --> 00:26:26,000 +to look for things in the world that + +739 +00:26:24,000 --> 00:26:28,000 +have changed recently that might have + +740 +00:26:26,000 --> 00:26:30,000 +created a new opportunity a great + +741 +00:26:28,000 --> 00:26:32,000 +example of this is covet + +742 +00:26:30,000 --> 00:26:35,000 +so when the pandemic started it changed + +743 +00:26:32,000 --> 00:26:36,000 +daily life for all of us and many + +744 +00:26:35,000 --> 00:26:38,000 +Founders realize that this created the + +745 +00:26:37,000 --> 00:26:40,000 +opportunity for new companies and some + +746 +00:26:39,000 --> 00:26:41,000 +very successful startups came out of it + +747 +00:26:41,000 --> 00:26:44,000 +and + +748 +00:26:42,000 --> 00:26:45,000 +one of them is this company called + +749 +00:26:44,000 --> 00:26:47,000 +gather town which builds like this fun + +750 +00:26:46,000 --> 00:26:49,000 +way to hang out with other people online + +751 +00:26:48,000 --> 00:26:51,000 +and the founders of gathered town were + +752 +00:26:50,000 --> 00:26:53,000 +actually working on a different idea + +753 +00:26:51,000 --> 00:26:55,000 +that wasn't going so well and when the + +754 +00:26:53,000 --> 00:26:56,000 +pandemic started they pivoted to this + +755 +00:26:55,000 --> 00:26:58,000 +because it was obvious that like the + +756 +00:26:57,000 --> 00:27:01,000 +change in behavior of the pandemic had + +757 +00:26:59,000 --> 00:27:03,000 +created a bunch of new opportunities you + +758 +00:27:01,000 --> 00:27:05,000 +can also look for companies that have + +759 +00:27:03,000 --> 00:27:08,000 +been successful recently and look for + +760 +00:27:06,000 --> 00:27:10,000 +new variants on them + +761 +00:27:08,000 --> 00:27:12,000 +a good example of this is a company + +762 +00:27:10,000 --> 00:27:14,000 +called Nuvo cargo Nuvo cargo is a good + +763 +00:27:13,000 --> 00:27:16,000 +example of explicitly sitting down to + +764 +00:27:15,000 --> 00:27:17,000 +try to think about startup ideas and + +765 +00:27:16,000 --> 00:27:18,000 +actually finding a good one which is the + +766 +00:27:17,000 --> 00:27:20,000 +thing that I told you is hard to do + +767 +00:27:19,000 --> 00:27:24,000 +pneumo cargo is basically flexport for + +768 +00:27:21,000 --> 00:27:26,000 +Latin America they help U.S companies to + +769 +00:27:24,000 --> 00:27:28,000 +import stuff from Mexico + +770 +00:27:26,000 --> 00:27:30,000 +and the story of nuva cargo is that + +771 +00:27:28,000 --> 00:27:32,000 +Deepak the founder was working on a + +772 +00:27:30,000 --> 00:27:34,000 +different idea NYC and he realized that + +773 +00:27:32,000 --> 00:27:36,000 +his idea wasn't going to work + +774 +00:27:35,000 --> 00:27:39,000 +and he went on like a systematic search + +775 +00:27:37,000 --> 00:27:42,000 +for better ideas + +776 +00:27:39,000 --> 00:27:43,000 +and he picked Nuvo cargo for for very + +777 +00:27:42,000 --> 00:27:45,000 +analytical reasons he picked it because + +778 +00:27:44,000 --> 00:27:47,000 +it was a large Market + +779 +00:27:45,000 --> 00:27:49,000 +because they were good + +780 +00:27:47,000 --> 00:27:51,000 +proxies from other companies flexport + +781 +00:27:49,000 --> 00:27:53,000 +and he picked it even though he didn't + +782 +00:27:52,000 --> 00:27:57,000 +have deep domain expertise in the import + +783 +00:27:54,000 --> 00:27:57,000 +export space because he had some + +784 +00:27:57,000 --> 00:28:00,000 +connections that would enable him to get + +785 +00:27:58,000 --> 00:28:01,000 +started and he felt like he would just + +786 +00:28:00,000 --> 00:28:04,000 +be very good at running this kind of + +787 +00:28:02,000 --> 00:28:06,000 +operationally intensive business + +788 +00:28:04,000 --> 00:28:08,000 +and that worked really well Niva cargo + +789 +00:28:06,000 --> 00:28:11,000 +is doing super well you can also go and + +790 +00:28:09,000 --> 00:28:13,000 +talk to people and just ask them what + +791 +00:28:11,000 --> 00:28:14,000 +problems they have this this can work + +792 +00:28:13,000 --> 00:28:17,000 +the the downside with this recipe is it + +793 +00:28:15,000 --> 00:28:19,000 +actually requires a lot of skill if you + +794 +00:28:17,000 --> 00:28:22,000 +want to do this I would recommend first + +795 +00:28:19,000 --> 00:28:24,000 +picking a fertile idea space and then + +796 +00:28:23,000 --> 00:28:27,000 +going and talking to people within that + +797 +00:28:25,000 --> 00:28:30,000 +idea space and I would also recommend + +798 +00:28:27,000 --> 00:28:32,000 +talking not just to potential customers + +799 +00:28:30,000 --> 00:28:36,000 +but also to potent but also to founders + +800 +00:28:33,000 --> 00:28:38,000 +of companies in that idea space to get + +801 +00:28:36,000 --> 00:28:39,000 +advice about what ideas are actually + +802 +00:28:38,000 --> 00:28:42,000 +worth pursuing and a good example of + +803 +00:28:40,000 --> 00:28:44,000 +doing this successfully is a to B and A + +804 +00:28:43,000 --> 00:28:46,000 +to B was in the position that a lot of + +805 +00:28:45,000 --> 00:28:48,000 +Founders that struggle to find good + +806 +00:28:47,000 --> 00:28:50,000 +startup ideas are in which is that the + +807 +00:28:48,000 --> 00:28:51,000 +founders were pretty young and they + +808 +00:28:50,000 --> 00:28:54,000 +hadn't acquired a lot of specific domain + +809 +00:28:52,000 --> 00:28:55,000 +expertise like the resi founders had yet + +810 +00:28:54,000 --> 00:28:56,000 +but they really wanted to do a startup + +811 +00:28:56,000 --> 00:28:59,000 +and they wanted to do a startup that had + +812 +00:28:57,000 --> 00:29:00,000 +like a genuinely good idea the way that + +813 +00:28:59,000 --> 00:29:03,000 +they came up with the idea for ADB was + +814 +00:29:01,000 --> 00:29:05,000 +very systematic and so I'm going to walk + +815 +00:29:03,000 --> 00:29:07,000 +you through how they did it and really + +816 +00:29:05,000 --> 00:29:09,000 +break it down for you so A to B makes + +817 +00:29:08,000 --> 00:29:12,000 +fuel cards and if you haven't heard of a + +818 +00:29:10,000 --> 00:29:14,000 +fuel card it's like a special kind of + +819 +00:29:12,000 --> 00:29:16,000 +credit card for truck drivers when the A + +820 +00:29:15,000 --> 00:29:19,000 +to B Founders got into YC they pivoted + +821 +00:29:17,000 --> 00:29:21,000 +and they spent the whole YC batch + +822 +00:29:19,000 --> 00:29:24,000 +looking for a new idea and here's how + +823 +00:29:21,000 --> 00:29:25,000 +they did it first they picked an idea + +824 +00:29:24,000 --> 00:29:27,000 +space and the idea space that they + +825 +00:29:26,000 --> 00:29:30,000 +picked was essentially software for the + +826 +00:29:28,000 --> 00:29:32,000 +trucking industry + +827 +00:29:30,000 --> 00:29:34,000 +and they picked this idea space despite + +828 +00:29:33,000 --> 00:29:37,000 +not being experts at the trucking + +829 +00:29:35,000 --> 00:29:40,000 +industry because they felt that it just + +830 +00:29:38,000 --> 00:29:42,000 +should be a fertile idea space to go + +831 +00:29:40,000 --> 00:29:44,000 +hunting for startup ideas the trucking + +832 +00:29:42,000 --> 00:29:46,000 +industry is as like Big Industry hasn't + +833 +00:29:45,000 --> 00:29:48,000 +been that disrupted by startups and + +834 +00:29:47,000 --> 00:29:50,000 +software yet so they just felt like + +835 +00:29:48,000 --> 00:29:52,000 +there were probably some good problems + +836 +00:29:50,000 --> 00:29:54,000 +to work on in the trucking industry but + +837 +00:29:53,000 --> 00:29:55,000 +the problem is + +838 +00:29:54,000 --> 00:29:56,000 +they didn't know that much about the + +839 +00:29:55,000 --> 00:29:58,000 +trucking industry so they didn't know + +840 +00:29:57,000 --> 00:30:01,000 +what those problems were and so they + +841 +00:29:58,000 --> 00:30:03,000 +decided that they would turn themselves + +842 +00:30:01,000 --> 00:30:06,000 +into experts in the trucking industry + +843 +00:30:04,000 --> 00:30:08,000 +and what they did is they actually + +844 +00:30:06,000 --> 00:30:09,000 +physically drove two truck stops which + +845 +00:30:08,000 --> 00:30:10,000 +were places where truck drivers are just + +846 +00:30:10,000 --> 00:30:13,000 +kind of + +847 +00:30:11,000 --> 00:30:15,000 +Milling about and they would just walk + +848 +00:30:13,000 --> 00:30:17,000 +up to truck drivers and like start + +849 +00:30:16,000 --> 00:30:20,000 +talking to them and ask them questions + +850 +00:30:18,000 --> 00:30:22,000 +about what their problems were + +851 +00:30:20,000 --> 00:30:23,000 +they also talked to a lot of Founders + +852 +00:30:23,000 --> 00:30:28,000 +who had started companies in the + +853 +00:30:24,000 --> 00:30:29,000 +trucking space to get ideas for what + +854 +00:30:28,000 --> 00:30:32,000 +problems were actually worth working on + +855 +00:30:30,000 --> 00:30:33,000 +they would basically talk to like anyone + +856 +00:30:32,000 --> 00:30:35,000 +who knew anything about Trucking that + +857 +00:30:34,000 --> 00:30:38,000 +was willing to talk to them and as they + +858 +00:30:36,000 --> 00:30:40,000 +did that they began to put together like + +859 +00:30:38,000 --> 00:30:42,000 +a mental map of the space and where the + +860 +00:30:41,000 --> 00:30:45,000 +good ideas were where the bad ideas were + +861 +00:30:43,000 --> 00:30:46,000 +and they actually went through a whole + +862 +00:30:45,000 --> 00:30:48,000 +bunch of different potential ideas + +863 +00:30:47,000 --> 00:30:52,000 +before eventually deciding to work on + +864 +00:30:49,000 --> 00:30:54,000 +fuel cards and I love the example of a + +865 +00:30:52,000 --> 00:30:56,000 +to B Because A to B is one of the best + +866 +00:30:55,000 --> 00:30:59,000 +new ideas to come out of YC in several + +867 +00:30:57,000 --> 00:31:01,000 +years A to B is a phenomenal company and + +868 +00:31:00,000 --> 00:31:03,000 +the approach that they used to find this + +869 +00:31:01,000 --> 00:31:07,000 +idea is something that really anyone + +870 +00:31:03,000 --> 00:31:09,000 +could do and most Founders don't do this + +871 +00:31:07,000 --> 00:31:11,000 +because it just sounds like too much + +872 +00:31:10,000 --> 00:31:14,000 +work so if you're willing to put in the + +873 +00:31:12,000 --> 00:31:16,000 +work this is an amazing way to find a + +874 +00:31:14,000 --> 00:31:18,000 +startup idea okay and my last recipe is + +875 +00:31:17,000 --> 00:31:20,000 +to just like look for big industries + +876 +00:31:19,000 --> 00:31:22,000 +that seem broken + +877 +00:31:21,000 --> 00:31:24,000 +any Big Industry that seems broken is + +878 +00:31:23,000 --> 00:31:26,000 +probably right for disruption and + +879 +00:31:25,000 --> 00:31:30,000 +finally I've got kind of a bonus recipe + +880 +00:31:26,000 --> 00:31:31,000 +which is to just find a co-founder that + +881 +00:31:30,000 --> 00:31:33,000 +already has an idea they're actually + +882 +00:31:31,000 --> 00:31:33,000 +like a lot of people just on Startup + +883 +00:31:33,000 --> 00:31:35,000 +School co-founder matching right now + +884 +00:31:34,000 --> 00:31:37,000 +that already have an idea and are + +885 +00:31:36,000 --> 00:31:39,000 +looking for a co-founder so if you don't + +886 +00:31:38,000 --> 00:31:41,000 +have a co-founder and you don't have an + +887 +00:31:39,000 --> 00:31:42,000 +idea that could be a great hack to + +888 +00:31:41,000 --> 00:31:44,000 +getting both at the same time the last + +889 +00:31:43,000 --> 00:31:46,000 +point that I want to leave you with is + +890 +00:31:45,000 --> 00:31:49,000 +just to remember that it's often hard to + +891 +00:31:47,000 --> 00:31:51,000 +tell if a startup idea is good or not + +892 +00:31:49,000 --> 00:31:54,000 +and so while I hope the concepts that I + +893 +00:31:52,000 --> 00:31:56,000 +talked about here will help + +894 +00:31:54,000 --> 00:31:58,000 +typically the only way to know for sure + +895 +00:31:57,000 --> 00:32:02,000 +if your startup idea is good is to Just + +896 +00:31:59,000 --> 00:32:03,000 +Launch it and find out so if after all + +897 +00:32:02,000 --> 00:32:04,000 +this you've got a startup idea and + +898 +00:32:04,000 --> 00:32:07,000 +you're still kind of on the fence about + +899 +00:32:05,000 --> 00:32:09,000 +whether it's actually a good idea or not + +900 +00:32:07,000 --> 00:32:11,000 +that is my advice for you just launch it + +901 +00:32:09,000 --> 00:32:22,000 +and find it + +902 +00:32:12,000 --> 00:32:22,000 +[Music] + diff --git a/create-a-js-file.svg b/create-a-js-file.svg new file mode 100644 index 0000000..c9602e3 --- /dev/null +++ b/create-a-js-file.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/errorCodes.ts b/errorCodes.ts new file mode 100644 index 0000000..2f554e9 --- /dev/null +++ b/errorCodes.ts @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +export const variableDeclaredButNeverUsed = new Set([6196, 6133]); +export const propertyDeclaretedButNeverUsed = new Set([6138]); +export const allImportsAreUnused = new Set([6192]); +export const unreachableCode = new Set([7027]); +export const unusedLabel = new Set([7028]); +export const fallThroughCaseInSwitch = new Set([7029]); +export const notAllCodePathsReturnAValue = new Set([7030]); +export const incorrectlyImplementsInterface = new Set([2420]); +export const cannotFindName = new Set([2552, 2304]); +export const extendsShouldBeImplements = new Set([2689]); +export const asyncOnlyAllowedInAsyncFunctions = new Set([1308]); diff --git a/experimentTelemetryReporter.ts b/experimentTelemetryReporter.ts new file mode 100644 index 0000000..8fd7ce4 --- /dev/null +++ b/experimentTelemetryReporter.ts @@ -0,0 +1,51 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import VsCodeTelemetryReporter from '@vscode/extension-telemetry'; +import * as vscode from 'vscode'; +import * as tas from 'vscode-tas-client'; + +export interface IExperimentationTelemetryReporter extends tas.IExperimentationTelemetry, vscode.Disposable { + postEventObj(eventName: string, props: { [prop: string]: string }): void; +} + +/** + * This reporter *supports* experimentation telemetry, + * but will only do so when passed to an {@link ExperimentationService}. + */ + +export class ExperimentationTelemetryReporter implements IExperimentationTelemetryReporter { + + private _sharedProperties: Record = {}; + private readonly _reporter: VsCodeTelemetryReporter; + + constructor(reporter: VsCodeTelemetryReporter) { + this._reporter = reporter; + } + + setSharedProperty(name: string, value: string): void { + this._sharedProperties[name] = value; + } + + postEvent(eventName: string, props: Map): void { + const propsObject = { + ...this._sharedProperties, + ...Object.fromEntries(props), + }; + this._reporter.sendTelemetryEvent(eventName, propsObject); + } + + postEventObj(eventName: string, props: { [prop: string]: string }) { + this._reporter.sendTelemetryEvent(eventName, { + ...this._sharedProperties, + ...props, + }); + } + + dispose() { + this._reporter.dispose(); + } +} + diff --git a/extension-browser.webpack.config.js b/extension-browser.webpack.config.js new file mode 100644 index 0000000..636198c --- /dev/null +++ b/extension-browser.webpack.config.js @@ -0,0 +1,20 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +//@ts-check + +'use strict'; + +const withBrowserDefaults = require('../shared.webpack.config').browser; + +module.exports = withBrowserDefaults({ + context: __dirname, + entry: { + extension: './src/extension.ts' + }, + output: { + filename: 'extension.js' + } +}); diff --git a/extension.webpack.config.js b/extension.webpack.config.js new file mode 100644 index 0000000..06bc95e --- /dev/null +++ b/extension.webpack.config.js @@ -0,0 +1,20 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +//@ts-check + +'use strict'; + +const withDefaults = require('../shared.webpack.config'); + +module.exports = withDefaults({ + context: __dirname, + entry: { + extension: './src/extension.ts' + }, + output: { + filename: 'extension.js' + } +}); diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000..7d1a59f Binary files /dev/null and b/favicon.ico differ diff --git a/fileWatchingManager.ts b/fileWatchingManager.ts new file mode 100644 index 0000000..27b9ec3 --- /dev/null +++ b/fileWatchingManager.ts @@ -0,0 +1,124 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as vscode from 'vscode'; +import { Utils } from 'vscode-uri'; +import { Schemes } from '../configuration/schemes'; +import { Logger } from '../logging/logger'; +import { disposeAll, IDisposable } from '../utils/dispose'; +import { ResourceMap } from '../utils/resourceMap'; + +interface DirWatcherEntry { + readonly uri: vscode.Uri; + readonly listeners: IDisposable[]; +} + + +export class FileWatcherManager implements IDisposable { + + private readonly _fileWatchers = new Map(); + + private readonly _dirWatchers = new ResourceMap<{ + readonly uri: vscode.Uri; + readonly watcher: vscode.FileSystemWatcher; + refCount: number; + }>(uri => uri.toString(), { onCaseInsensitiveFileSystem: false }); + + constructor( + private readonly logger: Logger, + ) { } + + dispose(): void { + for (const entry of this._fileWatchers.values()) { + entry.watcher.dispose(); + } + this._fileWatchers.clear(); + + for (const entry of this._dirWatchers.values()) { + entry.watcher.dispose(); + } + this._dirWatchers.clear(); + } + + create(id: number, uri: vscode.Uri, watchParentDirs: boolean, isRecursive: boolean, listeners: { create?: (uri: vscode.Uri) => void; change?: (uri: vscode.Uri) => void; delete?: (uri: vscode.Uri) => void }): void { + this.logger.trace(`Creating file watcher for ${uri.toString()}`); + + const watcher = vscode.workspace.createFileSystemWatcher(new vscode.RelativePattern(uri, isRecursive ? '**' : '*'), !listeners.create, !listeners.change, !listeners.delete); + const parentDirWatchers: DirWatcherEntry[] = []; + this._fileWatchers.set(id, { uri, watcher, dirWatchers: parentDirWatchers }); + + if (listeners.create) { watcher.onDidCreate(listeners.create); } + if (listeners.change) { watcher.onDidChange(listeners.change); } + if (listeners.delete) { watcher.onDidDelete(listeners.delete); } + + if (watchParentDirs && uri.scheme !== Schemes.untitled) { + // We need to watch the parent directories too for when these are deleted / created + for (let dirUri = Utils.dirname(uri); dirUri.path.length > 1; dirUri = Utils.dirname(dirUri)) { + const dirWatcher: DirWatcherEntry = { uri: dirUri, listeners: [] }; + + let parentDirWatcher = this._dirWatchers.get(dirUri); + if (!parentDirWatcher) { + this.logger.trace(`Creating parent dir watcher for ${dirUri.toString()}`); + const glob = new vscode.RelativePattern(Utils.dirname(dirUri), Utils.basename(dirUri)); + const parentWatcher = vscode.workspace.createFileSystemWatcher(glob, !listeners.create, true, !listeners.delete); + parentDirWatcher = { uri: dirUri, refCount: 0, watcher: parentWatcher }; + this._dirWatchers.set(dirUri, parentDirWatcher); + } + parentDirWatcher.refCount++; + + if (listeners.create) { + dirWatcher.listeners.push(parentDirWatcher.watcher.onDidCreate(async () => { + // Just because the parent dir was created doesn't mean our file was created + try { + const stat = await vscode.workspace.fs.stat(uri); + if (stat.type === vscode.FileType.File) { + listeners.create!(uri); + } + } catch { + // Noop + } + })); + } + + if (listeners.delete) { + // When the parent dir is deleted, consider our file deleted too + // TODO: this fires if the file previously did not exist and then the parent is deleted + dirWatcher.listeners.push(parentDirWatcher.watcher.onDidDelete(listeners.delete)); + } + + parentDirWatchers.push(dirWatcher); + } + } + } + + + delete(id: number): void { + const entry = this._fileWatchers.get(id); + if (entry) { + this.logger.trace(`Deleting file watcher for ${entry.uri}`); + + for (const dirWatcher of entry.dirWatchers) { + disposeAll(dirWatcher.listeners); + + const dirWatcherEntry = this._dirWatchers.get(dirWatcher.uri); + if (dirWatcherEntry) { + if (--dirWatcherEntry.refCount <= 0) { + this.logger.trace(`Deleting parent dir ${dirWatcherEntry.uri}`); + dirWatcherEntry.watcher.dispose(); + this._dirWatchers.delete(dirWatcher.uri); + } + } + } + + entry.watcher.dispose(); + } + + this._fileWatchers.delete(id); + } +} diff --git a/fixNames.ts b/fixNames.ts new file mode 100644 index 0000000..c423401 --- /dev/null +++ b/fixNames.ts @@ -0,0 +1,24 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +export const addMissingAwait = 'addMissingAwait'; +export const addMissingNewOperator = 'addMissingNewOperator'; +export const addMissingOverride = 'fixOverrideModifier'; +export const annotateWithTypeFromJSDoc = 'annotateWithTypeFromJSDoc'; +export const awaitInSyncFunction = 'fixAwaitInSyncFunction'; +export const classDoesntImplementInheritedAbstractMember = 'fixClassDoesntImplementInheritedAbstractMember'; +export const classIncorrectlyImplementsInterface = 'fixClassIncorrectlyImplementsInterface'; +export const constructorForDerivedNeedSuperCall = 'constructorForDerivedNeedSuperCall'; +export const extendsInterfaceBecomesImplements = 'extendsInterfaceBecomesImplements'; +export const fixImport = 'import'; +export const forgottenThisPropertyAccess = 'forgottenThisPropertyAccess'; +export const removeUnnecessaryAwait = 'removeUnnecessaryAwait'; +export const spelling = 'spelling'; +export const inferFromUsage = 'inferFromUsage'; +export const addNameToNamelessParameter = 'addNameToNamelessParameter'; +export const fixMissingFunctionDeclaration = 'fixMissingFunctionDeclaration'; +export const fixClassDoesntImplementInheritedAbstractMember = 'fixClassDoesntImplementInheritedAbstractMember'; +export const unreachableCode = 'fixUnreachableCode'; +export const unusedIdentifier = 'unusedIdentifier'; diff --git a/githubServer.ts b/githubServer.ts new file mode 100644 index 0000000..0729c4c --- /dev/null +++ b/githubServer.ts @@ -0,0 +1,357 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as vscode from 'vscode'; +import { ExperimentationTelemetry } from './common/experimentationService'; +import { AuthProviderType, UriEventHandler } from './github'; +import { Log } from './common/logger'; +import { isSupportedClient, isSupportedTarget } from './common/env'; +import { crypto } from './node/crypto'; +import { fetching } from './node/fetch'; +import { ExtensionHost, GitHubTarget, getFlows } from './flows'; +import { NETWORK_ERROR, USER_CANCELLATION_ERROR } from './common/errors'; +import { Config } from './config'; +import { base64Encode } from './node/buffer'; + +// This is the error message that we throw if the login was cancelled for any reason. Extensions +// calling `getSession` can handle this error to know that the user cancelled the login. +const CANCELLATION_ERROR = 'Cancelled'; + +const REDIRECT_URL_STABLE = 'https://vscode.dev/redirect'; +const REDIRECT_URL_INSIDERS = 'https://insiders.vscode.dev/redirect'; + +export interface IGitHubServer { + login(scopes: string): Promise; + logout(session: vscode.AuthenticationSession): Promise; + getUserInfo(token: string): Promise<{ id: string; accountName: string }>; + sendAdditionalTelemetryInfo(session: vscode.AuthenticationSession): Promise; + friendlyName: string; +} + + +export class GitHubServer implements IGitHubServer { + readonly friendlyName: string; + + private readonly _type: AuthProviderType; + + private _redirectEndpoint: string | undefined; + + constructor( + private readonly _logger: Log, + private readonly _telemetryReporter: ExperimentationTelemetry, + private readonly _uriHandler: UriEventHandler, + private readonly _extensionKind: vscode.ExtensionKind, + private readonly _ghesUri?: vscode.Uri + ) { + this._type = _ghesUri ? AuthProviderType.githubEnterprise : AuthProviderType.github; + this.friendlyName = this._type === AuthProviderType.github ? 'GitHub' : _ghesUri?.authority!; + } + + get baseUri() { + if (this._type === AuthProviderType.github) { + return vscode.Uri.parse('https://github.com/'); + } + return this._ghesUri!; + } + + private async getRedirectEndpoint(): Promise { + if (this._redirectEndpoint) { + return this._redirectEndpoint; + } + if (this._type === AuthProviderType.github) { + const proxyEndpoints = await vscode.commands.executeCommand<{ [providerId: string]: string } | undefined>('workbench.getCodeExchangeProxyEndpoints'); + // If we are running in insiders vscode.dev, then ensure we use the redirect route on that. + this._redirectEndpoint = REDIRECT_URL_STABLE; + if (proxyEndpoints?.github && new URL(proxyEndpoints.github).hostname === 'insiders.vscode.dev') { + this._redirectEndpoint = REDIRECT_URL_INSIDERS; + } + } else { + // GHE only supports a single redirect endpoint, so we can't use + // insiders.vscode.dev/redirect when we're running in Insiders, unfortunately. + // Additionally, we make the assumption that this function will only be used + // in flows that target supported GHE targets, not on-prem GHES. Because of this + // assumption, we can assume that the GHE version used is at least 3.8 which is + // the version that changed the redirect endpoint to this URI from the old + // GitHub maintained server. + this._redirectEndpoint = 'https://vscode.dev/redirect'; + } + return this._redirectEndpoint; + } + + // TODO@joaomoreno TODO@TylerLeonhardt + private _isNoCorsEnvironment: boolean | undefined; + private async isNoCorsEnvironment(): Promise { + if (this._isNoCorsEnvironment !== undefined) { + return this._isNoCorsEnvironment; + } + const uri = await vscode.env.asExternalUri(vscode.Uri.parse(`${vscode.env.uriScheme}://vscode.github-authentication/dummy`)); + this._isNoCorsEnvironment = (uri.scheme === 'https' && /^((insiders\.)?vscode|github)\./.test(uri.authority)) || (uri.scheme === 'http' && /^localhost/.test(uri.authority)); + return this._isNoCorsEnvironment; + } + + public async login(scopes: string): Promise { + this._logger.info(`Logging in for the following scopes: ${scopes}`); + + // Used for showing a friendlier message to the user when the explicitly cancel a flow. + let userCancelled: boolean | undefined; + const yes = vscode.l10n.t('Yes'); + const no = vscode.l10n.t('No'); + const promptToContinue = async (mode: string) => { + if (userCancelled === undefined) { + // We haven't had a failure yet so wait to prompt + return; + } + const message = userCancelled + ? vscode.l10n.t('Having trouble logging in? Would you like to try a different way? ({0})', mode) + : vscode.l10n.t('You have not yet finished authorizing this extension to use GitHub. Would you like to try a different way? ({0})', mode); + const result = await vscode.window.showWarningMessage(message, yes, no); + if (result !== yes) { + throw new Error(CANCELLATION_ERROR); + } + }; + + const nonce: string = crypto.getRandomValues(new Uint32Array(2)).reduce((prev, curr) => prev += curr.toString(16), ''); + const callbackUri = await vscode.env.asExternalUri(vscode.Uri.parse(`${vscode.env.uriScheme}://vscode.github-authentication/did-authenticate?nonce=${encodeURIComponent(nonce)}`)); + + const supportedClient = isSupportedClient(callbackUri); + const supportedTarget = isSupportedTarget(this._type, this._ghesUri); + + const flows = getFlows({ + target: this._type === AuthProviderType.github + ? GitHubTarget.DotCom + : supportedTarget ? GitHubTarget.HostedEnterprise : GitHubTarget.Enterprise, + extensionHost: typeof navigator === 'undefined' + ? this._extensionKind === vscode.ExtensionKind.UI ? ExtensionHost.Local : ExtensionHost.Remote + : ExtensionHost.WebWorker, + isSupportedClient: supportedClient + }); + + + for (const flow of flows) { + try { + if (flow !== flows[0]) { + await promptToContinue(flow.label); + } + return await flow.trigger({ + scopes, + callbackUri, + nonce, + baseUri: this.baseUri, + logger: this._logger, + uriHandler: this._uriHandler, + enterpriseUri: this._ghesUri, + redirectUri: vscode.Uri.parse(await this.getRedirectEndpoint()), + }); + } catch (e) { + userCancelled = this.processLoginError(e); + } + } + + throw new Error(userCancelled ? CANCELLATION_ERROR : 'No auth flow succeeded.'); + } + + public async logout(session: vscode.AuthenticationSession): Promise { + this._logger.trace(`Deleting session (${session.id}) from server...`); + + if (!Config.gitHubClientSecret) { + this._logger.warn('No client secret configured for GitHub authentication. The token has been deleted with best effort on this system, but we are unable to delete the token on server without the client secret.'); + return; + } + + // Only attempt to delete OAuth tokens. They are always prefixed with `gho_`. + // https://docs.github.com/en/rest/apps/oauth-applications#about-oauth-apps-and-oauth-authorizations-of-github-apps + if (!session.accessToken.startsWith('gho_')) { + this._logger.warn('The token being deleted is not an OAuth token. It has been deleted locally, but we cannot delete it on server.'); + return; + } + + if (!isSupportedTarget(this._type, this._ghesUri)) { + this._logger.trace('GitHub.com and GitHub hosted GitHub Enterprise are the only options that support deleting tokens on the server. Skipping.'); + return; + } + + const authHeader = 'Basic ' + base64Encode(`${Config.gitHubClientId}:${Config.gitHubClientSecret}`); + const uri = this.getServerUri(`/applications/${Config.gitHubClientId}/token`); + + try { + // Defined here: https://docs.github.com/en/rest/apps/oauth-applications?apiVersion=2022-11-28#delete-an-app-token + const result = await fetching(uri.toString(true), { + method: 'DELETE', + headers: { + Accept: 'application/vnd.github+json', + Authorization: authHeader, + 'X-GitHub-Api-Version': '2022-11-28', + 'User-Agent': `${vscode.env.appName} (${vscode.env.appHost})` + }, + body: JSON.stringify({ access_token: session.accessToken }), + }); + + if (result.status === 204) { + this._logger.trace(`Successfully deleted token from session (${session.id}) from server.`); + return; + } + + try { + const body = await result.text(); + throw new Error(body); + } catch (e) { + throw new Error(`${result.status} ${result.statusText}`); + } + } catch (e) { + this._logger.warn('Failed to delete token from server.' + e.message ?? e); + } + } + + private getServerUri(path: string = '') { + const apiUri = this.baseUri; + // github.com and Hosted GitHub Enterprise instances + if (isSupportedTarget(this._type, this._ghesUri)) { + return vscode.Uri.parse(`${apiUri.scheme}://api.${apiUri.authority}`).with({ path }); + } + // GitHub Enterprise Server (aka on-prem) + return vscode.Uri.parse(`${apiUri.scheme}://${apiUri.authority}/api/v3${path}`); + } + + public async getUserInfo(token: string): Promise<{ id: string; accountName: string }> { + let result; + try { + this._logger.info('Getting user info...'); + result = await fetching(this.getServerUri('/user').toString(), { + headers: { + Authorization: `token ${token}`, + 'User-Agent': `${vscode.env.appName} (${vscode.env.appHost})` + } + }); + } catch (ex) { + this._logger.error(ex.message); + throw new Error(NETWORK_ERROR); + } + + if (result.ok) { + try { + const json = await result.json(); + this._logger.info('Got account info!'); + return { id: json.id, accountName: json.login }; + } catch (e) { + this._logger.error(`Unexpected error parsing response from GitHub: ${e.message ?? e}`); + throw e; + } + } else { + // either display the response message or the http status text + let errorMessage = result.statusText; + try { + const json = await result.json(); + if (json.message) { + errorMessage = json.message; + } + } catch (err) { + // noop + } + this._logger.error(`Getting account info failed: ${errorMessage}`); + throw new Error(errorMessage); + } + } + + public async sendAdditionalTelemetryInfo(session: vscode.AuthenticationSession): Promise { + if (!vscode.env.isTelemetryEnabled) { + return; + } + const nocors = await this.isNoCorsEnvironment(); + + if (nocors) { + return; + } + + if (this._type === AuthProviderType.github) { + return await this.checkUserDetails(session); + } + + // GHES + await this.checkEnterpriseVersion(session.accessToken); + } + + private async checkUserDetails(session: vscode.AuthenticationSession): Promise { + let edu: string | undefined; + + try { + const result = await fetching('https://education.github.com/api/user', { + headers: { + Authorization: `token ${session.accessToken}`, + 'faculty-check-preview': 'true', + 'User-Agent': `${vscode.env.appName} (${vscode.env.appHost})` + } + }); + + if (result.ok) { + const json: { student: boolean; faculty: boolean } = await result.json(); + edu = json.student + ? 'student' + : json.faculty + ? 'faculty' + : 'none'; + } else { + edu = 'unknown'; + } + } catch (e) { + edu = 'unknown'; + } + + /* __GDPR__ + "session" : { + "owner": "TylerLeonhardt", + "isEdu": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, + "isManaged": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } + } + */ + this._telemetryReporter.sendTelemetryEvent('session', { + isEdu: edu, + // Apparently, this is how you tell if a user is an EMU... + isManaged: session.account.label.includes('_') ? 'true' : 'false' + }); + } + + private async checkEnterpriseVersion(token: string): Promise { + try { + let version: string; + if (!isSupportedTarget(this._type, this._ghesUri)) { + const result = await fetching(this.getServerUri('/meta').toString(), { + headers: { + Authorization: `token ${token}`, + 'User-Agent': `${vscode.env.appName} (${vscode.env.appHost})` + } + }); + + if (!result.ok) { + return; + } + + const json: { verifiable_password_authentication: boolean; installed_version: string } = await result.json(); + version = json.installed_version; + } else { + version = 'hosted'; + } + + /* __GDPR__ + "ghe-session" : { + "owner": "TylerLeonhardt", + "version": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } + } + */ + this._telemetryReporter.sendTelemetryEvent('ghe-session', { + version + }); + } catch { + // No-op + } + } + + private processLoginError(error: Error): boolean { + if (error.message === CANCELLATION_ERROR) { + throw error; + } + this._logger.error(error.message ?? error); + return error.message === USER_CANCELLATION_ERROR; + } +} diff --git a/goToProjectConfiguration.ts b/goToProjectConfiguration.ts new file mode 100644 index 0000000..0222f32 --- /dev/null +++ b/goToProjectConfiguration.ts @@ -0,0 +1,42 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import TypeScriptServiceClientHost from '../typeScriptServiceClientHost'; +import { ActiveJsTsEditorTracker } from '../ui/activeJsTsEditorTracker'; +import { Lazy } from '../utils/lazy'; +import { openProjectConfigForFile, ProjectType } from '../tsconfig'; +import { Command } from './commandManager'; + +export class TypeScriptGoToProjectConfigCommand implements Command { + public readonly id = 'typescript.goToProjectConfig'; + + public constructor( + private readonly activeJsTsEditorTracker: ActiveJsTsEditorTracker, + private readonly lazyClientHost: Lazy, + ) { } + + public execute() { + const editor = this.activeJsTsEditorTracker.activeJsTsEditor; + if (editor) { + openProjectConfigForFile(ProjectType.TypeScript, this.lazyClientHost.value.serviceClient, editor.document.uri); + } + } +} + +export class JavaScriptGoToProjectConfigCommand implements Command { + public readonly id = 'javascript.goToProjectConfig'; + + public constructor( + private readonly activeJsTsEditorTracker: ActiveJsTsEditorTracker, + private readonly lazyClientHost: Lazy, + ) { } + + public execute() { + const editor = this.activeJsTsEditorTracker.activeJsTsEditor; + if (editor) { + openProjectConfigForFile(ProjectType.JavaScript, this.lazyClientHost.value.serviceClient, editor.document.uri); + } + } +} diff --git a/gulpfile.js b/gulpfile.js new file mode 100644 index 0000000..9691ba8 --- /dev/null +++ b/gulpfile.js @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +require('./build/gulpfile'); diff --git a/icon.png b/icon.png new file mode 100644 index 0000000..c179f87 Binary files /dev/null and b/icon.png differ diff --git a/index.html b/index.html new file mode 100644 index 0000000..efd092d --- /dev/null +++ b/index.html @@ -0,0 +1,37 @@ + + + + + + + GitHub Authentication - Sign In + + + + + + + Visual Studio Code + +
+
+ You are signed in now and can close this page. +
+
+ An error occurred while signing in: +
+
+
+ + + + diff --git a/javascript 2.pages b/javascript 2.pages new file mode 100644 index 0000000..da45ef6 Binary files /dev/null and b/javascript 2.pages differ diff --git a/julia.tmLanguage.json b/julia.tmLanguage.json new file mode 100644 index 0000000..c1b883e --- /dev/null +++ b/julia.tmLanguage.json @@ -0,0 +1,1067 @@ +{ + "information_for_contributors": [ + "This file has been converted from https://github.com/JuliaEditorSupport/atom-language-julia/blob/master/grammars/julia_vscode.json", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], + "version": "https://github.com/JuliaEditorSupport/atom-language-julia/commit/8747e069119b24bff2703374d7961e3446a74034", + "name": "Julia", + "scopeName": "source.julia", + "comment": "This grammar is used by Atom (Oniguruma), GitHub (PCRE), and VSCode (Oniguruma),\nso all regexps must be compatible with both engines.\n\nSpecs:\n- https://github.com/kkos/oniguruma/blob/master/doc/RE\n- https://www.pcre.org/current/doc/html/", + "patterns": [ + { + "include": "#operator" + }, + { + "include": "#array" + }, + { + "include": "#string" + }, + { + "include": "#parentheses" + }, + { + "include": "#bracket" + }, + { + "include": "#function_decl" + }, + { + "include": "#function_call" + }, + { + "include": "#for_block" + }, + { + "include": "#keyword" + }, + { + "include": "#number" + }, + { + "include": "#comment" + }, + { + "include": "#type_decl" + }, + { + "include": "#symbol" + } + ], + "repository": { + "array": { + "patterns": [ + { + "begin": "\\[", + "beginCaptures": { + "0": { + "name": "meta.bracket.julia" + } + }, + "end": "(\\])((?:\\.)?'*)", + "endCaptures": { + "1": { + "name": "meta.bracket.julia" + }, + "2": { + "name": "keyword.operator.transpose.julia" + } + }, + "name": "meta.array.julia", + "patterns": [ + { + "match": "\\bbegin\\b", + "name": "constant.numeric.julia" + }, + { + "match": "\\bend\\b", + "name": "constant.numeric.julia" + }, + { + "include": "#self_no_for_block" + } + ] + } + ] + }, + "parentheses": { + "patterns": [ + { + "begin": "\\(", + "beginCaptures": { + "0": { + "name": "meta.bracket.julia" + } + }, + "end": "(\\))((?:\\.)?'*)", + "endCaptures": { + "1": { + "name": "meta.bracket.julia" + }, + "2": { + "name": "keyword.operator.transpose.julia" + } + }, + "patterns": [ + { + "include": "#self_no_for_block" + } + ] + } + ] + }, + "bracket": { + "patterns": [ + { + "begin": "\\{", + "beginCaptures": { + "0": { + "name": "meta.bracket.julia" + } + }, + "end": "(\\})((?:\\.)?'*)", + "endCaptures": { + "1": { + "name": "meta.bracket.julia" + }, + "2": { + "name": "keyword.operator.transpose.julia" + } + }, + "patterns": [ + { + "include": "#self_no_for_block" + } + ] + } + ] + }, + "comment_tags": { + "patterns": [ + { + "match": "\\bTODO\\b", + "name": "keyword.other.comment-annotation.julia" + }, + { + "match": "\\bFIXME\\b", + "name": "keyword.other.comment-annotation.julia" + }, + { + "match": "\\bCHANGED\\b", + "name": "keyword.other.comment-annotation.julia" + }, + { + "match": "\\bXXX\\b", + "name": "keyword.other.comment-annotation.julia" + } + ] + }, + "comment": { + "patterns": [ + { + "include": "#comment_block" + }, + { + "begin": "#", + "beginCaptures": { + "0": { + "name": "punctuation.definition.comment.julia" + } + }, + "end": "\\n", + "name": "comment.line.number-sign.julia", + "patterns": [ + { + "include": "#comment_tags" + } + ] + } + ] + }, + "comment_block": { + "patterns": [ + { + "begin": "#=", + "beginCaptures": { + "0": { + "name": "punctuation.definition.comment.begin.julia" + } + }, + "end": "=#", + "endCaptures": { + "0": { + "name": "punctuation.definition.comment.end.julia" + } + }, + "name": "comment.block.number-sign-equals.julia", + "patterns": [ + { + "include": "#comment_tags" + }, + { + "include": "#comment_block" + } + ] + } + ] + }, + "function_call": { + "patterns": [ + { + "begin": "((?:[[:alpha:]_\\p{Lu}\\p{Ll}\\p{Lt}\\p{Lm}\\p{Lo}\\p{Nl}\\p{Sc}โ…€-โ…„โˆฟโŠพโŠฟโŠคโŠฅโˆ‚โˆ…-โˆ‡โˆŽโˆโˆโˆ‘โˆžโˆŸโˆซ-โˆณโ‹€-โ‹ƒโ—ธ-โ—ฟโ™ฏโŸ˜โŸ™โŸ€โŸโฆฐ-โฆดโจ€-โจ†โจ‰-โจ–โจ›โจœ๐›๐››๐›ป๐œ•๐œต๐๐ฏ๐ž‰๐žฉ๐Ÿƒโฑ-โพโ‚-โ‚Žโˆ -โˆขโฆ›-โฆฏโ„˜โ„ฎใ‚›-ใ‚œ๐ŸŽ-๐Ÿก]|[^\\P{So}โ†-โ‡ฟ])(?:[[:word:]_!\\p{Lu}\\p{Ll}\\p{Lt}\\p{Lm}\\p{Lo}\\p{Nl}\\p{Sc}โ…€-โ…„โˆฟโŠพโŠฟโŠคโŠฅโˆ‚โˆ…-โˆ‡โˆŽโˆโˆโˆ‘โˆžโˆŸโˆซ-โˆณโ‹€-โ‹ƒโ—ธ-โ—ฟโ™ฏโŸ˜โŸ™โŸ€โŸโฆฐ-โฆดโจ€-โจ†โจ‰-โจ–โจ›โจœ๐›๐››๐›ป๐œ•๐œต๐๐ฏ๐ž‰๐žฉ๐Ÿƒโฑ-โพโ‚-โ‚Žโˆ -โˆขโฆ›-โฆฏโ„˜โ„ฎใ‚›-ใ‚œ๐ŸŽ-๐Ÿก]|[^\\P{Mn}\u0001-ยก]|[^\\P{Mc}\u0001-ยก]|[^\\P{Nd}\u0001-ยก]|[^\\P{Pc}\u0001-ยก]|[^\\P{Sk}\u0001-ยก]|[^\\P{Me}\u0001-ยก]|[^\\P{No}\u0001-ยก]|[โ€ฒ-โ€ทโ—]|[^\\P{So}โ†-โ‡ฟ])*)({(?:[^{}]|{(?:[^{}]|{[^{}]*})*})*})?\\.?(\\()", + "beginCaptures": { + "1": { + "name": "support.function.julia" + }, + "2": { + "name": "support.type.julia" + }, + "3": { + "name": "meta.bracket.julia" + } + }, + "end": "\\)(('|(\\.'))*\\.?')?", + "endCaptures": { + "0": { + "name": "meta.bracket.julia" + }, + "1": { + "name": "keyword.operator.transposed-func.julia" + } + }, + "patterns": [ + { + "include": "#self_no_for_block" + } + ] + } + ] + }, + "function_decl": { + "patterns": [ + { + "captures": { + "1": { + "name": "entity.name.function.julia" + }, + "2": { + "name": "support.type.julia" + } + }, + "match": "((?:[[:alpha:]_\\p{Lu}\\p{Ll}\\p{Lt}\\p{Lm}\\p{Lo}\\p{Nl}\\p{Sc}โ…€-โ…„โˆฟโŠพโŠฟโŠคโŠฅโˆ‚โˆ…-โˆ‡โˆŽโˆโˆโˆ‘โˆžโˆŸโˆซ-โˆณโ‹€-โ‹ƒโ—ธ-โ—ฟโ™ฏโŸ˜โŸ™โŸ€โŸโฆฐ-โฆดโจ€-โจ†โจ‰-โจ–โจ›โจœ๐›๐››๐›ป๐œ•๐œต๐๐ฏ๐ž‰๐žฉ๐Ÿƒโฑ-โพโ‚-โ‚Žโˆ -โˆขโฆ›-โฆฏโ„˜โ„ฎใ‚›-ใ‚œ๐ŸŽ-๐Ÿก]|[^\\P{So}โ†-โ‡ฟ])(?:[[:word:]_!\\p{Lu}\\p{Ll}\\p{Lt}\\p{Lm}\\p{Lo}\\p{Nl}\\p{Sc}โ…€-โ…„โˆฟโŠพโŠฟโŠคโŠฅโˆ‚โˆ…-โˆ‡โˆŽโˆโˆโˆ‘โˆžโˆŸโˆซ-โˆณโ‹€-โ‹ƒโ—ธ-โ—ฟโ™ฏโŸ˜โŸ™โŸ€โŸโฆฐ-โฆดโจ€-โจ†โจ‰-โจ–โจ›โจœ๐›๐››๐›ป๐œ•๐œต๐๐ฏ๐ž‰๐žฉ๐Ÿƒโฑ-โพโ‚-โ‚Žโˆ -โˆขโฆ›-โฆฏโ„˜โ„ฎใ‚›-ใ‚œ๐ŸŽ-๐Ÿก]|[^\\P{Mn}\u0001-ยก]|[^\\P{Mc}\u0001-ยก]|[^\\P{Nd}\u0001-ยก]|[^\\P{Pc}\u0001-ยก]|[^\\P{Sk}\u0001-ยก]|[^\\P{Me}\u0001-ยก]|[^\\P{No}\u0001-ยก]|[โ€ฒ-โ€ทโ—]|[^\\P{So}โ†-โ‡ฟ])*)({(?:[^{}]|{(?:[^{}]|{[^{}]*})*})*})?(?=\\([^#]*\\)(::[^\\s]+)?(\\s*\\bwhere\\b\\s+.+?)?\\s*?=(?![=>]))", + "comment": "first group is function name\nSecond group is type parameters (e.g. {T<:Number, S})\nThen open parens\nThen a lookahead ensures that we are followed by:\n - anything (function arguments)\n - 0 or more spaces\n - Finally an equal sign\nNegative lookahead ensures we don't have another equal sign (not `==`)" + }, + { + "captures": { + "1": { + "name": "keyword.other.julia" + }, + "2": { + "name": "keyword.operator.dots.julia" + }, + "3": { + "name": "entity.name.function.julia" + }, + "4": { + "name": "support.type.julia" + } + }, + "match": "\\b(function|macro)(?:\\s+(?:(?:[[:alpha:]_\\p{Lu}\\p{Ll}\\p{Lt}\\p{Lm}\\p{Lo}\\p{Nl}\\p{Sc}โ…€-โ…„โˆฟโŠพโŠฟโŠคโŠฅโˆ‚โˆ…-โˆ‡โˆŽโˆโˆโˆ‘โˆžโˆŸโˆซ-โˆณโ‹€-โ‹ƒโ—ธ-โ—ฟโ™ฏโŸ˜โŸ™โŸ€โŸโฆฐ-โฆดโจ€-โจ†โจ‰-โจ–โจ›โจœ๐›๐››๐›ป๐œ•๐œต๐๐ฏ๐ž‰๐žฉ๐Ÿƒโฑ-โพโ‚-โ‚Žโˆ -โˆขโฆ›-โฆฏโ„˜โ„ฎใ‚›-ใ‚œ๐ŸŽ-๐Ÿก]|[^\\P{So}โ†-โ‡ฟ])(?:[[:word:]_!\\p{Lu}\\p{Ll}\\p{Lt}\\p{Lm}\\p{Lo}\\p{Nl}\\p{Sc}โ…€-โ…„โˆฟโŠพโŠฟโŠคโŠฅโˆ‚โˆ…-โˆ‡โˆŽโˆโˆโˆ‘โˆžโˆŸโˆซ-โˆณโ‹€-โ‹ƒโ—ธ-โ—ฟโ™ฏโŸ˜โŸ™โŸ€โŸโฆฐ-โฆดโจ€-โจ†โจ‰-โจ–โจ›โจœ๐›๐››๐›ป๐œ•๐œต๐๐ฏ๐ž‰๐žฉ๐Ÿƒโฑ-โพโ‚-โ‚Žโˆ -โˆขโฆ›-โฆฏโ„˜โ„ฎใ‚›-ใ‚œ๐ŸŽ-๐Ÿก]|[^\\P{Mn}\u0001-ยก]|[^\\P{Mc}\u0001-ยก]|[^\\P{Nd}\u0001-ยก]|[^\\P{Pc}\u0001-ยก]|[^\\P{Sk}\u0001-ยก]|[^\\P{Me}\u0001-ยก]|[^\\P{No}\u0001-ยก]|[โ€ฒ-โ€ทโ—]|[^\\P{So}โ†-โ‡ฟ])*(\\.))?((?:[[:alpha:]_\\p{Lu}\\p{Ll}\\p{Lt}\\p{Lm}\\p{Lo}\\p{Nl}\\p{Sc}โ…€-โ…„โˆฟโŠพโŠฟโŠคโŠฅโˆ‚โˆ…-โˆ‡โˆŽโˆโˆโˆ‘โˆžโˆŸโˆซ-โˆณโ‹€-โ‹ƒโ—ธ-โ—ฟโ™ฏโŸ˜โŸ™โŸ€โŸโฆฐ-โฆดโจ€-โจ†โจ‰-โจ–โจ›โจœ๐›๐››๐›ป๐œ•๐œต๐๐ฏ๐ž‰๐žฉ๐Ÿƒโฑ-โพโ‚-โ‚Žโˆ -โˆขโฆ›-โฆฏโ„˜โ„ฎใ‚›-ใ‚œ๐ŸŽ-๐Ÿก]|[^\\P{So}โ†-โ‡ฟ])(?:[[:word:]_!\\p{Lu}\\p{Ll}\\p{Lt}\\p{Lm}\\p{Lo}\\p{Nl}\\p{Sc}โ…€-โ…„โˆฟโŠพโŠฟโŠคโŠฅโˆ‚โˆ…-โˆ‡โˆŽโˆโˆโˆ‘โˆžโˆŸโˆซ-โˆณโ‹€-โ‹ƒโ—ธ-โ—ฟโ™ฏโŸ˜โŸ™โŸ€โŸโฆฐ-โฆดโจ€-โจ†โจ‰-โจ–โจ›โจœ๐›๐››๐›ป๐œ•๐œต๐๐ฏ๐ž‰๐žฉ๐Ÿƒโฑ-โพโ‚-โ‚Žโˆ -โˆขโฆ›-โฆฏโ„˜โ„ฎใ‚›-ใ‚œ๐ŸŽ-๐Ÿก]|[^\\P{Mn}\u0001-ยก]|[^\\P{Mc}\u0001-ยก]|[^\\P{Nd}\u0001-ยก]|[^\\P{Pc}\u0001-ยก]|[^\\P{Sk}\u0001-ยก]|[^\\P{Me}\u0001-ยก]|[^\\P{No}\u0001-ยก]|[โ€ฒ-โ€ทโ—]|[^\\P{So}โ†-โ‡ฟ])*)({(?:[^{}]|{(?:[^{}]|{[^{}]*})*})*})?|\\s*)(?=\\()", + "comment": "similar regex to previous, but with keyword not 1-line syntax" + } + ] + }, + "for_block": { + "comment": "for blocks need to be special-cased to support tokenizing 'outer' properly", + "patterns": [ + { + "begin": "\\b(for)\\b", + "beginCaptures": { + "0": { + "name": "keyword.control.julia" + } + }, + "end": "(?|<-|-->|=>)", + "name": "keyword.operator.arrow.julia" + }, + { + "match": "(?::=|\\+=|-=|\\*=|//=|/=|\\.//=|\\./=|\\.\\*=|\\\\=|\\.\\\\=|\\^=|\\.\\^=|%=|\\.%=|รท=|\\.รท=|\\|=|&=|\\.&=|โŠป=|\\.โŠป=|\\$=|<<=|>>=|>>>=|=(?!=))", + "name": "keyword.operator.update.julia" + }, + { + "match": "(?:<<|>>>|>>|\\.>>>|\\.>>|\\.<<)", + "name": "keyword.operator.shift.julia" + }, + { + "match": "(?:\\s*(::|>:|<:)\\s*((?:(?:Union)?\\([^)]*\\)|[[:alpha:]_$โˆ‡][[:word:]โบ-โ‚œ!โ€ฒ\\.]*(?:(?:{(?:[^{}]|{(?:[^{}]|{[^{}]*})*})*})|(?:\".+?(?=|\\.>|\\.<=|\\.<|\\.โ‰ค|\\.โ‰ฅ|==|\\.!=|\\.=|\\.!|<:|>:|:>|(?)>=|(?|<|โ‰ฅ|โ‰ค)", + "name": "keyword.operator.relation.julia" + }, + { + "match": "(?<=\\s)(?:\\?)(?=\\s)", + "name": "keyword.operator.ternary.julia" + }, + { + "match": "(?<=\\s)(?:\\:)(?=\\s)", + "name": "keyword.operator.ternary.julia" + }, + { + "match": "(?:\\|\\||&&|(?)", + "name": "keyword.operator.applies.julia" + }, + { + "match": "(?:\\||\\.\\||\\&|\\.\\&|~|\\.~|โŠป|\\.โŠป)", + "name": "keyword.operator.bitwise.julia" + }, + { + "match": "(?:\\+\\+|--|\\+|\\.\\+|-|\\.\\-|\\*|\\.\\*|//(?!=)|\\.//(?!=)|/|\\./|%|\\.%|\\\\|\\.\\\\|\\^|\\.\\^|รท|\\.รท|โ‹…|\\.โ‹…|โˆฉ|\\.โˆฉ|โˆช|\\.โˆช|ร—|โˆš|โˆ›)", + "name": "keyword.operator.arithmetic.julia" + }, + { + "match": "(?:โˆ˜)", + "name": "keyword.operator.compose.julia" + }, + { + "match": "(?:::|(?<=\\s)isa(?=\\s))", + "name": "keyword.operator.isa.julia" + }, + { + "match": "(?:(?<=\\s)in(?=\\s))", + "name": "keyword.operator.relation.in.julia" + }, + { + "match": "(?:\\.(?=(?:@|_|\\p{L}))|\\.\\.+)", + "name": "keyword.operator.dots.julia" + }, + { + "match": "(?:\\$)(?=.+)", + "name": "keyword.operator.interpolation.julia" + }, + { + "captures": { + "2": { + "name": "keyword.operator.transposed-variable.julia" + } + }, + "match": "((?:[[:alpha:]_\\p{Lu}\\p{Ll}\\p{Lt}\\p{Lm}\\p{Lo}\\p{Nl}\\p{Sc}โ…€-โ…„โˆฟโŠพโŠฟโŠคโŠฅโˆ‚โˆ…-โˆ‡โˆŽโˆโˆโˆ‘โˆžโˆŸโˆซ-โˆณโ‹€-โ‹ƒโ—ธ-โ—ฟโ™ฏโŸ˜โŸ™โŸ€โŸโฆฐ-โฆดโจ€-โจ†โจ‰-โจ–โจ›โจœ๐›๐››๐›ป๐œ•๐œต๐๐ฏ๐ž‰๐žฉ๐Ÿƒโฑ-โพโ‚-โ‚Žโˆ -โˆขโฆ›-โฆฏโ„˜โ„ฎใ‚›-ใ‚œ๐ŸŽ-๐Ÿก]|[^\\P{So}โ†-โ‡ฟ])(?:[[:word:]_!\\p{Lu}\\p{Ll}\\p{Lt}\\p{Lm}\\p{Lo}\\p{Nl}\\p{Sc}โ…€-โ…„โˆฟโŠพโŠฟโŠคโŠฅโˆ‚โˆ…-โˆ‡โˆŽโˆโˆโˆ‘โˆžโˆŸโˆซ-โˆณโ‹€-โ‹ƒโ—ธ-โ—ฟโ™ฏโŸ˜โŸ™โŸ€โŸโฆฐ-โฆดโจ€-โจ†โจ‰-โจ–โจ›โจœ๐›๐››๐›ป๐œ•๐œต๐๐ฏ๐ž‰๐žฉ๐Ÿƒโฑ-โพโ‚-โ‚Žโˆ -โˆขโฆ›-โฆฏโ„˜โ„ฎใ‚›-ใ‚œ๐ŸŽ-๐Ÿก]|[^\\P{Mn}\u0001-ยก]|[^\\P{Mc}\u0001-ยก]|[^\\P{Nd}\u0001-ยก]|[^\\P{Pc}\u0001-ยก]|[^\\P{Sk}\u0001-ยก]|[^\\P{Me}\u0001-ยก]|[^\\P{No}\u0001-ยก]|[โ€ฒ-โ€ทโ—]|[^\\P{So}โ†-โ‡ฟ])*)(('|(\\.'))*\\.?')" + }, + { + "captures": { + "1": { + "name": "bracket.end.julia" + }, + "2": { + "name": "keyword.operator.transposed-matrix.julia" + } + }, + "match": "(\\])((?:'|(?:\\.'))*\\.?')" + }, + { + "captures": { + "1": { + "name": "bracket.end.julia" + }, + "2": { + "name": "keyword.operator.transposed-parens.julia" + } + }, + "match": "(\\))((?:'|(?:\\.'))*\\.?')" + } + ] + }, + "string": { + "patterns": [ + { + "begin": "(?:(@doc)\\s((?:doc)?\"\"\")|(doc\"\"\"))", + "beginCaptures": { + "1": { + "name": "support.function.macro.julia" + }, + "2": { + "name": "punctuation.definition.string.begin.julia" + } + }, + "end": "(\"\"\") ?(->)?", + "endCaptures": { + "1": { + "name": "punctuation.definition.string.end.julia" + }, + "2": { + "name": "keyword.operator.arrow.julia" + } + }, + "name": "string.docstring.julia", + "patterns": [ + { + "include": "#string_escaped_char" + }, + { + "include": "#string_dollar_sign_interpolate" + } + ] + }, + { + "begin": "(i?cxx)(\"\"\")", + "beginCaptures": { + "1": { + "name": "support.function.macro.julia" + }, + "2": { + "name": "punctuation.definition.string.begin.julia" + } + }, + "end": "\"\"\"", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.julia" + } + }, + "name": "embed.cxx.julia", + "contentName": "meta.embedded.inline.cpp", + "patterns": [ + { + "include": "source.cpp#root_context" + }, + { + "include": "#string_dollar_sign_interpolate" + } + ] + }, + { + "begin": "(py)(\"\"\")", + "beginCaptures": { + "1": { + "name": "support.function.macro.julia" + }, + "2": { + "name": "punctuation.definition.string.begin.julia" + } + }, + "end": "([\\s\\w]*)(\"\"\")", + "endCaptures": { + "2": { + "name": "punctuation.definition.string.end.julia" + } + }, + "name": "embed.python.julia", + "contentName": "meta.embedded.inline.python", + "patterns": [ + { + "include": "source.python" + }, + { + "include": "#string_dollar_sign_interpolate" + } + ] + }, + { + "begin": "(js)(\"\"\")", + "beginCaptures": { + "1": { + "name": "support.function.macro.julia" + }, + "2": { + "name": "punctuation.definition.string.begin.julia" + } + }, + "end": "\"\"\"", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.julia" + } + }, + "name": "embed.js.julia", + "contentName": "meta.embedded.inline.javascript", + "patterns": [ + { + "include": "source.js" + }, + { + "include": "#string_dollar_sign_interpolate" + } + ] + }, + { + "begin": "(R)(\"\"\")", + "beginCaptures": { + "1": { + "name": "support.function.macro.julia" + }, + "2": { + "name": "punctuation.definition.string.begin.julia" + } + }, + "end": "\"\"\"", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.julia" + } + }, + "name": "embed.R.julia", + "contentName": "meta.embedded.inline.r", + "patterns": [ + { + "include": "source.r" + }, + { + "include": "#string_dollar_sign_interpolate" + } + ] + }, + { + "begin": "(raw)(\"\"\")", + "beginCaptures": { + "1": { + "name": "support.function.macro.julia" + }, + "2": { + "name": "punctuation.definition.string.begin.julia" + } + }, + "end": "\"\"\"", + "name": "string.quoted.other.julia", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.julia" + } + }, + "patterns": [ + { + "include": "#string_escaped_char" + } + ] + }, + { + "begin": "(raw)(\")", + "beginCaptures": { + "1": { + "name": "support.function.macro.julia" + }, + "2": { + "name": "punctuation.definition.string.begin.julia" + } + }, + "end": "\"", + "name": "string.quoted.other.julia", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.julia" + } + }, + "patterns": [ + { + "include": "#string_escaped_char" + } + ] + }, + { + "begin": "(sql)(\"\"\")", + "beginCaptures": { + "1": { + "name": "support.function.macro.julia" + }, + "2": { + "name": "punctuation.definition.string.begin.julia" + } + }, + "end": "\"\"\"", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.julia" + } + }, + "name": "embed.sql.julia", + "contentName": "meta.embedded.inline.sql", + "patterns": [ + { + "include": "source.sql" + }, + { + "include": "#string_dollar_sign_interpolate" + } + ] + }, + { + "begin": "var\"\"\"", + "end": "\"\"\"", + "name": "constant.other.symbol.julia", + "patterns": [ + { + "include": "#string_escaped_char" + } + ] + }, + { + "begin": "var\"", + "end": "\"", + "name": "constant.other.symbol.julia", + "patterns": [ + { + "include": "#string_escaped_char" + } + ] + }, + { + "begin": "^\\s?(doc)?(\"\"\")\\s?$", + "beginCaptures": { + "1": { + "name": "support.function.macro.julia" + }, + "2": { + "name": "punctuation.definition.string.begin.julia" + } + }, + "end": "(\"\"\")", + "endCaptures": { + "1": { + "name": "punctuation.definition.string.end.julia" + } + }, + "name": "string.docstring.julia", + "comment": "This only matches docstrings that start and end with triple quotes on\ntheir own line in the void", + "patterns": [ + { + "include": "#string_escaped_char" + }, + { + "include": "#string_dollar_sign_interpolate" + } + ] + }, + { + "begin": "'", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.julia" + } + }, + "end": "'(?!')", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.julia" + } + }, + "name": "string.quoted.single.julia", + "patterns": [ + { + "include": "#string_escaped_char" + } + ] + }, + { + "begin": "\"\"\"", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.multiline.begin.julia" + } + }, + "end": "\"\"\"", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.multiline.end.julia" + } + }, + "name": "string.quoted.triple.double.julia", + "comment": "multi-line string with triple double quotes", + "patterns": [ + { + "include": "#string_escaped_char" + }, + { + "include": "#string_dollar_sign_interpolate" + } + ] + }, + { + "name": "string.quoted.double.julia", + "begin": "\"(?!\"\")", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.julia" + } + }, + "end": "\"", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.julia" + } + }, + "comment": "String with single pair of double quotes. Regex matches isolated double quote", + "patterns": [ + { + "include": "#string_escaped_char" + }, + { + "include": "#string_dollar_sign_interpolate" + } + ] + }, + { + "begin": "r\"\"\"", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.regexp.begin.julia" + } + }, + "end": "(\"\"\")([imsx]{0,4})?", + "endCaptures": { + "1": { + "name": "punctuation.definition.string.regexp.end.julia" + }, + "2": { + "comment": "I took this scope name from python regex grammar", + "name": "keyword.other.option-toggle.regexp.julia" + } + }, + "name": "string.regexp.julia", + "patterns": [ + { + "include": "#string_escaped_char" + } + ] + }, + { + "begin": "r\"", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.regexp.begin.julia" + } + }, + "end": "(\")([imsx]{0,4})?", + "endCaptures": { + "1": { + "name": "punctuation.definition.string.regexp.end.julia" + }, + "2": { + "comment": "I took this scope name from python regex grammar", + "name": "keyword.other.option-toggle.regexp.julia" + } + }, + "name": "string.regexp.julia", + "patterns": [ + { + "include": "#string_escaped_char" + } + ] + }, + { + "begin": "(?!:_)(?:struct|mutable\\s+struct|abstract\\s+type|primitive\\s+type)\\s+((?:[[:alpha:]_\\p{Lu}\\p{Ll}\\p{Lt}\\p{Lm}\\p{Lo}\\p{Nl}\\p{Sc}โ…€-โ…„โˆฟโŠพโŠฟโŠคโŠฅโˆ‚โˆ…-โˆ‡โˆŽโˆโˆโˆ‘โˆžโˆŸโˆซ-โˆณโ‹€-โ‹ƒโ—ธ-โ—ฟโ™ฏโŸ˜โŸ™โŸ€โŸโฆฐ-โฆดโจ€-โจ†โจ‰-โจ–โจ›โจœ๐›๐››๐›ป๐œ•๐œต๐๐ฏ๐ž‰๐žฉ๐Ÿƒโฑ-โพโ‚-โ‚Žโˆ -โˆขโฆ›-โฆฏโ„˜โ„ฎใ‚›-ใ‚œ๐ŸŽ-๐Ÿก]|[^\\P{So}โ†-โ‡ฟ])(?:[[:word:]_!\\p{Lu}\\p{Ll}\\p{Lt}\\p{Lm}\\p{Lo}\\p{Nl}\\p{Sc}โ…€-โ…„โˆฟโŠพโŠฟโŠคโŠฅโˆ‚โˆ…-โˆ‡โˆŽโˆโˆโˆ‘โˆžโˆŸโˆซ-โˆณโ‹€-โ‹ƒโ—ธ-โ—ฟโ™ฏโŸ˜โŸ™โŸ€โŸโฆฐ-โฆดโจ€-โจ†โจ‰-โจ–โจ›โจœ๐›๐››๐›ป๐œ•๐œต๐๐ฏ๐ž‰๐žฉ๐Ÿƒโฑ-โพโ‚-โ‚Žโˆ -โˆขโฆ›-โฆฏโ„˜โ„ฎใ‚›-ใ‚œ๐ŸŽ-๐Ÿก]|[^\\P{Mn}\u0001-ยก]|[^\\P{Mc}\u0001-ยก]|[^\\P{Nd}\u0001-ยก]|[^\\P{Pc}\u0001-ยก]|[^\\P{Sk}\u0001-ยก]|[^\\P{Me}\u0001-ยก]|[^\\P{No}\u0001-ยก]|[โ€ฒ-โ€ทโ—]|[^\\P{So}โ†-โ‡ฟ])*)(\\s*(<:)\\s*(?:[[:alpha:]_\\p{Lu}\\p{Ll}\\p{Lt}\\p{Lm}\\p{Lo}\\p{Nl}\\p{Sc}โ…€-โ…„โˆฟโŠพโŠฟโŠคโŠฅโˆ‚โˆ…-โˆ‡โˆŽโˆโˆโˆ‘โˆžโˆŸโˆซ-โˆณโ‹€-โ‹ƒโ—ธ-โ—ฟโ™ฏโŸ˜โŸ™โŸ€โŸโฆฐ-โฆดโจ€-โจ†โจ‰-โจ–โจ›โจœ๐›๐››๐›ป๐œ•๐œต๐๐ฏ๐ž‰๐žฉ๐Ÿƒโฑ-โพโ‚-โ‚Žโˆ -โˆขโฆ›-โฆฏโ„˜โ„ฎใ‚›-ใ‚œ๐ŸŽ-๐Ÿก]|[^\\P{So}โ†-โ‡ฟ])(?:[[:word:]_!\\p{Lu}\\p{Ll}\\p{Lt}\\p{Lm}\\p{Lo}\\p{Nl}\\p{Sc}โ…€-โ…„โˆฟโŠพโŠฟโŠคโŠฅโˆ‚โˆ…-โˆ‡โˆŽโˆโˆโˆ‘โˆžโˆŸโˆซ-โˆณโ‹€-โ‹ƒโ—ธ-โ—ฟโ™ฏโŸ˜โŸ™โŸ€โŸโฆฐ-โฆดโจ€-โจ†โจ‰-โจ–โจ›โจœ๐›๐››๐›ป๐œ•๐œต๐๐ฏ๐ž‰๐žฉ๐Ÿƒโฑ-โพโ‚-โ‚Žโˆ -โˆขโฆ›-โฆฏโ„˜โ„ฎใ‚›-ใ‚œ๐ŸŽ-๐Ÿก]|[^\\P{Mn}\u0001-ยก]|[^\\P{Mc}\u0001-ยก]|[^\\P{Nd}\u0001-ยก]|[^\\P{Pc}\u0001-ยก]|[^\\P{Sk}\u0001-ยก]|[^\\P{Me}\u0001-ยก]|[^\\P{No}\u0001-ยก]|[โ€ฒ-โ€ทโ—]|[^\\P{So}โ†-โ‡ฟ])*(?:{.*})?)?", + "name": "meta.type.julia" + } + ] + }, + "self_no_for_block": { + "comment": "Same as $self, but does not contain #for_block. 'outer' is not valid in some contexts (e.g. generators, comprehensions, indexing), so use this when matching those in begin/end patterns. Keep this up-to-date with $self!", + "patterns": [ + { + "include": "#operator" + }, + { + "include": "#array" + }, + { + "include": "#string" + }, + { + "include": "#parentheses" + }, + { + "include": "#bracket" + }, + { + "include": "#function_decl" + }, + { + "include": "#function_call" + }, + { + "include": "#keyword" + }, + { + "include": "#number" + }, + { + "include": "#comment" + }, + { + "include": "#type_decl" + }, + { + "include": "#symbol" + } + ] + } + } +} \ No newline at end of file diff --git a/language-configuration.json b/language-configuration.json new file mode 100644 index 0000000..e4affc8 --- /dev/null +++ b/language-configuration.json @@ -0,0 +1,31 @@ +{ + "comments": { + "lineComment": "//", + "blockComment": [ "(*", "*)" ] + }, + "brackets": [ + ["{", "}"], + ["[", "]"], + ["(", ")"] + ], + "autoClosingPairs": [ + { "open": "{", "close": "}" }, + { "open": "[", "close": "]" }, + { "open": "(", "close": ")" }, + { "open": "\"", "close": "\"", "notIn": ["string"] } + ], + "surroundingPairs": [ + ["{", "}"], + ["[", "]"], + ["(", ")"], + ["\"", "\""], + ["'", "'"] + ], + "folding": { + "offSide": true, + "markers": { + "start": "^\\s*//\\s*#region\\b|^\\s*\\(\\*\\s*#region(.*)\\*\\)", + "end": "^\\s*//\\s*#endregion\\b|^\\s*\\(\\*\\s*#endregion\\s*\\*\\)" + } + } +} diff --git a/lazyClientHost.ts b/lazyClientHost.ts new file mode 100644 index 0000000..be832b3 --- /dev/null +++ b/lazyClientHost.ts @@ -0,0 +1,102 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as vscode from 'vscode'; +import { CommandManager } from './commands/commandManager'; +import { IExperimentationTelemetryReporter } from './experimentTelemetryReporter'; +import { OngoingRequestCancellerFactory } from './tsServer/cancellation'; +import { ILogDirectoryProvider } from './tsServer/logDirectoryProvider'; +import { TsServerProcessFactory } from './tsServer/server'; +import { ITypeScriptVersionProvider } from './tsServer/versionProvider'; +import TypeScriptServiceClientHost from './typeScriptServiceClientHost'; +import { ActiveJsTsEditorTracker } from './ui/activeJsTsEditorTracker'; +import ManagedFileContextManager from './ui/managedFileContext'; +import { ServiceConfigurationProvider } from './configuration/configuration'; +import * as fileSchemes from './configuration/fileSchemes'; +import { standardLanguageDescriptions } from './configuration/languageDescription'; +import { Lazy, lazy } from './utils/lazy'; +import { Logger } from './logging/logger'; +import { PluginManager } from './tsServer/plugins'; + +export function createLazyClientHost( + context: vscode.ExtensionContext, + onCaseInsensitiveFileSystem: boolean, + services: { + pluginManager: PluginManager; + commandManager: CommandManager; + logDirectoryProvider: ILogDirectoryProvider; + cancellerFactory: OngoingRequestCancellerFactory; + versionProvider: ITypeScriptVersionProvider; + processFactory: TsServerProcessFactory; + activeJsTsEditorTracker: ActiveJsTsEditorTracker; + serviceConfigurationProvider: ServiceConfigurationProvider; + experimentTelemetryReporter: IExperimentationTelemetryReporter | undefined; + logger: Logger; + }, + onCompletionAccepted: (item: vscode.CompletionItem) => void, +): Lazy { + return lazy(() => { + const clientHost = new TypeScriptServiceClientHost( + standardLanguageDescriptions, + context, + onCaseInsensitiveFileSystem, + services, + onCompletionAccepted); + + context.subscriptions.push(clientHost); + + return clientHost; + }); +} + +export function lazilyActivateClient( + lazyClientHost: Lazy, + pluginManager: PluginManager, + activeJsTsEditorTracker: ActiveJsTsEditorTracker, + onActivate: () => Promise = () => Promise.resolve(), +): vscode.Disposable { + const disposables: vscode.Disposable[] = []; + + const supportedLanguage = [ + ...standardLanguageDescriptions.map(x => x.languageIds), + ...pluginManager.plugins.map(x => x.languages) + ].flat(); + + let hasActivated = false; + const maybeActivate = (textDocument: vscode.TextDocument): boolean => { + if (!hasActivated && isSupportedDocument(supportedLanguage, textDocument)) { + hasActivated = true; + + onActivate().then(() => { + // Force activation + void lazyClientHost.value; + + disposables.push(new ManagedFileContextManager(activeJsTsEditorTracker)); + }); + + return true; + } + return false; + }; + + const didActivate = vscode.workspace.textDocuments.some(maybeActivate); + if (!didActivate) { + const openListener = vscode.workspace.onDidOpenTextDocument(doc => { + if (maybeActivate(doc)) { + openListener.dispose(); + } + }, undefined, disposables); + } + + return vscode.Disposable.from(...disposables); +} + +function isSupportedDocument( + supportedLanguage: readonly string[], + document: vscode.TextDocument +): boolean { + return supportedLanguage.indexOf(document.languageId) >= 0 + && !fileSchemes.disabledSchemes.has(document.uri.scheme); +} diff --git a/logDirectoryProvider.electron.ts b/logDirectoryProvider.electron.ts new file mode 100644 index 0000000..69f9515 --- /dev/null +++ b/logDirectoryProvider.electron.ts @@ -0,0 +1,41 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as fs from 'fs'; +import * as path from 'path'; +import * as vscode from 'vscode'; +import { memoize } from '../utils/memoize'; +import { ILogDirectoryProvider } from './logDirectoryProvider'; + +export class NodeLogDirectoryProvider implements ILogDirectoryProvider { + public constructor( + private readonly context: vscode.ExtensionContext + ) { } + + public getNewLogDirectory(): vscode.Uri | undefined { + const root = this.logDirectory(); + if (root) { + try { + return vscode.Uri.file(fs.mkdtempSync(path.join(root, `tsserver-log-`))); + } catch (e) { + return undefined; + } + } + return undefined; + } + + @memoize + private logDirectory(): string | undefined { + try { + const path = this.context.logPath; + if (!fs.existsSync(path)) { + fs.mkdirSync(path); + } + return this.context.logPath; + } catch { + return undefined; + } + } +} diff --git a/logDirectoryProvider.ts b/logDirectoryProvider.ts new file mode 100644 index 0000000..a35a178 --- /dev/null +++ b/logDirectoryProvider.ts @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as vscode from 'vscode'; + +export interface ILogDirectoryProvider { + getNewLogDirectory(): vscode.Uri | undefined; +} + +export const noopLogDirectoryProvider = new class implements ILogDirectoryProvider { + public getNewLogDirectory(): undefined { + return undefined; + } +}; diff --git a/logger.ts b/logger.ts new file mode 100644 index 0000000..33139b1 --- /dev/null +++ b/logger.ts @@ -0,0 +1,35 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as vscode from 'vscode'; +import { memoize } from '../utils/memoize'; + +export class Logger { + + @memoize + private get output(): vscode.LogOutputChannel { + return vscode.window.createOutputChannel('TypeScript', { log: true }); + } + + public get logLevel(): vscode.LogLevel { + return this.output.logLevel; + } + + public info(message: string, ...args: any[]): void { + this.output.info(message, ...args); + } + + public trace(message: string, ...args: any[]): void { + this.output.trace(message, ...args); + } + + public error(message: string, data?: any): void { + // See https://github.com/microsoft/TypeScript/issues/10496 + if (data && data.message === 'No content available.') { + return; + } + this.output.error(message, ...(data ? [data] : [])); + } +} diff --git a/memFs.ts b/memFs.ts new file mode 100644 index 0000000..02476ec --- /dev/null +++ b/memFs.ts @@ -0,0 +1,198 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as vscode from 'vscode'; +import { basename, dirname } from 'path'; + +export class MemFs implements vscode.FileSystemProvider { + + private readonly root = new FsEntry( + new Map(), + 0, + 0, + ); + + stat(uri: vscode.Uri): vscode.FileStat { + // console.log('stat', uri.toString()); + const entry = this.getEntry(uri); + if (!entry) { + throw vscode.FileSystemError.FileNotFound(); + } + + return entry; + } + + readDirectory(uri: vscode.Uri): [string, vscode.FileType][] { + // console.log('readDirectory', uri.toString()); + + const entry = this.getEntry(uri); + if (!entry) { + throw vscode.FileSystemError.FileNotFound(); + } + + return [...entry.contents.entries()].map(([name, entry]) => [name, entry.type]); + } + + readFile(uri: vscode.Uri): Uint8Array { + // console.log('readFile', uri.toString()); + + const entry = this.getEntry(uri); + if (!entry) { + throw vscode.FileSystemError.FileNotFound(); + } + + return entry.data; + } + + writeFile(uri: vscode.Uri, content: Uint8Array, { create, overwrite }: { create: boolean; overwrite: boolean }): void { + // console.log('writeFile', uri.toString()); + + const dir = this.getParent(uri); + + const fileName = basename(uri.path); + const dirContents = dir.contents; + + const time = Date.now() / 1000; + const entry = dirContents.get(basename(uri.path)); + if (!entry) { + if (create) { + dirContents.set(fileName, new FsEntry(content, time, time)); + this._emitter.fire([{ type: vscode.FileChangeType.Created, uri }]); + } else { + throw vscode.FileSystemError.FileNotFound(); + } + } else { + if (overwrite) { + entry.mtime = time; + entry.data = content; + this._emitter.fire([{ type: vscode.FileChangeType.Changed, uri }]); + } else { + throw vscode.FileSystemError.NoPermissions('overwrite option was not passed in'); + } + } + } + + rename(_oldUri: vscode.Uri, _newUri: vscode.Uri, _options: { overwrite: boolean }): void { + throw new Error('not implemented'); + } + + delete(uri: vscode.Uri): void { + try { + const dir = this.getParent(uri); + dir.contents.delete(basename(uri.path)); + this._emitter.fire([{ type: vscode.FileChangeType.Deleted, uri }]); + } catch (e) { } + } + + createDirectory(uri: vscode.Uri): void { + // console.log('createDirectory', uri.toString()); + const dir = this.getParent(uri); + const now = Date.now() / 1000; + dir.contents.set(basename(uri.path), new FsEntry(new Map(), now, now)); + } + + private getEntry(uri: vscode.Uri): FsEntry | void { + // TODO: have this throw FileNotFound itself? + // TODO: support configuring case sensitivity + let node: FsEntry = this.root; + for (const component of uri.path.split('/')) { + if (!component) { + // Skip empty components (root, stuff between double slashes, + // trailing slashes) + continue; + } + + if (node.type !== vscode.FileType.Directory) { + // We're looking at a File or such, so bail. + return; + } + + const next = node.contents.get(component); + + if (!next) { + // not found! + return; + } + + node = next; + } + return node; + } + + private getParent(uri: vscode.Uri) { + const dir = this.getEntry(uri.with({ path: dirname(uri.path) })); + if (!dir) { + throw vscode.FileSystemError.FileNotFound(); + } + return dir; + } + + // --- manage file events + + private readonly _emitter = new vscode.EventEmitter(); + + readonly onDidChangeFile: vscode.Event = this._emitter.event; + private readonly watchers = new Map>; + + watch(resource: vscode.Uri): vscode.Disposable { + if (!this.watchers.has(resource.path)) { + this.watchers.set(resource.path, new Set()); + } + const sy = Symbol(resource.path); + return new vscode.Disposable(() => { + const watcher = this.watchers.get(resource.path); + if (watcher) { + watcher.delete(sy); + if (!watcher.size) { + this.watchers.delete(resource.path); + } + } + }); + } +} + +class FsEntry { + get type(): vscode.FileType { + if (this._data instanceof Uint8Array) { + return vscode.FileType.File; + } else { + return vscode.FileType.Directory; + } + } + + get size(): number { + if (this.type === vscode.FileType.Directory) { + return [...this.contents.values()].reduce((acc: number, entry: FsEntry) => acc + entry.size, 0); + } else { + return this.data.length; + } + } + + constructor( + private _data: Uint8Array | Map, + public ctime: number, + public mtime: number, + ) { } + + get data() { + if (this.type === vscode.FileType.Directory) { + throw vscode.FileSystemError.FileIsADirectory; + } + return this._data; + } + set data(val: Uint8Array) { + if (this.type === vscode.FileType.Directory) { + throw vscode.FileSystemError.FileIsADirectory; + } + this._data = val; + } + + get contents() { + if (this.type !== vscode.FileType.Directory) { + throw vscode.FileSystemError.FileNotADirectory; + } + return >this._data; + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..8739e70 --- /dev/null +++ b/package.json @@ -0,0 +1,26 @@ +{ + "name": "theme-tomorrow-night-blue", + "displayName": "%displayName%", + "description": "%description%", + "version": "1.0.0", + "publisher": "vscode", + "license": "MIT", + "engines": { + "vscode": "*" + }, + "categories": ["Themes"], + "contributes": { + "themes": [ + { + "id": "Tomorrow Night Blue", + "label": "%themeLabel%", + "uiTheme": "vs-dark", + "path": "./themes/tomorrow-night-blue-color-theme.json" + } + ] + }, + "repository": { + "type": "git", + "url": "https://github.com/microsoft/vscode.git" + } +} diff --git a/package.nls.json b/package.nls.json new file mode 100644 index 0000000..77b4457 --- /dev/null +++ b/package.nls.json @@ -0,0 +1,5 @@ +{ + "displayName": "Tomorrow Night Blue Theme", + "description": "Tomorrow night blue theme for Visual Studio Code", + "themeLabel": "Tomorrow Night Blue" +} diff --git a/prettierrc.1.jpeg b/prettierrc.1.jpeg new file mode 100644 index 0000000..716b37d Binary files /dev/null and b/prettierrc.1.jpeg differ diff --git a/product.json b/product.json new file mode 100644 index 0000000..b17eeda --- /dev/null +++ b/product.json @@ -0,0 +1,84 @@ +{ + "nameShort": "Code - OSS", + "nameLong": "Code - OSS", + "applicationName": "code-oss", + "dataFolderName": ".vscode-oss", + "win32MutexName": "vscodeoss", + "licenseName": "MIT", + "licenseUrl": "https://github.com/microsoft/vscode/blob/main/LICENSE.txt", + "serverLicenseUrl": "https://github.com/microsoft/vscode/blob/main/LICENSE.txt", + "serverGreeting": [], + "serverLicense": [], + "serverLicensePrompt": "", + "serverApplicationName": "code-server-oss", + "serverDataFolderName": ".vscode-server-oss", + "tunnelApplicationName": "code-tunnel-oss", + "win32DirName": "Microsoft Code OSS", + "win32NameVersion": "Microsoft Code OSS", + "win32RegValueName": "CodeOSS", + "win32x64AppId": "{{D77B7E06-80BA-4137-BCF4-654B95CCEBC5}", + "win32arm64AppId": "{{D1ACE434-89C5-48D1-88D3-E2991DF85475}", + "win32x64UserAppId": "{{CC6B787D-37A0-49E8-AE24-8559A032BE0C}", + "win32arm64UserAppId": "{{3AEBF0C8-F733-4AD4-BADE-FDB816D53D7B}", + "win32AppUserModelId": "Microsoft.CodeOSS", + "win32ShellNameShort": "C&ode - OSS", + "win32TunnelServiceMutex": "vscodeoss-tunnelservice", + "win32TunnelMutex": "vscodeoss-tunnel", + "darwinBundleIdentifier": "com.visualstudio.code.oss", + "linuxIconName": "code-oss", + "licenseFileName": "LICENSE.txt", + "reportIssueUrl": "https://github.com/microsoft/vscode/issues/new", + "nodejsRepository": "https://nodejs.org", + "urlProtocol": "code-oss", + "webviewContentExternalBaseUrlTemplate": "https://{{uuid}}.vscode-cdn.net/insider/ef65ac1ba57f57f2a3961bfe94aa20481caca4c6/out/vs/workbench/contrib/webview/browser/pre/", + "builtInExtensions": [ + { + "name": "ms-vscode.js-debug-companion", + "version": "1.1.2", + "sha256": "e034b8b41beb4e97e02c70f7175bd88abe66048374c2bd629f54bb33354bc2aa", + "repo": "https://github.com/microsoft/vscode-js-debug-companion", + "metadata": { + "id": "99cb0b7f-7354-4278-b8da-6cc79972169d", + "publisherId": { + "publisherId": "5f5636e7-69ed-4afe-b5d6-8d231fb3d3ee", + "publisherName": "ms-vscode", + "displayName": "Microsoft", + "flags": "verified" + }, + "publisherDisplayName": "Microsoft" + } + }, + { + "name": "ms-vscode.js-debug", + "version": "1.86.1", + "sha256": "e382de75b63a57d3419bbb110e17551d40d88b4bb0a49452dab2c7278b815e72", + "repo": "https://github.com/microsoft/vscode-js-debug", + "metadata": { + "id": "25629058-ddac-4e17-abba-74678e126c5d", + "publisherId": { + "publisherId": "5f5636e7-69ed-4afe-b5d6-8d231fb3d3ee", + "publisherName": "ms-vscode", + "displayName": "Microsoft", + "flags": "verified" + }, + "publisherDisplayName": "Microsoft" + } + }, + { + "name": "ms-vscode.vscode-js-profile-table", + "version": "1.0.8", + "sha256": "ca30069e21fbf576b49638ff8ff7c316b028c2faca924c23526737c65b8762bf", + "repo": "https://github.com/microsoft/vscode-js-profile-visualizer", + "metadata": { + "id": "7e52b41b-71ad-457b-ab7e-0620f1fc4feb", + "publisherId": { + "publisherId": "5f5636e7-69ed-4afe-b5d6-8d231fb3d3ee", + "publisherName": "ms-vscode", + "displayName": "Microsoft", + "flags": "verified" + }, + "publisherDisplayName": "Microsoft" + } + } + ] +} diff --git a/received_382928693030876.jpeg b/received_382928693030876.jpeg new file mode 100644 index 0000000..d0aecaf Binary files /dev/null and b/received_382928693030876.jpeg differ diff --git a/textcell-master.zip b/textcell-master.zip new file mode 100644 index 0000000..5cd4b77 Binary files /dev/null and b/textcell-master.zip differ diff --git a/thongdong7.thongdong7-snippets-0.0.19.zip b/thongdong7.thongdong7-snippets-0.0.19.zip new file mode 100644 index 0000000..eef2252 Binary files /dev/null and b/thongdong7.thongdong7-snippets-0.0.19.zip differ diff --git a/tomorrow-night-blue-color-theme.json b/tomorrow-night-blue-color-theme.json new file mode 100644 index 0000000..28fb8cd --- /dev/null +++ b/tomorrow-night-blue-color-theme.json @@ -0,0 +1,296 @@ +{ + "type": "dark", + "colors": { + "focusBorder": "#bbdaff", + "errorForeground": "#a92049", + "input.background": "#001733", + "dropdown.background": "#001733", + "quickInputList.focusBackground": "#ffffff60", + "list.activeSelectionBackground": "#ffffff60", + "list.inactiveSelectionBackground": "#ffffff40", + "list.hoverBackground": "#ffffff30", + "list.highlightForeground": "#bbdaff", + "pickerGroup.foreground": "#bbdaff", + "editor.background": "#002451", + "editor.foreground": "#ffffff", + "editor.selectionBackground": "#003f8e", + "minimap.selectionHighlight": "#003f8e", + "editor.lineHighlightBackground": "#00346e", + "editorLineNumber.activeForeground": "#949494", + "editorCursor.foreground": "#ffffff", + "editorWhitespace.foreground": "#404f7d", + "editorWidget.background": "#001c40", + "editorHoverWidget.background": "#001c40", + "editorHoverWidget.border": "#ffffff44", + "editorGroup.border": "#404f7d", + "editorGroupHeader.tabsBackground": "#001733", + "editorGroup.dropBackground": "#25375daa", + "peekViewResult.background": "#001c40", + "tab.inactiveBackground": "#001c40", + "tab.lastPinnedBorder": "#007acc80", + "debugToolBar.background": "#001c40", + "titleBar.activeBackground": "#001126", + "statusBar.background": "#001126", + "statusBarItem.remoteBackground": "#0e639c", + "ports.iconRunningProcessForeground": "#bbdaff", + "statusBar.noFolderBackground": "#001126", + "statusBar.debuggingBackground": "#001126", + "activityBar.background": "#001733", + "progressBar.background": "#bbdaffcc", + "badge.background": "#bbdaffcc", + "badge.foreground": "#001733", + "sideBar.background": "#001c40", + "terminal.ansiBlack": "#111111", + "terminal.ansiRed": "#ff9da4", + "terminal.ansiGreen": "#d1f1a9", + "terminal.ansiYellow": "#ffeead", + "terminal.ansiBlue": "#bbdaff", + "terminal.ansiMagenta": "#ebbbff", + "terminal.ansiCyan": "#99ffff", + "terminal.ansiWhite": "#cccccc", + "terminal.ansiBrightBlack": "#333333", + "terminal.ansiBrightRed": "#ff7882", + "terminal.ansiBrightGreen": "#b8f171", + "terminal.ansiBrightYellow": "#ffe580", + "terminal.ansiBrightBlue": "#80baff", + "terminal.ansiBrightMagenta": "#d778ff", + "terminal.ansiBrightCyan": "#78ffff", + "terminal.ansiBrightWhite": "#ffffff" + }, + "tokenColors": [ + { + "settings": { + "background": "#002451", + "foreground": "#FFFFFF" + } + }, + { + "scope": [ + "meta.embedded", + "source.groovy.embedded", + "meta.jsx.children", + "string meta.image.inline.markdown", + "variable.legacy.builtin.python" + ], + "settings": { + //"background": "#002451", + "foreground": "#FFFFFF" + } + }, + { + "name": "Comment", + "scope": "comment", + "settings": { + "foreground": "#7285B7" + } + }, + { + "name": "Foreground, Operator", + "scope": "keyword.operator.class, keyword.operator, constant.other, source.php.embedded.line", + "settings": { + "fontStyle": "", + "foreground": "#FFFFFF" + } + }, + { + "name": "Variable, String Link, Regular Expression, Tag Name, GitGutter deleted", + "scope": "variable, support.other.variable, string.other.link, string.regexp, entity.name.tag, entity.other.attribute-name, meta.tag, declaration.tag, markup.deleted.git_gutter", + "settings": { + "foreground": "#FF9DA4" + } + }, + { + "name": "Number, Constant, Function Argument, Tag Attribute, Embedded", + "scope": "constant.numeric, constant.language, support.constant, constant.character, variable.parameter, punctuation.section.embedded, keyword.other.unit", + "settings": { + "fontStyle": "", + "foreground": "#FFC58F" + } + }, + { + "name": "Class, Support", + "scope": "entity.name.class, entity.name.type, entity.name.namespace, entity.name.scope-resolution, support.type, support.class", + "settings": { + "fontStyle": "", + "foreground": "#FFEEAD" + } + }, + { + "name": "String, Symbols, Inherited Class, Markup Heading, GitGutter inserted", + "scope": "string, constant.other.symbol, entity.other.inherited-class, markup.heading, markup.inserted.git_gutter", + "settings": { + "fontStyle": "", + "foreground": "#D1F1A9" + } + }, + { + "name": "Operator, Misc", + "scope": "keyword.operator, constant.other.color", + "settings": { + "foreground": "#99FFFF" + } + }, + { + "name": "Function, Special Method, Block Level, GitGutter changed", + "scope": "entity.name.function, meta.function-call, support.function, keyword.other.special-method, meta.block-level, markup.changed.git_gutter", + "settings": { + "fontStyle": "", + "foreground": "#BBDAFF" + } + }, + { + "name": "Keyword, Storage", + "scope": [ + "keyword, storage, storage.type, entity.name.tag.css", + "entity.name.tag.less" + ], + "settings": { + "fontStyle": "", + "foreground": "#EBBBFF" + } + }, + { + "name": "Invalid", + "scope": "invalid", + "settings": { + //"background": "#F99DA5", + "fontStyle": "", + "foreground": "#a92049" + } + }, + { + "name": "Separator", + "scope": "meta.separator", + "settings": { + //"background": "#BBDAFE", + "foreground": "#FFFFFF" + } + }, + { + "name": "Deprecated", + "scope": "invalid.deprecated", + "settings": { + //"background": "#EBBBFF", + "fontStyle": "", + "foreground": "#cd9731" + } + }, + { + "name": "Diff foreground", + "scope": "markup.inserted.diff, markup.deleted.diff, meta.diff.header.to-file, meta.diff.header.from-file", + "settings": { + "foreground": "#FFFFFF" + } + }, + { + "name": "Diff insertion", + "scope": "markup.inserted.diff, meta.diff.header.to-file", + "settings": { + "foreground": "#718c00" + } + }, + { + "name": "Diff deletion", + "scope": "markup.deleted.diff, meta.diff.header.from-file", + "settings": { + "foreground": "#c82829" + } + }, + { + "name": "Diff header", + "scope": "meta.diff.header.from-file, meta.diff.header.to-file", + "settings": { + "foreground": "#4271ae" + } + }, + { + "name": "Diff range", + "scope": "meta.diff.range", + "settings": { + "fontStyle": "italic", + "foreground": "#3e999f" + } + }, + { + "name": "Markup Quote", + "scope": "markup.quote", + "settings": { + "foreground": "#FFC58F" + } + }, + { + "name": "Markup Lists", + "scope": "markup.list", + "settings": { + "foreground": "#BBDAFF" + } + }, + { + "name": "Markup Styling", + "scope": "markup.bold, markup.italic", + "settings": { + "foreground": "#FFC58F" + } + }, + { + "name": "Markup: Strong", + "scope": "markup.bold", + "settings": { + "fontStyle": "bold" + } + }, + { + "name": "Markup: Emphasis", + "scope": "markup.italic", + "settings": { + "fontStyle": "italic" + } + }, + { + "scope": "markup.strikethrough", + "settings": { + "fontStyle": "strikethrough" + } + }, + { + "name": "Markup Inline", + "scope": "markup.inline.raw", + "settings": { + "fontStyle": "", + "foreground": "#FF9DA4" + } + }, + { + "name": "Markup Headings", + "scope": "markup.heading", + "settings": { + "fontStyle": "bold" + } + }, + { + "scope": "token.info-token", + "settings": { + "foreground": "#6796e6" + } + }, + { + "scope": "token.warn-token", + "settings": { + "foreground": "#cd9731" + } + }, + { + "scope": "token.error-token", + "settings": { + "foreground": "#f44747" + } + }, + { + "scope": "token.debug-token", + "settings": { + "foreground": "#b267e6" + } + } + ], + "semanticHighlighting": true +} diff --git a/tracked_links.pages b/tracked_links.pages new file mode 100644 index 0000000..15423f1 Binary files /dev/null and b/tracked_links.pages differ diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..f0f7c00 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "../tsconfig.base.json", + "compilerOptions": { + "outDir": "./out", + }, + "include": [ + "src/**/*", + "../../src/vscode-dts/vscode.d.ts" + ] +} diff --git a/tsfmt.json b/tsfmt.json new file mode 100644 index 0000000..741eb1e --- /dev/null +++ b/tsfmt.json @@ -0,0 +1,17 @@ +{ + "tabSize": 4, + "indentSize": 4, + "convertTabsToSpaces": false, + "insertSpaceAfterCommaDelimiter": true, + "insertSpaceAfterSemicolonInForStatements": true, + "insertSpaceBeforeAndAfterBinaryOperators": true, + "insertSpaceAfterKeywordsInControlFlowStatements": true, + "insertSpaceAfterFunctionKeywordForAnonymousFunctions": true, + "insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis": false, + "insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets": false, + "insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces": false, + "insertSpaceAfterOpeningAndBeforeClosingEmptyBraces": true, + "insertSpaceBeforeFunctionParenthesis": false, + "placeOpenBraceOnNewLineForFunctions": false, + "placeOpenBraceOnNewLineForControlBlocks": false +} diff --git a/unnamed-1.jpeg b/unnamed-1.jpeg new file mode 100644 index 0000000..94980d4 Binary files /dev/null and b/unnamed-1.jpeg differ diff --git a/update-grammars.mjs b/update-grammars.mjs new file mode 100644 index 0000000..175f83f --- /dev/null +++ b/update-grammars.mjs @@ -0,0 +1,95 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// @ts-check + +import { update } from 'vscode-grammar-updater'; + +function removeDom(grammar) { + grammar.repository['support-objects'].patterns = grammar.repository['support-objects'].patterns.filter(pattern => { + if (pattern.match && ( + /\b(HTMLElement|ATTRIBUTE_NODE|stopImmediatePropagation)\b/g.test(pattern.match) + || /\bJSON\b/g.test(pattern.match) + || /\bMath\b/g.test(pattern.match) + )) { + return false; + } + + if (pattern.name?.startsWith('support.class.error.') + || pattern.name?.startsWith('support.class.builtin.') + || pattern.name?.startsWith('support.function.') + ) { + return false; + } + + return true; + }); + return grammar; +} + +function removeNodeTypes(grammar) { + grammar.repository['support-objects'].patterns = grammar.repository['support-objects'].patterns.filter(pattern => { + if (pattern.name) { + if (pattern.name.startsWith('support.variable.object.node') || pattern.name.startsWith('support.class.node.')) { + return false; + } + } + if (pattern.captures) { + if (Object.values(pattern.captures).some(capture => + capture.name && (capture.name.startsWith('support.variable.object.process') + || capture.name.startsWith('support.class.console')) + )) { + return false; + } + } + return true; + }); + return grammar; +} + +function patchJsdoctype(grammar) { + grammar.repository['jsdoctype'].patterns = grammar.repository['jsdoctype'].patterns.filter(pattern => { + if (pattern.name && pattern.name.includes('illegal')) { + return false; + } + return true; + }); + return grammar; +} + +function patchGrammar(grammar) { + return removeNodeTypes(removeDom(patchJsdoctype(grammar))); +} + +function adaptToJavaScript(grammar, replacementScope) { + grammar.name = 'JavaScript (with React support)'; + grammar.fileTypes = ['.js', '.jsx', '.es6', '.mjs', '.cjs']; + grammar.scopeName = `source${replacementScope}`; + + var fixScopeNames = function (rule) { + if (typeof rule.name === 'string') { + rule.name = rule.name.replace(/\.tsx/g, replacementScope); + } + if (typeof rule.contentName === 'string') { + rule.contentName = rule.contentName.replace(/\.tsx/g, replacementScope); + } + for (var property in rule) { + var value = rule[property]; + if (typeof value === 'object') { + fixScopeNames(value); + } + } + }; + + var repository = grammar.repository; + for (var key in repository) { + fixScopeNames(repository[key]); + } +} + +var tsGrammarRepo = 'microsoft/TypeScript-TmLanguage'; +update(tsGrammarRepo, 'TypeScript.tmLanguage', './syntaxes/TypeScript.tmLanguage.json', grammar => patchGrammar(grammar)); +update(tsGrammarRepo, 'TypeScriptReact.tmLanguage', './syntaxes/TypeScriptReact.tmLanguage.json', grammar => patchGrammar(grammar)); +update(tsGrammarRepo, 'TypeScriptReact.tmLanguage', '../javascript/syntaxes/JavaScript.tmLanguage.json', grammar => adaptToJavaScript(patchGrammar(grammar), '.js')); +update(tsGrammarRepo, 'TypeScriptReact.tmLanguage', '../javascript/syntaxes/JavaScriptReact.tmLanguage.json', grammar => adaptToJavaScript(patchGrammar(grammar), '.js.jsx')); diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..fb57ccd --- /dev/null +++ b/yarn.lock @@ -0,0 +1,4 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + +