master 24ea8a6908c8 cached
132 files
854.0 KB
246.4k tokens
514 symbols
1 requests
Download .txt
Showing preview only (899K chars total). Download the full file or copy to clipboard to get everything.
Repository: jupytercalpoly/jupyterlab-code-snippets
Branch: master
Commit: 24ea8a6908c8
Files: 132
Total size: 854.0 KB

Directory structure:
gitextract_5ffki41f/

├── .eslintignore
├── .eslintrc.js
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   └── feature_request.md
│   └── workflows/
│       └── build.yml
├── .gitignore
├── .husky/
│   ├── .gitignore
│   └── pre-commit
├── .prettierignore
├── .prettierrc
├── .vscode/
│   ├── launch.json
│   └── settings.json
├── LICENSE
├── MANIFEST.in
├── PRESSRELEASE.md
├── PROGRESS.md
├── README.md
├── babel.config.js
├── binder/
│   ├── environment.yml
│   ├── postBuild
│   ├── requirements.txt
│   └── workspace.json
├── coverage/
│   ├── CodeSnippetContentsService.ts.html
│   ├── CodeSnippetWidgetModel.ts.html
│   ├── base.css
│   ├── block-navigation.js
│   ├── clover.xml
│   ├── coverage-final.json
│   ├── index.html
│   ├── lcov-report/
│   │   ├── CodeSnippetContentsService.ts.html
│   │   ├── CodeSnippetWidgetModel.ts.html
│   │   ├── base.css
│   │   ├── block-navigation.js
│   │   ├── index.html
│   │   ├── prettify.css
│   │   ├── prettify.js
│   │   └── sorter.js
│   ├── lcov.info
│   ├── prettify.css
│   ├── prettify.js
│   └── sorter.js
├── cypress/
│   ├── fixtures/
│   │   └── example.json
│   ├── integration/
│   │   ├── codeSnippetService.spec.js
│   │   └── examples/
│   │       ├── actions.spec.js
│   │       ├── aliasing.spec.js
│   │       ├── assertions.spec.js
│   │       ├── connectors.spec.js
│   │       ├── cookies.spec.js
│   │       ├── cypress_api.spec.js
│   │       ├── files.spec.js
│   │       ├── local_storage.spec.js
│   │       ├── location.spec.js
│   │       ├── misc.spec.js
│   │       ├── navigation.spec.js
│   │       ├── network_requests.spec.js
│   │       ├── querying.spec.js
│   │       ├── spies_stubs_clocks.spec.js
│   │       ├── traversal.spec.js
│   │       ├── utilities.spec.js
│   │       ├── viewport.spec.js
│   │       ├── waiting.spec.js
│   │       └── window.spec.js
│   ├── plugins/
│   │   └── index.js
│   └── support/
│       ├── commands.js
│       └── index.js
├── cypress.json
├── docs/
│   ├── contributor/
│   │   ├── codebase.rst
│   │   ├── contribute.rst
│   │   └── snippet_metadata.rst
│   ├── getting_started/
│   │   ├── changelog.rst
│   │   ├── installation.rst
│   │   └── overview.rst
│   ├── index.rst
│   └── user/
│       ├── features.rst
│       ├── transition.rst
│       └── ux.rst
├── install.json
├── jest.config.js
├── junit.xml
├── jupyterlab-code-snippets/
│   ├── _version.py
│   └── labextension/
│       ├── build_log.json
│       ├── package.json
│       ├── schemas/
│       │   └── jupyterlab-code-snippets/
│       │       ├── package.json.orig
│       │       └── snippets.json
│       └── static/
│           ├── lib_index_js.be5d61b481146873348d.js
│           ├── remoteEntry.0a192b189a42c6f0af60.js
│           ├── style.js
│           ├── style_index_js.93ff47ff4745f8384ae9.js
│           └── vendors-node_modules_css-loader_dist_runtime_api_js-node_modules_css-loader_dist_runtime_cssW-7d5e6f.8245c3041950ff727f29.js
├── package.json
├── pyproject.toml
├── schema/
│   └── snippets.json
├── setup.py
├── snippets_example/
│   ├── carbon_emissions.json
│   ├── filter_income.json
│   ├── gdp_calculator.json
│   ├── generate_hundred.json
│   ├── import_cleaning.json
│   ├── import_matlib.json
│   ├── life_exp_eur_asia.json
│   ├── lorenz_deriv.json
│   ├── matplotlib_import.json
│   ├── matrix_lstsqr.json
│   ├── most_frequent.json
│   ├── parallel_strings.json
│   ├── plotting_sine.json
│   ├── progress_bar.json
│   ├── sum_array.json
│   └── time_calculation.json
├── src/
│   ├── CodeSnippetContentsService.ts
│   ├── CodeSnippetDisplay.tsx
│   ├── CodeSnippetEditor.tsx
│   ├── CodeSnippetEditorTags.tsx
│   ├── CodeSnippetFilterTools.tsx
│   ├── CodeSnippetInputDialog.ts
│   ├── CodeSnippetLanguages.ts
│   ├── CodeSnippetMenu.ts
│   ├── CodeSnippetMessage.ts
│   ├── CodeSnippetPreview.ts
│   ├── CodeSnippetService.ts
│   ├── CodeSnippetUtilities.ts
│   ├── CodeSnippetWidget.tsx
│   ├── index.ts
│   └── svg.d.ts
├── style/
│   ├── base.css
│   ├── index.css
│   └── index.js
├── test/
│   ├── codeSnippetContentsService.test.ts
│   └── sample.test.ts
├── testutils/
│   └── jest-setup-files.js
├── tsconfig.json
└── tsconfig.test.json

================================================
FILE CONTENTS
================================================

================================================
FILE: .eslintignore
================================================
node_modules
dist
coverage
**/*.d.ts
test
_temp_extension
babel.config.ts
jest.config.ts


================================================
FILE: .eslintrc.js
================================================
module.exports = {
  extends: [
    'eslint:recommended',
    'plugin:@typescript-eslint/eslint-recommended',
    'plugin:@typescript-eslint/recommended',
    'plugin:prettier/recommended',
    'plugin:react/recommended'
  ],
  settings: {
    react: {
      createClass: "createReactClass", // Regex for Component Factory to use,
                                         // default to "createReactClass"
      pragma: "React",  // Pragma to use, default to "React"
      fragment: "Fragment",  // Fragment to use (may be a property of <pragma>), default to "Fragment"
      version: "detect", // React version. "detect" automatically picks the version you have installed.
                           // You can also use `16.0`, `16.3`, etc, if you want to override the detected value.
                           // default to latest and warns if missing
                           // It will default to "detect" in the future
      flowVersion: "0.53" // Flow version
    }
  },
  parser: '@typescript-eslint/parser',
  parserOptions: {
    project: 'tsconfig.json',
    sourceType: 'module'
  },
  plugins: ['@typescript-eslint', 'react'],
  rules: {
    '@typescript-eslint/camelcase': 'off',
    '@typescript-eslint/no-unused-vars': ['warn', { args: 'none' }],
    '@typescript-eslint/no-explicit-any': 'off',
    '@typescript-eslint/no-namespace': 'off',
    '@typescript-eslint/no-use-before-define': 'off',
    '@typescript-eslint/no-control-regex': 'off',
    '@typescript-eslint/quotes': [
      'error',
      'single',
      { avoidEscape: true, allowTemplateLiterals: false }
    ],
    curly: ['error', 'all'],
    eqeqeq: 'error',
    'prefer-arrow-callback': 'error'
  },
  ignorePatterns: ['.eslintrc.js']
};


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: ''
assignees: ''

---

**Describe the bug**
A clear and concise description of what the bug is.

**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error

**Expected behavior**
A clear and concise description of what you expected to happen.

**Screenshots**
If applicable, add screenshots to help explain your problem.

**Desktop (please complete the following information):**
 - OS: [e.g. iOS]
 - Browser [e.g. chrome, safari]
 - Version [e.g. 22]

**Additional context**
Add any other context about the problem here.


================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: ''
assignees: ''

---

**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]

**Describe the solution you'd like**
A clear and concise description of what you want to happen.

**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.

**Additional context**
Add any other context or screenshots about the feature request here.


================================================
FILE: .github/workflows/build.yml
================================================
name: Build

on:
  push:
    branches: master
  pull_request:
    branches: '*'

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - name: Checkout
      uses: actions/checkout@v2
    - name: Install node
      uses: actions/setup-node@v2
      with:
       node-version: '16.x'
    - name: Install Python
      uses: actions/setup-python@v2
      with:
        python-version: '3.7'
        architecture: 'x64'
    - name: Install dependencies
      run: python -m pip install jupyterlab
    - name: Build the extension
      run: |
        jlpm
        jlpm run eslint:check
        python -m pip install .

        python -m jupyterlab.browser_check


================================================
FILE: .gitignore
================================================
*.bundle.*
lib/
node_modules/
*.egg-info/
.ipynb_checkpoints
*.tsbuildinfo
*.ipynb
.eslintcache
snippets/
dist/

*/labextension/*.tgz
# Created by https://www.gitignore.io/api/python
# Edit at https://www.gitignore.io/?templates=python

### Python ###
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class

# C extensions
*.so

# Distribution / packaging
.Python
build/
develop-eggs/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
pip-wheel-metadata/
share/python-wheels/
.installed.cfg
*.egg
MANIFEST

# PyInstaller
#  Usually these files are written by a python script from a template
#  before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec

# Installer logs
pip-log.txt
pip-delete-this-directory.txt

# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
.hypothesis/
.pytest_cache/

# Translations
*.mo
*.pot

# Scrapy stuff:
.scrapy

# Sphinx documentation
docs/_build/

# PyBuilder
target/

# pyenv
.python-version

# celery beat schedule file
celerybeat-schedule

# SageMath parsed files
*.sage.py

# Spyder project settings
.spyderproject
.spyproject

# Rope project settings
.ropeproject

# Mr Developer
.mr.developer.cfg
.project
.pydevproject

# mkdocs documentation
/site

# mypy
.mypy_cache/
.dmypy.json
dmypy.json

# Pyre type checker
.pyre/

.DS_Store

# End of https://www.gitignore.io/api/python


# Jupyter Stuff
_temp_extension/
yarn.lock

================================================
FILE: .husky/.gitignore
================================================
_


================================================
FILE: .husky/pre-commit
================================================
#!/bin/sh

. "$(dirname "$0")/_/husky.sh"

npx --no-install lint-staged
jlpm lint-staged

================================================
FILE: .prettierignore
================================================
node_modules
**/node_modules
**/lib
**/package.json


================================================
FILE: .prettierrc
================================================
{
  "singleQuote": true
}


================================================
FILE: .vscode/launch.json
================================================
{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "type": "chrome",
            "request": "launch",
            "name": "Launch Chrome against localhost",
            "url": "http://localhost:8080",
            "webRoot": "${workspaceFolder}"
        }
    ]
}

================================================
FILE: .vscode/settings.json
================================================
{
    "workbench.colorCustomizations": {
        "activityBar.activeBackground": "#1f6fd0",
        "activityBar.background": "#1f6fd0",
        "activityBar.foreground": "#e7e7e7",
        "activityBar.inactiveForeground": "#e7e7e799",
        "activityBarBadge.background": "#ee90bb",
        "activityBarBadge.foreground": "#15202b",
        "commandCenter.border": "#e7e7e799",
        "sash.hoverBorder": "#1f6fd0",
        "statusBar.background": "#1857a4",
        "statusBar.foreground": "#e7e7e7",
        "statusBarItem.hoverBackground": "#1f6fd0",
        "statusBarItem.remoteBackground": "#1857a4",
        "statusBarItem.remoteForeground": "#e7e7e7",
        "titleBar.activeBackground": "#1857a4",
        "titleBar.activeForeground": "#e7e7e7",
        "titleBar.inactiveBackground": "#1857a499",
        "titleBar.inactiveForeground": "#e7e7e799"
    },
    "peacock.remoteColor": "#1857a4"
}

================================================
FILE: LICENSE
================================================
BSD 3-Clause License

Copyright (c) 2020, jupytercalpoly
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

1. Redistributions of source code must retain the above copyright notice, this
   list of conditions and the following disclaimer.

2. 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.

3. Neither the name of the copyright holder 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 HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

-----------------------------------------------------------------------------------------------------------------
Some lines of code in this extension are from Elyra's code snippet extension (https://github.com/elyra-ai/elyra).
-----------------------------------------------------------------------------------------------------------------

                                 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.


================================================
FILE: MANIFEST.in
================================================
include LICENSE
include README.md
include pyproject.toml
include install.json

include package.json
include ts*.json
graft jupyterlab-code-snippets/labextension

# Javascript files
graft src
graft style
prune **/node_modules
prune lib

# Patterns to exclude from any directory
global-exclude *~
global-exclude *.pyc
global-exclude *.pyo
global-exclude .git
global-exclude .ipynb_checkpoints


================================================
FILE: PRESSRELEASE.md
================================================
# **JupyterLab Code Snippets**

## **JupyterLab Code Snippets empowers you to write code more rapidly**

Do you find yourself typing in the same code blocks over and over again? Are you tired of clicking through tabs online for starter code or browsing old notebook files to find the right import statements? Save, reuse, and share code snippets using JupyterLab Code Snippets! In the past, you would spend more time scouring the internet than actually working. Searching old code for snippets is like searching for your lost keys; it’s frustrating!

JupyterLab Code Snippets allows you to create and store code snippets that can be inserted into any JupyterLab workspace and save you from the hassle of typing repetitive code. Code snippets are pieces of code or individual cells that are frequently used. Simply browse or search snippets in the Snippets panel to use wherever you need in JupyterLab.

Using JupyterLab code snippets is easy! Simply open the snippet explorer and browse through the provided predefined code snippets. Still can’t find what you need? Simply highlight code and right-click to save as a snippet or drag cells into the panel. Find snippets by utilizing the search, filter, and preview features. For a fresh start, select the plus icon in the snippet panel to construct a completely new, custom snippet. Also, edit your snippet quickly at any time by clicking the edit icon on the snippet. To use your snippets, you can drag and drop a code snippet to insert it as a cell or press the insert icon on the snippet to inject the code where your cursor is located within the JupyterLab workspace.

*“I’ve grown accustomed to opening an old notebook and searching through it in order to find the necessary import statements every time I start a new project. But, with the JupyterLab Code Snippets extension, I saved a lot of time by storing them as snippets and inserting them directly into my workflow.” - amazed customer*

This new extension unlocks the exciting ability to seamlessly incorporate code snippets. You can now store the frequently used code as a snippet and use it quickly. Save time, save energy, and get down to business with JupyterLab Code Snippets!


================================================
FILE: PROGRESS.md
================================================
# Log of Features and Updates

## Feature List

- [x] Scrollable snippet panel displaying snippets
- [x] Right click and save highlighted code (lines of code)
- [x] Copy snippet
- [x] Delete snippet
- [x] Insert snippet
- [x] Drag cell into panel to save (lines of code)
- [x] Search bar for snippets
- [x] Snippet preview (on the side)
- [x] Drag snippet into notebook
- [x] Move snippet within snippet explorer
- [x] Filters on snippet panel
- [x] Code snippet editor
- [x] Plus button to create new snippet
- [x] Multi-cell Saving

## Future development
- [ ] Tab completion
- [ ] Templated Fields
- [ ] Color Code Tags

## Demo 3 (Aug 25)
- Design review
- Usability tests
- Minimap preview
- Removing extra icons
- Filter with cell tags
- Code snippet editor
- ‘+’ create snippets
- Design refinements

## Demo 2 (Aug 5)
- Search ability
  - search by name/language
  - search bolding
- Snippet preview
  - editing mode
  - snippet description
- Drag and drop
  - drag snippet into notebook - create new cell
- Undo/redo functionality
  
## Log of Changes/Progress

### 7/20/2020 - 7/24/2020:

- Improve drag and drop cell onto snippet panel interface.
- Improve code snippet preview

### 7/13/2020 - 7/17/2020:

- Create preview of snippets
- Add bookmark User Interface

### 7/6/2020 - 7/10/2020:

- Add predefined snippets
- Copy button to the clipboard
- Delete Snippets
- Search snippets by name
- Allow user to scroll through snippets


### 6/29/2020 - 7/3/2020:

- Implement right click Notebook operation to save highlighted code as snippet.
- Look at/use Elyra side panel code to display snippets
  Preview snippets (double click or hover-scroll)
  
### 6/22/2020 - 6/26/2020:

- Set up repos
- Research JupyterLab and Elyra codebase


================================================
FILE: README.md
================================================
# JupyterLab Code Snippet

## Save, reuse, and share code snippets using JupyterLab Code Snippets

![Github Actions Status](https://github.com/jupytercalpoly/jupyterlab-code-snippets/workflows/Build/badge.svg) [![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/jupytercalpoly/jupyterlab-code-snippets.git/master?urlpath=lab) [![npm version](https://badge.fury.io/js/jupyterlab-code-snippets.svg)](https://badge.fury.io/js/jupyterlab-code-snippets 'View this project on npm') [![PyPI version](https://badge.fury.io/py/jupyterlab-code-snippets.svg)](https://badge.fury.io/py/jupyterlab-code-snippets) [![Conda Version](https://img.shields.io/conda/vn/conda-forge/jupyterlab-code-snippets.svg)](https://anaconda.org/conda-forge/jupyterlab-code-snippets) [![License](https://img.shields.io/badge/License-BSD%203--Clause-blue.svg)](https://opensource.org/licenses/BSD-3-Clause) [![Documentation Status](https://readthedocs.org/projects/jupyterlab-code-snippets-documentation/badge/?version=latest)](https://jupyterlab-code-snippets-documentation.readthedocs.io/en/latest/?badge=latest)

This extension is a derivative of [Elyra](https://github.com/elyra-ai/elyra)'s original design and further developed by Jupyter Cal Poly Team.

Read [Press Release](./PRESSRELEASE.md) for more information.

Check out [the Current Progress](./PROGRESS.md) to keep up with our feature updates!

This extension is composed of a NPM package named `jupyterlab-code-snippets`
for the frontend extension.

![Alt Text](Design/overview.gif)

## Requirements

- JupyterLab >= 3.5.3
- Python >= 3.7

## Install

Install using jupyter:

```bash
jupyter labextension install jupyterlab-code-snippets
```

Install using pip:

```bash
pip install jupyterlab-code-snippets
```

```bash
conda install -c conda-forge jupyterlab-code-snippets
```

## Troubleshoot

If it is installed, try:

```bash
jupyter lab clean
jupyter lab build
```

## Contributing

### Install

The `jlpm` command is JupyterLab's pinned version of
[yarn](https://yarnpkg.com/) that is installed with JupyterLab. You may use
`yarn` or `npm` in lieu of `jlpm` below.

```bash
# Clone the repo to your local environment
# Move to jupyter-lab-code-snippets directory

# Install dependencies
jlpm
# Build Typescript source
jlpm build
# Link your development version of the extension with JupyterLab
jupyter labextension install .
# Rebuild Typescript source after making changes
jlpm build
# Rebuild JupyterLab after making any changes
jupyter lab build
```

You can watch the source directory and run JupyterLab in watch mode to watch for changes in the extension's source and automatically rebuild the extension and application.

```bash
# Watch the source directory in another terminal tab
jlpm watch
# Run jupyterlab in watch mode in one terminal tab
jupyter lab --watch
```

Now every change will be built locally and bundled into JupyterLab. Be sure to refresh your browser page after saving file changes to reload the extension (note: you'll need to wait for webpack to finish, which can take 10s+ at times).

### Uninstall

```bash
jupyter labextension uninstall jupyterlab-code-snippets
```

OR

```bash
pip uninstall jupyterlab-code-snippets
```


================================================
FILE: babel.config.js
================================================
module.exports = require('@jupyterlab/testutils/lib/babel.config');
// module.exports = {
//   presets: [
//     [
//       '@babel/preset-env',
//       {
//         targets: {
//           node: 'current'
//         }
//       }
//     ], '@babel/preset-react'
//   ]
// };


================================================
FILE: binder/environment.yml
================================================
# a mybinder.org-ready environment for demoing code_snippet
# this environment may also be used locally on Linux/MacOS/Windows, e.g.
#
#   conda env update --file binder/environment.yml
#   conda activate code_snippet-demo
#
name: code_snippet-demo

channels:
  - conda-forge

dependencies:
  # runtime dependencies
  - python >=3.8,<3.9.0a0
  - jupyterlab >=3,<4.0.0a0
  # labextension build dependencies
  - nodejs >=14,<15
  - pip
  - wheel
  # additional packages for demos
  # - ipywidgets


================================================
FILE: binder/postBuild
================================================
#!/usr/bin/env python3
""" perform a development install of code_snippet

    On Binder, this will run _after_ the environment has been fully created from
    the environment.yml in this directory.

    This script should also run locally on Linux/MacOS/Windows:

        python3 binder/postBuild
"""
import subprocess
import sys
from pathlib import Path


ROOT = Path.cwd()

print("Current Working dir:", ROOT)

def _(*args, **kwargs):
    """ Run a command, echoing the args

        fails hard if something goes wrong
    """
    print("\n\t", " ".join(args), "\n")
    return_code = subprocess.call(args, **kwargs)
    if return_code != 0:
        print("\nERROR", return_code, " ".join(args))
        sys.exit(return_code)

# verify the environment is self-consistent before even starting
# _(sys.executable, "-m", "pip", "check")

# install the labextension
_(sys.executable, "-m", "pip", "install", "-e", ".")

# verify the environment the extension didn't break anything
# _(sys.executable, "-m", "pip", "check")

# list the extensions
# _("jupyter", "server", "extension", "list")

# initially list installed extensions to determine if there are any surprises
# _("jupyter", "labextension", "list")

print("JupyterLab with code_snippet is ready to run with:\n")
print("\tjupyter lab\n")

# remove unnecessary directories when using the binder
_('rm', '-rf', './lib')
_('rm', '-rf', './src')
_('rm', '-rf', './style')
_('rm', '-rf', './_temp_extension')
_('rm', '-rf', './Design')
_('rm', '-rf', './binder')
_('rm', '-rf', './docs')
_('rm', '-rf', './code_snippet')
_('rm', '-rf', './code_snippet.egg-info')
_('rm', '-rf', './schema')
_('rm', '-rf', './node_modules')
_('rm', '-rf', './coverage')
_('rm', '-rf', './test')
_('rm', '-rf', './testutils')
_('rm', './install.json')
_('rm', './package.json')
_('rm', './PROGRESS.md')
_('rm', './setup.py')
_('rm', './pyproject.toml')
_('rm', './tsconfig.json')
_('rm', './tsconfig.test.json')
_('rm', './babel.config.js')
_('rm', './jest.config.js')
_('rm', './tsconfig.tsbuildinfo')
_('rm', './yarn.lock')
_('rm', './MANIFEST.in')


================================================
FILE: binder/requirements.txt
================================================
jupyterlab>=3.0

================================================
FILE: binder/workspace.json
================================================
{"data":{"layout-restorer:data":{"main":{"dock":{"type":"tab-area","currentIndex":1,"widgets":["notebook:Untitled.ipynb"]},"mode":"multiple-document","current":"notebook:Untitled.ipynb"},"left":{"collapsed":false,"current":"code-snippet-extension","widgets":["filebrowser","running-sessions","command-palette","jp-property-inspector","tab-manager","code-snippet-extension","extensionmanager.main-view"]},"right":{"collapsed":true,"widgets":[]}},"file-browser-filebrowser:cwd":{"path":""},"@jupyterlab/settingeditor-extension:plugin":{"sizes":[0.09057971014492754,0.9094202898550725],"container":{"plugin":"@jupyterlab/shortcuts-extension:shortcuts","sizes":[0.48376993166287013,0.5162300683371298]}},"notebook:Untitled.ipynb":{"data":{"path":"Untitled.ipynb","factory":"Notebook"}}},"metadata":{"id":"/lab"}}


================================================
FILE: coverage/CodeSnippetContentsService.ts.html
================================================

<!doctype html>
<html lang="en">

<head>
    <title>Code coverage report for CodeSnippetContentsService.ts</title>
    <meta charset="utf-8" />
    <link rel="stylesheet" href="prettify.css" />
    <link rel="stylesheet" href="base.css" />
    <link rel="shortcut icon" type="image/x-icon" href="favicon.png" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <style type='text/css'>
        .coverage-summary .sorter {
            background-image: url(sort-arrow-sprite.png);
        }
    </style>
</head>
    
<body>
<div class='wrapper'>
    <div class='pad1'>
        <h1><a href="index.html">All files</a> CodeSnippetContentsService.ts</h1>
        <div class='clearfix'>
            
            <div class='fl pad1y space-right2'>
                <span class="strong">100% </span>
                <span class="quiet">Statements</span>
                <span class='fraction'>24/24</span>
            </div>
        
            
            <div class='fl pad1y space-right2'>
                <span class="strong">100% </span>
                <span class="quiet">Branches</span>
                <span class='fraction'>2/2</span>
            </div>
        
            
            <div class='fl pad1y space-right2'>
                <span class="strong">100% </span>
                <span class="quiet">Functions</span>
                <span class='fraction'>6/6</span>
            </div>
        
            
            <div class='fl pad1y space-right2'>
                <span class="strong">100% </span>
                <span class="quiet">Lines</span>
                <span class='fraction'>24/24</span>
            </div>
        
            
        </div>
        <p class="quiet">
            Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
        </p>
    </div>
    <div class='status-line high'></div>
    <pre><table class="coverage">
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
<a name='L2'></a><a href='#L2'>2</a>
<a name='L3'></a><a href='#L3'>3</a>
<a name='L4'></a><a href='#L4'>4</a>
<a name='L5'></a><a href='#L5'>5</a>
<a name='L6'></a><a href='#L6'>6</a>
<a name='L7'></a><a href='#L7'>7</a>
<a name='L8'></a><a href='#L8'>8</a>
<a name='L9'></a><a href='#L9'>9</a>
<a name='L10'></a><a href='#L10'>10</a>
<a name='L11'></a><a href='#L11'>11</a>
<a name='L12'></a><a href='#L12'>12</a>
<a name='L13'></a><a href='#L13'>13</a>
<a name='L14'></a><a href='#L14'>14</a>
<a name='L15'></a><a href='#L15'>15</a>
<a name='L16'></a><a href='#L16'>16</a>
<a name='L17'></a><a href='#L17'>17</a>
<a name='L18'></a><a href='#L18'>18</a>
<a name='L19'></a><a href='#L19'>19</a>
<a name='L20'></a><a href='#L20'>20</a>
<a name='L21'></a><a href='#L21'>21</a>
<a name='L22'></a><a href='#L22'>22</a>
<a name='L23'></a><a href='#L23'>23</a>
<a name='L24'></a><a href='#L24'>24</a>
<a name='L25'></a><a href='#L25'>25</a>
<a name='L26'></a><a href='#L26'>26</a>
<a name='L27'></a><a href='#L27'>27</a>
<a name='L28'></a><a href='#L28'>28</a>
<a name='L29'></a><a href='#L29'>29</a>
<a name='L30'></a><a href='#L30'>30</a>
<a name='L31'></a><a href='#L31'>31</a>
<a name='L32'></a><a href='#L32'>32</a>
<a name='L33'></a><a href='#L33'>33</a>
<a name='L34'></a><a href='#L34'>34</a>
<a name='L35'></a><a href='#L35'>35</a>
<a name='L36'></a><a href='#L36'>36</a>
<a name='L37'></a><a href='#L37'>37</a>
<a name='L38'></a><a href='#L38'>38</a>
<a name='L39'></a><a href='#L39'>39</a>
<a name='L40'></a><a href='#L40'>40</a>
<a name='L41'></a><a href='#L41'>41</a>
<a name='L42'></a><a href='#L42'>42</a>
<a name='L43'></a><a href='#L43'>43</a>
<a name='L44'></a><a href='#L44'>44</a>
<a name='L45'></a><a href='#L45'>45</a>
<a name='L46'></a><a href='#L46'>46</a>
<a name='L47'></a><a href='#L47'>47</a>
<a name='L48'></a><a href='#L48'>48</a>
<a name='L49'></a><a href='#L49'>49</a>
<a name='L50'></a><a href='#L50'>50</a>
<a name='L51'></a><a href='#L51'>51</a>
<a name='L52'></a><a href='#L52'>52</a>
<a name='L53'></a><a href='#L53'>53</a>
<a name='L54'></a><a href='#L54'>54</a>
<a name='L55'></a><a href='#L55'>55</a>
<a name='L56'></a><a href='#L56'>56</a>
<a name='L57'></a><a href='#L57'>57</a>
<a name='L58'></a><a href='#L58'>58</a>
<a name='L59'></a><a href='#L59'>59</a>
<a name='L60'></a><a href='#L60'>60</a>
<a name='L61'></a><a href='#L61'>61</a>
<a name='L62'></a><a href='#L62'>62</a>
<a name='L63'></a><a href='#L63'>63</a>
<a name='L64'></a><a href='#L64'>64</a>
<a name='L65'></a><a href='#L65'>65</a>
<a name='L66'></a><a href='#L66'>66</a>
<a name='L67'></a><a href='#L67'>67</a>
<a name='L68'></a><a href='#L68'>68</a>
<a name='L69'></a><a href='#L69'>69</a>
<a name='L70'></a><a href='#L70'>70</a>
<a name='L71'></a><a href='#L71'>71</a>
<a name='L72'></a><a href='#L72'>72</a>
<a name='L73'></a><a href='#L73'>73</a>
<a name='L74'></a><a href='#L74'>74</a>
<a name='L75'></a><a href='#L75'>75</a>
<a name='L76'></a><a href='#L76'>76</a>
<a name='L77'></a><a href='#L77'>77</a>
<a name='L78'></a><a href='#L78'>78</a>
<a name='L79'></a><a href='#L79'>79</a>
<a name='L80'></a><a href='#L80'>80</a>
<a name='L81'></a><a href='#L81'>81</a>
<a name='L82'></a><a href='#L82'>82</a>
<a name='L83'></a><a href='#L83'>83</a>
<a name='L84'></a><a href='#L84'>84</a>
<a name='L85'></a><a href='#L85'>85</a>
<a name='L86'></a><a href='#L86'>86</a>
<a name='L87'></a><a href='#L87'>87</a>
<a name='L88'></a><a href='#L88'>88</a>
<a name='L89'></a><a href='#L89'>89</a>
<a name='L90'></a><a href='#L90'>90</a>
<a name='L91'></a><a href='#L91'>91</a>
<a name='L92'></a><a href='#L92'>92</a>
<a name='L93'></a><a href='#L93'>93</a>
<a name='L94'></a><a href='#L94'>94</a>
<a name='L95'></a><a href='#L95'>95</a>
<a name='L96'></a><a href='#L96'>96</a>
<a name='L97'></a><a href='#L97'>97</a>
<a name='L98'></a><a href='#L98'>98</a>
<a name='L99'></a><a href='#L99'>99</a>
<a name='L100'></a><a href='#L100'>100</a>
<a name='L101'></a><a href='#L101'>101</a>
<a name='L102'></a><a href='#L102'>102</a>
<a name='L103'></a><a href='#L103'>103</a>
<a name='L104'></a><a href='#L104'>104</a>
<a name='L105'></a><a href='#L105'>105</a>
<a name='L106'></a><a href='#L106'>106</a>
<a name='L107'></a><a href='#L107'>107</a>
<a name='L108'></a><a href='#L108'>108</a>
<a name='L109'></a><a href='#L109'>109</a>
<a name='L110'></a><a href='#L110'>110</a>
<a name='L111'></a><a href='#L111'>111</a>
<a name='L112'></a><a href='#L112'>112</a>
<a name='L113'></a><a href='#L113'>113</a>
<a name='L114'></a><a href='#L114'>114</a>
<a name='L115'></a><a href='#L115'>115</a>
<a name='L116'></a><a href='#L116'>116</a>
<a name='L117'></a><a href='#L117'>117</a>
<a name='L118'></a><a href='#L118'>118</a>
<a name='L119'></a><a href='#L119'>119</a>
<a name='L120'></a><a href='#L120'>120</a>
<a name='L121'></a><a href='#L121'>121</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { ContentsManager, Drive, Contents } from '@jupyterlab/services';
&nbsp;
export interface ICodeSnippet {
  name: string;
  description: string;
  language: string;
  // code separated by new line
  code: string[];
  id: number;
  tags?: string[];
}
&nbsp;
/**
 * Singleton contentsService class
 */
export class CodeSnippetContentsService {
  drive: Drive;
  contentsManager: ContentsManager;
  private static instance: CodeSnippetContentsService;
  private constructor() {
    const drive = new Drive({ name: 'snippetDrive ' });
    const contentsManager = new ContentsManager({ defaultDrive: drive });
    this.drive = drive;
    this.contentsManager = contentsManager;
  }
&nbsp;
  static getInstance(): CodeSnippetContentsService {
    if (!this.instance) {
      this.instance = new CodeSnippetContentsService();
    }
    return this.instance;
  }
&nbsp;
  /**
   * Get the metadata information in the given path
   * @param path path to a file/directory
   */
  async getData(
    path: string,
    type: Contents.ContentType
  ): Promise&lt;Contents.IModel&gt; {
    try {
      const data = await this.contentsManager.get(path, {
        type: type,
        //   format: 'text',
        content: true
      });
      return data;
    } catch (error) {
      return error;
    }
    // const data = await this.contentsManager.get(path, {
    //   type: type,
    //   //   format: 'text',
    //   content: true
    // });
    // return data;
  }
&nbsp;
  /**
   * Create a file/directory if it does not exist. Otherwise, save the change in a file/directory in the given path
   * @param path path to a file/directory
   * @param options options that specify if it's a file or directory and additial information
   * Usage: save('snippets', { type: 'directory' }) to create/save a directory
   *        save('snippets/test.json', {type: 'file', format: 'text', content: 'Lorem ipsum dolor sit amet'})
   */
  async save(
    path: string,
    options?: Partial&lt;Contents.IModel&gt;
  ): Promise&lt;Contents.IModel&gt; {
    try {
      const changedModel = await this.contentsManager.save(path, options);
      return changedModel;
    } catch (error) {
      return error;
    }
  }
&nbsp;
  /**
   * Change the order of snippets
   * @param oldPath
   * @param newPath
   */
&nbsp;
  /**
   * Rename the file or directory (not case sensitive)
   * @param oldPath change from
   * @param newPath change to
   */
  async rename(oldPath: string, newPath: string): Promise&lt;Contents.IModel&gt; {
    try {
      const changedModel = await this.contentsManager.rename(oldPath, newPath);
      return changedModel;
    } catch (error) {
      return error;
    }
    // const changedModel = await this.contentsManager.rename(oldPath, newPath);
    // return changedModel;
  }
&nbsp;
  /**
   * Delete the file/directory in the given path
   * @param path path to a file/directory
   */
  async delete(path: string): Promise&lt;void&gt; {
    try {
      await this.contentsManager.delete(path);
    } catch (error) {
      return;
    }
  }
&nbsp;
  // async renameAndSave(
  //   oldPath: string,
  //   newPath: string
  // ): Promise&lt;Contents.IModel&gt; {
  //   this.rename(oldPath, newPath);
  //   this.save(newPath);
  // }
}
&nbsp;</pre></td></tr></table></pre>

                <div class='push'></div><!-- for sticky footer -->
            </div><!-- /wrapper -->
            <div class='footer quiet pad2 space-top1 center small'>
                Code coverage generated by
                <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
                at Tue Nov 17 2020 11:49:34 GMT-0800 (Pacific Standard Time)
            </div>
        </div>
        <script src="prettify.js"></script>
        <script>
            window.onload = function () {
                prettyPrint();
            };
        </script>
        <script src="sorter.js"></script>
        <script src="block-navigation.js"></script>
    </body>
</html>
    

================================================
FILE: coverage/CodeSnippetWidgetModel.ts.html
================================================

<!doctype html>
<html lang="en">

<head>
    <title>Code coverage report for CodeSnippetWidgetModel.ts</title>
    <meta charset="utf-8" />
    <link rel="stylesheet" href="prettify.css" />
    <link rel="stylesheet" href="base.css" />
    <link rel="shortcut icon" type="image/x-icon" href="favicon.png" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <style type='text/css'>
        .coverage-summary .sorter {
            background-image: url(sort-arrow-sprite.png);
        }
    </style>
</head>
    
<body>
<div class='wrapper'>
    <div class='pad1'>
        <h1><a href="index.html">All files</a> CodeSnippetWidgetModel.ts</h1>
        <div class='clearfix'>
            
            <div class='fl pad1y space-right2'>
                <span class="strong">100% </span>
                <span class="quiet">Statements</span>
                <span class='fraction'>46/46</span>
            </div>
        
            
            <div class='fl pad1y space-right2'>
                <span class="strong">88.89% </span>
                <span class="quiet">Branches</span>
                <span class='fraction'>16/18</span>
            </div>
        
            
            <div class='fl pad1y space-right2'>
                <span class="strong">100% </span>
                <span class="quiet">Functions</span>
                <span class='fraction'>14/14</span>
            </div>
        
            
            <div class='fl pad1y space-right2'>
                <span class="strong">100% </span>
                <span class="quiet">Lines</span>
                <span class='fraction'>42/42</span>
            </div>
        
            
        </div>
        <p class="quiet">
            Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
        </p>
    </div>
    <div class='status-line high'></div>
    <pre><table class="coverage">
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
<a name='L2'></a><a href='#L2'>2</a>
<a name='L3'></a><a href='#L3'>3</a>
<a name='L4'></a><a href='#L4'>4</a>
<a name='L5'></a><a href='#L5'>5</a>
<a name='L6'></a><a href='#L6'>6</a>
<a name='L7'></a><a href='#L7'>7</a>
<a name='L8'></a><a href='#L8'>8</a>
<a name='L9'></a><a href='#L9'>9</a>
<a name='L10'></a><a href='#L10'>10</a>
<a name='L11'></a><a href='#L11'>11</a>
<a name='L12'></a><a href='#L12'>12</a>
<a name='L13'></a><a href='#L13'>13</a>
<a name='L14'></a><a href='#L14'>14</a>
<a name='L15'></a><a href='#L15'>15</a>
<a name='L16'></a><a href='#L16'>16</a>
<a name='L17'></a><a href='#L17'>17</a>
<a name='L18'></a><a href='#L18'>18</a>
<a name='L19'></a><a href='#L19'>19</a>
<a name='L20'></a><a href='#L20'>20</a>
<a name='L21'></a><a href='#L21'>21</a>
<a name='L22'></a><a href='#L22'>22</a>
<a name='L23'></a><a href='#L23'>23</a>
<a name='L24'></a><a href='#L24'>24</a>
<a name='L25'></a><a href='#L25'>25</a>
<a name='L26'></a><a href='#L26'>26</a>
<a name='L27'></a><a href='#L27'>27</a>
<a name='L28'></a><a href='#L28'>28</a>
<a name='L29'></a><a href='#L29'>29</a>
<a name='L30'></a><a href='#L30'>30</a>
<a name='L31'></a><a href='#L31'>31</a>
<a name='L32'></a><a href='#L32'>32</a>
<a name='L33'></a><a href='#L33'>33</a>
<a name='L34'></a><a href='#L34'>34</a>
<a name='L35'></a><a href='#L35'>35</a>
<a name='L36'></a><a href='#L36'>36</a>
<a name='L37'></a><a href='#L37'>37</a>
<a name='L38'></a><a href='#L38'>38</a>
<a name='L39'></a><a href='#L39'>39</a>
<a name='L40'></a><a href='#L40'>40</a>
<a name='L41'></a><a href='#L41'>41</a>
<a name='L42'></a><a href='#L42'>42</a>
<a name='L43'></a><a href='#L43'>43</a>
<a name='L44'></a><a href='#L44'>44</a>
<a name='L45'></a><a href='#L45'>45</a>
<a name='L46'></a><a href='#L46'>46</a>
<a name='L47'></a><a href='#L47'>47</a>
<a name='L48'></a><a href='#L48'>48</a>
<a name='L49'></a><a href='#L49'>49</a>
<a name='L50'></a><a href='#L50'>50</a>
<a name='L51'></a><a href='#L51'>51</a>
<a name='L52'></a><a href='#L52'>52</a>
<a name='L53'></a><a href='#L53'>53</a>
<a name='L54'></a><a href='#L54'>54</a>
<a name='L55'></a><a href='#L55'>55</a>
<a name='L56'></a><a href='#L56'>56</a>
<a name='L57'></a><a href='#L57'>57</a>
<a name='L58'></a><a href='#L58'>58</a>
<a name='L59'></a><a href='#L59'>59</a>
<a name='L60'></a><a href='#L60'>60</a>
<a name='L61'></a><a href='#L61'>61</a>
<a name='L62'></a><a href='#L62'>62</a>
<a name='L63'></a><a href='#L63'>63</a>
<a name='L64'></a><a href='#L64'>64</a>
<a name='L65'></a><a href='#L65'>65</a>
<a name='L66'></a><a href='#L66'>66</a>
<a name='L67'></a><a href='#L67'>67</a>
<a name='L68'></a><a href='#L68'>68</a>
<a name='L69'></a><a href='#L69'>69</a>
<a name='L70'></a><a href='#L70'>70</a>
<a name='L71'></a><a href='#L71'>71</a>
<a name='L72'></a><a href='#L72'>72</a>
<a name='L73'></a><a href='#L73'>73</a>
<a name='L74'></a><a href='#L74'>74</a>
<a name='L75'></a><a href='#L75'>75</a>
<a name='L76'></a><a href='#L76'>76</a>
<a name='L77'></a><a href='#L77'>77</a>
<a name='L78'></a><a href='#L78'>78</a>
<a name='L79'></a><a href='#L79'>79</a>
<a name='L80'></a><a href='#L80'>80</a>
<a name='L81'></a><a href='#L81'>81</a>
<a name='L82'></a><a href='#L82'>82</a>
<a name='L83'></a><a href='#L83'>83</a>
<a name='L84'></a><a href='#L84'>84</a>
<a name='L85'></a><a href='#L85'>85</a>
<a name='L86'></a><a href='#L86'>86</a>
<a name='L87'></a><a href='#L87'>87</a>
<a name='L88'></a><a href='#L88'>88</a>
<a name='L89'></a><a href='#L89'>89</a>
<a name='L90'></a><a href='#L90'>90</a>
<a name='L91'></a><a href='#L91'>91</a>
<a name='L92'></a><a href='#L92'>92</a>
<a name='L93'></a><a href='#L93'>93</a>
<a name='L94'></a><a href='#L94'>94</a>
<a name='L95'></a><a href='#L95'>95</a>
<a name='L96'></a><a href='#L96'>96</a>
<a name='L97'></a><a href='#L97'>97</a>
<a name='L98'></a><a href='#L98'>98</a>
<a name='L99'></a><a href='#L99'>99</a>
<a name='L100'></a><a href='#L100'>100</a>
<a name='L101'></a><a href='#L101'>101</a>
<a name='L102'></a><a href='#L102'>102</a>
<a name='L103'></a><a href='#L103'>103</a>
<a name='L104'></a><a href='#L104'>104</a>
<a name='L105'></a><a href='#L105'>105</a>
<a name='L106'></a><a href='#L106'>106</a>
<a name='L107'></a><a href='#L107'>107</a>
<a name='L108'></a><a href='#L108'>108</a>
<a name='L109'></a><a href='#L109'>109</a>
<a name='L110'></a><a href='#L110'>110</a>
<a name='L111'></a><a href='#L111'>111</a>
<a name='L112'></a><a href='#L112'>112</a>
<a name='L113'></a><a href='#L113'>113</a>
<a name='L114'></a><a href='#L114'>114</a>
<a name='L115'></a><a href='#L115'>115</a>
<a name='L116'></a><a href='#L116'>116</a>
<a name='L117'></a><a href='#L117'>117</a>
<a name='L118'></a><a href='#L118'>118</a>
<a name='L119'></a><a href='#L119'>119</a>
<a name='L120'></a><a href='#L120'>120</a>
<a name='L121'></a><a href='#L121'>121</a>
<a name='L122'></a><a href='#L122'>122</a>
<a name='L123'></a><a href='#L123'>123</a>
<a name='L124'></a><a href='#L124'>124</a>
<a name='L125'></a><a href='#L125'>125</a>
<a name='L126'></a><a href='#L126'>126</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">17x</span>
<span class="cline-any cline-yes">17x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">19x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import {
  ICodeSnippet,
  CodeSnippetContentsService
} from './CodeSnippetContentsService';
&nbsp;
export interface ICodeSnippetWidgetModel {
  /**
   * The list of code snippets in the code snippet explorer
   */
  readonly _snippets: ICodeSnippet[];
}
&nbsp;
export class CodeSnippetWidgetModel implements ICodeSnippetWidgetModel {
  _snippets: ICodeSnippet[];
&nbsp;
  constructor(snippets: ICodeSnippet[]) {
    this._snippets = snippets;
  }
&nbsp;
  get snippets(): ICodeSnippet[] {
    this.sortSnippets();
    return this._snippets;
  }
&nbsp;
  set snippets(snippetList: ICodeSnippet[]) {
    this._snippets = snippetList;
  }
&nbsp;
  reorderSnippet(): void {
    this.sortSnippets();
    for (let i = 0; i &lt; this._snippets.length; i++) {
      this._snippets[i].id = i;
    }
  }
&nbsp;
  renameSnippet(oldName: string, newName: string): void {
    for (const snippet of this._snippets) {
      if (snippet.name === oldName) {
        snippet.name = newName;
        CodeSnippetContentsService.getInstance().save(
          'snippets/' + snippet.name + '.json',
          { type: 'file', format: 'text', content: JSON.stringify(snippet) }
        );
        break;
      }
    }
  }
&nbsp;
  addSnippet(newSnippet: ICodeSnippet, index: number): void {
    // append a new snippet created from input form to the end
    if (newSnippet.id === -1) {
      newSnippet.id = this._snippets.length;
    }
    this.insertSnippet(newSnippet, index);
  }
&nbsp;
  sortSnippets(): void {
    this._snippets.sort((a, b) =&gt; a.id - b.id);
  }
&nbsp;
  // move snippetes within explorer
  moveSnippet(fromIdx: number, toIdx: number): void {
    if (toIdx &gt; fromIdx) {
      toIdx = toIdx - 1;
    }
    if (toIdx === fromIdx) {
      return;
    }
    const snippetToInsert = this._snippets[fromIdx];
    this.deleteSnippet(fromIdx);
    snippetToInsert.id = toIdx;
&nbsp;
    this.insertSnippet(snippetToInsert, toIdx);
    this.updateSnippetContents();
  }
&nbsp;
  /**
   * Delete a snippet from the list
   * @param index index to delete. If it's not given, the last one gets deleted.
   */
  deleteSnippet(index = <span class="branch-0 cbranch-no" title="branch not covered" >-1)</span>: void {
    const numSnippets = this._snippets.length;
    if (index &lt; 0 || index &gt; numSnippets) {
      this._snippets.pop();
    } else {
      // Update list
      for (let i = index + 1; i &lt; numSnippets; i++) {
        this._snippets[i].id = this._snippets[i].id - 1;
      }
      this._snippets.splice(index, 1);
    }
  }
&nbsp;
  clearSnippets(): void {
    this._snippets = [];
  }
&nbsp;
  updateSnippetContents(): void {
    this._snippets.forEach(snippet =&gt; {
      CodeSnippetContentsService.getInstance().save(
        'snippets/' + snippet.name + '.json',
        { type: 'file', format: 'text', content: JSON.stringify(snippet) }
      );
    });
  }
&nbsp;
  /**
   * insert a snippet to the certain index of the snippet list
   * @param newSnippet new snippet to insert
   * @param index index to insert. If it's not given, the snippet is added at the end of the list.
   */
  private insertSnippet(newSnippet: ICodeSnippet, index = <span class="branch-0 cbranch-no" title="branch not covered" >-1)</span>: void {
    const numSnippets = this._snippets.length;
    // add it at the end of the list
    if (index &lt; 0 || index &gt;= numSnippets) {
      this._snippets.push(newSnippet);
    } else {
      // Update list
      for (let i = index; i &lt; numSnippets; i++) {
        this._snippets[i].id = this._snippets[i].id + 1;
      }
      this._snippets.splice(index, 0, newSnippet);
    }
  }
}
&nbsp;</pre></td></tr></table></pre>

                <div class='push'></div><!-- for sticky footer -->
            </div><!-- /wrapper -->
            <div class='footer quiet pad2 space-top1 center small'>
                Code coverage generated by
                <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
                at Tue Nov 17 2020 11:49:34 GMT-0800 (Pacific Standard Time)
            </div>
        </div>
        <script src="prettify.js"></script>
        <script>
            window.onload = function () {
                prettyPrint();
            };
        </script>
        <script src="sorter.js"></script>
        <script src="block-navigation.js"></script>
    </body>
</html>
    

================================================
FILE: coverage/base.css
================================================
body, html {
  margin:0; padding: 0;
  height: 100%;
}
body {
    font-family: Helvetica Neue, Helvetica, Arial;
    font-size: 14px;
    color:#333;
}
.small { font-size: 12px; }
*, *:after, *:before {
  -webkit-box-sizing:border-box;
     -moz-box-sizing:border-box;
          box-sizing:border-box;
  }
h1 { font-size: 20px; margin: 0;}
h2 { font-size: 14px; }
pre {
    font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace;
    margin: 0;
    padding: 0;
    -moz-tab-size: 2;
    -o-tab-size:  2;
    tab-size: 2;
}
a { color:#0074D9; text-decoration:none; }
a:hover { text-decoration:underline; }
.strong { font-weight: bold; }
.space-top1 { padding: 10px 0 0 0; }
.pad2y { padding: 20px 0; }
.pad1y { padding: 10px 0; }
.pad2x { padding: 0 20px; }
.pad2 { padding: 20px; }
.pad1 { padding: 10px; }
.space-left2 { padding-left:55px; }
.space-right2 { padding-right:20px; }
.center { text-align:center; }
.clearfix { display:block; }
.clearfix:after {
  content:'';
  display:block;
  height:0;
  clear:both;
  visibility:hidden;
  }
.fl { float: left; }
@media only screen and (max-width:640px) {
  .col3 { width:100%; max-width:100%; }
  .hide-mobile { display:none!important; }
}

.quiet {
  color: #7f7f7f;
  color: rgba(0,0,0,0.5);
}
.quiet a { opacity: 0.7; }

.fraction {
  font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace;
  font-size: 10px;
  color: #555;
  background: #E8E8E8;
  padding: 4px 5px;
  border-radius: 3px;
  vertical-align: middle;
}

div.path a:link, div.path a:visited { color: #333; }
table.coverage {
  border-collapse: collapse;
  margin: 10px 0 0 0;
  padding: 0;
}

table.coverage td {
  margin: 0;
  padding: 0;
  vertical-align: top;
}
table.coverage td.line-count {
    text-align: right;
    padding: 0 5px 0 20px;
}
table.coverage td.line-coverage {
    text-align: right;
    padding-right: 10px;
    min-width:20px;
}

table.coverage td span.cline-any {
    display: inline-block;
    padding: 0 5px;
    width: 100%;
}
.missing-if-branch {
    display: inline-block;
    margin-right: 5px;
    border-radius: 3px;
    position: relative;
    padding: 0 4px;
    background: #333;
    color: yellow;
}

.skip-if-branch {
    display: none;
    margin-right: 10px;
    position: relative;
    padding: 0 4px;
    background: #ccc;
    color: white;
}
.missing-if-branch .typ, .skip-if-branch .typ {
    color: inherit !important;
}
.coverage-summary {
  border-collapse: collapse;
  width: 100%;
}
.coverage-summary tr { border-bottom: 1px solid #bbb; }
.keyline-all { border: 1px solid #ddd; }
.coverage-summary td, .coverage-summary th { padding: 10px; }
.coverage-summary tbody { border: 1px solid #bbb; }
.coverage-summary td { border-right: 1px solid #bbb; }
.coverage-summary td:last-child { border-right: none; }
.coverage-summary th {
  text-align: left;
  font-weight: normal;
  white-space: nowrap;
}
.coverage-summary th.file { border-right: none !important; }
.coverage-summary th.pct { }
.coverage-summary th.pic,
.coverage-summary th.abs,
.coverage-summary td.pct,
.coverage-summary td.abs { text-align: right; }
.coverage-summary td.file { white-space: nowrap;  }
.coverage-summary td.pic { min-width: 120px !important;  }
.coverage-summary tfoot td { }

.coverage-summary .sorter {
    height: 10px;
    width: 7px;
    display: inline-block;
    margin-left: 0.5em;
    background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent;
}
.coverage-summary .sorted .sorter {
    background-position: 0 -20px;
}
.coverage-summary .sorted-desc .sorter {
    background-position: 0 -10px;
}
.status-line {  height: 10px; }
/* yellow */
.cbranch-no { background: yellow !important; color: #111; }
/* dark red */
.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 }
.low .chart { border:1px solid #C21F39 }
.highlighted,
.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{
  background: #C21F39 !important;
}
/* medium red */
.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE }
/* light red */
.low, .cline-no { background:#FCE1E5 }
/* light green */
.high, .cline-yes { background:rgb(230,245,208) }
/* medium green */
.cstat-yes { background:rgb(161,215,106) }
/* dark green */
.status-line.high, .high .cover-fill { background:rgb(77,146,33) }
.high .chart { border:1px solid rgb(77,146,33) }
/* dark yellow (gold) */
.status-line.medium, .medium .cover-fill { background: #f9cd0b; }
.medium .chart { border:1px solid #f9cd0b; }
/* light yellow */
.medium { background: #fff4c2; }

.cstat-skip { background: #ddd; color: #111; }
.fstat-skip { background: #ddd; color: #111 !important; }
.cbranch-skip { background: #ddd !important; color: #111; }

span.cline-neutral { background: #eaeaea; }

.coverage-summary td.empty {
    opacity: .5;
    padding-top: 4px;
    padding-bottom: 4px;
    line-height: 1;
    color: #888;
}

.cover-fill, .cover-empty {
  display:inline-block;
  height: 12px;
}
.chart {
  line-height: 0;
}
.cover-empty {
    background: white;
}
.cover-full {
    border-right: none !important;
}
pre.prettyprint {
    border: none !important;
    padding: 0 !important;
    margin: 0 !important;
}
.com { color: #999 !important; }
.ignore-none { color: #999; font-weight: normal; }

.wrapper {
  min-height: 100%;
  height: auto !important;
  height: 100%;
  margin: 0 auto -48px;
}
.footer, .push {
  height: 48px;
}


================================================
FILE: coverage/block-navigation.js
================================================
/* eslint-disable */
var jumpToCode = (function init() {
    // Classes of code we would like to highlight in the file view
    var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no'];

    // Elements to highlight in the file listing view
    var fileListingElements = ['td.pct.low'];

    // We don't want to select elements that are direct descendants of another match
    var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > `

    // Selecter that finds elements on the page to which we can jump
    var selector =
        fileListingElements.join(', ') +
        ', ' +
        notSelector +
        missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b`

    // The NodeList of matching elements
    var missingCoverageElements = document.querySelectorAll(selector);

    var currentIndex;

    function toggleClass(index) {
        missingCoverageElements
            .item(currentIndex)
            .classList.remove('highlighted');
        missingCoverageElements.item(index).classList.add('highlighted');
    }

    function makeCurrent(index) {
        toggleClass(index);
        currentIndex = index;
        missingCoverageElements.item(index).scrollIntoView({
            behavior: 'smooth',
            block: 'center',
            inline: 'center'
        });
    }

    function goToPrevious() {
        var nextIndex = 0;
        if (typeof currentIndex !== 'number' || currentIndex === 0) {
            nextIndex = missingCoverageElements.length - 1;
        } else if (missingCoverageElements.length > 1) {
            nextIndex = currentIndex - 1;
        }

        makeCurrent(nextIndex);
    }

    function goToNext() {
        var nextIndex = 0;

        if (
            typeof currentIndex === 'number' &&
            currentIndex < missingCoverageElements.length - 1
        ) {
            nextIndex = currentIndex + 1;
        }

        makeCurrent(nextIndex);
    }

    return function jump(event) {
        switch (event.which) {
            case 78: // n
            case 74: // j
                goToNext();
                break;
            case 66: // b
            case 75: // k
            case 80: // p
                goToPrevious();
                break;
        }
    };
})();
window.addEventListener('keydown', jumpToCode);


================================================
FILE: coverage/clover.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<coverage generated="1604606156495" clover="3.2.0">
  <project timestamp="1604606156495" name="All files">
    <metrics statements="0" coveredstatements="0" conditionals="0" coveredconditionals="0" methods="0" coveredmethods="0" elements="0" coveredelements="0" complexity="0" loc="0" ncloc="0" packages="0" files="0" classes="0"/>
  </project>
</coverage>


================================================
FILE: coverage/coverage-final.json
================================================
{"/Users/jaewookahn/projects/code_snippet/code_snippets/src/CodeSnippetContentsService.ts": {"path":"/Users/jaewookahn/projects/code_snippet/code_snippets/src/CodeSnippetContentsService.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":72}},"1":{"start":{"line":21,"column":18},"end":{"line":21,"column":54}},"2":{"start":{"line":22,"column":28},"end":{"line":22,"column":72}},"3":{"start":{"line":23,"column":4},"end":{"line":23,"column":23}},"4":{"start":{"line":24,"column":4},"end":{"line":24,"column":43}},"5":{"start":{"line":28,"column":4},"end":{"line":30,"column":null}},"6":{"start":{"line":29,"column":6},"end":{"line":29,"column":55}},"7":{"start":{"line":31,"column":4},"end":{"line":31,"column":25}},"8":{"start":{"line":42,"column":4},"end":{"line":51,"column":null}},"9":{"start":{"line":43,"column":19},"end":{"line":47,"column":8}},"10":{"start":{"line":48,"column":6},"end":{"line":48,"column":18}},"11":{"start":{"line":50,"column":6},"end":{"line":50,"column":19}},"12":{"start":{"line":71,"column":4},"end":{"line":76,"column":null}},"13":{"start":{"line":72,"column":27},"end":{"line":72,"column":73}},"14":{"start":{"line":73,"column":6},"end":{"line":73,"column":26}},"15":{"start":{"line":75,"column":6},"end":{"line":75,"column":19}},"16":{"start":{"line":91,"column":4},"end":{"line":96,"column":null}},"17":{"start":{"line":92,"column":27},"end":{"line":92,"column":78}},"18":{"start":{"line":93,"column":6},"end":{"line":93,"column":26}},"19":{"start":{"line":95,"column":6},"end":{"line":95,"column":19}},"20":{"start":{"line":106,"column":4},"end":{"line":110,"column":null}},"21":{"start":{"line":107,"column":6},"end":{"line":107,"column":46}},"22":{"start":{"line":109,"column":6},"end":{"line":109,"column":13}},"23":{"start":{"line":16,"column":0},"end":{"line":16,"column":13}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":20,"column":2},"end":{"line":20,"column":null}},"loc":{"start":{"line":20,"column":2},"end":{"line":25,"column":3}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":27,"column":2},"end":{"line":27,"column":8}},"loc":{"start":{"line":27,"column":20},"end":{"line":32,"column":3}}},"2":{"name":"(anonymous_9)","decl":{"start":{"line":38,"column":8},"end":{"line":38,"column":15}},"loc":{"start":{"line":40,"column":30},"end":{"line":58,"column":null}}},"3":{"name":"(anonymous_11)","decl":{"start":{"line":67,"column":8},"end":{"line":67,"column":12}},"loc":{"start":{"line":69,"column":38},"end":{"line":77,"column":null}}},"4":{"name":"(anonymous_13)","decl":{"start":{"line":90,"column":8},"end":{"line":90,"column":14}},"loc":{"start":{"line":90,"column":47},"end":{"line":99,"column":null}}},"5":{"name":"(anonymous_15)","decl":{"start":{"line":105,"column":8},"end":{"line":105,"column":14}},"loc":{"start":{"line":105,"column":27},"end":{"line":111,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":28,"column":4},"end":{"line":30,"column":null}},"type":"if","locations":[{"start":{"line":28,"column":4},"end":{"line":30,"column":null}},{"start":{"line":28,"column":4},"end":{"line":30,"column":null}}]}},"s":{"0":2,"1":2,"2":2,"3":2,"4":2,"5":4,"6":2,"7":4,"8":2,"9":2,"10":1,"11":1,"12":4,"13":4,"14":1,"15":3,"16":2,"17":2,"18":1,"19":1,"20":1,"21":1,"22":1,"23":2},"f":{"0":2,"1":4,"2":2,"3":4,"4":2,"5":1},"b":{"0":[2,2]}}
,"/Users/jaewookahn/projects/code_snippet/code_snippets/src/CodeSnippetWidgetModel.ts": {"path":"/Users/jaewookahn/projects/code_snippet/code_snippets/src/CodeSnippetWidgetModel.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":17,"column":4},"end":{"line":17,"column":30}},"2":{"start":{"line":21,"column":4},"end":{"line":21,"column":24}},"3":{"start":{"line":22,"column":4},"end":{"line":22,"column":26}},"4":{"start":{"line":26,"column":4},"end":{"line":26,"column":33}},"5":{"start":{"line":30,"column":4},"end":{"line":30,"column":24}},"6":{"start":{"line":31,"column":4},"end":{"line":33,"column":null}},"7":{"start":{"line":31,"column":17},"end":{"line":31,"column":18}},"8":{"start":{"line":32,"column":6},"end":{"line":32,"column":31}},"9":{"start":{"line":37,"column":4},"end":{"line":46,"column":null}},"10":{"start":{"line":38,"column":6},"end":{"line":45,"column":null}},"11":{"start":{"line":39,"column":8},"end":{"line":39,"column":31}},"12":{"start":{"line":40,"column":8},"end":{"line":43,"column":10}},"13":{"start":{"line":44,"column":8},"end":{"line":44,"column":14}},"14":{"start":{"line":51,"column":4},"end":{"line":53,"column":null}},"15":{"start":{"line":52,"column":6},"end":{"line":52,"column":44}},"16":{"start":{"line":54,"column":4},"end":{"line":54,"column":42}},"17":{"start":{"line":58,"column":4},"end":{"line":58,"column":47}},"18":{"start":{"line":58,"column":34},"end":{"line":58,"column":45}},"19":{"start":{"line":63,"column":4},"end":{"line":65,"column":null}},"20":{"start":{"line":64,"column":6},"end":{"line":64,"column":24}},"21":{"start":{"line":66,"column":4},"end":{"line":68,"column":null}},"22":{"start":{"line":67,"column":6},"end":{"line":67,"column":13}},"23":{"start":{"line":69,"column":28},"end":{"line":69,"column":51}},"24":{"start":{"line":70,"column":4},"end":{"line":70,"column":32}},"25":{"start":{"line":71,"column":4},"end":{"line":71,"column":31}},"26":{"start":{"line":73,"column":4},"end":{"line":73,"column":47}},"27":{"start":{"line":74,"column":4},"end":{"line":74,"column":33}},"28":{"start":{"line":82,"column":24},"end":{"line":82,"column":45}},"29":{"start":{"line":83,"column":4},"end":{"line":91,"column":null}},"30":{"start":{"line":84,"column":6},"end":{"line":84,"column":27}},"31":{"start":{"line":87,"column":6},"end":{"line":89,"column":null}},"32":{"start":{"line":87,"column":19},"end":{"line":87,"column":28}},"33":{"start":{"line":88,"column":8},"end":{"line":88,"column":56}},"34":{"start":{"line":90,"column":6},"end":{"line":90,"column":38}},"35":{"start":{"line":95,"column":4},"end":{"line":95,"column":24}},"36":{"start":{"line":99,"column":4},"end":{"line":104,"column":7}},"37":{"start":{"line":100,"column":6},"end":{"line":103,"column":8}},"38":{"start":{"line":113,"column":24},"end":{"line":113,"column":45}},"39":{"start":{"line":115,"column":4},"end":{"line":123,"column":null}},"40":{"start":{"line":116,"column":6},"end":{"line":116,"column":38}},"41":{"start":{"line":119,"column":6},"end":{"line":121,"column":null}},"42":{"start":{"line":119,"column":19},"end":{"line":119,"column":24}},"43":{"start":{"line":120,"column":8},"end":{"line":120,"column":56}},"44":{"start":{"line":122,"column":6},"end":{"line":122,"column":50}},"45":{"start":{"line":13,"column":0},"end":{"line":13,"column":13}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":16,"column":2},"end":{"line":16,"column":14}},"loc":{"start":{"line":16,"column":38},"end":{"line":18,"column":3}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":20,"column":2},"end":{"line":20,"column":6}},"loc":{"start":{"line":20,"column":14},"end":{"line":23,"column":3}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":25,"column":2},"end":{"line":25,"column":6}},"loc":{"start":{"line":25,"column":42},"end":{"line":27,"column":3}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":29,"column":2},"end":{"line":29,"column":16}},"loc":{"start":{"line":29,"column":16},"end":{"line":34,"column":3}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":36,"column":2},"end":{"line":36,"column":15}},"loc":{"start":{"line":36,"column":48},"end":{"line":47,"column":3}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":49,"column":2},"end":{"line":49,"column":12}},"loc":{"start":{"line":49,"column":52},"end":{"line":55,"column":3}}},"6":{"name":"(anonymous_6)","decl":{"start":{"line":57,"column":2},"end":{"line":57,"column":14}},"loc":{"start":{"line":57,"column":14},"end":{"line":59,"column":3}}},"7":{"name":"(anonymous_7)","decl":{"start":{"line":58,"column":24},"end":{"line":58,"column":25}},"loc":{"start":{"line":58,"column":34},"end":{"line":58,"column":45}}},"8":{"name":"(anonymous_8)","decl":{"start":{"line":62,"column":2},"end":{"line":62,"column":13}},"loc":{"start":{"line":62,"column":44},"end":{"line":75,"column":3}}},"9":{"name":"(anonymous_9)","decl":{"start":{"line":81,"column":2},"end":{"line":81,"column":15}},"loc":{"start":{"line":81,"column":26},"end":{"line":92,"column":3}}},"10":{"name":"(anonymous_10)","decl":{"start":{"line":94,"column":2},"end":{"line":94,"column":15}},"loc":{"start":{"line":94,"column":15},"end":{"line":96,"column":3}}},"11":{"name":"(anonymous_11)","decl":{"start":{"line":98,"column":2},"end":{"line":98,"column":23}},"loc":{"start":{"line":98,"column":23},"end":{"line":105,"column":3}}},"12":{"name":"(anonymous_12)","decl":{"start":{"line":99,"column":27},"end":{"line":99,"column":34}},"loc":{"start":{"line":99,"column":37},"end":{"line":104,"column":5}}},"13":{"name":"(anonymous_13)","decl":{"start":{"line":112,"column":10},"end":{"line":112,"column":23}},"loc":{"start":{"line":112,"column":60},"end":{"line":124,"column":3}}}},"branchMap":{"0":{"loc":{"start":{"line":38,"column":6},"end":{"line":45,"column":null}},"type":"if","locations":[{"start":{"line":38,"column":6},"end":{"line":45,"column":null}},{"start":{"line":38,"column":6},"end":{"line":45,"column":null}}]},"1":{"loc":{"start":{"line":51,"column":4},"end":{"line":53,"column":null}},"type":"if","locations":[{"start":{"line":51,"column":4},"end":{"line":53,"column":null}},{"start":{"line":51,"column":4},"end":{"line":53,"column":null}}]},"2":{"loc":{"start":{"line":63,"column":4},"end":{"line":65,"column":null}},"type":"if","locations":[{"start":{"line":63,"column":4},"end":{"line":65,"column":null}},{"start":{"line":63,"column":4},"end":{"line":65,"column":null}}]},"3":{"loc":{"start":{"line":66,"column":4},"end":{"line":68,"column":null}},"type":"if","locations":[{"start":{"line":66,"column":4},"end":{"line":68,"column":null}},{"start":{"line":66,"column":4},"end":{"line":68,"column":null}}]},"4":{"loc":{"start":{"line":81,"column":24},"end":{"line":81,"column":26}},"type":"default-arg","locations":[{"start":{"line":81,"column":24},"end":{"line":81,"column":26}}]},"5":{"loc":{"start":{"line":83,"column":4},"end":{"line":91,"column":null}},"type":"if","locations":[{"start":{"line":83,"column":4},"end":{"line":91,"column":null}},{"start":{"line":83,"column":4},"end":{"line":91,"column":null}}]},"6":{"loc":{"start":{"line":83,"column":8},"end":{"line":83,"column":17}},"type":"binary-expr","locations":[{"start":{"line":83,"column":8},"end":{"line":83,"column":17}},{"start":{"line":83,"column":21},"end":{"line":83,"column":40}}]},"7":{"loc":{"start":{"line":112,"column":58},"end":{"line":112,"column":60}},"type":"default-arg","locations":[{"start":{"line":112,"column":58},"end":{"line":112,"column":60}}]},"8":{"loc":{"start":{"line":115,"column":4},"end":{"line":123,"column":null}},"type":"if","locations":[{"start":{"line":115,"column":4},"end":{"line":123,"column":null}},{"start":{"line":115,"column":4},"end":{"line":123,"column":null}}]},"9":{"loc":{"start":{"line":115,"column":8},"end":{"line":115,"column":17}},"type":"binary-expr","locations":[{"start":{"line":115,"column":8},"end":{"line":115,"column":17}},{"start":{"line":115,"column":21},"end":{"line":115,"column":41}}]}},"s":{"0":1,"1":1,"2":17,"3":17,"4":2,"5":1,"6":1,"7":1,"8":2,"9":1,"10":2,"11":1,"12":1,"13":1,"14":3,"15":1,"16":3,"17":19,"18":14,"19":2,"20":1,"21":2,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":3,"29":3,"30":1,"31":2,"32":2,"33":2,"34":2,"35":1,"36":1,"37":2,"38":4,"39":4,"40":3,"41":1,"42":1,"43":1,"44":1,"45":1},"f":{"0":1,"1":17,"2":2,"3":1,"4":1,"5":3,"6":19,"7":14,"8":2,"9":3,"10":1,"11":1,"12":2,"13":4},"b":{"0":[1,1],"1":[1,2],"2":[1,1],"3":[1,1],"4":[0],"5":[1,2],"6":[3,2],"7":[0],"8":[3,1],"9":[4,3]}}
}


================================================
FILE: coverage/index.html
================================================

<!doctype html>
<html lang="en">

<head>
    <title>Code coverage report for All files</title>
    <meta charset="utf-8" />
    <link rel="stylesheet" href="prettify.css" />
    <link rel="stylesheet" href="base.css" />
    <link rel="shortcut icon" type="image/x-icon" href="favicon.png" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <style type='text/css'>
        .coverage-summary .sorter {
            background-image: url(sort-arrow-sprite.png);
        }
    </style>
</head>
    
<body>
<div class='wrapper'>
    <div class='pad1'>
        <h1>All files</h1>
        <div class='clearfix'>
            
            <div class='fl pad1y space-right2'>
                <span class="strong">100% </span>
                <span class="quiet">Statements</span>
                <span class='fraction'>70/70</span>
            </div>
        
            
            <div class='fl pad1y space-right2'>
                <span class="strong">90% </span>
                <span class="quiet">Branches</span>
                <span class='fraction'>18/20</span>
            </div>
        
            
            <div class='fl pad1y space-right2'>
                <span class="strong">100% </span>
                <span class="quiet">Functions</span>
                <span class='fraction'>20/20</span>
            </div>
        
            
            <div class='fl pad1y space-right2'>
                <span class="strong">100% </span>
                <span class="quiet">Lines</span>
                <span class='fraction'>66/66</span>
            </div>
        
            
        </div>
        <p class="quiet">
            Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
        </p>
    </div>
    <div class='status-line high'></div>
    <div class="pad1">
<table class="coverage-summary">
<thead>
<tr>
   <th data-col="file" data-fmt="html" data-html="true" class="file">File</th>
   <th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th>
   <th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th>
   <th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th>
   <th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th>
   <th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th>
   <th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th>
   <th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th>
   <th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th>
   <th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th>
</tr>
</thead>
<tbody><tr>
	<td class="file high" data-value="CodeSnippetContentsService.ts"><a href="CodeSnippetContentsService.ts.html">CodeSnippetContentsService.ts</a></td>
	<td data-value="100" class="pic high">
	<div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div>
	</td>
	<td data-value="100" class="pct high">100%</td>
	<td data-value="24" class="abs high">24/24</td>
	<td data-value="100" class="pct high">100%</td>
	<td data-value="2" class="abs high">2/2</td>
	<td data-value="100" class="pct high">100%</td>
	<td data-value="6" class="abs high">6/6</td>
	<td data-value="100" class="pct high">100%</td>
	<td data-value="24" class="abs high">24/24</td>
	</tr>

<tr>
	<td class="file high" data-value="CodeSnippetWidgetModel.ts"><a href="CodeSnippetWidgetModel.ts.html">CodeSnippetWidgetModel.ts</a></td>
	<td data-value="100" class="pic high">
	<div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div>
	</td>
	<td data-value="100" class="pct high">100%</td>
	<td data-value="46" class="abs high">46/46</td>
	<td data-value="88.89" class="pct high">88.89%</td>
	<td data-value="18" class="abs high">16/18</td>
	<td data-value="100" class="pct high">100%</td>
	<td data-value="14" class="abs high">14/14</td>
	<td data-value="100" class="pct high">100%</td>
	<td data-value="42" class="abs high">42/42</td>
	</tr>

</tbody>
</table>
</div>
                <div class='push'></div><!-- for sticky footer -->
            </div><!-- /wrapper -->
            <div class='footer quiet pad2 space-top1 center small'>
                Code coverage generated by
                <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
                at Tue Nov 17 2020 11:49:34 GMT-0800 (Pacific Standard Time)
            </div>
        </div>
        <script src="prettify.js"></script>
        <script>
            window.onload = function () {
                prettyPrint();
            };
        </script>
        <script src="sorter.js"></script>
        <script src="block-navigation.js"></script>
    </body>
</html>
    

================================================
FILE: coverage/lcov-report/CodeSnippetContentsService.ts.html
================================================

<!doctype html>
<html lang="en">

<head>
    <title>Code coverage report for CodeSnippetContentsService.ts</title>
    <meta charset="utf-8" />
    <link rel="stylesheet" href="prettify.css" />
    <link rel="stylesheet" href="base.css" />
    <link rel="shortcut icon" type="image/x-icon" href="favicon.png" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <style type='text/css'>
        .coverage-summary .sorter {
            background-image: url(sort-arrow-sprite.png);
        }
    </style>
</head>
    
<body>
<div class='wrapper'>
    <div class='pad1'>
        <h1><a href="index.html">All files</a> CodeSnippetContentsService.ts</h1>
        <div class='clearfix'>
            
            <div class='fl pad1y space-right2'>
                <span class="strong">100% </span>
                <span class="quiet">Statements</span>
                <span class='fraction'>24/24</span>
            </div>
        
            
            <div class='fl pad1y space-right2'>
                <span class="strong">100% </span>
                <span class="quiet">Branches</span>
                <span class='fraction'>2/2</span>
            </div>
        
            
            <div class='fl pad1y space-right2'>
                <span class="strong">100% </span>
                <span class="quiet">Functions</span>
                <span class='fraction'>6/6</span>
            </div>
        
            
            <div class='fl pad1y space-right2'>
                <span class="strong">100% </span>
                <span class="quiet">Lines</span>
                <span class='fraction'>24/24</span>
            </div>
        
            
        </div>
        <p class="quiet">
            Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
        </p>
    </div>
    <div class='status-line high'></div>
    <pre><table class="coverage">
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
<a name='L2'></a><a href='#L2'>2</a>
<a name='L3'></a><a href='#L3'>3</a>
<a name='L4'></a><a href='#L4'>4</a>
<a name='L5'></a><a href='#L5'>5</a>
<a name='L6'></a><a href='#L6'>6</a>
<a name='L7'></a><a href='#L7'>7</a>
<a name='L8'></a><a href='#L8'>8</a>
<a name='L9'></a><a href='#L9'>9</a>
<a name='L10'></a><a href='#L10'>10</a>
<a name='L11'></a><a href='#L11'>11</a>
<a name='L12'></a><a href='#L12'>12</a>
<a name='L13'></a><a href='#L13'>13</a>
<a name='L14'></a><a href='#L14'>14</a>
<a name='L15'></a><a href='#L15'>15</a>
<a name='L16'></a><a href='#L16'>16</a>
<a name='L17'></a><a href='#L17'>17</a>
<a name='L18'></a><a href='#L18'>18</a>
<a name='L19'></a><a href='#L19'>19</a>
<a name='L20'></a><a href='#L20'>20</a>
<a name='L21'></a><a href='#L21'>21</a>
<a name='L22'></a><a href='#L22'>22</a>
<a name='L23'></a><a href='#L23'>23</a>
<a name='L24'></a><a href='#L24'>24</a>
<a name='L25'></a><a href='#L25'>25</a>
<a name='L26'></a><a href='#L26'>26</a>
<a name='L27'></a><a href='#L27'>27</a>
<a name='L28'></a><a href='#L28'>28</a>
<a name='L29'></a><a href='#L29'>29</a>
<a name='L30'></a><a href='#L30'>30</a>
<a name='L31'></a><a href='#L31'>31</a>
<a name='L32'></a><a href='#L32'>32</a>
<a name='L33'></a><a href='#L33'>33</a>
<a name='L34'></a><a href='#L34'>34</a>
<a name='L35'></a><a href='#L35'>35</a>
<a name='L36'></a><a href='#L36'>36</a>
<a name='L37'></a><a href='#L37'>37</a>
<a name='L38'></a><a href='#L38'>38</a>
<a name='L39'></a><a href='#L39'>39</a>
<a name='L40'></a><a href='#L40'>40</a>
<a name='L41'></a><a href='#L41'>41</a>
<a name='L42'></a><a href='#L42'>42</a>
<a name='L43'></a><a href='#L43'>43</a>
<a name='L44'></a><a href='#L44'>44</a>
<a name='L45'></a><a href='#L45'>45</a>
<a name='L46'></a><a href='#L46'>46</a>
<a name='L47'></a><a href='#L47'>47</a>
<a name='L48'></a><a href='#L48'>48</a>
<a name='L49'></a><a href='#L49'>49</a>
<a name='L50'></a><a href='#L50'>50</a>
<a name='L51'></a><a href='#L51'>51</a>
<a name='L52'></a><a href='#L52'>52</a>
<a name='L53'></a><a href='#L53'>53</a>
<a name='L54'></a><a href='#L54'>54</a>
<a name='L55'></a><a href='#L55'>55</a>
<a name='L56'></a><a href='#L56'>56</a>
<a name='L57'></a><a href='#L57'>57</a>
<a name='L58'></a><a href='#L58'>58</a>
<a name='L59'></a><a href='#L59'>59</a>
<a name='L60'></a><a href='#L60'>60</a>
<a name='L61'></a><a href='#L61'>61</a>
<a name='L62'></a><a href='#L62'>62</a>
<a name='L63'></a><a href='#L63'>63</a>
<a name='L64'></a><a href='#L64'>64</a>
<a name='L65'></a><a href='#L65'>65</a>
<a name='L66'></a><a href='#L66'>66</a>
<a name='L67'></a><a href='#L67'>67</a>
<a name='L68'></a><a href='#L68'>68</a>
<a name='L69'></a><a href='#L69'>69</a>
<a name='L70'></a><a href='#L70'>70</a>
<a name='L71'></a><a href='#L71'>71</a>
<a name='L72'></a><a href='#L72'>72</a>
<a name='L73'></a><a href='#L73'>73</a>
<a name='L74'></a><a href='#L74'>74</a>
<a name='L75'></a><a href='#L75'>75</a>
<a name='L76'></a><a href='#L76'>76</a>
<a name='L77'></a><a href='#L77'>77</a>
<a name='L78'></a><a href='#L78'>78</a>
<a name='L79'></a><a href='#L79'>79</a>
<a name='L80'></a><a href='#L80'>80</a>
<a name='L81'></a><a href='#L81'>81</a>
<a name='L82'></a><a href='#L82'>82</a>
<a name='L83'></a><a href='#L83'>83</a>
<a name='L84'></a><a href='#L84'>84</a>
<a name='L85'></a><a href='#L85'>85</a>
<a name='L86'></a><a href='#L86'>86</a>
<a name='L87'></a><a href='#L87'>87</a>
<a name='L88'></a><a href='#L88'>88</a>
<a name='L89'></a><a href='#L89'>89</a>
<a name='L90'></a><a href='#L90'>90</a>
<a name='L91'></a><a href='#L91'>91</a>
<a name='L92'></a><a href='#L92'>92</a>
<a name='L93'></a><a href='#L93'>93</a>
<a name='L94'></a><a href='#L94'>94</a>
<a name='L95'></a><a href='#L95'>95</a>
<a name='L96'></a><a href='#L96'>96</a>
<a name='L97'></a><a href='#L97'>97</a>
<a name='L98'></a><a href='#L98'>98</a>
<a name='L99'></a><a href='#L99'>99</a>
<a name='L100'></a><a href='#L100'>100</a>
<a name='L101'></a><a href='#L101'>101</a>
<a name='L102'></a><a href='#L102'>102</a>
<a name='L103'></a><a href='#L103'>103</a>
<a name='L104'></a><a href='#L104'>104</a>
<a name='L105'></a><a href='#L105'>105</a>
<a name='L106'></a><a href='#L106'>106</a>
<a name='L107'></a><a href='#L107'>107</a>
<a name='L108'></a><a href='#L108'>108</a>
<a name='L109'></a><a href='#L109'>109</a>
<a name='L110'></a><a href='#L110'>110</a>
<a name='L111'></a><a href='#L111'>111</a>
<a name='L112'></a><a href='#L112'>112</a>
<a name='L113'></a><a href='#L113'>113</a>
<a name='L114'></a><a href='#L114'>114</a>
<a name='L115'></a><a href='#L115'>115</a>
<a name='L116'></a><a href='#L116'>116</a>
<a name='L117'></a><a href='#L117'>117</a>
<a name='L118'></a><a href='#L118'>118</a>
<a name='L119'></a><a href='#L119'>119</a>
<a name='L120'></a><a href='#L120'>120</a>
<a name='L121'></a><a href='#L121'>121</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { ContentsManager, Drive, Contents } from '@jupyterlab/services';
&nbsp;
export interface ICodeSnippet {
  name: string;
  description: string;
  language: string;
  // code separated by new line
  code: string[];
  id: number;
  tags?: string[];
}
&nbsp;
/**
 * Singleton contentsService class
 */
export class CodeSnippetContentsService {
  drive: Drive;
  contentsManager: ContentsManager;
  private static instance: CodeSnippetContentsService;
  private constructor() {
    const drive = new Drive({ name: 'snippetDrive ' });
    const contentsManager = new ContentsManager({ defaultDrive: drive });
    this.drive = drive;
    this.contentsManager = contentsManager;
  }
&nbsp;
  static getInstance(): CodeSnippetContentsService {
    if (!this.instance) {
      this.instance = new CodeSnippetContentsService();
    }
    return this.instance;
  }
&nbsp;
  /**
   * Get the metadata information in the given path
   * @param path path to a file/directory
   */
  async getData(
    path: string,
    type: Contents.ContentType
  ): Promise&lt;Contents.IModel&gt; {
    try {
      const data = await this.contentsManager.get(path, {
        type: type,
        //   format: 'text',
        content: true
      });
      return data;
    } catch (error) {
      return error;
    }
    // const data = await this.contentsManager.get(path, {
    //   type: type,
    //   //   format: 'text',
    //   content: true
    // });
    // return data;
  }
&nbsp;
  /**
   * Create a file/directory if it does not exist. Otherwise, save the change in a file/directory in the given path
   * @param path path to a file/directory
   * @param options options that specify if it's a file or directory and additial information
   * Usage: save('snippets', { type: 'directory' }) to create/save a directory
   *        save('snippets/test.json', {type: 'file', format: 'text', content: 'Lorem ipsum dolor sit amet'})
   */
  async save(
    path: string,
    options?: Partial&lt;Contents.IModel&gt;
  ): Promise&lt;Contents.IModel&gt; {
    try {
      const changedModel = await this.contentsManager.save(path, options);
      return changedModel;
    } catch (error) {
      return error;
    }
  }
&nbsp;
  /**
   * Change the order of snippets
   * @param oldPath
   * @param newPath
   */
&nbsp;
  /**
   * Rename the file or directory (not case sensitive)
   * @param oldPath change from
   * @param newPath change to
   */
  async rename(oldPath: string, newPath: string): Promise&lt;Contents.IModel&gt; {
    try {
      const changedModel = await this.contentsManager.rename(oldPath, newPath);
      return changedModel;
    } catch (error) {
      return error;
    }
    // const changedModel = await this.contentsManager.rename(oldPath, newPath);
    // return changedModel;
  }
&nbsp;
  /**
   * Delete the file/directory in the given path
   * @param path path to a file/directory
   */
  async delete(path: string): Promise&lt;void&gt; {
    try {
      await this.contentsManager.delete(path);
    } catch (error) {
      return;
    }
  }
&nbsp;
  // async renameAndSave(
  //   oldPath: string,
  //   newPath: string
  // ): Promise&lt;Contents.IModel&gt; {
  //   this.rename(oldPath, newPath);
  //   this.save(newPath);
  // }
}
&nbsp;</pre></td></tr></table></pre>

                <div class='push'></div><!-- for sticky footer -->
            </div><!-- /wrapper -->
            <div class='footer quiet pad2 space-top1 center small'>
                Code coverage generated by
                <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
                at Tue Nov 17 2020 11:49:34 GMT-0800 (Pacific Standard Time)
            </div>
        </div>
        <script src="prettify.js"></script>
        <script>
            window.onload = function () {
                prettyPrint();
            };
        </script>
        <script src="sorter.js"></script>
        <script src="block-navigation.js"></script>
    </body>
</html>
    

================================================
FILE: coverage/lcov-report/CodeSnippetWidgetModel.ts.html
================================================

<!doctype html>
<html lang="en">

<head>
    <title>Code coverage report for CodeSnippetWidgetModel.ts</title>
    <meta charset="utf-8" />
    <link rel="stylesheet" href="prettify.css" />
    <link rel="stylesheet" href="base.css" />
    <link rel="shortcut icon" type="image/x-icon" href="favicon.png" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <style type='text/css'>
        .coverage-summary .sorter {
            background-image: url(sort-arrow-sprite.png);
        }
    </style>
</head>
    
<body>
<div class='wrapper'>
    <div class='pad1'>
        <h1><a href="index.html">All files</a> CodeSnippetWidgetModel.ts</h1>
        <div class='clearfix'>
            
            <div class='fl pad1y space-right2'>
                <span class="strong">100% </span>
                <span class="quiet">Statements</span>
                <span class='fraction'>46/46</span>
            </div>
        
            
            <div class='fl pad1y space-right2'>
                <span class="strong">88.89% </span>
                <span class="quiet">Branches</span>
                <span class='fraction'>16/18</span>
            </div>
        
            
            <div class='fl pad1y space-right2'>
                <span class="strong">100% </span>
                <span class="quiet">Functions</span>
                <span class='fraction'>14/14</span>
            </div>
        
            
            <div class='fl pad1y space-right2'>
                <span class="strong">100% </span>
                <span class="quiet">Lines</span>
                <span class='fraction'>42/42</span>
            </div>
        
            
        </div>
        <p class="quiet">
            Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
        </p>
    </div>
    <div class='status-line high'></div>
    <pre><table class="coverage">
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
<a name='L2'></a><a href='#L2'>2</a>
<a name='L3'></a><a href='#L3'>3</a>
<a name='L4'></a><a href='#L4'>4</a>
<a name='L5'></a><a href='#L5'>5</a>
<a name='L6'></a><a href='#L6'>6</a>
<a name='L7'></a><a href='#L7'>7</a>
<a name='L8'></a><a href='#L8'>8</a>
<a name='L9'></a><a href='#L9'>9</a>
<a name='L10'></a><a href='#L10'>10</a>
<a name='L11'></a><a href='#L11'>11</a>
<a name='L12'></a><a href='#L12'>12</a>
<a name='L13'></a><a href='#L13'>13</a>
<a name='L14'></a><a href='#L14'>14</a>
<a name='L15'></a><a href='#L15'>15</a>
<a name='L16'></a><a href='#L16'>16</a>
<a name='L17'></a><a href='#L17'>17</a>
<a name='L18'></a><a href='#L18'>18</a>
<a name='L19'></a><a href='#L19'>19</a>
<a name='L20'></a><a href='#L20'>20</a>
<a name='L21'></a><a href='#L21'>21</a>
<a name='L22'></a><a href='#L22'>22</a>
<a name='L23'></a><a href='#L23'>23</a>
<a name='L24'></a><a href='#L24'>24</a>
<a name='L25'></a><a href='#L25'>25</a>
<a name='L26'></a><a href='#L26'>26</a>
<a name='L27'></a><a href='#L27'>27</a>
<a name='L28'></a><a href='#L28'>28</a>
<a name='L29'></a><a href='#L29'>29</a>
<a name='L30'></a><a href='#L30'>30</a>
<a name='L31'></a><a href='#L31'>31</a>
<a name='L32'></a><a href='#L32'>32</a>
<a name='L33'></a><a href='#L33'>33</a>
<a name='L34'></a><a href='#L34'>34</a>
<a name='L35'></a><a href='#L35'>35</a>
<a name='L36'></a><a href='#L36'>36</a>
<a name='L37'></a><a href='#L37'>37</a>
<a name='L38'></a><a href='#L38'>38</a>
<a name='L39'></a><a href='#L39'>39</a>
<a name='L40'></a><a href='#L40'>40</a>
<a name='L41'></a><a href='#L41'>41</a>
<a name='L42'></a><a href='#L42'>42</a>
<a name='L43'></a><a href='#L43'>43</a>
<a name='L44'></a><a href='#L44'>44</a>
<a name='L45'></a><a href='#L45'>45</a>
<a name='L46'></a><a href='#L46'>46</a>
<a name='L47'></a><a href='#L47'>47</a>
<a name='L48'></a><a href='#L48'>48</a>
<a name='L49'></a><a href='#L49'>49</a>
<a name='L50'></a><a href='#L50'>50</a>
<a name='L51'></a><a href='#L51'>51</a>
<a name='L52'></a><a href='#L52'>52</a>
<a name='L53'></a><a href='#L53'>53</a>
<a name='L54'></a><a href='#L54'>54</a>
<a name='L55'></a><a href='#L55'>55</a>
<a name='L56'></a><a href='#L56'>56</a>
<a name='L57'></a><a href='#L57'>57</a>
<a name='L58'></a><a href='#L58'>58</a>
<a name='L59'></a><a href='#L59'>59</a>
<a name='L60'></a><a href='#L60'>60</a>
<a name='L61'></a><a href='#L61'>61</a>
<a name='L62'></a><a href='#L62'>62</a>
<a name='L63'></a><a href='#L63'>63</a>
<a name='L64'></a><a href='#L64'>64</a>
<a name='L65'></a><a href='#L65'>65</a>
<a name='L66'></a><a href='#L66'>66</a>
<a name='L67'></a><a href='#L67'>67</a>
<a name='L68'></a><a href='#L68'>68</a>
<a name='L69'></a><a href='#L69'>69</a>
<a name='L70'></a><a href='#L70'>70</a>
<a name='L71'></a><a href='#L71'>71</a>
<a name='L72'></a><a href='#L72'>72</a>
<a name='L73'></a><a href='#L73'>73</a>
<a name='L74'></a><a href='#L74'>74</a>
<a name='L75'></a><a href='#L75'>75</a>
<a name='L76'></a><a href='#L76'>76</a>
<a name='L77'></a><a href='#L77'>77</a>
<a name='L78'></a><a href='#L78'>78</a>
<a name='L79'></a><a href='#L79'>79</a>
<a name='L80'></a><a href='#L80'>80</a>
<a name='L81'></a><a href='#L81'>81</a>
<a name='L82'></a><a href='#L82'>82</a>
<a name='L83'></a><a href='#L83'>83</a>
<a name='L84'></a><a href='#L84'>84</a>
<a name='L85'></a><a href='#L85'>85</a>
<a name='L86'></a><a href='#L86'>86</a>
<a name='L87'></a><a href='#L87'>87</a>
<a name='L88'></a><a href='#L88'>88</a>
<a name='L89'></a><a href='#L89'>89</a>
<a name='L90'></a><a href='#L90'>90</a>
<a name='L91'></a><a href='#L91'>91</a>
<a name='L92'></a><a href='#L92'>92</a>
<a name='L93'></a><a href='#L93'>93</a>
<a name='L94'></a><a href='#L94'>94</a>
<a name='L95'></a><a href='#L95'>95</a>
<a name='L96'></a><a href='#L96'>96</a>
<a name='L97'></a><a href='#L97'>97</a>
<a name='L98'></a><a href='#L98'>98</a>
<a name='L99'></a><a href='#L99'>99</a>
<a name='L100'></a><a href='#L100'>100</a>
<a name='L101'></a><a href='#L101'>101</a>
<a name='L102'></a><a href='#L102'>102</a>
<a name='L103'></a><a href='#L103'>103</a>
<a name='L104'></a><a href='#L104'>104</a>
<a name='L105'></a><a href='#L105'>105</a>
<a name='L106'></a><a href='#L106'>106</a>
<a name='L107'></a><a href='#L107'>107</a>
<a name='L108'></a><a href='#L108'>108</a>
<a name='L109'></a><a href='#L109'>109</a>
<a name='L110'></a><a href='#L110'>110</a>
<a name='L111'></a><a href='#L111'>111</a>
<a name='L112'></a><a href='#L112'>112</a>
<a name='L113'></a><a href='#L113'>113</a>
<a name='L114'></a><a href='#L114'>114</a>
<a name='L115'></a><a href='#L115'>115</a>
<a name='L116'></a><a href='#L116'>116</a>
<a name='L117'></a><a href='#L117'>117</a>
<a name='L118'></a><a href='#L118'>118</a>
<a name='L119'></a><a href='#L119'>119</a>
<a name='L120'></a><a href='#L120'>120</a>
<a name='L121'></a><a href='#L121'>121</a>
<a name='L122'></a><a href='#L122'>122</a>
<a name='L123'></a><a href='#L123'>123</a>
<a name='L124'></a><a href='#L124'>124</a>
<a name='L125'></a><a href='#L125'>125</a>
<a name='L126'></a><a href='#L126'>126</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">17x</span>
<span class="cline-any cline-yes">17x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">19x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import {
  ICodeSnippet,
  CodeSnippetContentsService
} from './CodeSnippetContentsService';
&nbsp;
export interface ICodeSnippetWidgetModel {
  /**
   * The list of code snippets in the code snippet explorer
   */
  readonly _snippets: ICodeSnippet[];
}
&nbsp;
export class CodeSnippetWidgetModel implements ICodeSnippetWidgetModel {
  _snippets: ICodeSnippet[];
&nbsp;
  constructor(snippets: ICodeSnippet[]) {
    this._snippets = snippets;
  }
&nbsp;
  get snippets(): ICodeSnippet[] {
    this.sortSnippets();
    return this._snippets;
  }
&nbsp;
  set snippets(snippetList: ICodeSnippet[]) {
    this._snippets = snippetList;
  }
&nbsp;
  reorderSnippet(): void {
    this.sortSnippets();
    for (let i = 0; i &lt; this._snippets.length; i++) {
      this._snippets[i].id = i;
    }
  }
&nbsp;
  renameSnippet(oldName: string, newName: string): void {
    for (const snippet of this._snippets) {
      if (snippet.name === oldName) {
        snippet.name = newName;
        CodeSnippetContentsService.getInstance().save(
          'snippets/' + snippet.name + '.json',
          { type: 'file', format: 'text', content: JSON.stringify(snippet) }
        );
        break;
      }
    }
  }
&nbsp;
  addSnippet(newSnippet: ICodeSnippet, index: number): void {
    // append a new snippet created from input form to the end
    if (newSnippet.id === -1) {
      newSnippet.id = this._snippets.length;
    }
    this.insertSnippet(newSnippet, index);
  }
&nbsp;
  sortSnippets(): void {
    this._snippets.sort((a, b) =&gt; a.id - b.id);
  }
&nbsp;
  // move snippetes within explorer
  moveSnippet(fromIdx: number, toIdx: number): void {
    if (toIdx &gt; fromIdx) {
      toIdx = toIdx - 1;
    }
    if (toIdx === fromIdx) {
      return;
    }
    const snippetToInsert = this._snippets[fromIdx];
    this.deleteSnippet(fromIdx);
    snippetToInsert.id = toIdx;
&nbsp;
    this.insertSnippet(snippetToInsert, toIdx);
    this.updateSnippetContents();
  }
&nbsp;
  /**
   * Delete a snippet from the list
   * @param index index to delete. If it's not given, the last one gets deleted.
   */
  deleteSnippet(index = <span class="branch-0 cbranch-no" title="branch not covered" >-1)</span>: void {
    const numSnippets = this._snippets.length;
    if (index &lt; 0 || index &gt; numSnippets) {
      this._snippets.pop();
    } else {
      // Update list
      for (let i = index + 1; i &lt; numSnippets; i++) {
        this._snippets[i].id = this._snippets[i].id - 1;
      }
      this._snippets.splice(index, 1);
    }
  }
&nbsp;
  clearSnippets(): void {
    this._snippets = [];
  }
&nbsp;
  updateSnippetContents(): void {
    this._snippets.forEach(snippet =&gt; {
      CodeSnippetContentsService.getInstance().save(
        'snippets/' + snippet.name + '.json',
        { type: 'file', format: 'text', content: JSON.stringify(snippet) }
      );
    });
  }
&nbsp;
  /**
   * insert a snippet to the certain index of the snippet list
   * @param newSnippet new snippet to insert
   * @param index index to insert. If it's not given, the snippet is added at the end of the list.
   */
  private insertSnippet(newSnippet: ICodeSnippet, index = <span class="branch-0 cbranch-no" title="branch not covered" >-1)</span>: void {
    const numSnippets = this._snippets.length;
    // add it at the end of the list
    if (index &lt; 0 || index &gt;= numSnippets) {
      this._snippets.push(newSnippet);
    } else {
      // Update list
      for (let i = index; i &lt; numSnippets; i++) {
        this._snippets[i].id = this._snippets[i].id + 1;
      }
      this._snippets.splice(index, 0, newSnippet);
    }
  }
}
&nbsp;</pre></td></tr></table></pre>

                <div class='push'></div><!-- for sticky footer -->
            </div><!-- /wrapper -->
            <div class='footer quiet pad2 space-top1 center small'>
                Code coverage generated by
                <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
                at Tue Nov 17 2020 11:49:34 GMT-0800 (Pacific Standard Time)
            </div>
        </div>
        <script src="prettify.js"></script>
        <script>
            window.onload = function () {
                prettyPrint();
            };
        </script>
        <script src="sorter.js"></script>
        <script src="block-navigation.js"></script>
    </body>
</html>
    

================================================
FILE: coverage/lcov-report/base.css
================================================
body, html {
  margin:0; padding: 0;
  height: 100%;
}
body {
    font-family: Helvetica Neue, Helvetica, Arial;
    font-size: 14px;
    color:#333;
}
.small { font-size: 12px; }
*, *:after, *:before {
  -webkit-box-sizing:border-box;
     -moz-box-sizing:border-box;
          box-sizing:border-box;
  }
h1 { font-size: 20px; margin: 0;}
h2 { font-size: 14px; }
pre {
    font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace;
    margin: 0;
    padding: 0;
    -moz-tab-size: 2;
    -o-tab-size:  2;
    tab-size: 2;
}
a { color:#0074D9; text-decoration:none; }
a:hover { text-decoration:underline; }
.strong { font-weight: bold; }
.space-top1 { padding: 10px 0 0 0; }
.pad2y { padding: 20px 0; }
.pad1y { padding: 10px 0; }
.pad2x { padding: 0 20px; }
.pad2 { padding: 20px; }
.pad1 { padding: 10px; }
.space-left2 { padding-left:55px; }
.space-right2 { padding-right:20px; }
.center { text-align:center; }
.clearfix { display:block; }
.clearfix:after {
  content:'';
  display:block;
  height:0;
  clear:both;
  visibility:hidden;
  }
.fl { float: left; }
@media only screen and (max-width:640px) {
  .col3 { width:100%; max-width:100%; }
  .hide-mobile { display:none!important; }
}

.quiet {
  color: #7f7f7f;
  color: rgba(0,0,0,0.5);
}
.quiet a { opacity: 0.7; }

.fraction {
  font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace;
  font-size: 10px;
  color: #555;
  background: #E8E8E8;
  padding: 4px 5px;
  border-radius: 3px;
  vertical-align: middle;
}

div.path a:link, div.path a:visited { color: #333; }
table.coverage {
  border-collapse: collapse;
  margin: 10px 0 0 0;
  padding: 0;
}

table.coverage td {
  margin: 0;
  padding: 0;
  vertical-align: top;
}
table.coverage td.line-count {
    text-align: right;
    padding: 0 5px 0 20px;
}
table.coverage td.line-coverage {
    text-align: right;
    padding-right: 10px;
    min-width:20px;
}

table.coverage td span.cline-any {
    display: inline-block;
    padding: 0 5px;
    width: 100%;
}
.missing-if-branch {
    display: inline-block;
    margin-right: 5px;
    border-radius: 3px;
    position: relative;
    padding: 0 4px;
    background: #333;
    color: yellow;
}

.skip-if-branch {
    display: none;
    margin-right: 10px;
    position: relative;
    padding: 0 4px;
    background: #ccc;
    color: white;
}
.missing-if-branch .typ, .skip-if-branch .typ {
    color: inherit !important;
}
.coverage-summary {
  border-collapse: collapse;
  width: 100%;
}
.coverage-summary tr { border-bottom: 1px solid #bbb; }
.keyline-all { border: 1px solid #ddd; }
.coverage-summary td, .coverage-summary th { padding: 10px; }
.coverage-summary tbody { border: 1px solid #bbb; }
.coverage-summary td { border-right: 1px solid #bbb; }
.coverage-summary td:last-child { border-right: none; }
.coverage-summary th {
  text-align: left;
  font-weight: normal;
  white-space: nowrap;
}
.coverage-summary th.file { border-right: none !important; }
.coverage-summary th.pct { }
.coverage-summary th.pic,
.coverage-summary th.abs,
.coverage-summary td.pct,
.coverage-summary td.abs { text-align: right; }
.coverage-summary td.file { white-space: nowrap;  }
.coverage-summary td.pic { min-width: 120px !important;  }
.coverage-summary tfoot td { }

.coverage-summary .sorter {
    height: 10px;
    width: 7px;
    display: inline-block;
    margin-left: 0.5em;
    background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent;
}
.coverage-summary .sorted .sorter {
    background-position: 0 -20px;
}
.coverage-summary .sorted-desc .sorter {
    background-position: 0 -10px;
}
.status-line {  height: 10px; }
/* yellow */
.cbranch-no { background: yellow !important; color: #111; }
/* dark red */
.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 }
.low .chart { border:1px solid #C21F39 }
.highlighted,
.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{
  background: #C21F39 !important;
}
/* medium red */
.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE }
/* light red */
.low, .cline-no { background:#FCE1E5 }
/* light green */
.high, .cline-yes { background:rgb(230,245,208) }
/* medium green */
.cstat-yes { background:rgb(161,215,106) }
/* dark green */
.status-line.high, .high .cover-fill { background:rgb(77,146,33) }
.high .chart { border:1px solid rgb(77,146,33) }
/* dark yellow (gold) */
.status-line.medium, .medium .cover-fill { background: #f9cd0b; }
.medium .chart { border:1px solid #f9cd0b; }
/* light yellow */
.medium { background: #fff4c2; }

.cstat-skip { background: #ddd; color: #111; }
.fstat-skip { background: #ddd; color: #111 !important; }
.cbranch-skip { background: #ddd !important; color: #111; }

span.cline-neutral { background: #eaeaea; }

.coverage-summary td.empty {
    opacity: .5;
    padding-top: 4px;
    padding-bottom: 4px;
    line-height: 1;
    color: #888;
}

.cover-fill, .cover-empty {
  display:inline-block;
  height: 12px;
}
.chart {
  line-height: 0;
}
.cover-empty {
    background: white;
}
.cover-full {
    border-right: none !important;
}
pre.prettyprint {
    border: none !important;
    padding: 0 !important;
    margin: 0 !important;
}
.com { color: #999 !important; }
.ignore-none { color: #999; font-weight: normal; }

.wrapper {
  min-height: 100%;
  height: auto !important;
  height: 100%;
  margin: 0 auto -48px;
}
.footer, .push {
  height: 48px;
}


================================================
FILE: coverage/lcov-report/block-navigation.js
================================================
/* eslint-disable */
var jumpToCode = (function init() {
    // Classes of code we would like to highlight in the file view
    var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no'];

    // Elements to highlight in the file listing view
    var fileListingElements = ['td.pct.low'];

    // We don't want to select elements that are direct descendants of another match
    var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > `

    // Selecter that finds elements on the page to which we can jump
    var selector =
        fileListingElements.join(', ') +
        ', ' +
        notSelector +
        missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b`

    // The NodeList of matching elements
    var missingCoverageElements = document.querySelectorAll(selector);

    var currentIndex;

    function toggleClass(index) {
        missingCoverageElements
            .item(currentIndex)
            .classList.remove('highlighted');
        missingCoverageElements.item(index).classList.add('highlighted');
    }

    function makeCurrent(index) {
        toggleClass(index);
        currentIndex = index;
        missingCoverageElements.item(index).scrollIntoView({
            behavior: 'smooth',
            block: 'center',
            inline: 'center'
        });
    }

    function goToPrevious() {
        var nextIndex = 0;
        if (typeof currentIndex !== 'number' || currentIndex === 0) {
            nextIndex = missingCoverageElements.length - 1;
        } else if (missingCoverageElements.length > 1) {
            nextIndex = currentIndex - 1;
        }

        makeCurrent(nextIndex);
    }

    function goToNext() {
        var nextIndex = 0;

        if (
            typeof currentIndex === 'number' &&
            currentIndex < missingCoverageElements.length - 1
        ) {
            nextIndex = currentIndex + 1;
        }

        makeCurrent(nextIndex);
    }

    return function jump(event) {
        switch (event.which) {
            case 78: // n
            case 74: // j
                goToNext();
                break;
            case 66: // b
            case 75: // k
            case 80: // p
                goToPrevious();
                break;
        }
    };
})();
window.addEventListener('keydown', jumpToCode);


================================================
FILE: coverage/lcov-report/index.html
================================================

<!doctype html>
<html lang="en">

<head>
    <title>Code coverage report for All files</title>
    <meta charset="utf-8" />
    <link rel="stylesheet" href="prettify.css" />
    <link rel="stylesheet" href="base.css" />
    <link rel="shortcut icon" type="image/x-icon" href="favicon.png" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <style type='text/css'>
        .coverage-summary .sorter {
            background-image: url(sort-arrow-sprite.png);
        }
    </style>
</head>
    
<body>
<div class='wrapper'>
    <div class='pad1'>
        <h1>All files</h1>
        <div class='clearfix'>
            
            <div class='fl pad1y space-right2'>
                <span class="strong">100% </span>
                <span class="quiet">Statements</span>
                <span class='fraction'>70/70</span>
            </div>
        
            
            <div class='fl pad1y space-right2'>
                <span class="strong">90% </span>
                <span class="quiet">Branches</span>
                <span class='fraction'>18/20</span>
            </div>
        
            
            <div class='fl pad1y space-right2'>
                <span class="strong">100% </span>
                <span class="quiet">Functions</span>
                <span class='fraction'>20/20</span>
            </div>
        
            
            <div class='fl pad1y space-right2'>
                <span class="strong">100% </span>
                <span class="quiet">Lines</span>
                <span class='fraction'>66/66</span>
            </div>
        
            
        </div>
        <p class="quiet">
            Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
        </p>
    </div>
    <div class='status-line high'></div>
    <div class="pad1">
<table class="coverage-summary">
<thead>
<tr>
   <th data-col="file" data-fmt="html" data-html="true" class="file">File</th>
   <th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th>
   <th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th>
   <th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th>
   <th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th>
   <th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th>
   <th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th>
   <th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th>
   <th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th>
   <th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th>
</tr>
</thead>
<tbody><tr>
	<td class="file high" data-value="CodeSnippetContentsService.ts"><a href="CodeSnippetContentsService.ts.html">CodeSnippetContentsService.ts</a></td>
	<td data-value="100" class="pic high">
	<div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div>
	</td>
	<td data-value="100" class="pct high">100%</td>
	<td data-value="24" class="abs high">24/24</td>
	<td data-value="100" class="pct high">100%</td>
	<td data-value="2" class="abs high">2/2</td>
	<td data-value="100" class="pct high">100%</td>
	<td data-value="6" class="abs high">6/6</td>
	<td data-value="100" class="pct high">100%</td>
	<td data-value="24" class="abs high">24/24</td>
	</tr>

<tr>
	<td class="file high" data-value="CodeSnippetWidgetModel.ts"><a href="CodeSnippetWidgetModel.ts.html">CodeSnippetWidgetModel.ts</a></td>
	<td data-value="100" class="pic high">
	<div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div>
	</td>
	<td data-value="100" class="pct high">100%</td>
	<td data-value="46" class="abs high">46/46</td>
	<td data-value="88.89" class="pct high">88.89%</td>
	<td data-value="18" class="abs high">16/18</td>
	<td data-value="100" class="pct high">100%</td>
	<td data-value="14" class="abs high">14/14</td>
	<td data-value="100" class="pct high">100%</td>
	<td data-value="42" class="abs high">42/42</td>
	</tr>

</tbody>
</table>
</div>
                <div class='push'></div><!-- for sticky footer -->
            </div><!-- /wrapper -->
            <div class='footer quiet pad2 space-top1 center small'>
                Code coverage generated by
                <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
                at Tue Nov 17 2020 11:49:34 GMT-0800 (Pacific Standard Time)
            </div>
        </div>
        <script src="prettify.js"></script>
        <script>
            window.onload = function () {
                prettyPrint();
            };
        </script>
        <script src="sorter.js"></script>
        <script src="block-navigation.js"></script>
    </body>
</html>
    

================================================
FILE: coverage/lcov-report/prettify.css
================================================
.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee}


================================================
FILE: coverage/lcov-report/prettify.js
================================================
/* eslint-disable */
window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V<U;++V){var ae=Z[V];if(ae.ignoreCase){ac=true}else{if(/[a-z]/i.test(ae.source.replace(/\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi,""))){S=true;ac=false;break}}}var Y={b:8,t:9,n:10,v:11,f:12,r:13};function ab(ah){var ag=ah.charCodeAt(0);if(ag!==92){return ag}var af=ah.charAt(1);ag=Y[af];if(ag){return ag}else{if("0"<=af&&af<="7"){return parseInt(ah.substring(1),8)}else{if(af==="u"||af==="x"){return parseInt(ah.substring(2),16)}else{return ah.charCodeAt(1)}}}}function T(af){if(af<32){return(af<16?"\\x0":"\\x")+af.toString(16)}var ag=String.fromCharCode(af);if(ag==="\\"||ag==="-"||ag==="["||ag==="]"){ag="\\"+ag}return ag}function X(am){var aq=am.substring(1,am.length-1).match(new RegExp("\\\\u[0-9A-Fa-f]{4}|\\\\x[0-9A-Fa-f]{2}|\\\\[0-3][0-7]{0,2}|\\\\[0-7]{1,2}|\\\\[\\s\\S]|-|[^-\\\\]","g"));var ak=[];var af=[];var ao=aq[0]==="^";for(var ar=ao?1:0,aj=aq.length;ar<aj;++ar){var ah=aq[ar];if(/\\[bdsw]/i.test(ah)){ak.push(ah)}else{var ag=ab(ah);var al;if(ar+2<aj&&"-"===aq[ar+1]){al=ab(aq[ar+2]);ar+=2}else{al=ag}af.push([ag,al]);if(!(al<65||ag>122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;ar<af.length;++ar){var at=af[ar];if(at[0]<=ap[1]+1){ap[1]=Math.max(ap[1],at[1])}else{ai.push(ap=at)}}var an=["["];if(ao){an.push("^")}an.push.apply(an,ak);for(var ar=0;ar<ai.length;++ar){var at=ai[ar];an.push(T(at[0]));if(at[1]>at[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak<ah;++ak){var ag=aj[ak];if(ag==="("){++am}else{if("\\"===ag.charAt(0)){var af=+ag.substring(1);if(af&&af<=am){an[af]=-1}}}}for(var ak=1;ak<an.length;++ak){if(-1===an[ak]){an[ak]=++ad}}for(var ak=0,am=0;ak<ah;++ak){var ag=aj[ak];if(ag==="("){++am;if(an[am]===undefined){aj[ak]="(?:"}}else{if("\\"===ag.charAt(0)){var af=+ag.substring(1);if(af&&af<=am){aj[ak]="\\"+an[am]}}}}for(var ak=0,am=0;ak<ah;++ak){if("^"===aj[ak]&&"^"!==aj[ak+1]){aj[ak]=""}}if(al.ignoreCase&&S){for(var ak=0;ak<ah;++ak){var ag=aj[ak];var ai=ag.charAt(0);if(ag.length>=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V<U;++V){var ae=Z[V];if(ae.global||ae.multiline){throw new Error(""+ae)}aa.push("(?:"+W(ae)+")")}return new RegExp(aa.join("|"),ac?"gi":"g")}function a(V){var U=/(?:^|\s)nocode(?:\s|$)/;var X=[];var T=0;var Z=[];var W=0;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=document.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Y=S&&"pre"===S.substring(0,3);function aa(ab){switch(ab.nodeType){case 1:if(U.test(ab.className)){return}for(var ae=ab.firstChild;ae;ae=ae.nextSibling){aa(ae)}var ad=ab.nodeName;if("BR"===ad||"LI"===ad){X[W]="\n";Z[W<<1]=T++;Z[(W++<<1)|1]=ab}break;case 3:case 4:var ac=ab.nodeValue;if(ac.length){if(!Y){ac=ac.replace(/[ \t\r\n]+/g," ")}else{ac=ac.replace(/\r\n?/g,"\n")}X[W]=ac;Z[W<<1]=T;T+=ac.length;Z[(W++<<1)|1]=ab}break}}aa(V);return{sourceCode:X.join("").replace(/\n$/,""),spans:Z}}function B(S,U,W,T){if(!U){return}var V={sourceCode:U,basePos:S};W(V);T.push.apply(T,V.decorations)}var v=/\S/;function o(S){var V=undefined;for(var U=S.firstChild;U;U=U.nextSibling){var T=U.nodeType;V=(T===1)?(V?S:U):(T===3)?(v.test(U.nodeValue)?S:V):V}return V===S?undefined:V}function g(U,T){var S={};var V;(function(){var ad=U.concat(T);var ah=[];var ag={};for(var ab=0,Z=ad.length;ab<Z;++ab){var Y=ad[ab];var ac=Y[3];if(ac){for(var ae=ac.length;--ae>=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae<aq;++ae){var ag=an[ae];var ap=aj[ag];var ai=void 0;var am;if(typeof ap==="string"){am=false}else{var aa=S[ag.charAt(0)];if(aa){ai=ag.match(aa[1]);ap=aa[0]}else{for(var ao=0;ao<X;++ao){aa=T[ao];ai=ag.match(aa[1]);if(ai){ap=aa[0];break}}if(!ai){ap=F}}am=ap.length>=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y<W.length;++Y){ae(W[Y])}if(ag===(ag|0)){W[0].setAttribute("value",ag)}var aa=ac.createElement("OL");aa.className="linenums";var X=Math.max(0,((ag-1))|0)||0;for(var Y=0,T=W.length;Y<T;++Y){af=W[Y];af.className="L"+((Y+X)%10);if(!af.firstChild){af.appendChild(ac.createTextNode("\xA0"))}aa.appendChild(af)}V.appendChild(aa)}function D(ac){var aj=/\bMSIE\b/.test(navigator.userAgent);var am=/\n/g;var al=ac.sourceCode;var an=al.length;var V=0;var aa=ac.spans;var T=aa.length;var ah=0;var X=ac.decorations;var Y=X.length;var Z=0;X[Y]=an;var ar,aq;for(aq=ar=0;aq<Y;){if(X[aq]!==X[aq+2]){X[ar++]=X[aq++];X[ar++]=X[aq++]}else{aq+=2}}Y=ar;for(aq=ar=0;aq<Y;){var at=X[aq];var ab=X[aq+1];var W=aq+2;while(W+2<=Y&&X[W+1]===ab){W+=2}X[ar++]=at;X[ar++]=ab;aq=W}Y=X.length=ar;var ae=null;while(ah<T){var af=aa[ah];var S=aa[ah+2]||an;var ag=X[Z];var ap=X[Z+2]||an;var W=Math.min(S,ap);var ak=aa[ah+1];var U;if(ak.nodeType!==1&&(U=al.substring(V,W))){if(aj){U=U.replace(am,"\r")}ak.nodeValue=U;var ai=ak.ownerDocument;var ao=ai.createElement("SPAN");ao.className=X[Z+1];var ad=ak.parentNode;ad.replaceChild(ao,ak);ao.appendChild(ak);if(V<S){aa[ah+1]=ak=ai.createTextNode(al.substring(W,S));ad.insertBefore(ak,ao.nextSibling)}}V=W;if(V>=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*</.test(S)?"default-markup":"default-code"}return t[T]}c(K,["default-code"]);c(g([],[[F,/^[^<?]+/],[E,/^<!\w[^>]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa<ac.length;++aa){for(var Z=0,V=ac[aa].length;Z<V;++Z){T.push(ac[aa][Z])}}ac=null;var W=Date;if(!W.now){W={now:function(){return +(new Date)}}}var X=0;var S;var ab=/\blang(?:uage)?-([\w.]+)(?!\S)/;var ae=/\bprettyprint\b/;function U(){var ag=(window.PR_SHOULD_USE_CONTINUATION?W.now()+250:Infinity);for(;X<T.length&&W.now()<ag;X++){var aj=T[X];var ai=aj.className;if(ai.indexOf("prettyprint")>=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X<T.length){setTimeout(U,250)}else{if(ad){ad()}}}U()}window.prettyPrintOne=y;window.prettyPrint=b;window.PR={createSimpleLexer:g,registerLangHandler:c,sourceDecorator:i,PR_ATTRIB_NAME:P,PR_ATTRIB_VALUE:n,PR_COMMENT:j,PR_DECLARATION:E,PR_KEYWORD:z,PR_LITERAL:G,PR_NOCODE:N,PR_PLAIN:F,PR_PUNCTUATION:L,PR_SOURCE:J,PR_STRING:C,PR_TAG:m,PR_TYPE:O}})();PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_DECLARATION,/^<!\w[^>]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^<script\b[^>]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:<!--|-->)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]);


================================================
FILE: coverage/lcov-report/sorter.js
================================================
/* eslint-disable */
var addSorting = (function() {
    'use strict';
    var cols,
        currentSort = {
            index: 0,
            desc: false
        };

    // returns the summary table element
    function getTable() {
        return document.querySelector('.coverage-summary');
    }
    // returns the thead element of the summary table
    function getTableHeader() {
        return getTable().querySelector('thead tr');
    }
    // returns the tbody element of the summary table
    function getTableBody() {
        return getTable().querySelector('tbody');
    }
    // returns the th element for nth column
    function getNthColumn(n) {
        return getTableHeader().querySelectorAll('th')[n];
    }

    // loads all columns
    function loadColumns() {
        var colNodes = getTableHeader().querySelectorAll('th'),
            colNode,
            cols = [],
            col,
            i;

        for (i = 0; i < colNodes.length; i += 1) {
            colNode = colNodes[i];
            col = {
                key: colNode.getAttribute('data-col'),
                sortable: !colNode.getAttribute('data-nosort'),
                type: colNode.getAttribute('data-type') || 'string'
            };
            cols.push(col);
            if (col.sortable) {
                col.defaultDescSort = col.type === 'number';
                colNode.innerHTML =
                    colNode.innerHTML + '<span class="sorter"></span>';
            }
        }
        return cols;
    }
    // attaches a data attribute to every tr element with an object
    // of data values keyed by column name
    function loadRowData(tableRow) {
        var tableCols = tableRow.querySelectorAll('td'),
            colNode,
            col,
            data = {},
            i,
            val;
        for (i = 0; i < tableCols.length; i += 1) {
            colNode = tableCols[i];
            col = cols[i];
            val = colNode.getAttribute('data-value');
            if (col.type === 'number') {
                val = Number(val);
            }
            data[col.key] = val;
        }
        return data;
    }
    // loads all row data
    function loadData() {
        var rows = getTableBody().querySelectorAll('tr'),
            i;

        for (i = 0; i < rows.length; i += 1) {
            rows[i].data = loadRowData(rows[i]);
        }
    }
    // sorts the table using the data for the ith column
    function sortByIndex(index, desc) {
        var key = cols[index].key,
            sorter = function(a, b) {
                a = a.data[key];
                b = b.data[key];
                return a < b ? -1 : a > b ? 1 : 0;
            },
            finalSorter = sorter,
            tableBody = document.querySelector('.coverage-summary tbody'),
            rowNodes = tableBody.querySelectorAll('tr'),
            rows = [],
            i;

        if (desc) {
            finalSorter = function(a, b) {
                return -1 * sorter(a, b);
            };
        }

        for (i = 0; i < rowNodes.length; i += 1) {
            rows.push(rowNodes[i]);
            tableBody.removeChild(rowNodes[i]);
        }

        rows.sort(finalSorter);

        for (i = 0; i < rows.length; i += 1) {
            tableBody.appendChild(rows[i]);
        }
    }
    // removes sort indicators for current column being sorted
    function removeSortIndicators() {
        var col = getNthColumn(currentSort.index),
            cls = col.className;

        cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, '');
        col.className = cls;
    }
    // adds sort indicators for current column being sorted
    function addSortIndicators() {
        getNthColumn(currentSort.index).className += currentSort.desc
            ? ' sorted-desc'
            : ' sorted';
    }
    // adds event listeners for all sorter widgets
    function enableUI() {
        var i,
            el,
            ithSorter = function ithSorter(i) {
                var col = cols[i];

                return function() {
                    var desc = col.defaultDescSort;

                    if (currentSort.index === i) {
                        desc = !currentSort.desc;
                    }
                    sortByIndex(i, desc);
                    removeSortIndicators();
                    currentSort.index = i;
                    currentSort.desc = desc;
                    addSortIndicators();
                };
            };
        for (i = 0; i < cols.length; i += 1) {
            if (cols[i].sortable) {
                // add the click event handler on the th so users
                // dont have to click on those tiny arrows
                el = getNthColumn(i).querySelector('.sorter').parentElement;
                if (el.addEventListener) {
                    el.addEventListener('click', ithSorter(i));
                } else {
                    el.attachEvent('onclick', ithSorter(i));
                }
            }
        }
    }
    // adds sorting functionality to the UI
    return function() {
        if (!getTable()) {
            return;
        }
        cols = loadColumns();
        loadData();
        addSortIndicators();
        enableUI();
    };
})();

window.addEventListener('load', addSorting);


================================================
FILE: coverage/lcov.info
================================================
TN:
SF:src/CodeSnippetContentsService.ts
FN:20,(anonymous_7)
FN:27,(anonymous_8)
FN:38,(anonymous_9)
FN:67,(anonymous_11)
FN:90,(anonymous_13)
FN:105,(anonymous_15)
FNF:6
FNH:6
FNDA:2,(anonymous_7)
FNDA:4,(anonymous_8)
FNDA:2,(anonymous_9)
FNDA:4,(anonymous_11)
FNDA:2,(anonymous_13)
FNDA:1,(anonymous_15)
DA:1,2
DA:16,2
DA:21,2
DA:22,2
DA:23,2
DA:24,2
DA:28,4
DA:29,2
DA:31,4
DA:42,2
DA:43,2
DA:48,1
DA:50,1
DA:71,4
DA:72,4
DA:73,1
DA:75,3
DA:91,2
DA:92,2
DA:93,1
DA:95,1
DA:106,1
DA:107,1
DA:109,1
LF:24
LH:24
BRDA:28,0,0,2
BRDA:28,0,1,2
BRF:2
BRH:2
end_of_record
TN:
SF:src/CodeSnippetWidgetModel.ts
FN:16,(anonymous_0)
FN:20,(anonymous_1)
FN:25,(anonymous_2)
FN:29,(anonymous_3)
FN:36,(anonymous_4)
FN:49,(anonymous_5)
FN:57,(anonymous_6)
FN:58,(anonymous_7)
FN:62,(anonymous_8)
FN:81,(anonymous_9)
FN:94,(anonymous_10)
FN:98,(anonymous_11)
FN:99,(anonymous_12)
FN:112,(anonymous_13)
FNF:14
FNH:14
FNDA:1,(anonymous_0)
FNDA:17,(anonymous_1)
FNDA:2,(anonymous_2)
FNDA:1,(anonymous_3)
FNDA:1,(anonymous_4)
FNDA:3,(anonymous_5)
FNDA:19,(anonymous_6)
FNDA:14,(anonymous_7)
FNDA:2,(anonymous_8)
FNDA:3,(anonymous_9)
FNDA:1,(anonymous_10)
FNDA:1,(anonymous_11)
FNDA:2,(anonymous_12)
FNDA:4,(anonymous_13)
DA:1,1
DA:13,1
DA:17,1
DA:21,17
DA:22,17
DA:26,2
DA:30,1
DA:31,1
DA:32,2
DA:37,1
DA:38,2
DA:39,1
DA:40,1
DA:44,1
DA:51,3
DA:52,1
DA:54,3
DA:58,19
DA:63,2
DA:64,1
DA:66,2
DA:67,1
DA:69,1
DA:70,1
DA:71,1
DA:73,1
DA:74,1
DA:82,3
DA:83,3
DA:84,1
DA:87,2
DA:88,2
DA:90,2
DA:95,1
DA:99,1
DA:100,2
DA:113,4
DA:115,4
DA:116,3
DA:119,1
DA:120,1
DA:122,1
LF:42
LH:42
BRDA:38,0,0,1
BRDA:38,0,1,1
BRDA:51,1,0,1
BRDA:51,1,1,2
BRDA:63,2,0,1
BRDA:63,2,1,1
BRDA:66,3,0,1
BRDA:66,3,1,1
BRDA:81,4,0,0
BRDA:83,5,0,1
BRDA:83,5,1,2
BRDA:83,6,0,3
BRDA:83,6,1,2
BRDA:112,7,0,0
BRDA:115,8,0,3
BRDA:115,8,1,1
BRDA:115,9,0,4
BRDA:115,9,1,3
BRF:18
BRH:16
end_of_record


================================================
FILE: coverage/prettify.css
================================================
.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee}


================================================
FILE: coverage/prettify.js
================================================
/* eslint-disable */
window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V<U;++V){var ae=Z[V];if(ae.ignoreCase){ac=true}else{if(/[a-z]/i.test(ae.source.replace(/\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi,""))){S=true;ac=false;break}}}var Y={b:8,t:9,n:10,v:11,f:12,r:13};function ab(ah){var ag=ah.charCodeAt(0);if(ag!==92){return ag}var af=ah.charAt(1);ag=Y[af];if(ag){return ag}else{if("0"<=af&&af<="7"){return parseInt(ah.substring(1),8)}else{if(af==="u"||af==="x"){return parseInt(ah.substring(2),16)}else{return ah.charCodeAt(1)}}}}function T(af){if(af<32){return(af<16?"\\x0":"\\x")+af.toString(16)}var ag=String.fromCharCode(af);if(ag==="\\"||ag==="-"||ag==="["||ag==="]"){ag="\\"+ag}return ag}function X(am){var aq=am.substring(1,am.length-1).match(new RegExp("\\\\u[0-9A-Fa-f]{4}|\\\\x[0-9A-Fa-f]{2}|\\\\[0-3][0-7]{0,2}|\\\\[0-7]{1,2}|\\\\[\\s\\S]|-|[^-\\\\]","g"));var ak=[];var af=[];var ao=aq[0]==="^";for(var ar=ao?1:0,aj=aq.length;ar<aj;++ar){var ah=aq[ar];if(/\\[bdsw]/i.test(ah)){ak.push(ah)}else{var ag=ab(ah);var al;if(ar+2<aj&&"-"===aq[ar+1]){al=ab(aq[ar+2]);ar+=2}else{al=ag}af.push([ag,al]);if(!(al<65||ag>122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;ar<af.length;++ar){var at=af[ar];if(at[0]<=ap[1]+1){ap[1]=Math.max(ap[1],at[1])}else{ai.push(ap=at)}}var an=["["];if(ao){an.push("^")}an.push.apply(an,ak);for(var ar=0;ar<ai.length;++ar){var at=ai[ar];an.push(T(at[0]));if(at[1]>at[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak<ah;++ak){var ag=aj[ak];if(ag==="("){++am}else{if("\\"===ag.charAt(0)){var af=+ag.substring(1);if(af&&af<=am){an[af]=-1}}}}for(var ak=1;ak<an.length;++ak){if(-1===an[ak]){an[ak]=++ad}}for(var ak=0,am=0;ak<ah;++ak){var ag=aj[ak];if(ag==="("){++am;if(an[am]===undefined){aj[ak]="(?:"}}else{if("\\"===ag.charAt(0)){var af=+ag.substring(1);if(af&&af<=am){aj[ak]="\\"+an[am]}}}}for(var ak=0,am=0;ak<ah;++ak){if("^"===aj[ak]&&"^"!==aj[ak+1]){aj[ak]=""}}if(al.ignoreCase&&S){for(var ak=0;ak<ah;++ak){var ag=aj[ak];var ai=ag.charAt(0);if(ag.length>=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V<U;++V){var ae=Z[V];if(ae.global||ae.multiline){throw new Error(""+ae)}aa.push("(?:"+W(ae)+")")}return new RegExp(aa.join("|"),ac?"gi":"g")}function a(V){var U=/(?:^|\s)nocode(?:\s|$)/;var X=[];var T=0;var Z=[];var W=0;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=document.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Y=S&&"pre"===S.substring(0,3);function aa(ab){switch(ab.nodeType){case 1:if(U.test(ab.className)){return}for(var ae=ab.firstChild;ae;ae=ae.nextSibling){aa(ae)}var ad=ab.nodeName;if("BR"===ad||"LI"===ad){X[W]="\n";Z[W<<1]=T++;Z[(W++<<1)|1]=ab}break;case 3:case 4:var ac=ab.nodeValue;if(ac.length){if(!Y){ac=ac.replace(/[ \t\r\n]+/g," ")}else{ac=ac.replace(/\r\n?/g,"\n")}X[W]=ac;Z[W<<1]=T;T+=ac.length;Z[(W++<<1)|1]=ab}break}}aa(V);return{sourceCode:X.join("").replace(/\n$/,""),spans:Z}}function B(S,U,W,T){if(!U){return}var V={sourceCode:U,basePos:S};W(V);T.push.apply(T,V.decorations)}var v=/\S/;function o(S){var V=undefined;for(var U=S.firstChild;U;U=U.nextSibling){var T=U.nodeType;V=(T===1)?(V?S:U):(T===3)?(v.test(U.nodeValue)?S:V):V}return V===S?undefined:V}function g(U,T){var S={};var V;(function(){var ad=U.concat(T);var ah=[];var ag={};for(var ab=0,Z=ad.length;ab<Z;++ab){var Y=ad[ab];var ac=Y[3];if(ac){for(var ae=ac.length;--ae>=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae<aq;++ae){var ag=an[ae];var ap=aj[ag];var ai=void 0;var am;if(typeof ap==="string"){am=false}else{var aa=S[ag.charAt(0)];if(aa){ai=ag.match(aa[1]);ap=aa[0]}else{for(var ao=0;ao<X;++ao){aa=T[ao];ai=ag.match(aa[1]);if(ai){ap=aa[0];break}}if(!ai){ap=F}}am=ap.length>=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y<W.length;++Y){ae(W[Y])}if(ag===(ag|0)){W[0].setAttribute("value",ag)}var aa=ac.createElement("OL");aa.className="linenums";var X=Math.max(0,((ag-1))|0)||0;for(var Y=0,T=W.length;Y<T;++Y){af=W[Y];af.className="L"+((Y+X)%10);if(!af.firstChild){af.appendChild(ac.createTextNode("\xA0"))}aa.appendChild(af)}V.appendChild(aa)}function D(ac){var aj=/\bMSIE\b/.test(navigator.userAgent);var am=/\n/g;var al=ac.sourceCode;var an=al.length;var V=0;var aa=ac.spans;var T=aa.length;var ah=0;var X=ac.decorations;var Y=X.length;var Z=0;X[Y]=an;var ar,aq;for(aq=ar=0;aq<Y;){if(X[aq]!==X[aq+2]){X[ar++]=X[aq++];X[ar++]=X[aq++]}else{aq+=2}}Y=ar;for(aq=ar=0;aq<Y;){var at=X[aq];var ab=X[aq+1];var W=aq+2;while(W+2<=Y&&X[W+1]===ab){W+=2}X[ar++]=at;X[ar++]=ab;aq=W}Y=X.length=ar;var ae=null;while(ah<T){var af=aa[ah];var S=aa[ah+2]||an;var ag=X[Z];var ap=X[Z+2]||an;var W=Math.min(S,ap);var ak=aa[ah+1];var U;if(ak.nodeType!==1&&(U=al.substring(V,W))){if(aj){U=U.replace(am,"\r")}ak.nodeValue=U;var ai=ak.ownerDocument;var ao=ai.createElement("SPAN");ao.className=X[Z+1];var ad=ak.parentNode;ad.replaceChild(ao,ak);ao.appendChild(ak);if(V<S){aa[ah+1]=ak=ai.createTextNode(al.substring(W,S));ad.insertBefore(ak,ao.nextSibling)}}V=W;if(V>=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*</.test(S)?"default-markup":"default-code"}return t[T]}c(K,["default-code"]);c(g([],[[F,/^[^<?]+/],[E,/^<!\w[^>]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa<ac.length;++aa){for(var Z=0,V=ac[aa].length;Z<V;++Z){T.push(ac[aa][Z])}}ac=null;var W=Date;if(!W.now){W={now:function(){return +(new Date)}}}var X=0;var S;var ab=/\blang(?:uage)?-([\w.]+)(?!\S)/;var ae=/\bprettyprint\b/;function U(){var ag=(window.PR_SHOULD_USE_CONTINUATION?W.now()+250:Infinity);for(;X<T.length&&W.now()<ag;X++){var aj=T[X];var ai=aj.className;if(ai.indexOf("prettyprint")>=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X<T.length){setTimeout(U,250)}else{if(ad){ad()}}}U()}window.prettyPrintOne=y;window.prettyPrint=b;window.PR={createSimpleLexer:g,registerLangHandler:c,sourceDecorator:i,PR_ATTRIB_NAME:P,PR_ATTRIB_VALUE:n,PR_COMMENT:j,PR_DECLARATION:E,PR_KEYWORD:z,PR_LITERAL:G,PR_NOCODE:N,PR_PLAIN:F,PR_PUNCTUATION:L,PR_SOURCE:J,PR_STRING:C,PR_TAG:m,PR_TYPE:O}})();PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_DECLARATION,/^<!\w[^>]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^<script\b[^>]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:<!--|-->)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]);


================================================
FILE: coverage/sorter.js
================================================
/* eslint-disable */
var addSorting = (function() {
    'use strict';
    var cols,
        currentSort = {
            index: 0,
            desc: false
        };

    // returns the summary table element
    function getTable() {
        return document.querySelector('.coverage-summary');
    }
    // returns the thead element of the summary table
    function getTableHeader() {
        return getTable().querySelector('thead tr');
    }
    // returns the tbody element of the summary table
    function getTableBody() {
        return getTable().querySelector('tbody');
    }
    // returns the th element for nth column
    function getNthColumn(n) {
        return getTableHeader().querySelectorAll('th')[n];
    }

    // loads all columns
    function loadColumns() {
        var colNodes = getTableHeader().querySelectorAll('th'),
            colNode,
            cols = [],
            col,
            i;

        for (i = 0; i < colNodes.length; i += 1) {
            colNode = colNodes[i];
            col = {
                key: colNode.getAttribute('data-col'),
                sortable: !colNode.getAttribute('data-nosort'),
                type: colNode.getAttribute('data-type') || 'string'
            };
            cols.push(col);
            if (col.sortable) {
                col.defaultDescSort = col.type === 'number';
                colNode.innerHTML =
                    colNode.innerHTML + '<span class="sorter"></span>';
            }
        }
        return cols;
    }
    // attaches a data attribute to every tr element with an object
    // of data values keyed by column name
    function loadRowData(tableRow) {
        var tableCols = tableRow.querySelectorAll('td'),
            colNode,
            col,
            data = {},
            i,
            val;
        for (i = 0; i < tableCols.length; i += 1) {
            colNode = tableCols[i];
            col = cols[i];
            val = colNode.getAttribute('data-value');
            if (col.type === 'number') {
                val = Number(val);
            }
            data[col.key] = val;
        }
        return data;
    }
    // loads all row data
    function loadData() {
        var rows = getTableBody().querySelectorAll('tr'),
            i;

        for (i = 0; i < rows.length; i += 1) {
            rows[i].data = loadRowData(rows[i]);
        }
    }
    // sorts the table using the data for the ith column
    function sortByIndex(index, desc) {
        var key = cols[index].key,
            sorter = function(a, b) {
                a = a.data[key];
                b = b.data[key];
                return a < b ? -1 : a > b ? 1 : 0;
            },
            finalSorter = sorter,
            tableBody = document.querySelector('.coverage-summary tbody'),
            rowNodes = tableBody.querySelectorAll('tr'),
            rows = [],
            i;

        if (desc) {
            finalSorter = function(a, b) {
                return -1 * sorter(a, b);
            };
        }

        for (i = 0; i < rowNodes.length; i += 1) {
            rows.push(rowNodes[i]);
            tableBody.removeChild(rowNodes[i]);
        }

        rows.sort(finalSorter);

        for (i = 0; i < rows.length; i += 1) {
            tableBody.appendChild(rows[i]);
        }
    }
    // removes sort indicators for current column being sorted
    function removeSortIndicators() {
        var col = getNthColumn(currentSort.index),
            cls = col.className;

        cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, '');
        col.className = cls;
    }
    // adds sort indicators for current column being sorted
    function addSortIndicators() {
        getNthColumn(currentSort.index).className += currentSort.desc
            ? ' sorted-desc'
            : ' sorted';
    }
    // adds event listeners for all sorter widgets
    function enableUI() {
        var i,
            el,
            ithSorter = function ithSorter(i) {
                var col = cols[i];

                return function() {
                    var desc = col.defaultDescSort;

                    if (currentSort.index === i) {
                        desc = !currentSort.desc;
                    }
                    sortByIndex(i, desc);
                    removeSortIndicators();
                    currentSort.index = i;
                    currentSort.desc = desc;
                    addSortIndicators();
                };
            };
        for (i = 0; i < cols.length; i += 1) {
            if (cols[i].sortable) {
                // add the click event handler on the th so users
                // dont have to click on those tiny arrows
                el = getNthColumn(i).querySelector('.sorter').parentElement;
                if (el.addEventListener) {
                    el.addEventListener('click', ithSorter(i));
                } else {
                    el.attachEvent('onclick', ithSorter(i));
                }
            }
        }
    }
    // adds sorting functionality to the UI
    return function() {
        if (!getTable()) {
            return;
        }
        cols = loadColumns();
        loadData();
        addSortIndicators();
        enableUI();
    };
})();

window.addEventListener('load', addSorting);


================================================
FILE: cypress/fixtures/example.json
================================================
{
  "name": "Using fixtures to represent data",
  "email": "hello@cypress.io",
  "body": "Fixtures are a great way to mock data for responses to routes"
}

================================================
FILE: cypress/integration/codeSnippetService.spec.js
================================================
describe('Test Code Snippet Extension on load', () => {
    beforeEach(() => {
        cy.visit('http://localhost:8888/lab')
    })

    // it('Create code snippet settings on load', () => {
    //     cy.get('.jp-PluginList > ul > li').eq(1).should('have.attr', 'data-id', 'jupyterlab-code-snippets:snippets')
    // })

    it('Create default snippets in the beginning', () => {
        cy.get('.jp-codeSnippetsContainer').find('.jp-codeSnippet-item').should('have.length', 3)
    })
})

describe('Test Code Snippet Manipulation', () => {
    beforeEach(() => {
        cy.visit('http://localhost:8888/lab')
    })

    it('Create a new code snippet', () => {
        // adding a snippet
        cy.get('.jp-Notebook').rightclick()
            .get('.lm-Menu-itemLabel').eq(13).click()
            .wait(500)
            .get('.jp-codeSnippet-dialog-input').eq(0).click().type("test").should('have.value', 'test')
            .wait(500)
            .get('.jp-codeSnippet-dialog-input').eq(1).click().type("testing with cypress").should('have.value', 'testing with cypress')
            .wait(500)
            .get('.jp-codeSnippet-dialog-input').eq(2).click().type("Python").should('have.value', 'Python')
            .get('.jp-mod-accept').click();

        cy.get('.lm-Widget').eq(0).click({force: true});

        // checking the snippet
        cy.get('.jp-codeSnippetsContainer').find('.jp-codeSnippet-item').should('have.length', 4);
    })

    it('Delete a new code snippet', () => {
        // delete snippet
        cy.get('.jp-codeSnippet-item #0 > .jp-codeSnippetsContainer-button').click()
            .get('.jp-codeSnippet-more-options-delete').click()
            .get('.jp-mod-accept').click()

        // checking the snippet
        cy.get('.jp-codeSnippetsContainer').find('.jp-codeSnippet-item').should('have.length', 3);
    })
    
    it('Renaming a snippet', () => {
        cy.wait(500)
        // rename snippet
        cy.get('.jp-codeSnippet-item #0 > .jp-codeSnippetsContainer-name > span').eq(1).dblclick()
            .get('#jp-codeSnippet-rename').type('new_test')

        cy.wait(500)
        // rename with duplicate name
        cy.get('.jp-codeSnippet-item #1 > .jp-codeSnippetsContainer-name > span').eq(1).dblclick()
        .get('#jp-codeSnippet-rename').type('new_test')
        .get('.lm-StackedPanel').eq(0).click({force:true})
        .get('.jp-mod-accept').click()

    })

    it('Create a new code snippet from scratch', () => {
        cy.get('.jp-createSnippetBtn').click().get('.jp-codeSnippet-editor-name').type('create_test').should('have.value', 'create_test')
            .get('.jp-codeSnippet-editor-description').type('testing').should('have.value', 'testing')
            .get('.saveBtn').click()
    })

    it.only('Edit a snippet', () => {
        cy.get('.jp-codeSnippet-item #0 > .jp-codeSnippetsContainer-button').click()
            .get('.jp-codeSnippet-more-options-edit').click()
            .wait(500)
            .get('.jp-codeSnippet-editor-name').clear().type('test_editing').should('have.value', 'test_editing')
            .wait(500)
            .get('.jp-codeSnippet-editor-name').clear().type('test_editing').should('have.value', 'test_editing')
            .get('.saveBtn').click()

        cy.get('.jp-codeSnippet-item #0 > .jp-codeSnippetsContainer-name > span').eq(1).contains('test_editing')
    })
    // it.only('moving a snippet', () => {
    //     cy.visit('http://localhost:8888/lab')

    //     cy.wait(500)
    //     cy.get('.jp-codeSnippet-drag-hover').eq(0)
    //         .dragTo(':nth-child(3) > .jp-codeSnippet-metadata')
    //         .get('.jp-codeSnippet-item #1 > .jp-codeSnippetsContainer-name > span').eq(1).contains('test')
    // })
})

================================================
FILE: cypress/integration/examples/actions.spec.js
================================================
/// <reference types="cypress" />

context('Actions', () => {
  beforeEach(() => {
    cy.visit('https://example.cypress.io/commands/actions')
  })

  // https://on.cypress.io/interacting-with-elements

  it('.type() - type into a DOM element', () => {
    // https://on.cypress.io/type
    cy.get('.action-email')
      .type('fake@email.com').should('have.value', 'fake@email.com')

      // .type() with special character sequences
      .type('{leftarrow}{rightarrow}{uparrow}{downarrow}')
      .type('{del}{selectall}{backspace}')

      // .type() with key modifiers
      .type('{alt}{option}') //these are equivalent
      .type('{ctrl}{control}') //these are equivalent
      .type('{meta}{command}{cmd}') //these are equivalent
      .type('{shift}')

      // Delay each keypress by 0.1 sec
      .type('slow.typing@email.com', { delay: 100 })
      .should('have.value', 'slow.typing@email.com')

    cy.get('.action-disabled')
      // Ignore error checking prior to type
      // like whether the input is visible or disabled
      .type('disabled error checking', { force: true })
      .should('have.value', 'disabled error checking')
  })

  it('.focus() - focus on a DOM element', () => {
    // https://on.cypress.io/focus
    cy.get('.action-focus').focus()
      .should('have.class', 'focus')
      .prev().should('have.attr', 'style', 'color: orange;')
  })

  it('.blur() - blur off a DOM element', () => {
    // https://on.cypress.io/blur
    cy.get('.action-blur').type('About to blur').blur()
      .should('have.class', 'error')
      .prev().should('have.attr', 'style', 'color: red;')
  })

  it('.clear() - clears an input or textarea element', () => {
    // https://on.cypress.io/clear
    cy.get('.action-clear').type('Clear this text')
      .should('have.value', 'Clear this text')
      .clear()
      .should('have.value', '')
  })

  it('.submit() - submit a form', () => {
    // https://on.cypress.io/submit
    cy.get('.action-form')
      .find('[type="text"]').type('HALFOFF')

    cy.get('.action-form').submit()
      .next().should('contain', 'Your form has been submitted!')
  })

  it('.click() - click on a DOM element', () => {
    // https://on.cypress.io/click
    cy.get('.action-btn').click()

    // You can click on 9 specific positions of an element:
    //  -----------------------------------
    // | topLeft        top       topRight |
    // |                                   |
    // |                                   |
    // |                                   |
    // | left          center        right |
    // |                                   |
    // |                                   |
    // |                                
Download .txt
gitextract_5ffki41f/

├── .eslintignore
├── .eslintrc.js
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   └── feature_request.md
│   └── workflows/
│       └── build.yml
├── .gitignore
├── .husky/
│   ├── .gitignore
│   └── pre-commit
├── .prettierignore
├── .prettierrc
├── .vscode/
│   ├── launch.json
│   └── settings.json
├── LICENSE
├── MANIFEST.in
├── PRESSRELEASE.md
├── PROGRESS.md
├── README.md
├── babel.config.js
├── binder/
│   ├── environment.yml
│   ├── postBuild
│   ├── requirements.txt
│   └── workspace.json
├── coverage/
│   ├── CodeSnippetContentsService.ts.html
│   ├── CodeSnippetWidgetModel.ts.html
│   ├── base.css
│   ├── block-navigation.js
│   ├── clover.xml
│   ├── coverage-final.json
│   ├── index.html
│   ├── lcov-report/
│   │   ├── CodeSnippetContentsService.ts.html
│   │   ├── CodeSnippetWidgetModel.ts.html
│   │   ├── base.css
│   │   ├── block-navigation.js
│   │   ├── index.html
│   │   ├── prettify.css
│   │   ├── prettify.js
│   │   └── sorter.js
│   ├── lcov.info
│   ├── prettify.css
│   ├── prettify.js
│   └── sorter.js
├── cypress/
│   ├── fixtures/
│   │   └── example.json
│   ├── integration/
│   │   ├── codeSnippetService.spec.js
│   │   └── examples/
│   │       ├── actions.spec.js
│   │       ├── aliasing.spec.js
│   │       ├── assertions.spec.js
│   │       ├── connectors.spec.js
│   │       ├── cookies.spec.js
│   │       ├── cypress_api.spec.js
│   │       ├── files.spec.js
│   │       ├── local_storage.spec.js
│   │       ├── location.spec.js
│   │       ├── misc.spec.js
│   │       ├── navigation.spec.js
│   │       ├── network_requests.spec.js
│   │       ├── querying.spec.js
│   │       ├── spies_stubs_clocks.spec.js
│   │       ├── traversal.spec.js
│   │       ├── utilities.spec.js
│   │       ├── viewport.spec.js
│   │       ├── waiting.spec.js
│   │       └── window.spec.js
│   ├── plugins/
│   │   └── index.js
│   └── support/
│       ├── commands.js
│       └── index.js
├── cypress.json
├── docs/
│   ├── contributor/
│   │   ├── codebase.rst
│   │   ├── contribute.rst
│   │   └── snippet_metadata.rst
│   ├── getting_started/
│   │   ├── changelog.rst
│   │   ├── installation.rst
│   │   └── overview.rst
│   ├── index.rst
│   └── user/
│       ├── features.rst
│       ├── transition.rst
│       └── ux.rst
├── install.json
├── jest.config.js
├── junit.xml
├── jupyterlab-code-snippets/
│   ├── _version.py
│   └── labextension/
│       ├── build_log.json
│       ├── package.json
│       ├── schemas/
│       │   └── jupyterlab-code-snippets/
│       │       ├── package.json.orig
│       │       └── snippets.json
│       └── static/
│           ├── lib_index_js.be5d61b481146873348d.js
│           ├── remoteEntry.0a192b189a42c6f0af60.js
│           ├── style.js
│           ├── style_index_js.93ff47ff4745f8384ae9.js
│           └── vendors-node_modules_css-loader_dist_runtime_api_js-node_modules_css-loader_dist_runtime_cssW-7d5e6f.8245c3041950ff727f29.js
├── package.json
├── pyproject.toml
├── schema/
│   └── snippets.json
├── setup.py
├── snippets_example/
│   ├── carbon_emissions.json
│   ├── filter_income.json
│   ├── gdp_calculator.json
│   ├── generate_hundred.json
│   ├── import_cleaning.json
│   ├── import_matlib.json
│   ├── life_exp_eur_asia.json
│   ├── lorenz_deriv.json
│   ├── matplotlib_import.json
│   ├── matrix_lstsqr.json
│   ├── most_frequent.json
│   ├── parallel_strings.json
│   ├── plotting_sine.json
│   ├── progress_bar.json
│   ├── sum_array.json
│   └── time_calculation.json
├── src/
│   ├── CodeSnippetContentsService.ts
│   ├── CodeSnippetDisplay.tsx
│   ├── CodeSnippetEditor.tsx
│   ├── CodeSnippetEditorTags.tsx
│   ├── CodeSnippetFilterTools.tsx
│   ├── CodeSnippetInputDialog.ts
│   ├── CodeSnippetLanguages.ts
│   ├── CodeSnippetMenu.ts
│   ├── CodeSnippetMessage.ts
│   ├── CodeSnippetPreview.ts
│   ├── CodeSnippetService.ts
│   ├── CodeSnippetUtilities.ts
│   ├── CodeSnippetWidget.tsx
│   ├── index.ts
│   └── svg.d.ts
├── style/
│   ├── base.css
│   ├── index.css
│   └── index.js
├── test/
│   ├── codeSnippetContentsService.test.ts
│   └── sample.test.ts
├── testutils/
│   └── jest-setup-files.js
├── tsconfig.json
└── tsconfig.test.json
Download .txt
SYMBOL INDEX (514 symbols across 28 files)

FILE: coverage/block-navigation.js
  function toggleClass (line 24) | function toggleClass(index) {
  function makeCurrent (line 31) | function makeCurrent(index) {
  function goToPrevious (line 41) | function goToPrevious() {
  function goToNext (line 52) | function goToNext() {

FILE: coverage/lcov-report/block-navigation.js
  function toggleClass (line 24) | function toggleClass(index) {
  function makeCurrent (line 31) | function makeCurrent(index) {
  function goToPrevious (line 41) | function goToPrevious() {
  function goToNext (line 52) | function goToNext() {

FILE: coverage/lcov-report/prettify.js
  function k (line 2) | function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V...
  function a (line 2) | function a(V){var U=/(?:^|\s)nocode(?:\s|$)/;var X=[];var T=0;var Z=[];v...
  function B (line 2) | function B(S,U,W,T){if(!U){return}var V={sourceCode:U,basePos:S};W(V);T....
  function o (line 2) | function o(S){var V=undefined;for(var U=S.firstChild;U;U=U.nextSibling){...
  function g (line 2) | function g(U,T){var S={};var V;(function(){var ad=U.concat(T);var ah=[];...
  function i (line 2) | function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\...
  function Q (line 2) | function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac...
  function D (line 2) | function D(ac){var aj=/\bMSIE\b/.test(navigator.userAgent);var am=/\n/g;...
  function c (line 2) | function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnPrope...
  function q (line 2) | function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*</.test(S)?"default...
  function d (line 2) | function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.so...
  function y (line 2) | function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U...
  function b (line 2) | function b(ad){function Y(af){return document.getElementsByTagName(af)}v...

FILE: coverage/lcov-report/sorter.js
  function getTable (line 11) | function getTable() {
  function getTableHeader (line 15) | function getTableHeader() {
  function getTableBody (line 19) | function getTableBody() {
  function getNthColumn (line 23) | function getNthColumn(n) {
  function loadColumns (line 28) | function loadColumns() {
  function loadRowData (line 53) | function loadRowData(tableRow) {
  function loadData (line 72) | function loadData() {
  function sortByIndex (line 81) | function sortByIndex(index, desc) {
  function removeSortIndicators (line 112) | function removeSortIndicators() {
  function addSortIndicators (line 120) | function addSortIndicators() {
  function enableUI (line 126) | function enableUI() {

FILE: coverage/prettify.js
  function k (line 2) | function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V...
  function a (line 2) | function a(V){var U=/(?:^|\s)nocode(?:\s|$)/;var X=[];var T=0;var Z=[];v...
  function B (line 2) | function B(S,U,W,T){if(!U){return}var V={sourceCode:U,basePos:S};W(V);T....
  function o (line 2) | function o(S){var V=undefined;for(var U=S.firstChild;U;U=U.nextSibling){...
  function g (line 2) | function g(U,T){var S={};var V;(function(){var ad=U.concat(T);var ah=[];...
  function i (line 2) | function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\...
  function Q (line 2) | function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac...
  function D (line 2) | function D(ac){var aj=/\bMSIE\b/.test(navigator.userAgent);var am=/\n/g;...
  function c (line 2) | function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnPrope...
  function q (line 2) | function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*</.test(S)?"default...
  function d (line 2) | function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.so...
  function y (line 2) | function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U...
  function b (line 2) | function b(ad){function Y(af){return document.getElementsByTagName(af)}v...

FILE: coverage/sorter.js
  function getTable (line 11) | function getTable() {
  function getTableHeader (line 15) | function getTableHeader() {
  function getTableBody (line 19) | function getTableBody() {
  function getNthColumn (line 23) | function getNthColumn(n) {
  function loadColumns (line 28) | function loadColumns() {
  function loadRowData (line 53) | function loadRowData(tableRow) {
  function loadData (line 72) | function loadData() {
  function sortByIndex (line 81) | function sortByIndex(index, desc) {
  function removeSortIndicators (line 112) | function removeSortIndicators() {
  function addSortIndicators (line 120) | function addSortIndicators() {
  function enableUI (line 126) | function enableUI() {

FILE: cypress/integration/examples/misc.spec.js
  method onBeforeScreenshot (line 92) | onBeforeScreenshot () { }
  method onAfterScreenshot (line 93) | onAfterScreenshot () { }

FILE: cypress/integration/examples/navigation.spec.js
  method onBeforeLoad (line 46) | onBeforeLoad (contentWindow) {
  method onLoad (line 50) | onLoad (contentWindow) {

FILE: cypress/integration/examples/spies_stubs_clocks.spec.js
  method foo (line 11) | foo () {}
  method foo (line 29) | foo (x) {
  method foo (line 57) | foo (a, b) {
  method greet (line 107) | greet (name) {
  method add (line 136) | add (a, b) {

FILE: cypress/integration/examples/utilities.spec.js
  function waitOneSecond (line 86) | function waitOneSecond () {

FILE: jupyterlab-code-snippets/labextension/static/lib_index_js.be5d61b481146873348d.js
  class CodeSnippetContentsService (line 22) | class CodeSnippetContentsService {
    method constructor (line 23) | constructor() {
    method getInstance (line 29) | static getInstance() {
    method save (line 42) | async save(path, options) {
  class CodeSnippetDisplay (line 180) | class CodeSnippetDisplay extends (react__WEBPACK_IMPORTED_MODULE_11___de...
    method constructor (line 181) | constructor(props) {
    method handleRenameSnippet (line 513) | async handleRenameSnippet(event) {
    method handleDragSnippet (line 586) | handleDragSnippet(event) {
    method _evtMouseUp (line 609) | _evtMouseUp(event) {
    method handleDragMove (line 616) | handleDragMove(event) {
    method shouldStartDrag (line 636) | shouldStartDrag(prevX, prevY, nextX, nextY) {
    method startDrag (line 641) | async startDrag(dragImage, codeSnippet, clientX, clientY) {
    method _evtMouseLeave (line 666) | _evtMouseLeave() {
    method _setPreviewPosition (line 675) | _setPreviewPosition(id) {
    method _setOptionsPosition (line 689) | _setOptionsPosition(event) {
    method renderLanguageIcon (line 706) | renderLanguageIcon(language) {
    method renderDescription (line 839) | renderDescription(codeSnippet, id) {
    method getActiveTags (line 848) | getActiveTags() {
    method deleteCommand (line 861) | deleteCommand(codeSnippet) {
    method exportCommand (line 895) | exportCommand(codeSnippet) {
    method removeOptionsNode (line 926) | removeOptionsNode() {
    method createOptionsNode (line 933) | createOptionsNode(codeSnippet) {
    method setSearchOptions (line 994) | setSearchOptions(selectedOptions) {
    method render (line 999) | render() {
  class OptionsHandler (line 1023) | class OptionsHandler extends _lumino_widgets__WEBPACK_IMPORTED_MODULE_7_...
    method constructor (line 1024) | constructor(display, codeSnippet) {
  class PreviewHandler (line 1028) | class PreviewHandler extends _lumino_widgets__WEBPACK_IMPORTED_MODULE_7_...
    method constructor (line 1029) | constructor() {
  class Private (line 1033) | class Private {
    method createPreviewContent (line 1034) | static createPreviewContent() {
    method createPreviewNode (line 1041) | static createPreviewNode() {
    method handleOnBlur (line 1962) | static handleOnBlur(event) {
    method createInputNode (line 1971) | static createInputNode(snippetTags, language, langTags) {
    method addTag (line 2044) | static addTag(event) {
    method addTagOnKeyDown (line 2055) | static addTagOnKeyDown(event) {
    method addTagOnBlur (line 2102) | static addTagOnBlur(event) {
    method handleClick (line 2121) | static handleClick(event) {
  class CodeSnippetEditor (line 1110) | class CodeSnippetEditor extends _jupyterlab_apputils__WEBPACK_IMPORTED_M...
    method constructor (line 1111) | constructor(editorServices, tracker, codeSnippetWidget, args) {
    method codeSnippetEditorMetadata (line 1129) | get codeSnippetEditorMetadata() {
    method deactivateEditor (line 1132) | deactivateEditor(event) {
    method deactivateNameField (line 1163) | deactivateNameField(nameInput) {
    method deactivateDescriptionField (line 1168) | deactivateDescriptionField(descriptionInput) {
    method activeFieldState (line 1173) | activeFieldState(event) {
    method onUpdateRequest (line 1179) | onUpdateRequest(msg) {
    method onAfterAttach (line 1208) | onAfterAttach(msg) {
    method onAfterShow (line 1221) | onAfterShow(msg) {
    method onActivateRequest (line 1230) | onActivateRequest(msg) {
    method onCloseRequest (line 1233) | onCloseRequest(msg) {
    method activateCodeMirror (line 1278) | activateCodeMirror(event) {
    method deactivateCodeMirror (line 1293) | deactivateCodeMirror(editor) {
    method handleInputFieldChange (line 1298) | handleInputFieldChange(event) {
    method saveChange (line 1308) | saveChange(event) {
    method updateSnippet (line 1317) | async updateSnippet() {
    method handleChangeOnTag (line 1403) | handleChangeOnTag(tags) {
    method handleOnBlur (line 1413) | handleOnBlur(event) {
    method renderCodeInput (line 1422) | renderCodeInput() {
    method renderLanguages (line 1426) | renderLanguages() {
    method renderLanguageOptions (line 1432) | renderLanguageOptions(option) {
    method render (line 1435) | render() {
  class CodeSnippetEditorTags (line 1495) | class CodeSnippetEditorTags extends (react__WEBPACK_IMPORTED_MODULE_1___...
    method constructor (line 1496) | constructor(props) {
    method componentDidMount (line 1505) | componentDidMount() {
    method componentDidUpdate (line 1511) | componentDidUpdate(prevProps) {
    method handleClick (line 1518) | handleClick(event) {
    method handleOnChange (line 1523) | handleOnChange() {
    method handleClickHelper (line 1526) | handleClickHelper(
    method addTagOnClick (line 1533) | addTagOnClick(event) {
    method addTagOnKeyDown (line 1542) | addTagOnKeyDown(event) {
    method addTagOnBlur (line 1560) | addTagOnBlur(event) {
    method renderTags (line 1568) | renderTags() {
    method render (line 1590) | render() {
  class FilterTools (line 1627) | class FilterTools extends (react__WEBPACK_IMPORTED_MODULE_1___default()....
    method constructor (line 1628) | constructor(props) {
    method componentDidUpdate (line 1642) | componentDidUpdate(prevProps) {
    method createFilterBox (line 1653) | createFilterBox() {
    method renderTags (line 1659) | renderTags(tags, type) {
    method renderAppliedTag (line 1700) | renderAppliedTag(tag, index) {
    method renderUnappliedTag (line 1705) | renderUnappliedTag(tag, index) {
    method handleClick (line 1709) | handleClick(event) {
    method handleClickHelper (line 1717) | handleClickHelper(parent, currentTags, clickedTag) {
    method filterSnippets (line 1729) | filterSnippets() {
    method renderFilterOption (line 1732) | renderFilterOption() {
    method render (line 1743) | render() {
  class CodeSnippetDialog (line 1802) | class CodeSnippetDialog extends _jupyterlab_apputils__WEBPACK_IMPORTED_M...
    method onAfterAttach (line 1803) | onAfterAttach(msg) {
    method onAfterDetach (line 1814) | onAfterDetach(msg) {
    method _evtKeydown (line 1821) | _evtKeydown(event) {
  function showCodeSnippetDialog (line 1847) | function showCodeSnippetDialog(options = {}) {
  function CodeSnippetInputDialog (line 1855) | function CodeSnippetInputDialog(codeSnippetWidget, code, language, idx) {
  function showInputDialog (line 1879) | function showInputDialog(codeSnippetWidget, tags, idx, codeSnippetManage...
  function createNewSnippet (line 1918) | function createNewSnippet(codeSnippetWidget, newSnippet, codeSnippetMana...
  function isValidFileName (line 1933) | function isValidFileName(name) {
  class InputHandler (line 1940) | class InputHandler extends _lumino_widgets__WEBPACK_IMPORTED_MODULE_2__....
    method constructor (line 1945) | constructor(snippetTags, language, langTags) {
    method getValue (line 1949) | getValue() {
  class Private (line 1961) | class Private {
    method createPreviewContent (line 1034) | static createPreviewContent() {
    method createPreviewNode (line 1041) | static createPreviewNode() {
    method handleOnBlur (line 1962) | static handleOnBlur(event) {
    method createInputNode (line 1971) | static createInputNode(snippetTags, language, langTags) {
    method addTag (line 2044) | static addTag(event) {
    method addTagOnKeyDown (line 2055) | static addTagOnKeyDown(event) {
    method addTagOnBlur (line 2102) | static addTagOnBlur(event) {
    method handleClick (line 2121) | static handleClick(event) {
  function showMoreOptions (line 2567) | function showMoreOptions(options = {}) {
  class OptionsMessage (line 2574) | class OptionsMessage extends _lumino_widgets__WEBPACK_IMPORTED_MODULE_1_...
    method constructor (line 2575) | constructor(options = {}) {
    method launch (line 2598) | launch() {
    method handleEvent (line 2621) | handleEvent(event) {
    method _evtClick (line 2638) | _evtClick(event) {
    method reject (line 2652) | reject() {
    method _resolve (line 2661) | _resolve() {
    method dispose (line 2676) | dispose() {
    method onAfterAttach (line 2688) | onAfterAttach(msg) {
    method onAfterDetach (line 2696) | onAfterDetach(msg) {
  class Renderer (line 2703) | class Renderer {
    method createBody (line 2711) | createBody(value) {
    method createBody (line 3065) | createBody(value) {
  function showMessage (line 2792) | function showMessage(type) {
  class CodeSnippetMessage (line 2802) | class CodeSnippetMessage extends _jupyterlab_apputils__WEBPACK_IMPORTED_...
    method constructor (line 2803) | constructor(options = {}) {
    method onAfterAttach (line 2807) | onAfterAttach(msg) {
    method onAfterDetach (line 2815) | onAfterDetach(msg) {
    method handleEvent (line 2820) | handleEvent(event) {
    method _evtKeydown (line 2830) | _evtKeydown(event) {
  class MessageHandler (line 2841) | class MessageHandler extends _lumino_widgets__WEBPACK_IMPORTED_MODULE_1_...
    method constructor (line 2842) | constructor(type) {
  function createMessageNode (line 2853) | function createMessageNode(type) {
  function showPreview (line 2923) | function showPreview(options = {}, editorServices) {
  class Preview (line 2934) | class Preview extends _lumino_widgets__WEBPACK_IMPORTED_MODULE_2__.Widget {
    method constructor (line 2935) | constructor(options = {}, editorServices) {
    method launch (line 2961) | launch() {
    method reject (line 2980) | reject() {
    method _resolve (line 2989) | _resolve() {
    method dispose (line 3004) | dispose() {
    method onAfterAttach (line 3016) | onAfterAttach(msg) {
    method onAfterShow (line 3023) | onAfterShow(msg) {
    method onUpdateRequest (line 3028) | onUpdateRequest(msg) {
  class Renderer (line 3057) | class Renderer {
    method createBody (line 2711) | createBody(value) {
    method createBody (line 3065) | createBody(value) {
  class CodeSnippetService (line 3125) | class CodeSnippetService {
    method constructor (line 3126) | constructor(settings, app) {
    method convertToICodeSnippetList (line 3162) | convertToICodeSnippetList(snippets) {
    method init (line 3170) | static init(settings, app) {
    method getCodeSnippetService (line 3175) | static getCodeSnippetService() {
    method settings (line 3178) | get settings() {
    method snippets (line 3181) | get snippets() {
    method getSnippetByName (line 3184) | getSnippetByName(snippetName) {
    method addSnippet (line 3187) | async addSnippet(snippet) {
    method deleteSnippet (line 3203) | async deleteSnippet(id) {
    method renameSnippet (line 3227) | async renameSnippet(oldName, newName) {
    method duplicateNameExists (line 3241) | duplicateNameExists(newName) {
    method modifyExistingSnippet (line 3249) | async modifyExistingSnippet(oldName, newSnippet) {
    method moveSnippet (line 3263) | async moveSnippet(fromIdx, toIdx) {
    method orderSnippets (line 3292) | async orderSnippets() {
  function validateInputs (line 3326) | function validateInputs(name, description, language) {
  function saveOverWriteFile (line 3349) | async function saveOverWriteFile(codeSnippetManager, oldSnippet, newSnip...
  function shouldOverwrite (line 3373) | async function shouldOverwrite(newName) {
  class CodeSnippetWidget (line 3446) | class CodeSnippetWidget extends _jupyterlab_apputils__WEBPACK_IMPORTED_M...
    method constructor (line 3447) | constructor(getCurrentWidget, app, editorServices) {
    method updateCodeSnippetWidget (line 3459) | updateCodeSnippetWidget() {
    method onAfterShow (line 3465) | onAfterShow(msg) {
    method openCodeSnippetEditor (line 3468) | openCodeSnippetEditor(args) {
    method handleEvent (line 3481) | handleEvent(event) {
    method onAfterAttach (line 3503) | onAfterAttach(msg) {
    method onBeforeDetach (line 3515) | onBeforeDetach(msg) {
    method _findSnippet (line 3528) | _findSnippet(node) {
    method _evtDragEnter (line 3543) | _evtDragEnter(event) {
    method _evtDragLeave (line 3564) | _evtDragLeave(event) {
    method _evtDragOver (line 3578) | _evtDragOver(event) {
    method findCellData (line 3598) | findCellData(mime) {
    method _evtDrop (line 3605) | async _evtDrop(event) {
    method moveCodeSnippet (line 3660) | moveCodeSnippet(srcIdx, targetIdx) {
    method render (line 3672) | render() {
  function activateCodeSnippet (line 3767) | function activateCodeSnippet(app, palette, restorer, editorServices) {
  function getSelectedText (line 3952) | function getSelectedText() {

FILE: jupyterlab-code-snippets/labextension/static/remoteEntry.0a192b189a42c6f0af60.js
  function __webpack_require__ (line 58) | function __webpack_require__(moduleId) {
  function o (line 284) | function o(){return g.pop().replace(/^\((.+)\)$/,"$1")}

FILE: jupyterlab-code-snippets/labextension/static/vendors-node_modules_css-loader_dist_runtime_api_js-node_modules_css-loader_dist_runtime_cssW-7d5e6f.8245c3041950ff727f29.js
  function _slicedToArray (line 87) | function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterab...
  function _nonIterableRest (line 89) | function _nonIterableRest() { throw new TypeError("Invalid attempt to de...
  function _unsupportedIterableToArray (line 91) | function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (ty...
  function _arrayLikeToArray (line 93) | function _arrayLikeToArray(arr, len) { if (len == null || len > arr.leng...
  function _iterableToArrayLimit (line 95) | function _iterableToArrayLimit(arr, i) { var _i = arr && (typeof Symbol ...
  function _arrayWithHoles (line 97) | function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
  function getIndexByIdentifier (line 217) | function getIndexByIdentifier(identifier) {
  function modulesToDom (line 230) | function modulesToDom(list, options) {
  function insertStyleElement (line 264) | function insertStyleElement(options) {
  function removeStyleElement (line 295) | function removeStyleElement(style) {
  function applyToSingletonTag (line 314) | function applyToSingletonTag(style, index, remove, obj) {
  function applyToTag (line 337) | function applyToTag(style, options, obj) {
  function addStyle (line 369) | function addStyle(obj, options) {

FILE: src/CodeSnippetContentsService.ts
  class CodeSnippetContentsService (line 9) | class CodeSnippetContentsService {
    method constructor (line 13) | private constructor() {
    method getInstance (line 20) | static getInstance(): CodeSnippetContentsService {
    method save (line 34) | async save(

FILE: src/CodeSnippetDisplay.tsx
  constant CODE_SNIPPETS_HEADER_CLASS (line 100) | const CODE_SNIPPETS_HEADER_CLASS = 'jp-codeSnippetsHeader';
  constant CODE_SNIPPET_TITLE (line 101) | const CODE_SNIPPET_TITLE = 'jp-codeSnippet-title';
  constant CODE_SNIPPETS_CONTAINER (line 102) | const CODE_SNIPPETS_CONTAINER = 'jp-codeSnippetsContainer';
  constant DISPLAY_NAME_CLASS (line 103) | const DISPLAY_NAME_CLASS = 'jp-codeSnippetsContainer-name';
  constant BUTTON_CLASS (line 104) | const BUTTON_CLASS = 'jp-codeSnippetsContainer-button';
  constant TITLE_CLASS (line 105) | const TITLE_CLASS = 'jp-codeSnippetsContainer-title';
  constant ACTION_BUTTONS_WRAPPER_CLASS (line 106) | const ACTION_BUTTONS_WRAPPER_CLASS = 'jp-codeSnippetsContainer-action-bu...
  constant ACTION_BUTTON_CLASS (line 107) | const ACTION_BUTTON_CLASS = 'jp-codeSnippetsContainer-actionButton';
  constant SEARCH_BOLD (line 108) | const SEARCH_BOLD = 'jp-codeSnippet-search-bolding';
  constant SNIPPET_DRAG_IMAGE (line 109) | const SNIPPET_DRAG_IMAGE = 'jp-codeSnippet-drag-image';
  constant CODE_SNIPPET_DRAG_HOVER (line 110) | const CODE_SNIPPET_DRAG_HOVER = 'jp-codeSnippet-drag-hover';
  constant CODE_SNIPPET_DRAG_HOVER_SELECTED (line 111) | const CODE_SNIPPET_DRAG_HOVER_SELECTED = 'jp-codeSnippet-drag-hover-sele...
  constant CODE_SNIPPET_METADATA (line 112) | const CODE_SNIPPET_METADATA = 'jp-codeSnippet-metadata';
  constant CODE_SNIPPET_DESC (line 113) | const CODE_SNIPPET_DESC = 'jp-codeSnippet-description';
  constant CODE_SNIPPET_EDITOR (line 114) | const CODE_SNIPPET_EDITOR = 'jp-codeSnippet-editor';
  constant CODE_SNIPPET_MORE_OPTIONS (line 115) | const CODE_SNIPPET_MORE_OPTIONS = 'jp-codeSnippet-options';
  constant CODE_SNIPPET_MORE_OTPIONS_CONTENT (line 116) | const CODE_SNIPPET_MORE_OTPIONS_CONTENT = 'jp-codeSnippet-more-options-c...
  constant CODE_SNIPPET_MORE_OTPIONS_COPY (line 117) | const CODE_SNIPPET_MORE_OTPIONS_COPY = 'jp-codeSnippet-more-options-copy';
  constant CODE_SNIPPET_MORE_OTPIONS_INSERT (line 118) | const CODE_SNIPPET_MORE_OTPIONS_INSERT = 'jp-codeSnippet-more-options-in...
  constant CODE_SNIPPET_MORE_OTPIONS_EDIT (line 119) | const CODE_SNIPPET_MORE_OTPIONS_EDIT = 'jp-codeSnippet-more-options-edit';
  constant CODE_SNIPPET_MORE_OTPIONS_DELETE (line 120) | const CODE_SNIPPET_MORE_OTPIONS_DELETE = 'jp-codeSnippet-more-options-de...
  constant CODE_SNIPPET_MORE_OTPIONS_EXPORT (line 121) | const CODE_SNIPPET_MORE_OTPIONS_EXPORT = 'jp-codeSnippet-more-options-ex...
  constant CODE_SNIPPET_CREATE_NEW_BTN (line 122) | const CODE_SNIPPET_CREATE_NEW_BTN = 'jp-createSnippetBtn';
  constant CODE_SNIPPET_NAME (line 123) | const CODE_SNIPPET_NAME = 'jp-codeSnippet-name';
  constant OPTIONS_BODY (line 124) | const OPTIONS_BODY = 'jp-codeSnippet-options-body';
  constant DRAG_THRESHOLD (line 129) | const DRAG_THRESHOLD = 3;
  constant CODE_SNIPPET_ITEM (line 134) | const CODE_SNIPPET_ITEM = 'jp-codeSnippet-item';
  constant JUPYTER_CELL_MIME (line 139) | const JUPYTER_CELL_MIME = 'application/vnd.jupyter.cells';
  type ICodeSnippetDisplayProps (line 152) | interface ICodeSnippetDisplayProps {
  type ICodeSnippetDisplayState (line 165) | interface ICodeSnippetDisplayState {
  class CodeSnippetDisplay (line 175) | class CodeSnippetDisplay extends React.Component<
    method constructor (line 181) | constructor(props: ICodeSnippetDisplayProps) {
    method handleRenameSnippet (line 504) | private async handleRenameSnippet(
    method handleDragSnippet (line 582) | private handleDragSnippet(
    method _evtMouseUp (line 618) | private _evtMouseUp(event: MouseEvent): void {
    method handleDragMove (line 629) | private handleDragMove(event: MouseEvent): void {
    method shouldStartDrag (line 670) | private shouldStartDrag(
    method startDrag (line 681) | private async startDrag(
    method _evtMouseLeave (line 718) | private _evtMouseLeave(): void {
    method _setPreviewPosition (line 728) | private _setPreviewPosition(id: number): void {
    method _setOptionsPosition (line 746) | private _setOptionsPosition(
    method renderLanguageIcon (line 774) | private renderLanguageIcon(language: string): JSX.Element {
    method renderDescription (line 1405) | renderDescription(codeSnippet: ICodeSnippet, id: number): JSX.Element {
    method getActiveTags (line 1429) | getActiveTags(): string[][] {
    method deleteCommand (line 1469) | private deleteCommand(codeSnippet: ICodeSnippet): void {
    method exportCommand (line 1507) | private exportCommand(codeSnippet: ICodeSnippet): void {
    method removeOptionsNode (line 1544) | private removeOptionsNode(): void {
    method createOptionsNode (line 1552) | public createOptionsNode(codeSnippet: ICodeSnippet): HTMLElement {
    method setSearchOptions (line 1617) | setSearchOptions(selectedOptions: string[]): void {
    method render (line 1623) | render(): React.ReactElement {
  class OptionsHandler (line 1675) | class OptionsHandler extends Widget {
    method constructor (line 1676) | constructor(display: CodeSnippetDisplay, codeSnippet: ICodeSnippet) {
  class PreviewHandler (line 1681) | class PreviewHandler extends Widget {
    method constructor (line 1682) | constructor() {
  class Private (line 1687) | class Private {
    method createPreviewContent (line 1688) | static createPreviewContent(): HTMLElement {
    method createPreviewNode (line 1695) | static createPreviewNode(): HTMLElement {

FILE: src/CodeSnippetEditor.tsx
  constant CODE_SNIPPET_EDITOR (line 41) | const CODE_SNIPPET_EDITOR = 'jp-codeSnippet-editor';
  constant CODE_SNIPPET_EDITOR_TITLE (line 42) | const CODE_SNIPPET_EDITOR_TITLE = 'jp-codeSnippet-editor-title';
  constant CODE_SNIPPET_EDITOR_METADATA (line 43) | const CODE_SNIPPET_EDITOR_METADATA = 'jp-codeSnippet-editor-metadata';
  constant CODE_SNIPPET_EDITOR_INPUT_ACTIVE (line 44) | const CODE_SNIPPET_EDITOR_INPUT_ACTIVE = 'jp-codeSnippet-editor-active';
  constant CODE_SNIPPET_EDITOR_NAME_INPUT (line 45) | const CODE_SNIPPET_EDITOR_NAME_INPUT = 'jp-codeSnippet-editor-name';
  constant CODE_SNIPPET_EDITOR_LABEL (line 46) | const CODE_SNIPPET_EDITOR_LABEL = 'jp-codeSnippet-editor-label';
  constant CODE_SNIPPET_EDITOR_DESC_INPUT (line 47) | const CODE_SNIPPET_EDITOR_DESC_INPUT = 'jp-codeSnippet-editor-description';
  constant CODE_SNIPPET_EDITOR_LANG_INPUT (line 48) | const CODE_SNIPPET_EDITOR_LANG_INPUT = 'jp-codeSnippet-editor-language';
  constant CODE_SNIPPET_EDITOR_MIRROR (line 49) | const CODE_SNIPPET_EDITOR_MIRROR = 'jp-codeSnippetInput-editor';
  constant CODE_SNIPPET_EDITOR_INPUTAREA (line 50) | const CODE_SNIPPET_EDITOR_INPUTAREA = 'jp-codeSnippetInputArea';
  constant CODE_SNIPPET_EDITOR_INPUTAREA_MIRROR (line 51) | const CODE_SNIPPET_EDITOR_INPUTAREA_MIRROR = 'jp-codeSnippetInputArea-ed...
  constant EDITOR_DIRTY_CLASS (line 53) | const EDITOR_DIRTY_CLASS = 'jp-mod-dirty';
  type ICodeSnippetEditorMetadata (line 55) | interface ICodeSnippetEditorMetadata extends ICodeSnippet {
  class CodeSnippetEditor (line 61) | class CodeSnippetEditor extends ReactWidget {
    method constructor (line 72) | constructor(
    method codeSnippetEditorMetadata (line 99) | get codeSnippetEditorMetadata(): ICodeSnippetEditorMetadata {
    method deactivateEditor (line 103) | private deactivateEditor(
    method deactivateNameField (line 145) | private deactivateNameField(nameInput: Element): void {
    method deactivateDescriptionField (line 151) | private deactivateDescriptionField(descriptionInput: Element): void {
    method activeFieldState (line 157) | private activeFieldState(
    method onUpdateRequest (line 166) | onUpdateRequest(msg: Message): void {
    method onAfterAttach (line 203) | onAfterAttach(msg: Message): void {
    method onAfterShow (line 219) | onAfterShow(msg: Message): void {
    method onActivateRequest (line 229) | onActivateRequest(msg: Message): void {
    method onCloseRequest (line 233) | onCloseRequest(msg: Message): void {
    method activateCodeMirror (line 292) | activateCodeMirror(
    method deactivateCodeMirror (line 315) | deactivateCodeMirror(editor: Element): void {
    method handleInputFieldChange (line 321) | handleInputFieldChange(event: React.ChangeEvent<HTMLInputElement>): vo...
    method saveChange (line 335) | saveChange(event: React.MouseEvent<HTMLElement, MouseEvent>): void {
    method updateSnippet (line 358) | async updateSnippet(): Promise<boolean> {
    method handleChangeOnTag (line 477) | handleChangeOnTag(tags: ITag[]): void {
    method handleOnBlur (line 492) | handleOnBlur(event: React.FocusEvent<HTMLInputElement>): void {
    method renderCodeInput (line 502) | renderCodeInput(): React.ReactElement {
    method renderLanguages (line 516) | renderLanguages(): React.ReactElement {
    method renderLanguageOptions (line 536) | renderLanguageOptions(option: string): JSX.Element {
    method render (line 540) | render(): React.ReactElement {

FILE: src/CodeSnippetEditorTags.tsx
  type ITag (line 7) | interface ITag {
  type ICodeSnippetEditorTagProps (line 12) | interface ICodeSnippetEditorTagProps {
  type ICodeSnippetEditorTagState (line 17) | interface ICodeSnippetEditorTagState {
  constant CODE_SNIPPET_EDITOR_TAG (line 25) | const CODE_SNIPPET_EDITOR_TAG = 'jp-codeSnippet-editor-tag';
  constant CODE_SNIPPET_EDITOR_TAG_PLUS_ICON (line 26) | const CODE_SNIPPET_EDITOR_TAG_PLUS_ICON = 'jp-codeSnippet-editor-tag-plu...
  constant CODE_SNIPPET_EDITOR_TAG_LIST (line 27) | const CODE_SNIPPET_EDITOR_TAG_LIST = 'jp-codeSnippet-editor-tagList';
  class CodeSnippetEditorTags (line 29) | class CodeSnippetEditorTags extends React.Component<
    method constructor (line 33) | constructor(props: ICodeSnippetEditorTagProps) {
    method componentDidMount (line 43) | componentDidMount(): void {
    method componentDidUpdate (line 50) | componentDidUpdate(prevProps: ICodeSnippetEditorTagProps): void {
    method handleClick (line 58) | handleClick(event: React.MouseEvent<HTMLButtonElement, MouseEvent>): v...
    method handleOnChange (line 65) | handleOnChange(): void {
    method handleClickHelper (line 69) | handleClickHelper(
    method addTagOnClick (line 83) | addTagOnClick(event: React.MouseEvent<HTMLInputElement>): void {
    method addTagOnKeyDown (line 93) | addTagOnKeyDown(event: React.KeyboardEvent<HTMLInputElement>): void {
    method addTagOnBlur (line 125) | addTagOnBlur(event: React.FocusEvent<HTMLInputElement>): void {
    method renderTags (line 134) | renderTags(): JSX.Element {
    method render (line 214) | render(): JSX.Element {

FILE: src/CodeSnippetFilterTools.tsx
  type IFilterSnippetProps (line 7) | interface IFilterSnippetProps {
  type IFilterSnippetState (line 18) | interface IFilterSnippetState {
  constant FILTER_ARROW_UP (line 24) | const FILTER_ARROW_UP = 'jp-codeSnippet-filter-arrow-up';
  constant FILTER_OPTION (line 25) | const FILTER_OPTION = 'jp-codeSnippet-filter-option';
  constant FILTER_TAGS (line 26) | const FILTER_TAGS = 'jp-codeSnippet-filter-tags';
  constant FILTER_TAG (line 27) | const FILTER_TAG = 'jp-codeSnippet-filter-tag';
  constant FILTER_CHECK (line 28) | const FILTER_CHECK = 'jp-codeSnippet-filter-check';
  constant FILTER_TITLE (line 29) | const FILTER_TITLE = 'jp-codeSnippet-filter-title';
  constant FILTER_TOOLS (line 30) | const FILTER_TOOLS = 'jp-codeSnippet-filterTools';
  constant FILTER_SEARCHBAR (line 31) | const FILTER_SEARCHBAR = 'jp-codeSnippet-searchbar';
  constant FILTER_SEARCHWRAPPER (line 32) | const FILTER_SEARCHWRAPPER = 'jp-codeSnippet-searchwrapper';
  constant FILTER_CLASS (line 33) | const FILTER_CLASS = 'jp-codeSnippet-filter';
  constant FILTER_BUTTON (line 34) | const FILTER_BUTTON = 'jp-codeSnippet-filter-btn';
  class FilterTools (line 36) | class FilterTools extends React.Component<
    method constructor (line 40) | constructor(props: IFilterSnippetProps) {
    method componentDidUpdate (line 52) | componentDidUpdate(prevProps: IFilterSnippetProps): void {
    method createFilterBox (line 64) | createFilterBox(): void {
    method renderTags (line 73) | renderTags(tags: string[], type: string): JSX.Element {
    method renderAppliedTag (line 117) | renderAppliedTag(tag: string, index: string): JSX.Element {
    method renderUnappliedTag (line 138) | renderUnappliedTag(tag: string, index: string): JSX.Element {
    method handleClick (line 150) | handleClick(event: React.MouseEvent<HTMLButtonElement, MouseEvent>): v...
    method handleClickHelper (line 167) | handleClickHelper(
    method filterSnippets (line 188) | filterSnippets(): void {
    method renderFilterOption (line 198) | renderFilterOption(): JSX.Element {
    method render (line 215) | render(): JSX.Element {

FILE: src/CodeSnippetInputDialog.ts
  constant FILE_DIALOG_CLASS (line 21) | const FILE_DIALOG_CLASS = 'jp-codeSnippet-fileDialog';
  constant CODE_SNIPPET_DIALOG_NAME_INPUT (line 26) | const CODE_SNIPPET_DIALOG_NAME_INPUT = 'jp-codeSnippet-dialog-name-input';
  constant CODE_SNIPPET_DIALOG_DESC_INPUT (line 27) | const CODE_SNIPPET_DIALOG_DESC_INPUT = 'jp-codeSnippet-dialog-desc-input';
  constant CODE_SNIPPET_DIALOG_LANG_INPUT (line 28) | const CODE_SNIPPET_DIALOG_LANG_INPUT = 'jp-codeSnippet-dialog-lang-input';
  constant CODE_SNIPPET_INPUTTAG_PLUS_ICON (line 29) | const CODE_SNIPPET_INPUTTAG_PLUS_ICON = 'jp-codeSnippet-inputTag-plusIcon';
  constant CODE_SNIPPET_INPUTTAG_LIST (line 30) | const CODE_SNIPPET_INPUTTAG_LIST = 'jp-codeSnippet-inputTagList';
  constant CODE_SNIPPET_INPUT_TAG (line 31) | const CODE_SNIPPET_INPUT_TAG = 'jp-codeSnippet-inputTag';
  constant CODE_SNIPPET_INPUT_TAG_CHECK (line 32) | const CODE_SNIPPET_INPUT_TAG_CHECK = 'jp-codeSnippet-inputTag-check';
  class CodeSnippetDialog (line 34) | class CodeSnippetDialog extends Dialog<any> {
    method onAfterAttach (line 36) | protected onAfterAttach(msg: Message): void {
    method onAfterDetach (line 51) | protected onAfterDetach(msg: Message): void {
    method _evtKeydown (line 59) | protected _evtKeydown(event: KeyboardEvent): void {
  function showCodeSnippetDialog (line 86) | function showCodeSnippetDialog<T>(
  function CodeSnippetInputDialog (line 97) | function CodeSnippetInputDialog(
  function showInputDialog (line 139) | function showInputDialog(
  function createNewSnippet (line 202) | function createNewSnippet(
  function isValidFileName (line 223) | function isValidFileName(name: string): boolean {
  class InputHandler (line 231) | class InputHandler extends Widget {
    method constructor (line 236) | constructor(snippetTags: string[], language: string, langTags: string[...
    method getValue (line 241) | getValue(): string[] {
  class Private (line 273) | class Private {
    method handleOnBlur (line 278) | static handleOnBlur(event: Event): void {
    method createInputNode (line 288) | static createInputNode(
    method addTag (line 375) | static addTag(event: MouseEvent): boolean {
    method addTagOnKeyDown (line 392) | static addTagOnKeyDown(event: KeyboardEvent): void {
    method addTagOnBlur (line 450) | static addTagOnBlur(event: FocusEvent): void {
    method handleClick (line 473) | static handleClick(event: MouseEvent): boolean {

FILE: src/CodeSnippetLanguages.ts
  constant SUPPORTED_LANGUAGES (line 49) | const SUPPORTED_LANGUAGES = [

FILE: src/CodeSnippetMenu.ts
  constant OPTIONS_CLASS (line 14) | const OPTIONS_CLASS = 'jp-codeSnippet-options';
  constant OPTIONS_CONTENT (line 15) | const OPTIONS_CONTENT = 'jp-codeSnippet-options-content';
  constant OPTIONS_BODY (line 16) | const OPTIONS_BODY = 'jp-codeSnippet-options-body';
  function showMoreOptions (line 25) | function showMoreOptions(
  class OptionsMessage (line 35) | class OptionsMessage extends Widget {
    method constructor (line 36) | constructor(options: Partial<OptionsMessage.IOptions> = {}) {
    method launch (line 63) | launch(): Promise<void> {
    method handleEvent (line 87) | handleEvent(event: Event): void {
    method _evtClick (line 105) | protected _evtClick(event: MouseEvent): void {
    method reject (line 122) | reject(): void {
    method _resolve (line 132) | private _resolve(): void {
    method dispose (line 148) | dispose(): void {
    method onAfterAttach (line 161) | protected onAfterAttach(msg: Message): void {
    method onAfterDetach (line 170) | protected onAfterDetach(msg: Message): void {
  type Body (line 184) | type Body = Widget;
  type IOptions (line 186) | interface IOptions {
  type IRenderer (line 213) | interface IRenderer {
  class Renderer (line 224) | class Renderer {
    method createBody (line 232) | createBody(value: Body): Widget {

FILE: src/CodeSnippetMessage.ts
  constant CONFIRM_CONTENT (line 16) | const CONFIRM_CONTENT = 'jp-codeSnippet-Message-content';
  constant CONFIRM_BODY (line 17) | const CONFIRM_BODY = 'jp-codeSnippet-Message-body';
  constant CODE_SNIPPET_CONFIRM_TEXT (line 18) | const CODE_SNIPPET_CONFIRM_TEXT = 'jp-codeSnippet-confirm-text';
  function showMessage (line 27) | function showMessage<T>(type: string): Promise<Dialog.IResult<T>> {
  class CodeSnippetMessage (line 38) | class CodeSnippetMessage<T> extends Dialog<any> {
    method constructor (line 39) | constructor(options: Partial<Dialog.IOptions<T>> = {}) {
    method onAfterAttach (line 44) | protected onAfterAttach(msg: Message): void {
    method onAfterDetach (line 54) | protected onAfterDetach(msg: Message): void {
    method handleEvent (line 60) | handleEvent(event: Event): void {
    method _evtKeydown (line 71) | protected _evtKeydown(event: KeyboardEvent): void {
  class MessageHandler (line 83) | class MessageHandler extends Widget {
    method constructor (line 84) | constructor(type: string) {
  function createMessageNode (line 95) | function createMessageNode(type: string): HTMLElement {

FILE: src/CodeSnippetPreview.ts
  constant PREVIEW_CLASS (line 17) | const PREVIEW_CLASS = 'jp-codeSnippet-preview';
  constant PREVIEW_CONTENT (line 18) | const PREVIEW_CONTENT = 'jp-codeSnippet-preview-content';
  constant PREVIEW_BODY (line 19) | const PREVIEW_BODY = 'jp-codeSnippet-preview-body';
  function showPreview (line 27) | function showPreview(
  class Preview (line 42) | class Preview extends Widget {
    method constructor (line 51) | constructor(
    method launch (line 81) | launch(): Promise<void> {
    method reject (line 101) | reject(): void {
    method _resolve (line 111) | private _resolve(): void {
    method dispose (line 127) | dispose(): void {
    method onAfterAttach (line 140) | protected onAfterAttach(msg: Message): void {
    method onAfterShow (line 148) | onAfterShow(msg: Message): void {
    method onUpdateRequest (line 154) | onUpdateRequest(msg: Message): void {
  type Body (line 199) | type Body = Widget;
  type IOptions (line 201) | interface IOptions {
  type IRenderer (line 220) | interface IRenderer {
  class Renderer (line 231) | class Renderer {
    method createBody (line 239) | createBody(value: Body): Widget {

FILE: src/CodeSnippetService.ts
  type ICodeSnippet (line 7) | interface ICodeSnippet {
  class CodeSnippetService (line 17) | class CodeSnippetService {
    method constructor (line 22) | private constructor(settings: Settings, app: JupyterFrontEnd) {
    method convertToICodeSnippetList (line 80) | private convertToICodeSnippetList(snippets: JSONArray): ICodeSnippet[] {
    method init (line 91) | static init(settings: Settings, app: JupyterFrontEnd): void {
    method getCodeSnippetService (line 97) | static getCodeSnippetService(): CodeSnippetService {
    method settings (line 101) | get settings(): Settings {
    method snippets (line 105) | get snippets(): ICodeSnippet[] {
    method getSnippetByName (line 109) | getSnippetByName(snippetName: string): ICodeSnippet[] {
    method addSnippet (line 115) | async addSnippet(snippet: ICodeSnippet): Promise<boolean> {
    method deleteSnippet (line 135) | async deleteSnippet(id: number): Promise<boolean> {
    method renameSnippet (line 164) | async renameSnippet(oldName: string, newName: string): Promise<boolean> {
    method duplicateNameExists (line 179) | duplicateNameExists(newName: string): boolean {
    method modifyExistingSnippet (line 188) | async modifyExistingSnippet(
    method moveSnippet (line 207) | async moveSnippet(fromIdx: number, toIdx: number): Promise<boolean> {
    method orderSnippets (line 240) | async orderSnippets(): Promise<boolean> {

FILE: src/CodeSnippetUtilities.ts
  function validateInputs (line 9) | function validateInputs(
  function saveOverWriteFile (line 37) | async function saveOverWriteFile(
  function shouldOverwrite (line 68) | async function shouldOverwrite(newName: string): Promise<boolean> {

FILE: src/CodeSnippetWidget.tsx
  constant CODE_SNIPPET_ITEM (line 38) | const CODE_SNIPPET_ITEM = 'jp-codeSnippet-item';
  constant JUPYTER_CELL_MIME (line 43) | const JUPYTER_CELL_MIME = 'application/vnd.jupyter.cells';
  constant DROP_TARGET_CLASS (line 48) | const DROP_TARGET_CLASS = 'jp-codeSnippet-dropTarget';
  constant CODE_SNIPPET_EDITOR (line 49) | const CODE_SNIPPET_EDITOR = 'jp-codeSnippet-editor';
  constant CODE_SNIPPET_DRAG_HOVER (line 50) | const CODE_SNIPPET_DRAG_HOVER = 'jp-codeSnippet-drag-hover';
  class CodeSnippetWidget (line 59) | class CodeSnippetWidget extends ReactWidget {
    method constructor (line 67) | constructor(
    method updateCodeSnippetWidget (line 86) | updateCodeSnippetWidget(): void {
    method onAfterShow (line 93) | onAfterShow(msg: Message): void {
    method openCodeSnippetEditor (line 97) | openCodeSnippetEditor(args: ReadonlyPartialJSONObject): void {
    method handleEvent (line 111) | handleEvent(event: Event): void {
    method onAfterAttach (line 134) | protected onAfterAttach(msg: Message): void {
    method onBeforeDetach (line 148) | protected onBeforeDetach(msg: Message): void {
    method _findSnippet (line 162) | private _findSnippet(node: HTMLElement): HTMLElement {
    method _evtDragEnter (line 179) | private _evtDragEnter(event: IDragEvent): void {
    method _evtDragLeave (line 204) | private _evtDragLeave(event: IDragEvent): void {
    method _evtDragOver (line 220) | private _evtDragOver(event: IDragEvent): void {
    method findCellData (line 242) | private findCellData(mime: MimeData): string {
    method _evtDrop (line 250) | private async _evtDrop(event: IDragEvent): Promise<void> {
    method moveCodeSnippet (line 315) | private moveCodeSnippet(srcIdx: number, targetIdx: number): void {
    method render (line 328) | render(): React.ReactElement {

FILE: src/index.ts
  constant CODE_SNIPPET_EXTENSION_ID (line 46) | const CODE_SNIPPET_EXTENSION_ID = 'code-snippet-extension';
  constant CODE_SNIPPET_SETTING_ID (line 48) | const CODE_SNIPPET_SETTING_ID = 'jupyterlab-code-snippets:snippets';
  function activateCodeSnippet (line 76) | function activateCodeSnippet(
  function getSelectedText (line 320) | function getSelectedText(): string {

FILE: test/codeSnippetContentsService.test.ts
  constant DEFAULT_FILE (line 10) | const DEFAULT_FILE: Contents.IModel = {
  type IService (line 22) | interface IService {
  function handleRequest (line 32) | function handleRequest(item: IService, status: number, body: any) {
Condensed preview — 132 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (922K chars).
[
  {
    "path": ".eslintignore",
    "chars": 89,
    "preview": "node_modules\ndist\ncoverage\n**/*.d.ts\ntest\n_temp_extension\nbabel.config.ts\njest.config.ts\n"
  },
  {
    "path": ".eslintrc.js",
    "chars": 1724,
    "preview": "module.exports = {\n  extends: [\n    'eslint:recommended',\n    'plugin:@typescript-eslint/eslint-recommended',\n    'plugi"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "chars": 665,
    "preview": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n**Describe the b"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "chars": 595,
    "preview": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n**Is your fea"
  },
  {
    "path": ".github/workflows/build.yml",
    "chars": 660,
    "preview": "name: Build\n\non:\n  push:\n    branches: master\n  pull_request:\n    branches: '*'\n\njobs:\n  build:\n    runs-on: ubuntu-late"
  },
  {
    "path": ".gitignore",
    "chars": 1497,
    "preview": "*.bundle.*\nlib/\nnode_modules/\n*.egg-info/\n.ipynb_checkpoints\n*.tsbuildinfo\n*.ipynb\n.eslintcache\nsnippets/\ndist/\n\n*/labex"
  },
  {
    "path": ".husky/.gitignore",
    "chars": 2,
    "preview": "_\n"
  },
  {
    "path": ".husky/pre-commit",
    "chars": 88,
    "preview": "#!/bin/sh\n\n. \"$(dirname \"$0\")/_/husky.sh\"\n\nnpx --no-install lint-staged\njlpm lint-staged"
  },
  {
    "path": ".prettierignore",
    "chars": 52,
    "preview": "node_modules\n**/node_modules\n**/lib\n**/package.json\n"
  },
  {
    "path": ".prettierrc",
    "chars": 26,
    "preview": "{\n  \"singleQuote\": true\n}\n"
  },
  {
    "path": ".vscode/launch.json",
    "chars": 484,
    "preview": "{\n    // Use IntelliSense to learn about possible attributes.\n    // Hover to view descriptions of existing attributes.\n"
  },
  {
    "path": ".vscode/settings.json",
    "chars": 909,
    "preview": "{\n    \"workbench.colorCustomizations\": {\n        \"activityBar.activeBackground\": \"#1f6fd0\",\n        \"activityBar.backgro"
  },
  {
    "path": "LICENSE",
    "chars": 13223,
    "preview": "BSD 3-Clause License\n\nCopyright (c) 2020, jupytercalpoly\nAll rights reserved.\n\nRedistribution and use in source and bina"
  },
  {
    "path": "MANIFEST.in",
    "chars": 391,
    "preview": "include LICENSE\ninclude README.md\ninclude pyproject.toml\ninclude install.json\n\ninclude package.json\ninclude ts*.json\ngra"
  },
  {
    "path": "PRESSRELEASE.md",
    "chars": 2193,
    "preview": "# **JupyterLab Code Snippets**\n\n## **JupyterLab Code Snippets empowers you to write code more rapidly**\n\nDo you find you"
  },
  {
    "path": "PROGRESS.md",
    "chars": 1748,
    "preview": "# Log of Features and Updates\n\n## Feature List\n\n- [x] Scrollable snippet panel displaying snippets\n- [x] Right click and"
  },
  {
    "path": "README.md",
    "chars": 3214,
    "preview": "# JupyterLab Code Snippet\n\n## Save, reuse, and share code snippets using JupyterLab Code Snippets\n\n![Github Actions Stat"
  },
  {
    "path": "babel.config.js",
    "chars": 276,
    "preview": "module.exports = require('@jupyterlab/testutils/lib/babel.config');\n// module.exports = {\n//   presets: [\n//     [\n//   "
  },
  {
    "path": "binder/environment.yml",
    "chars": 495,
    "preview": "# a mybinder.org-ready environment for demoing code_snippet\n# this environment may also be used locally on Linux/MacOS/W"
  },
  {
    "path": "binder/postBuild",
    "chars": 2085,
    "preview": "#!/usr/bin/env python3\n\"\"\" perform a development install of code_snippet\n\n    On Binder, this will run _after_ the envir"
  },
  {
    "path": "binder/requirements.txt",
    "chars": 15,
    "preview": "jupyterlab>=3.0"
  },
  {
    "path": "binder/workspace.json",
    "chars": 809,
    "preview": "{\"data\":{\"layout-restorer:data\":{\"main\":{\"dock\":{\"type\":\"tab-area\",\"currentIndex\":1,\"widgets\":[\"notebook:Untitled.ipynb\""
  },
  {
    "path": "coverage/CodeSnippetContentsService.ts.html",
    "chars": 17052,
    "preview": "\n<!doctype html>\n<html lang=\"en\">\n\n<head>\n    <title>Code coverage report for CodeSnippetContentsService.ts</title>\n    "
  },
  {
    "path": "coverage/CodeSnippetWidgetModel.ts.html",
    "chars": 17764,
    "preview": "\n<!doctype html>\n<html lang=\"en\">\n\n<head>\n    <title>Code coverage report for CodeSnippetWidgetModel.ts</title>\n    <met"
  },
  {
    "path": "coverage/base.css",
    "chars": 5394,
    "preview": "body, html {\n  margin:0; padding: 0;\n  height: 100%;\n}\nbody {\n    font-family: Helvetica Neue, Helvetica, Arial;\n    fon"
  },
  {
    "path": "coverage/block-navigation.js",
    "chars": 2387,
    "preview": "/* eslint-disable */\nvar jumpToCode = (function init() {\n    // Classes of code we would like to highlight in the file v"
  },
  {
    "path": "coverage/clover.xml",
    "chars": 396,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<coverage generated=\"1604606156495\" clover=\"3.2.0\">\n  <project timestamp=\"1604606"
  },
  {
    "path": "coverage/coverage-final.json",
    "chars": 11867,
    "preview": "{\"/Users/jaewookahn/projects/code_snippet/code_snippets/src/CodeSnippetContentsService.ts\": {\"path\":\"/Users/jaewookahn/p"
  },
  {
    "path": "coverage/index.html",
    "chars": 4990,
    "preview": "\n<!doctype html>\n<html lang=\"en\">\n\n<head>\n    <title>Code coverage report for All files</title>\n    <meta charset=\"utf-8"
  },
  {
    "path": "coverage/lcov-report/CodeSnippetContentsService.ts.html",
    "chars": 17052,
    "preview": "\n<!doctype html>\n<html lang=\"en\">\n\n<head>\n    <title>Code coverage report for CodeSnippetContentsService.ts</title>\n    "
  },
  {
    "path": "coverage/lcov-report/CodeSnippetWidgetModel.ts.html",
    "chars": 17764,
    "preview": "\n<!doctype html>\n<html lang=\"en\">\n\n<head>\n    <title>Code coverage report for CodeSnippetWidgetModel.ts</title>\n    <met"
  },
  {
    "path": "coverage/lcov-report/base.css",
    "chars": 5394,
    "preview": "body, html {\n  margin:0; padding: 0;\n  height: 100%;\n}\nbody {\n    font-family: Helvetica Neue, Helvetica, Arial;\n    fon"
  },
  {
    "path": "coverage/lcov-report/block-navigation.js",
    "chars": 2387,
    "preview": "/* eslint-disable */\nvar jumpToCode = (function init() {\n    // Classes of code we would like to highlight in the file v"
  },
  {
    "path": "coverage/lcov-report/index.html",
    "chars": 4990,
    "preview": "\n<!doctype html>\n<html lang=\"en\">\n\n<head>\n    <title>Code coverage report for All files</title>\n    <meta charset=\"utf-8"
  },
  {
    "path": "coverage/lcov-report/prettify.css",
    "chars": 676,
    "preview": ".pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,"
  },
  {
    "path": "coverage/lcov-report/prettify.js",
    "chars": 17590,
    "preview": "/* eslint-disable */\nwindow.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=[\"break,continue,do,else,for,if,return,whi"
  },
  {
    "path": "coverage/lcov-report/sorter.js",
    "chars": 5278,
    "preview": "/* eslint-disable */\nvar addSorting = (function() {\n    'use strict';\n    var cols,\n        currentSort = {\n            "
  },
  {
    "path": "coverage/lcov.info",
    "chars": 1845,
    "preview": "TN:\nSF:src/CodeSnippetContentsService.ts\nFN:20,(anonymous_7)\nFN:27,(anonymous_8)\nFN:38,(anonymous_9)\nFN:67,(anonymous_11"
  },
  {
    "path": "coverage/prettify.css",
    "chars": 676,
    "preview": ".pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,"
  },
  {
    "path": "coverage/prettify.js",
    "chars": 17590,
    "preview": "/* eslint-disable */\nwindow.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=[\"break,continue,do,else,for,if,return,whi"
  },
  {
    "path": "coverage/sorter.js",
    "chars": 5278,
    "preview": "/* eslint-disable */\nvar addSorting = (function() {\n    'use strict';\n    var cols,\n        currentSort = {\n            "
  },
  {
    "path": "cypress/fixtures/example.json",
    "chars": 154,
    "preview": "{\n  \"name\": \"Using fixtures to represent data\",\n  \"email\": \"hello@cypress.io\",\n  \"body\": \"Fixtures are a great way to mo"
  },
  {
    "path": "cypress/integration/codeSnippetService.spec.js",
    "chars": 3741,
    "preview": "describe('Test Code Snippet Extension on load', () => {\n    beforeEach(() => {\n        cy.visit('http://localhost:8888/l"
  },
  {
    "path": "cypress/integration/examples/actions.spec.js",
    "chars": 10438,
    "preview": "/// <reference types=\"cypress\" />\n\ncontext('Actions', () => {\n  beforeEach(() => {\n    cy.visit('https://example.cypress"
  },
  {
    "path": "cypress/integration/examples/aliasing.spec.js",
    "chars": 1108,
    "preview": "/// <reference types=\"cypress\" />\n\ncontext('Aliasing', () => {\n  beforeEach(() => {\n    cy.visit('https://example.cypres"
  },
  {
    "path": "cypress/integration/examples/assertions.spec.js",
    "chars": 5679,
    "preview": "/// <reference types=\"cypress\" />\n\ncontext('Assertions', () => {\n  beforeEach(() => {\n    cy.visit('https://example.cypr"
  },
  {
    "path": "cypress/integration/examples/connectors.spec.js",
    "chars": 2865,
    "preview": "/// <reference types=\"cypress\" />\n\ncontext('Connectors', () => {\n  beforeEach(() => {\n    cy.visit('https://example.cypr"
  },
  {
    "path": "cypress/integration/examples/cookies.spec.js",
    "chars": 2295,
    "preview": "/// <reference types=\"cypress\" />\n\ncontext('Cookies', () => {\n  beforeEach(() => {\n    Cypress.Cookies.debug(true)\n\n    "
  },
  {
    "path": "cypress/integration/examples/cypress_api.spec.js",
    "chars": 5879,
    "preview": "/// <reference types=\"cypress\" />\n\ncontext('Cypress.Commands', () => {\n  beforeEach(() => {\n    cy.visit('https://exampl"
  },
  {
    "path": "cypress/integration/examples/files.spec.js",
    "chars": 2752,
    "preview": "/// <reference types=\"cypress\" />\n\n/// JSON fixture file can be loaded directly using\n// the built-in JavaScript bundler"
  },
  {
    "path": "cypress/integration/examples/local_storage.spec.js",
    "chars": 1885,
    "preview": "/// <reference types=\"cypress\" />\n\ncontext('Local Storage', () => {\n  beforeEach(() => {\n    cy.visit('https://example.c"
  },
  {
    "path": "cypress/integration/examples/location.spec.js",
    "chars": 1075,
    "preview": "/// <reference types=\"cypress\" />\n\ncontext('Location', () => {\n  beforeEach(() => {\n    cy.visit('https://example.cypres"
  },
  {
    "path": "cypress/integration/examples/misc.spec.js",
    "chars": 3082,
    "preview": "/// <reference types=\"cypress\" />\n\ncontext('Misc', () => {\n  beforeEach(() => {\n    cy.visit('https://example.cypress.io"
  },
  {
    "path": "cypress/integration/examples/navigation.spec.js",
    "chars": 1604,
    "preview": "/// <reference types=\"cypress\" />\n\ncontext('Navigation', () => {\n  beforeEach(() => {\n    cy.visit('https://example.cypr"
  },
  {
    "path": "cypress/integration/examples/network_requests.spec.js",
    "chars": 6128,
    "preview": "/// <reference types=\"cypress\" />\n\ncontext('Network Requests', () => {\n  beforeEach(() => {\n    cy.visit('https://exampl"
  },
  {
    "path": "cypress/integration/examples/querying.spec.js",
    "chars": 3565,
    "preview": "/// <reference types=\"cypress\" />\n\ncontext('Querying', () => {\n  beforeEach(() => {\n    cy.visit('https://example.cypres"
  },
  {
    "path": "cypress/integration/examples/spies_stubs_clocks.spec.js",
    "chars": 5914,
    "preview": "/// <reference types=\"cypress\" />\n// remove no check once Cypress.sinon is typed\n// https://github.com/cypress-io/cypres"
  },
  {
    "path": "cypress/integration/examples/traversal.spec.js",
    "chars": 3660,
    "preview": "/// <reference types=\"cypress\" />\n\ncontext('Traversal', () => {\n  beforeEach(() => {\n    cy.visit('https://example.cypre"
  },
  {
    "path": "cypress/integration/examples/utilities.spec.js",
    "chars": 3230,
    "preview": "/// <reference types=\"cypress\" />\n\ncontext('Utilities', () => {\n  beforeEach(() => {\n    cy.visit('https://example.cypre"
  },
  {
    "path": "cypress/integration/examples/viewport.spec.js",
    "chars": 1709,
    "preview": "/// <reference types=\"cypress\" />\n\ncontext('Viewport', () => {\n  beforeEach(() => {\n    cy.visit('https://example.cypres"
  },
  {
    "path": "cypress/integration/examples/waiting.spec.js",
    "chars": 992,
    "preview": "/// <reference types=\"cypress\" />\n\ncontext('Waiting', () => {\n  beforeEach(() => {\n    cy.visit('https://example.cypress"
  },
  {
    "path": "cypress/integration/examples/window.spec.js",
    "chars": 602,
    "preview": "/// <reference types=\"cypress\" />\n\ncontext('Window', () => {\n  beforeEach(() => {\n    cy.visit('https://example.cypress."
  },
  {
    "path": "cypress/plugins/index.js",
    "chars": 718,
    "preview": "/// <reference types=\"cypress\" />\n// ***********************************************************\n// This example plugins"
  },
  {
    "path": "cypress/support/commands.js",
    "chars": 1011,
    "preview": "// ***********************************************\n// This example commands.js shows you how to\n// create various custom"
  },
  {
    "path": "cypress/support/index.js",
    "chars": 670,
    "preview": "// ***********************************************************\n// This example support/index.js is processed and\n// load"
  },
  {
    "path": "cypress.json",
    "chars": 3,
    "preview": "{}\n"
  },
  {
    "path": "docs/contributor/codebase.rst",
    "chars": 2983,
    "preview": "Codebase Orientation\n--------------------\n\nDirectories\n~~~~~~~~~~~\n\nCode Snippets: ``snippets/``\n^^^^^^^^^^^^^^^^^^^^^^^"
  },
  {
    "path": "docs/contributor/contribute.rst",
    "chars": 2499,
    "preview": ".. _contribute:\n\nHow to Contribute\n-----------------\nGeneral Guidelines for Contributing\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
  },
  {
    "path": "docs/contributor/snippet_metadata.rst",
    "chars": 744,
    "preview": ".. _snippet_metadata:\n\nCode Snippet Metadata \n-------------------\nThis extension uses JupyterLab Contents Service and cr"
  },
  {
    "path": "docs/getting_started/changelog.rst",
    "chars": 2472,
    "preview": ".. _changelog:\n\nChangelog\n---------\n\nv2.1.1\n^^^^^^\n* Made font size of preview configurable in settings\n\nv2.1.0\n^^^^^^\n*"
  },
  {
    "path": "docs/getting_started/installation.rst",
    "chars": 523,
    "preview": ".. _installation:\n\nInstallation\n------------\n\nRequirements\n~~~~~~~~~~~~\nJupyterLab >= 3.0\n\nInstall with jupyter\n~~~~~~~~"
  },
  {
    "path": "docs/getting_started/overview.rst",
    "chars": 2291,
    "preview": ".. _overview:\n\nOverview\n--------\n\nJupyterLab Code Snippets empowers you to write code more rapidly\n~~~~~~~~~~~~~~~~~~~~~"
  },
  {
    "path": "docs/index.rst",
    "chars": 987,
    "preview": ".. jupyterlab-code-snippet documentation master file, created by\n   sphinx-quickstart on Fri Aug 21 12:18:14 2020.\n   Yo"
  },
  {
    "path": "docs/user/features.rst",
    "chars": 3509,
    "preview": "Features\n========\n\nCode Snippet Explorer\n---------------------\n\nOn the left side bar of the JupyterLab, you can click th"
  },
  {
    "path": "docs/user/transition.rst",
    "chars": 5616,
    "preview": "Transition to 2.1.0\n===================\n\nThe 2.1.0 update has made snippets globally accessible across notebooks by savi"
  },
  {
    "path": "docs/user/ux.rst",
    "chars": 1411,
    "preview": ".. _ux:\n\nUser Experience\n---------------\n\nAdd snippet\n^^^^^^^^^^^\n* Drag code cell(s) to panel.\n* Highlight code and sav"
  },
  {
    "path": "install.json",
    "chars": 209,
    "preview": "{\n  \"packageManager\": \"python\",\n  \"packageName\": \"jupyterlab-code-snippets\",\n  \"uninstallInstructions\": \"Use your Python"
  },
  {
    "path": "jest.config.js",
    "chars": 781,
    "preview": "const func = require('@jupyterlab/testutils/lib/jest-config');\nmodule.exports = func(__dirname);\n// const path = require"
  },
  {
    "path": "junit.xml",
    "chars": 115,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<testsuites name=\"jest tests\" tests=\"0\" failures=\"0\" time=\"0\">\n</testsuites>"
  },
  {
    "path": "jupyterlab-code-snippets/_version.py",
    "chars": 171,
    "preview": "# This file is auto-generated by Hatchling. As such, do not:\n#   - modify\n#   - track in version control e.g. be sure to"
  },
  {
    "path": "jupyterlab-code-snippets/labextension/build_log.json",
    "chars": 21068,
    "preview": "[\n  {\n    \"bail\": true,\n    \"module\": {\n      \"rules\": [\n        {\n          \"test\": {},\n          \"use\": [\n            "
  },
  {
    "path": "jupyterlab-code-snippets/labextension/package.json",
    "chars": 4675,
    "preview": "{\n  \"name\": \"jupyterlab-code-snippets\",\n  \"version\": \"2.2.0\",\n  \"description\": \"EXPERIMENTAL: Save, reuse, and share cod"
  },
  {
    "path": "jupyterlab-code-snippets/labextension/schemas/jupyterlab-code-snippets/package.json.orig",
    "chars": 4533,
    "preview": "{\n  \"name\": \"jupyterlab-code-snippets\",\n  \"version\": \"2.2.0\",\n  \"description\": \"EXPERIMENTAL: Save, reuse, and share cod"
  },
  {
    "path": "jupyterlab-code-snippets/labextension/schemas/jupyterlab-code-snippets/snippets.json",
    "chars": 2341,
    "preview": "{\n    \"jupyter.lab.setting-icon\": \"custom-ui-components:codeSnippetIcon\",\n    \"jupyter.lab.setting-icon-label\": \"Code Sn"
  },
  {
    "path": "jupyterlab-code-snippets/labextension/static/lib_index_js.be5d61b481146873348d.js",
    "chars": 277279,
    "preview": "\"use strict\";\n(self[\"webpackChunkjupyterlab_code_snippets\"] = self[\"webpackChunkjupyterlab_code_snippets\"] || []).push(["
  },
  {
    "path": "jupyterlab-code-snippets/labextension/static/remoteEntry.0a192b189a42c6f0af60.js",
    "chars": 31284,
    "preview": "var _JUPYTERLAB;\n/******/ (() => { // webpackBootstrap\n/******/ \t\"use strict\";\n/******/ \tvar __webpack_modules__ = ({\n\n/"
  },
  {
    "path": "jupyterlab-code-snippets/labextension/static/style.js",
    "chars": 167,
    "preview": "/* This is a generated file of CSS imports */\n/* It was generated by @jupyterlab/builder in Build.ensureAssets() */\n\nimp"
  },
  {
    "path": "jupyterlab-code-snippets/labextension/static/style_index_js.93ff47ff4745f8384ae9.js",
    "chars": 45483,
    "preview": "(self[\"webpackChunkjupyterlab_code_snippets\"] = self[\"webpackChunkjupyterlab_code_snippets\"] || []).push([[\"style_index_"
  },
  {
    "path": "jupyterlab-code-snippets/labextension/static/vendors-node_modules_css-loader_dist_runtime_api_js-node_modules_css-loader_dist_runtime_cssW-7d5e6f.8245c3041950ff727f29.js",
    "chars": 13173,
    "preview": "\"use strict\";\n(self[\"webpackChunkjupyterlab_code_snippets\"] = self[\"webpackChunkjupyterlab_code_snippets\"] || []).push(["
  },
  {
    "path": "package.json",
    "chars": 4533,
    "preview": "{\n  \"name\": \"jupyterlab-code-snippets\",\n  \"version\": \"2.2.0\",\n  \"description\": \"EXPERIMENTAL: Save, reuse, and share cod"
  },
  {
    "path": "pyproject.toml",
    "chars": 2408,
    "preview": "[build-system]\nrequires = [\"hatchling>=1.4.0\", \"jupyterlab>=3.4.7,<4.0.0\", \"hatch-nodejs-version\"]\nbuild-backend = \"hatc"
  },
  {
    "path": "schema/snippets.json",
    "chars": 2341,
    "preview": "{\n    \"jupyter.lab.setting-icon\": \"custom-ui-components:codeSnippetIcon\",\n    \"jupyter.lab.setting-icon-label\": \"Code Sn"
  },
  {
    "path": "setup.py",
    "chars": 33,
    "preview": "__import__('setuptools').setup()\n"
  },
  {
    "path": "snippets_example/carbon_emissions.json",
    "chars": 354,
    "preview": "{\"name\":\"carbon_emissions\",\"description\":\"Total carbon dioxide, in gigatonnes, by region, over time\",\"language\":\"R\",\"cod"
  },
  {
    "path": "snippets_example/filter_income.json",
    "chars": 314,
    "preview": "{\"name\":\"filter_income\",\"description\":\"Find the ten high income countries with the shortest life expectancy from country"
  },
  {
    "path": "snippets_example/gdp_calculator.json",
    "chars": 373,
    "preview": "{\"name\":\"gdp_calculator\",\"description\":\"Calculate total GDP, in trillions of dollars, by region, over time\",\"language\":\""
  },
  {
    "path": "snippets_example/generate_hundred.json",
    "chars": 429,
    "preview": "{\"name\":\"generate_hundred\",\"description\":\"Scala program to print numbers from 1 to 100  using for loop with until to det"
  },
  {
    "path": "snippets_example/import_cleaning.json",
    "chars": 221,
    "preview": "{\"name\":\"import_cleaning\",\"description\":\"Import statements for cleaning.\",\"language\":\"Python\",\"code\":[\"# Importing the n"
  },
  {
    "path": "snippets_example/import_matlib.json",
    "chars": 195,
    "preview": "{\"name\":\"import_matlib\",\"description\":\"import statements for matlib\",\"language\":\"Python\",\"code\":[\"import matplotlib as m"
  },
  {
    "path": "snippets_example/life_exp_eur_asia.json",
    "chars": 392,
    "preview": "{\"name\":\"life_exp_eur_asia\",\"description\":\"Find countries in North America or Europe and Central Asia with a life expect"
  },
  {
    "path": "snippets_example/lorenz_deriv.json",
    "chars": 371,
    "preview": "{\"name\":\"lorenz_deriv\",\"description\":\"Math equation for lorenz.\",\"language\":\"Python\",\"code\":[\"    def lorenz_deriv(x_y_z"
  },
  {
    "path": "snippets_example/matplotlib_import.json",
    "chars": 223,
    "preview": "{\"name\":\"matplotlib_import\",\"description\":\"Import statements to start plotting with matplotlib.\",\"language\":\"Python\",\"co"
  },
  {
    "path": "snippets_example/matrix_lstsqr.json",
    "chars": 361,
    "preview": "{\"name\":\"matrix_lstsqr\",\"description\":\"Math equation for least squares\",\"language\":\"Python\",\"code\":[\"import numpy as np\""
  },
  {
    "path": "snippets_example/most_frequent.json",
    "chars": 286,
    "preview": "{\"name\":\"most_frequent\",\"description\":\"This method returns the most frequent element that appears in a list.\",\"language\""
  },
  {
    "path": "snippets_example/parallel_strings.json",
    "chars": 1107,
    "preview": "{\"name\":\"parallel_strings\",\"description\":\"A simple queue function to generate four random strings in parallel.\",\"languag"
  },
  {
    "path": "snippets_example/plotting_sine.json",
    "chars": 297,
    "preview": "{\"name\":\"plotting_sine\",\"description\":\"Plotting code for sine graph using matplotlib.\",\"language\":\"Python\",\"code\":[\"impo"
  },
  {
    "path": "snippets_example/progress_bar.json",
    "chars": 474,
    "preview": "{\"name\":\"progress_bar\",\"description\":\"Create a progress bar.\",\"language\":\"Python\",\"code\":[\"class ProgressBar():\",\"    de"
  },
  {
    "path": "snippets_example/sum_array.json",
    "chars": 659,
    "preview": "{\"name\":\"sum_array\",\"description\":\"Scala program of array. Declare, print, and calculate sum of all elements.\",\"language"
  },
  {
    "path": "snippets_example/time_calculation.json",
    "chars": 396,
    "preview": "{\"name\":\"time_calculation\",\"description\":\"Snippet that measures the amount of time a section of code takes to run.\",\"lan"
  },
  {
    "path": "src/CodeSnippetContentsService.ts",
    "chars": 1488,
    "preview": "// Copyright (c) 2020, jupytercalpoly\n// Distributed under the terms of the BSD-3 Clause License.\n\nimport { ContentsMana"
  },
  {
    "path": "src/CodeSnippetDisplay.tsx",
    "chars": 47638,
    "preview": "// Copyright (c) 2020, jupytercalpoly\n// Distributed under the terms of the BSD-3 Clause License.\n\n// Some lines of code"
  },
  {
    "path": "src/CodeSnippetEditor.tsx",
    "chars": 20578,
    "preview": "// Copyright (c) 2020, jupytercalpoly\n// Distributed under the terms of the BSD-3 Clause License.\n\n// Some lines of code"
  },
  {
    "path": "src/CodeSnippetEditorTags.tsx",
    "chars": 6412,
    "preview": "// Copyright (c) 2020, jupytercalpoly\n// Distributed under the terms of the BSD-3 Clause License.\n\nimport { checkIcon, a"
  },
  {
    "path": "src/CodeSnippetFilterTools.tsx",
    "chars": 7640,
    "preview": "// Copyright (c) 2020, jupytercalpoly\n// Distributed under the terms of the BSD-3 Clause License.\n\nimport { InputGroup, "
  },
  {
    "path": "src/CodeSnippetInputDialog.ts",
    "chars": 15674,
    "preview": "// Copyright (c) 2020, jupytercalpoly\n// Distributed under the terms of the BSD-3 Clause License.\n\nimport { Dialog } fro"
  },
  {
    "path": "src/CodeSnippetLanguages.ts",
    "chars": 7870,
    "preview": "// Copyright (c) 2020, jupytercalpoly\n// Distributed under the terms of the BSD-3 Clause License.\n\nimport { LabIcon } fr"
  },
  {
    "path": "src/CodeSnippetMenu.ts",
    "chars": 7449,
    "preview": "// Copyright (c) 2020, jupytercalpoly\n// Distributed under the terms of the BSD-3 Clause License.\n\nimport { WidgetTracke"
  },
  {
    "path": "src/CodeSnippetMessage.ts",
    "chars": 3173,
    "preview": "// Copyright (c) 2020, jupytercalpoly\n// Distributed under the terms of the BSD-3 Clause License.\n\n// import { WidgetTra"
  },
  {
    "path": "src/CodeSnippetPreview.ts",
    "chars": 7569,
    "preview": "// Copyright (c) 2020, jupytercalpoly\n// Distributed under the terms of the BSD-3 Clause License.\n\nimport { WidgetTracke"
  },
  {
    "path": "src/CodeSnippetService.ts",
    "chars": 6818,
    "preview": "import { JupyterFrontEnd } from '@jupyterlab/application';\nimport { Settings } from '@jupyterlab/settingregistry';\nimpor"
  },
  {
    "path": "src/CodeSnippetUtilities.ts",
    "chars": 1994,
    "preview": "import { showDialog, Dialog } from '@jupyterlab/apputils';\n\nimport { SUPPORTED_LANGUAGES } from './CodeSnippetLanguages'"
  },
  {
    "path": "src/CodeSnippetWidget.tsx",
    "chars": 10433,
    "preview": "// Copyright (c) 2020, jupytercalpoly\n// Distributed under the terms of the BSD-3 Clause License.\n\n// Some lines of code"
  },
  {
    "path": "src/index.ts",
    "chars": 9743,
    "preview": "// Copyright (c) 2020, jupytercalpoly\n// Distributed under the terms of the BSD-3 Clause License.\n\n// Some lines of code"
  },
  {
    "path": "src/svg.d.ts",
    "chars": 74,
    "preview": "declare module '*.svg' {\n  const value: string;\n  export default value;\n}\n"
  },
  {
    "path": "style/base.css",
    "chars": 15195,
    "preview": ":root {\n  --preview-distance: 0px;\n  --preview-max-height: 75px;\n  --more-options-top: 0px;\n  --more-options-left: 0px;\n"
  },
  {
    "path": "style/index.css",
    "chars": 24,
    "preview": "@import url('base.css');"
  },
  {
    "path": "style/index.js",
    "chars": 21,
    "preview": "import './base.css';\n"
  },
  {
    "path": "test/codeSnippetContentsService.test.ts",
    "chars": 1888,
    "preview": "import { CodeSnippetContentsService } from '../src/CodeSnippetContentsService';\nimport {\n  ServerConnection,\n  ContentsM"
  },
  {
    "path": "test/sample.test.ts",
    "chars": 2920,
    "preview": "test('two plus two is four', () => {\n  expect(2 + 2).toBe(4);\n});\n\n// mock function\n// const add = jest.fn();\n\n// import"
  },
  {
    "path": "testutils/jest-setup-files.js",
    "chars": 167,
    "preview": "import { configure } from 'enzyme';\nimport Adapter from 'enzyme-adapter-react-16';\n\nglobal.fetch = require('jest-fetch-m"
  },
  {
    "path": "tsconfig.json",
    "chars": 555,
    "preview": "{\n  \"compilerOptions\": {\n    \"allowSyntheticDefaultImports\": true,\n    \"composite\": true,\n    \"declaration\": true,\n    \""
  },
  {
    "path": "tsconfig.test.json",
    "chars": 677,
    "preview": "{\n    \"compilerOptions\": {\n      \"declaration\": true,\n      \"noImplicitAny\": true,\n      \"noEmitOnError\": true,\n      \"n"
  }
]

About this extraction

This page contains the full source code of the jupytercalpoly/jupyterlab-code-snippets GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 132 files (854.0 KB), approximately 246.4k tokens, and a symbol index with 514 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!